apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/DocumentWindowController.java

Print this page
rev 9240 : 8076423: JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization


  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 //}