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.javafx;
27
28 import jakarta.annotation.Nonnull;
29 import java.util.Collection;
30 import java.util.Optional;
31 import java.util.function.Function;
32 import java.nio.file.Path;
33 import javafx.beans.property.BooleanProperty;
34 import javafx.beans.property.DoubleProperty;
35 import javafx.beans.property.IntegerProperty;
36 import javafx.beans.property.LongProperty;
37 import javafx.beans.property.Property;
38 import javafx.scene.Node;
39 import javafx.scene.control.ButtonBase;
40 import javafx.scene.control.ComboBox;
41 import javafx.scene.control.ListView;
42 import javafx.scene.control.MenuItem;
43 import javafx.scene.control.TableView;
44 import javafx.scene.control.TextField;
45 import javafx.scene.control.ToggleButton;
46 import javafx.scene.control.TreeTableView;
47 import javafx.scene.control.TreeView;
48 import javafx.scene.layout.GridPane;
49 import javafx.scene.layout.Pane;
50 import javafx.stage.Window;
51 import it.tidalwave.ui.core.role.Visibility;
52 import it.tidalwave.ui.javafx.role.CustomGraphicProvider;
53 import it.tidalwave.ui.core.UserNotification;
54 import it.tidalwave.ui.core.UserNotificationWithFeedback;
55 import it.tidalwave.ui.core.BoundProperty;
56 import it.tidalwave.ui.core.role.PresentationModel;
57 import it.tidalwave.ui.core.role.UserAction;
58
59 /***************************************************************************************************************************************************************
60 *
61 * @author Fabrizio Giudici
62 *
63 **************************************************************************************************************************************************************/
64 public interface JavaFXBinder
65 {
66 /***********************************************************************************************************************************************************
67 * Sets the main window. This operation must be performed before any other method is called. This operation is
68 * automatically performed by the SteelBlue runtime.
69 *
70 * @param window the main window
71 **********************************************************************************************************************************************************/
72 public void setMainWindow (@Nonnull Window window);
73
74 /***********************************************************************************************************************************************************
75 * Binds a button to a {@link UserAction}. The following roles o the action are used:
76 *
77 * <ul>
78 * <li>Displayable: to set the label of the button</li>
79 * </ul>
80 *
81 * The action is used as a callback when the button is pressed; invoked in a thread provided by the binder executor.
82 * The {@code enabled} property of the {@code UserAction} is bound, negated, to the {@code disabled} property of the
83 * button.
84 *
85 * @param button the button
86 * @param action the action
87 **********************************************************************************************************************************************************/
88 public void bind (@Nonnull ButtonBase button, @Nonnull UserAction action);
89
90 /***********************************************************************************************************************************************************
91 * Binds a menu item to a {@link UserAction}. The following roles o the action are used:
92 *
93 * <ul>
94 * <li>Displayable: to set the label of the menu item</li>
95 * </ul>
96 *
97 * The action is used as a callback when the button is pressed; invoked in a thread provided by the binder executor.
98 * The {@code enabled} property of the {@code UserAction} is bound, negated, to the {@code disabled} property of the
99 * menu item.
100 *
101 * @param menuItem the menu item
102 * @param action the action
103 **********************************************************************************************************************************************************/
104 public void bind (@Nonnull MenuItem menuItem, @Nonnull UserAction action);
105
106 /***********************************************************************************************************************************************************
107 * Binds a {@link TableView} to a {@link PresentationModel} and an optional callback.
108 *
109 * The {@code PresentationModel} is used to populate the table. The following roles are used:
110 *
111 * <ul>
112 * <li>A {@link it.tidalwave.role.SimpleComposite} provides children {@code PresentationModel}s for each row.</li>
113 * <li>In each row, an {@link it.tidalwave.role.Aggregate<PresentationModel>} is used to provide the {@code PresentationModel}s for
114 * each column.</li>
115 * <li>A {@link it.tidalwave.ui.core.role.Displayable} (optional) is used to provide the text to render for each item.</li>
116 * <li>A {@link CustomGraphicProvider} (optional) is used to provide the graphics to render for each item.</li>
117 * <li>A {@link it.tidalwave.ui.core.role.Styleable} (optional) is used to provide the rendering style for each item.</li>
118 * <li>A {@link it.tidalwave.ui.core.role.UserActionProvider} (optional) is used to provide the actions for creating a context menu;
119 * the default action is also bound to the double click or SPACE gesture.</li>
120 * </ul>
121 *
122 * The process of populating data is performed in background threads, so this method quickly returns also in case
123 * of large amount of data.
124 * The initialization callback is called in the JavaFX thread when data population has been completed.
125 *
126 * @since 1.0-ALPHA-13
127 * @param tableView the {@code TablewView}
128 * @param pm the {@code PresentationModel}
129 * @param initCallback the callback
130 **********************************************************************************************************************************************************/
131 public void bind (@Nonnull TableView<PresentationModel> tableView,
132 @Nonnull PresentationModel pm,
133 @Nonnull Optional<Runnable> initCallback);
134
135 /***********************************************************************************************************************************************************
136 * Binds a {@link TableView} to a {@link PresentationModel} and a callback.
137 * See {@link #bind(javafx.scene.control.TableView, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}.
138 *
139 * The process of populating data is performed in background threads, so this method quickly returns also in case
140 * of large amount of data.
141 * The initialization callback is called in the JavaFX thread when data population has been completed.
142 *
143 * @param tableView the {@code TablewView}
144 * @param pm the {@code PresentationModel}
145 * @param initCallback the callback
146 **********************************************************************************************************************************************************/
147 public default void bind (@Nonnull final TableView<PresentationModel> tableView,
148 @Nonnull final PresentationModel pm,
149 @Nonnull final Runnable initCallback)
150 {
151 bind(tableView, pm, Optional.of(initCallback));
152 }
153
154 /***********************************************************************************************************************************************************
155 * Binds a {@link TableView} to a {@link PresentationModel}.
156 * See {@link #bind(javafx.scene.control.TableView, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}.
157 *
158 * @since 1.0-ALPHA-13
159 * @param tableView the {@code TablewView}
160 * @param pm the {@code PresentationModel}
161 **********************************************************************************************************************************************************/
162 public default void bind (@Nonnull final TableView<PresentationModel> tableView,
163 @Nonnull final PresentationModel pm)
164 {
165 bind(tableView, pm, Optional.empty());
166 }
167
168 /***********************************************************************************************************************************************************
169 * Binds a {@link TreeView} to a {@link PresentationModel} and a callback.
170 *
171 * The {@code PresentationModel} is used to populate the table. The following roles are used:
172 *
173 * <ul>
174 * <li>A {@link it.tidalwave.role.SimpleComposite} provides children {@code PresentationModel}s for each row.</li>
175 * <li>In each row, an {@link it.tidalwave.role.Aggregate<PresentationModel>} is used to provide the {@code PresentationModel}s for
176 * each column.</li>
177 * <li>A {@link it.tidalwave.ui.core.role.Displayable} (optional) is used to provide the text to render for each item.</li>
178 * <li>A {@link CustomGraphicProvider} (optional) is used to provide the graphics to render for each item.</li>
179 * <li>A {@link it.tidalwave.ui.core.role.Styleable} (optional) is used to provide the rendering style for each item.</li>
180 * <li>A {@link it.tidalwave.ui.core.role.UserActionProvider} (optional) is used to provide the actions for creating a context menu;
181 * the default action is also bound to the double click or SPACE gesture.</li>
182 * <li>A {@link Visibility} (optional) is used to decide whether the root node should be visible or not.</li>
183 * </ul>
184 *
185 * The process of populating data is performed in background threads, so this method quickly returns also in case
186 * of large amount of data.
187 * The initialization callback is called in the JavaFX thread when data population has been completed.
188 *
189 * @param treeView the {@code TreeView}
190 * @param pm the {@code PresentationModel}
191 * @param initCallback the callback
192 **********************************************************************************************************************************************************/
193 public void bind (@Nonnull TreeView<PresentationModel> treeView,
194 @Nonnull PresentationModel pm,
195 @Nonnull Optional<Runnable> initCallback);
196
197 /***********************************************************************************************************************************************************
198 * Binds a {@link TableView} to a {@link PresentationModel} and a callback.
199 * See {@link #bind(javafx.scene.control.TreeView, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}.
200 *
201 * @since 1.0-ALPHA-13
202 * @param treeView the {@code TreeView}
203 * @param pm the {@code PresentationModel}
204 * @param initCallback the callback
205 **********************************************************************************************************************************************************/
206 public default void bind (@Nonnull final TreeView<PresentationModel> treeView,
207 @Nonnull final PresentationModel pm,
208 @Nonnull final Runnable initCallback)
209 {
210 bind(treeView, pm, Optional.of(initCallback));
211 }
212
213 /***********************************************************************************************************************************************************
214 * Binds a {@link TableView} to a {@link PresentationModel}.
215 * See {@link #bind(javafx.scene.control.TableView, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}
216 *
217 * @since 1.0-ALPHA-13
218 * @param treeView the {@code TreeView}
219 * @param pm the {@code PresentationModel}
220 **********************************************************************************************************************************************************/
221 public default void bind (@Nonnull final TreeView<PresentationModel> treeView,
222 @Nonnull final PresentationModel pm)
223 {
224 bind(treeView, pm, Optional.empty());
225 }
226
227 /***********************************************************************************************************************************************************
228 * Binds a {@link TreeTableView} to a {@link PresentationModel} and a callback.
229 *
230 * The {@code PresentationModel} is used to populate the table. The following roles are used:
231 *
232 * <ul>
233 * <li>A {@link it.tidalwave.role.SimpleComposite} provides children {@code PresentationModel}s for each row.</li>
234 * <li>In each row, an {@link it.tidalwave.role.Aggregate<PresentationModel>} is used to provide the {@code PresentationModel}s for
235 * each column.</li>
236 * <li>A {@link it.tidalwave.ui.core.role.Displayable} (optional) is used to provide the text to render for each item.</li>
237 * <li>A {@link CustomGraphicProvider} (optional) is used to provide the graphics to render for each item.</li>
238 * <li>A {@link it.tidalwave.ui.core.role.Styleable} (optional) is used to provide the rendering style for each item.</li>
239 * <li>A {@link it.tidalwave.ui.core.role.UserActionProvider} (optional) is used to provide the actions for creating a context menu;
240 * the default action is also bound to the double click or SPACE gesture.</li>
241 * <li>A {@link Visibility} (optional) is used to decide whether the root node should be visible or not.</li>
242 * </ul>
243 *
244 * The process of populating data is performed in background threads, so this method quickly returns also in case
245 * of large amount of data.
246 * The initialization callback is called in the JavaFX thread when data population has been completed.
247 *
248 * @param treeTableView the {@code TreeTableView}
249 * @param pm the {@code PresentationModel}
250 * @param initCallback the callback
251 **********************************************************************************************************************************************************/
252 public void bind (@Nonnull TreeTableView<PresentationModel> treeTableView,
253 @Nonnull PresentationModel pm,
254 @Nonnull Optional<Runnable> initCallback);
255
256 /***********************************************************************************************************************************************************
257 * Binds a {@link TreeTableView} to a {@link PresentationModel} and a callback.
258 * See {@link #bind(javafx.scene.control.TreeTableView, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}.
259 *
260 * @since 1.0-ALPHA-13
261 * @param treeTableView the {@code TreeTableView}
262 * @param pm the {@code PresentationModel}
263 * @param initCallback the callback
264 **********************************************************************************************************************************************************/
265 public default void bind (@Nonnull final TreeTableView<PresentationModel> treeTableView,
266 @Nonnull final PresentationModel pm,
267 @Nonnull final Runnable initCallback)
268 {
269 bind(treeTableView, pm, Optional.of(initCallback));
270 }
271
272 /***********************************************************************************************************************************************************
273 * Binds a {@link TreeTableView} to a {@link PresentationModel}.
274 * See {@link #bind(javafx.scene.control.TreeTableView, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}.
275 *
276 * @since 1.0-ALPHA-13
277 * @param treeTableView the {@code TreeTableView}
278 * @param pm the {@code PresentationModel}
279 **********************************************************************************************************************************************************/
280 public default void bind (@Nonnull final TreeTableView<PresentationModel> treeTableView,
281 @Nonnull final PresentationModel pm)
282 {
283 bind(treeTableView, pm, Optional.empty());
284 }
285
286 /***********************************************************************************************************************************************************
287 * Binds a {@link ListView} to a {@link PresentationModel} and an optional callback.
288 *
289 * The {@code PresentationModel} is used to populate the table. The following roles are used:
290 *
291 * <ul>
292 * <li>A {@link it.tidalwave.role.SimpleComposite} provides children {@code PresentationModel}s for each row.</li>
293 * <li>In each row, an {@link it.tidalwave.role.Aggregate<PresentationModel>} is used to provide the {@code PresentationModel}s for
294 * each column.</li>
295 * <li>A {@link it.tidalwave.ui.core.role.Displayable} (optional) is used to provide the text to render for each item.</li>
296 * <li>A {@link CustomGraphicProvider} (optional) is used to provide the graphics to render for each item.</li>
297 * <li>A {@link it.tidalwave.ui.core.role.Styleable} (optional) is used to provide the rendering style for each item.</li>
298 * <li>A {@link it.tidalwave.ui.core.role.UserActionProvider} (optional) is used to provide the actions for creating a context menu;
299 * the default action is also bound to the double click or SPACE gesture.</li>
300 * </ul>
301 *
302 * The process of populating data is performed in background threads, so this method quickly returns also in case
303 * of large amount of data.
304 * The initialization callback is called in the JavaFX thread when data population has been completed.
305 *
306 * @param listView the {@code ListView}
307 * @param pm the {@code PresentationModel}
308 * @param initCallback the callback
309 **********************************************************************************************************************************************************/
310 public void bind (@Nonnull ListView<PresentationModel> listView,
311 @Nonnull PresentationModel pm,
312 @Nonnull Optional<Runnable> initCallback);
313
314 /***********************************************************************************************************************************************************
315 * Binds a {@link ListView} to a {@link PresentationModel} and a callback.
316 * See {@link #bind(javafx.scene.control.ListView, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}.
317 *
318 * @since 1.0-ALPHA-13
319 * @param listView the {@code ListView}
320 * @param pm the {@code PresentationModel}
321 * @param initCallback the callback
322 **********************************************************************************************************************************************************/
323 public default void bind (@Nonnull final ListView<PresentationModel> listView,
324 @Nonnull final PresentationModel pm,
325 @Nonnull final Runnable initCallback)
326 {
327 bind(listView, pm, Optional.of(initCallback));
328 }
329
330 /***********************************************************************************************************************************************************
331 * Binds a {@link ComboBox} to a {@link PresentationModel}.
332 * See {@link #bind(javafx.scene.control.ListView, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}.
333 *
334 * @since 1.0-ALPHA-13
335 * @param listView the {@code ListView}
336 * @param pm the {@code PresentationModel}
337 **********************************************************************************************************************************************************/
338 public default void bind (@Nonnull final ListView<PresentationModel> listView,
339 @Nonnull final PresentationModel pm)
340 {
341 bind(listView, pm, Optional.empty());
342 }
343
344 /***********************************************************************************************************************************************************
345 * Binds a {@link ComboBox} to a {@link PresentationModel} and an optional callback.
346 *
347 * The {@code PresentationModel} is used to populate the table. The following roles are used:
348 *
349 * <ul>
350 * <li>A {@link it.tidalwave.role.SimpleComposite} provides children {@code PresentationModel}s for each row.</li>
351 * <li>In each row, an {@link it.tidalwave.role.Aggregate<PresentationModel>} is used to provide the {@code PresentationModel}s for
352 * each column.</li>
353 * <li>A {@link it.tidalwave.ui.core.role.Displayable} (optional) is used to provide the text to render for each item.</li>
354 * <li>A {@link CustomGraphicProvider} (optional) is used to provide the graphics to render for each item.</li>
355 * <li>A {@link it.tidalwave.ui.core.role.Styleable} (optional) is used to provide the rendering style for each item.</li>
356 * <li>A {@link it.tidalwave.ui.core.role.UserActionProvider} (optional) is used to provide the actions for creating a context menu;
357 * the default action is also bound to the double click or SPACE gesture.</li>
358 * </ul>
359 *
360 * The process of populating data is performed in background threads, so this method quickly returns also in case
361 * of large amount of data.
362 * The initialization callback is called in the JavaFX thread when data population has been completed.
363 *
364 * @param comboBox the {@code ComboBox}
365 * @param pm the {@code PresentationModel}
366 * @param initCallback the callback
367 **********************************************************************************************************************************************************/
368 public void bind (@Nonnull ComboBox<PresentationModel> comboBox,
369 @Nonnull PresentationModel pm,
370 @Nonnull Optional<Runnable> initCallback);
371
372 /***********************************************************************************************************************************************************
373 * Binds a {@link ComboBox} to a {@link PresentationModel} and a callback.
374 * See {@link #bind(javafx.scene.control.ComboBox, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}.
375 *
376 * @since 1.0-ALPHA-13
377 * @param comboBox the {@code ComboBox}
378 * @param pm the {@code PresentationModel}
379 * @param initCallback the callback
380 **********************************************************************************************************************************************************/
381 public default void bind (@Nonnull final ComboBox<PresentationModel> comboBox,
382 @Nonnull final PresentationModel pm,
383 @Nonnull final Runnable initCallback)
384 {
385 bind(comboBox, pm, Optional.of(initCallback));
386 }
387
388 /***********************************************************************************************************************************************************
389 * Binds a {@link ComboBox} to a {@link PresentationModel}.
390 * See {@link #bind(javafx.scene.control.ComboBox, it.tidalwave.ui.core.role.PresentationModel, java.util.Optional)}.
391 *
392 * @since 1.0-ALPHA-13
393 * @param comboBox the {@code ComboBox}
394 * @param pm the {@code PresentationModel}
395 **********************************************************************************************************************************************************/
396 public default void bind (@Nonnull final ComboBox<PresentationModel> comboBox,
397 @Nonnull final PresentationModel pm)
398 {
399 bind(comboBox, pm, Optional.empty());
400 }
401
402 /***********************************************************************************************************************************************************
403 * Given a {@link PresentationModel} that contains a {@link it.tidalwave.role.Composite}, populate the pane with
404 * {@link ToggleButton}s associated to the elements of the {@link it.tidalwave.role.Composite}. Each element is searched for the
405 * following roles:
406 *
407 * <ul>
408 * <li>{@link it.tidalwave.ui.core.role.UserActionProvider} (mandatory) to provide a callback for the button</li>
409 * <li>{@link it.tidalwave.ui.core.role.Displayable} to provide a text for the button</li>
410 * <li>{@link it.tidalwave.ui.core.role.Styleable} to provide a CSS style for the button</li>
411 * </ul>
412 *
413 * The pane must be pre-populated with at least one button, which will be queried for the CSS style.
414 *
415 * @param pane the {@code Pane}
416 * @param pm the {@code PresentationModel}
417 **********************************************************************************************************************************************************/
418 public void bindToggleButtons (@Nonnull Pane pane, @Nonnull PresentationModel pm);
419
420 /***********************************************************************************************************************************************************
421 * Deprecated. Merge to bindToggleButtons, passing some arguments for choosing toggle or normal buttons.
422 *
423 * @deprecated
424 **********************************************************************************************************************************************************/
425 @Deprecated
426 public void bindButtonsInPane (@Nonnull GridPane gridPane, @Nonnull Collection<UserAction> actions);
427
428 /***********************************************************************************************************************************************************
429 * Binds two properties of different types.
430 * @param <T> the target property type
431 * @param <S> the source property type
432 * @param target the target property
433 * @param source the source property
434 * @param adapter an adapter from one source to the target
435 * @since 2.0-ALPHA-1
436 **********************************************************************************************************************************************************/
437 public <T, S> void bind (@Nonnull final BoundProperty<? super T> target,
438 @Nonnull final Property<? extends S> source,
439 @Nonnull final Function<S, T> adapter);
440
441 /***********************************************************************************************************************************************************
442 * Binds two properties of the same type.
443 * @param <T> the property type
444 * @param target the target property
445 * @param source the source property
446 * @since 2.0-ALPHA-1
447 **********************************************************************************************************************************************************/
448 public default <T> void bind (@Nonnull final BoundProperty<? super T> target, @Nonnull final Property<T> source)
449 {
450 bind(target, source, Function.identity());
451 }
452
453 /***********************************************************************************************************************************************************
454 * Bidirectionally binds two properties of different types.
455 * @param <T> the former property type
456 * @param <S> the latter property type
457 * @param property1 the former property
458 * @param property2 the latter property
459 * @param adapter an adapter from one type to the other
460 * @param reverseAdapter the reverse adapter
461 * @since 2.0-ALPHA-1
462 **********************************************************************************************************************************************************/
463 public <T, S> void bindBidirectionally (@Nonnull final BoundProperty<? super T> property1,
464 @Nonnull final Property<S> property2,
465 @Nonnull final Function<? super S, T> adapter,
466 @Nonnull final Function<? super T, ? extends S> reverseAdapter);
467
468 /***********************************************************************************************************************************************************
469 * {@inheritDoc}
470 **********************************************************************************************************************************************************/
471 public default <T> void bindBidirectionally (@Nonnull final BoundProperty<? super T> property1, @Nonnull final Property<T> property2)
472 {
473 bindBidirectionally(property1, property2, Function.identity(), Function.identity());
474 }
475
476 /***********************************************************************************************************************************************************
477 * Bidirectionally binds two properties.
478 * @param property1 the former property
479 * @param property2 the latter property
480 **********************************************************************************************************************************************************/
481 public default void bindBidirectionally (@Nonnull final BoundProperty<? super Boolean> property1, @Nonnull final BooleanProperty property2)
482 {
483 bindBidirectionally(property1, property2, a -> a, a -> a);
484 }
485
486 /***********************************************************************************************************************************************************
487 * Bidirectionally binds two properties.
488 * @param property1 the former property
489 * @param property2 the latter property
490 **********************************************************************************************************************************************************/
491 public default void bindBidirectionally (@Nonnull final BoundProperty<? super Integer> property1, @Nonnull final IntegerProperty property2)
492 {
493 bindBidirectionally(property1, property2, Number::intValue, a -> a);
494 }
495
496 /***********************************************************************************************************************************************************
497 * Bidirectionally binds two properties.
498 * @param property1 the former property
499 * @param property2 the latter property
500 **********************************************************************************************************************************************************/
501 public default void bindBidirectionally (@Nonnull final BoundProperty<? super Long> property1, @Nonnull final LongProperty property2)
502 {
503 bindBidirectionally(property1, property2, Number::longValue, a -> a);
504 }
505
506 /***********************************************************************************************************************************************************
507 * Bidirectionally binds two properties.
508 * @param property1 the former property
509 * @param property2 the latter property
510 **********************************************************************************************************************************************************/
511 public default void bindBidirectionally (@Nonnull final BoundProperty<? super Double> property1, @Nonnull final DoubleProperty property2)
512 {
513 bindBidirectionally(property1, property2, Number::doubleValue, a -> a);
514 }
515
516 /***********************************************************************************************************************************************************
517 *
518 **********************************************************************************************************************************************************/
519 public void bindBidirectionally (@Nonnull TextField textField,
520 @Nonnull BoundProperty<String> textProperty,
521 @Nonnull BoundProperty<Boolean> validProperty);
522
523 /***********************************************************************************************************************************************************
524 * Shows a modal dialog with the given content and provides feedback by means of the given notification.
525 *
526 * @param notification the object notifying whether the operation is confirmed or cancelled
527 * @since 1.1-ALPHA-6
528 **********************************************************************************************************************************************************/
529 public default void showInModalDialog (@Nonnull final UserNotification notification)
530 {
531 showInModalDialog(UserNotificationWithFeedback.notificationWithFeedback()
532 .withCaption(notification.getCaption())
533 .withText(notification.getText()));
534 }
535
536 /***********************************************************************************************************************************************************
537 * Shows a modal dialog with the given content and provides feedback by means of the given notification.
538 *
539 * @param node the dialog content
540 * @param notification the object notifying whether the operation is confirmed or cancelled
541 **********************************************************************************************************************************************************/
542 public void showInModalDialog (@Nonnull UserNotificationWithFeedback notification,
543 @Nonnull Optional<Node> node);
544
545 // FIXME: use a Builder, merge with the above
546 public default void showInModalDialog (@Nonnull final Node node,
547 @Nonnull final UserNotificationWithFeedback notification,
548 @Nonnull final BoundProperty<Boolean> valid)
549 {
550 showInModalDialog(notification, Optional.of(node));
551 }
552
553 @Deprecated
554 public default void showInModalDialog (@Nonnull final Node node,
555 @Nonnull final UserNotificationWithFeedback notification)
556 {
557 showInModalDialog(notification, Optional.of(node));
558 }
559
560 public default void showInModalDialog (@Nonnull final UserNotificationWithFeedback notification)
561 {
562 showInModalDialog(notification, Optional.empty());
563 }
564
565 /***********************************************************************************************************************************************************
566 * Opens the FileChooser for selecting a file. The outcome of the operation (confirmed or cancelled) will be
567 * notified to the given notification object. The selected file will be set to the given bound property, which can
568 * be also used to set the default value rendered on the FileChooser.
569 *
570 * @param notification the object notifying whether the operation is confirmed or cancelled
571 * @param selectedFile the property containing the selected file
572 **********************************************************************************************************************************************************/
573 public void openFileChooserFor (@Nonnull UserNotificationWithFeedback notification,
574 @Nonnull BoundProperty<Path> selectedFile);
575
576 /***********************************************************************************************************************************************************
577 * Opens the FileChooser for selecting a folder. The outcome of the operation (confirmed or cancelled) will be
578 * notified to the given notification object. The selected folder will be set to the given bound property, which can
579 * be also used to set the default value rendered on the FileChooser.
580 *
581 * @param notification the object notifying whether the operation is confirmed or cancelled
582 * @param selectedFolder the property containing the selected folder
583 **********************************************************************************************************************************************************/
584 public void openDirectoryChooserFor (@Nonnull UserNotificationWithFeedback notification,
585 @Nonnull BoundProperty<Path> selectedFolder);
586 }