53 import com.oracle.javafx.scenebuilder.kit.editor.panel.hierarchy.AbstractHierarchyPanelController.DisplayOption;
54 import com.oracle.javafx.scenebuilder.kit.editor.panel.hierarchy.HierarchyPanelController;
55 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.InspectorPanelController;
56 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.InspectorPanelController.SectionId;
57 import com.oracle.javafx.scenebuilder.kit.editor.panel.library.LibraryPanelController;
58 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.AbstractFxmlWindowController;
59 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog;
60 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog.ButtonID;
61 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AlertDialog;
62 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.ErrorDialog;
63 import com.oracle.javafx.scenebuilder.kit.editor.search.SearchController;
64 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
65 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
66 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
67 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
68 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
69 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNodes;
70 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
71 import com.oracle.javafx.scenebuilder.kit.library.Library;
72 import com.oracle.javafx.scenebuilder.kit.library.user.UserLibrary;
73 import com.sun.javafx.scene.control.behavior.KeyBinding;
74
75 import java.io.File;
76 import java.io.IOException;
77 import java.io.UnsupportedEncodingException;
78 import java.net.MalformedURLException;
79 import java.net.URISyntaxException;
80 import java.net.URL;
81 import java.nio.file.Files;
82 import java.nio.file.NoSuchFileException;
83 import java.nio.file.Path;
84 import java.nio.file.Paths;
85 import java.nio.file.attribute.FileTime;
86 import java.util.ArrayList;
87 import java.util.Collections;
88 import java.util.Comparator;
89 import java.util.HashMap;
90 import java.util.List;
91 import java.util.Map;
92
93 import javafx.beans.InvalidationListener;
220 @FXML private MenuItem cssPanelSplitDefaultsMi;
221
222 @FXML private RadioMenuItem showInfoMenuItem;
223 @FXML private RadioMenuItem showFxIdMenuItem;
224 @FXML private RadioMenuItem showNodeIdMenuItem;
225
226 private SplitController bottomSplitController;
227 private SplitController leftSplitController;
228 private SplitController rightSplitController;
229 private SplitController librarySplitController;
230 private SplitController documentSplitController;
231
232 private FileTime loadFileTime;
233 private Job saveJob;
234
235 private static List<String> imageExtensions;
236 private static List<String> audioExtensions;
237 private static List<String> videoExtensions;
238 private static List<String> mediaExtensions;
239
240 private final EventHandler<KeyEvent> mainKeyEventFilter = event -> {
241 //------------------------------------------------------------------
242 // TEXT INPUT CONTROL
243 //------------------------------------------------------------------
244 // Common editing actions handled natively and defined as application accelerators
245 //
246 // The platform support is not mature/stable enough to rely on.
247 // Indeed, the behavior may differ :
248 // - when using system menu bar vs not using it
249 // - when using accelerators vs using menu items
250 // - depending on the focused control (TextField vs ComboBox)
251 //
252 // On SB side, we decide for now to consume events that may be handled natively
253 // so ALL actions are defined in our ApplicationMenu class.
254 //
255 // This may be revisit when platform implementation will be more reliable.
256 //
257 final Node focusOwner = getScene().getFocusOwner();
258 final KeyCombination accelerator = getAccelerator(event);
259 if (isTextInputControlEditing(focusOwner) == true
260 && accelerator != null) {
261 for (KeyBinding binding : SBTextInputControlBindings.getBindings()) {
262 // The event is handled natively
263 if (binding.getSpecificity(null, event) > 0) {
264 //
265 // When using system menu bar, the event is handled natively
266 // before the application receives it : we just consume the event
267 // so the editing action is not performed a second time by the app.
268 if (menuBarController.getMenuBar().isUseSystemMenuBar()) {
269 event.consume();
270 }
271 break;
272 }
273 }
274 }
275
276 //------------------------------------------------------------------
277 // Hierarchy TreeView + select all
278 //------------------------------------------------------------------
279 // Select all is handled natively by TreeView (= hierarchy panel control).
280 boolean modifierDown = (EditorPlatform.IS_MAC ? event.isMetaDown() : event.isControlDown());
281 boolean isSelectAll = KeyCode.A.equals(event.getCode()) && modifierDown;
282 if (getHierarchyPanelController().getPanelControl().isFocused() && isSelectAll) {
283 // Consume the event so the control action is not performed natively.
284 event.consume();
285 // When using system menu bar, the control action is performed by the app.
286 if (menuBarController.getMenuBar().isUseSystemMenuBar() == false) {
287 if (canPerformControlAction(DocumentControlAction.SELECT_ALL)) {
288 performControlAction(DocumentControlAction.SELECT_ALL);
289 }
290 }
291 }
292
293 // MenuItems define a single accelerator.
2138 }
2139 }
2140
2141 return result;
2142 }
2143
2144
2145 private void performHelp() {
2146 try {
2147 EditorPlatform.open(EditorPlatform.DOCUMENTATION_URL);
2148 } catch (IOException ioe) {
2149 final ErrorDialog errorDialog = new ErrorDialog(null);
2150 errorDialog.setMessage(I18N.getString("alert.help.failure.message", EditorPlatform.DOCUMENTATION_URL));
2151 errorDialog.setDetails(I18N.getString("alert.messagebox.failure.details"));
2152 errorDialog.setDebugInfoWithThrowable(ioe);
2153 errorDialog.showAndWait();
2154 }
2155 }
2156 }
2157
2158 /**
2159 * This class setup key bindings for the TextInputControl type classes and
2160 * provide a way to access the key binding list.
2161 */
2162 class SBTextInputControlBindings extends com.sun.javafx.scene.control.behavior.TextInputControlBindings {
2163
2164 private SBTextInputControlBindings() {
2165 assert false;
2166 }
2167
2168 public static List<KeyBinding> getBindings() {
2169 return BINDINGS;
2170 }
2171 }
|
53 import com.oracle.javafx.scenebuilder.kit.editor.panel.hierarchy.AbstractHierarchyPanelController.DisplayOption;
54 import com.oracle.javafx.scenebuilder.kit.editor.panel.hierarchy.HierarchyPanelController;
55 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.InspectorPanelController;
56 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.InspectorPanelController.SectionId;
57 import com.oracle.javafx.scenebuilder.kit.editor.panel.library.LibraryPanelController;
58 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.AbstractFxmlWindowController;
59 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog;
60 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog.ButtonID;
61 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AlertDialog;
62 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.ErrorDialog;
63 import com.oracle.javafx.scenebuilder.kit.editor.search.SearchController;
64 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
65 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
66 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
67 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
68 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
69 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNodes;
70 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
71 import com.oracle.javafx.scenebuilder.kit.library.Library;
72 import com.oracle.javafx.scenebuilder.kit.library.user.UserLibrary;
73
74 import java.io.File;
75 import java.io.IOException;
76 import java.io.UnsupportedEncodingException;
77 import java.net.MalformedURLException;
78 import java.net.URISyntaxException;
79 import java.net.URL;
80 import java.nio.file.Files;
81 import java.nio.file.NoSuchFileException;
82 import java.nio.file.Path;
83 import java.nio.file.Paths;
84 import java.nio.file.attribute.FileTime;
85 import java.util.ArrayList;
86 import java.util.Collections;
87 import java.util.Comparator;
88 import java.util.HashMap;
89 import java.util.List;
90 import java.util.Map;
91
92 import javafx.beans.InvalidationListener;
219 @FXML private MenuItem cssPanelSplitDefaultsMi;
220
221 @FXML private RadioMenuItem showInfoMenuItem;
222 @FXML private RadioMenuItem showFxIdMenuItem;
223 @FXML private RadioMenuItem showNodeIdMenuItem;
224
225 private SplitController bottomSplitController;
226 private SplitController leftSplitController;
227 private SplitController rightSplitController;
228 private SplitController librarySplitController;
229 private SplitController documentSplitController;
230
231 private FileTime loadFileTime;
232 private Job saveJob;
233
234 private static List<String> imageExtensions;
235 private static List<String> audioExtensions;
236 private static List<String> videoExtensions;
237 private static List<String> mediaExtensions;
238
239 private final EventHandler<KeyEvent> mainKeyEventFilter = (KeyEvent event) -> {
240 //------------------------------------------------------------------
241 // TEXT INPUT CONTROL
242 //------------------------------------------------------------------
243 // Common editing actions handled natively and defined as application accelerators
244 //
245 // The platform support is not mature/stable enough to rely on.
246 // Indeed, the behavior may differ :
247 // - when using system menu bar vs not using it
248 // - when using accelerators vs using menu items
249 // - depending on the focused control (TextField vs ComboBox)
250 //
251 // On SB side, we decide for now to consume events that may be handled natively
252 // so ALL actions are defined in our ApplicationMenu class.
253 //
254 // This may be revisit when platform implementation will be more reliable.
255 //
256 final Node focusOwner = getScene().getFocusOwner();
257 final KeyCombination accelerator = getAccelerator(event);
258 if (isTextInputControlEditing(focusOwner) == true
259 && accelerator != null) {
260
261 // focusOwner.getInputMap()
262 // .lookupMapping(KeyBinding.toKeyBinding(event))
263 // .ifPresent(mapping -> {
264 // // The event is handled natively
265 // if (mapping.getSpecificity(event) > 0) {
266 // // When using system menu bar, the event is handled natively
267 // // before the application receives it : we just consume the event
268 // // so the editing action is not performed a second time by the app.
269 // if (menuBarController.getMenuBar().isUseSystemMenuBar()) {
270 // event.consume();
271 // }
272 // }
273 // });
274 }
275
276 //------------------------------------------------------------------
277 // Hierarchy TreeView + select all
278 //------------------------------------------------------------------
279 // Select all is handled natively by TreeView (= hierarchy panel control).
280 boolean modifierDown = (EditorPlatform.IS_MAC ? event.isMetaDown() : event.isControlDown());
281 boolean isSelectAll = KeyCode.A.equals(event.getCode()) && modifierDown;
282 if (getHierarchyPanelController().getPanelControl().isFocused() && isSelectAll) {
283 // Consume the event so the control action is not performed natively.
284 event.consume();
285 // When using system menu bar, the control action is performed by the app.
286 if (menuBarController.getMenuBar().isUseSystemMenuBar() == false) {
287 if (canPerformControlAction(DocumentControlAction.SELECT_ALL)) {
288 performControlAction(DocumentControlAction.SELECT_ALL);
289 }
290 }
291 }
292
293 // MenuItems define a single accelerator.
2138 }
2139 }
2140
2141 return result;
2142 }
2143
2144
2145 private void performHelp() {
2146 try {
2147 EditorPlatform.open(EditorPlatform.DOCUMENTATION_URL);
2148 } catch (IOException ioe) {
2149 final ErrorDialog errorDialog = new ErrorDialog(null);
2150 errorDialog.setMessage(I18N.getString("alert.help.failure.message", EditorPlatform.DOCUMENTATION_URL));
2151 errorDialog.setDetails(I18N.getString("alert.messagebox.failure.details"));
2152 errorDialog.setDebugInfoWithThrowable(ioe);
2153 errorDialog.showAndWait();
2154 }
2155 }
2156 }
2157
2158 ///**
2159 // * This class setup key bindings for the TextInputControl type classes and
2160 // * provide a way to access the key binding list.
2161 // */
2162 //class SBTextInputControlBindings extends TextInputControlBindings {
2163 //
2164 // private SBTextInputControlBindings() {
2165 // assert false;
2166 // }
2167 //
2168 // public static List<KeyBinding> getBindings() {
2169 // return BINDINGS;
2170 // }
2171 //}
|