1 /* 2 * ************************************************************************************************************************************************************* 3 * 4 * SteelBlue: DCI User Interfaces 5 * http://tidalwave.it/projects/steelblue 6 * 7 * Copyright (C) 2015 - 2025 by Tidalwave s.a.s. (http://tidalwave.it) 8 * 9 * ************************************************************************************************************************************************************* 10 * 11 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 17 * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 18 * 19 * ************************************************************************************************************************************************************* 20 * 21 * git clone https://bitbucket.org/tidalwave/steelblue-src 22 * git clone https://github.com/tidalwave-it/steelblue-src 23 * 24 * ************************************************************************************************************************************************************* 25 */ 26 package it.tidalwave.ui.example.presentation.impl.javafx; 27 28 import jakarta.annotation.Nonnull; 29 import java.nio.file.Path; 30 import javafx.fxml.FXML; 31 import javafx.scene.control.Button; 32 import javafx.scene.control.ComboBox; 33 import javafx.scene.control.ListView; 34 import javafx.scene.control.TableView; 35 import javafx.scene.control.TextArea; 36 import javafx.scene.control.TextField; 37 import javafx.scene.control.TreeTableView; 38 import javafx.scene.control.TreeView; 39 import it.tidalwave.util.ui.UserNotificationWithFeedback; 40 import it.tidalwave.ui.core.BoundProperty; 41 import it.tidalwave.ui.core.role.PresentationModel; 42 import it.tidalwave.ui.javafx.JavaFXBinder; 43 import it.tidalwave.ui.example.presentation.MainPanelPresentation; 44 import lombok.RequiredArgsConstructor; 45 import lombok.extern.slf4j.Slf4j; 46 47 /*************************************************************************************************************************************************************** 48 * 49 * The JavaFX controller just works as a dumb object with SteelBlue: it must implement in the most simple way each 50 * method in the presentation interface, by applying simple manipulation to the UI. No logic here, neither presentaton 51 * nor business. 52 * 53 * @author Fabrizio Giudici 54 * 55 **************************************************************************************************************************************************************/ 56 @RequiredArgsConstructor @Slf4j 57 public class JavaFXMainPanelPresentationDelegate implements MainPanelPresentation 58 { 59 // START SNIPPET: fields 60 // This facility provides all the methods to bind JavaFX controls to DCI roles. 61 @Nonnull 62 private final JavaFXBinder binder; 63 64 @FXML 65 private Button btButton; 66 67 @FXML 68 private Button btDialogOk; 69 70 @FXML 71 private Button btDialogOkCancel; 72 73 @FXML 74 private Button btPickFile; 75 76 @FXML 77 private Button btPickDirectory; 78 79 @FXML 80 private TextField tfTextField; 81 82 @FXML 83 private ListView<PresentationModel> lvListView; 84 85 @FXML 86 private ComboBox<PresentationModel> cbComboBox; 87 88 @FXML 89 private TableView<PresentationModel> tvTableView; 90 91 @FXML 92 private TreeView<PresentationModel> tvTreeView; 93 94 @FXML 95 private TreeTableView<PresentationModel> ttvTreeTableView; 96 97 @FXML 98 private TextArea taLog; 99 // END SNIPPET: fields 100 101 /*********************************************************************************************************************************************************** 102 * {@inheritDoc} 103 **********************************************************************************************************************************************************/ 104 // START SNIPPET: bind 105 @Override 106 public void bind (@Nonnull final Bindings bindings) 107 { 108 binder.bind(btButton, bindings.actionButton); 109 binder.bind(btDialogOk, bindings.actionDialogOk); 110 binder.bind(btDialogOkCancel, bindings.actionDialogCancelOk); 111 binder.bind(btPickFile, bindings.actionPickFile); 112 binder.bind(btPickDirectory, bindings.actionPickDirectory); 113 binder.bindBidirectionally(tfTextField, bindings.textProperty, bindings.booleanProperty); 114 } 115 // END SNIPPET: bind 116 117 /*********************************************************************************************************************************************************** 118 * {@inheritDoc} 119 **********************************************************************************************************************************************************/ 120 // START SNIPPET: populate 121 @Override 122 public void populate (@Nonnull final PresentationModel pmSimpleEntities, 123 @Nonnull final PresentationModel pmDciEntities, 124 @Nonnull final PresentationModel pmFileEntities) 125 { 126 binder.bind(lvListView, pmSimpleEntities, () -> log.info("Finished setup of lvListView")); 127 binder.bind(cbComboBox, pmSimpleEntities, () -> log.info("Finished setup of cbComboBox")); 128 binder.bind(tvTableView, pmDciEntities, () -> log.info("Finished setup of tvTableView")); 129 binder.bind(tvTreeView, pmFileEntities, () -> log.info("Finished setup of tvTreeView")); 130 binder.bind(ttvTreeTableView, pmFileEntities, () -> log.info("Finished setup of ttvTreeTableView")); 131 } 132 // END SNIPPET: populate 133 134 /*********************************************************************************************************************************************************** 135 * {@inheritDoc} 136 **********************************************************************************************************************************************************/ 137 // START SNIPPET: notify1 138 @Override 139 public void notify (@Nonnull final UserNotificationWithFeedback notification) 140 { 141 binder.showInModalDialog(notification); 142 } 143 // END SNIPPET: notify1 144 145 /*********************************************************************************************************************************************************** 146 * {@inheritDoc} 147 **********************************************************************************************************************************************************/ 148 // START SNIPPET: notify2 149 @Override 150 public void notify (@Nonnull final String message) 151 { 152 taLog.appendText(message + "\n"); 153 } 154 // END SNIPPET: notify2 155 156 /*********************************************************************************************************************************************************** 157 * {@inheritDoc} 158 **********************************************************************************************************************************************************/ 159 // START SNIPPET: pickFile 160 @Override 161 public void pickFile (@Nonnull final BoundProperty<Path> selectedFile, 162 @Nonnull final UserNotificationWithFeedback notification) 163 { 164 binder.openFileChooserFor(notification, selectedFile); 165 } 166 // END SNIPPET: pickFile 167 168 /*********************************************************************************************************************************************************** 169 * {@inheritDoc} 170 **********************************************************************************************************************************************************/ 171 // START SNIPPET: pickDirectory 172 @Override 173 public void pickDirectory (@Nonnull final BoundProperty<Path> selectedFolder, 174 @Nonnull final UserNotificationWithFeedback notification) 175 { 176 binder.openDirectoryChooserFor(notification, selectedFolder); 177 } 178 // END SNIPPET: pickDirectory 179 }