Beispiel #1
0
 @Override
 protected void unregisterListeners() {
   for (IViewer<Node> viewer : getDomain().getViewers().values()) {
     viewer.viewerFocusedProperty().removeListener(viewerFocusChangeListeners.remove(viewer));
     Scene scene = viewer.getRootPart().getVisual().getScene();
     if (pressedFilterMap.containsKey(scene)) {
       scene.removeEventFilter(KeyEvent.KEY_PRESSED, pressedFilterMap.remove(scene));
     }
     if (releasedFilterMap.containsKey(scene)) {
       scene.removeEventFilter(KeyEvent.KEY_RELEASED, releasedFilterMap.remove(scene));
     }
     if (typedFilterMap.containsKey(scene)) {
       scene.removeEventFilter(KeyEvent.KEY_TYPED, typedFilterMap.remove(scene));
     }
   }
 }
Beispiel #2
0
  @SuppressWarnings("serial")
  @Override
  protected void registerListeners() {
    for (final IViewer<Node> viewer : getDomain().getViewers().values()) {
      // check if we have access to a FocusModel<Node>
      FocusModel<Node> focusModel = viewer.getAdapter(new TypeToken<FocusModel<Node>>() {});
      if (focusModel == null) {
        throw new IllegalStateException("Cannot find FocusModel<Node>.");
      }

      // store the key that is initially pressed so that we can wait for
      // it to be released
      final Set<KeyCode> pressedKeys = new HashSet<>();

      // register a viewer focus change listener to release the initially
      // pressed key when the window loses focus
      ChangeListener<Boolean> viewerFocusChangeListener =
          new ChangeListener<Boolean>() {
            @Override
            public void changed(
                ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
              if (newValue == null || !newValue) {
                if (pressedKeys.isEmpty()) {
                  return;
                }
                // cancel target policies
                for (IFXOnTypePolicy policy : getActivePolicies(viewer)) {
                  policy.unfocus();
                }
                // clear active policies and close execution
                // transaction
                clearActivePolicies(viewer);
                getDomain().closeExecutionTransaction(FXTypeTool.this);
                // unset pressed keys
                pressedKeys.clear();
              }
            }
          };
      viewer.viewerFocusedProperty().addListener(viewerFocusChangeListener);
      viewerFocusChangeListeners.put(viewer, viewerFocusChangeListener);

      Scene scene = viewer.getRootPart().getVisual().getScene();
      if (pressedFilterMap.containsKey(scene)) {
        continue;
      }

      // generate event handlers
      EventHandler<KeyEvent> pressedFilter =
          new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
              // store initially pressed key
              // System.out.println("pressed " + event);
              if (pressedKeys.isEmpty()) {
                // open exec tx on first key press
                getDomain().openExecutionTransaction(FXTypeTool.this);
                // determine target policies on first key press
                setActivePolicies(viewer, getTargetPolicies(event));
              }
              pressedKeys.add(event.getCode());

              // notify target policies
              for (IFXOnTypePolicy policy : getActivePolicies(viewer)) {
                policy.pressed(event);
              }
            }
          };
      pressedFilterMap.put(scene, pressedFilter);

      EventHandler<KeyEvent> releasedFilter =
          new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
              // System.out.println("released " + event);

              // notify target policies
              for (IFXOnTypePolicy policy : getActivePolicies(viewer)) {
                policy.released(event);
              }

              // check if the last pressed key is released now
              if (pressedKeys.size() == 1 && pressedKeys.contains(event.getCode())) {
                // clear active policies and close execution transaction
                // only when the initially pressed key is released
                clearActivePolicies(viewer);
                getDomain().closeExecutionTransaction(FXTypeTool.this);
              }
              pressedKeys.remove(event.getCode());
            }
          };
      releasedFilterMap.put(scene, releasedFilter);

      EventHandler<KeyEvent> typedFilter =
          new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
              // System.out.println("typed " + event);
              if (pressedKeys.isEmpty()) {
                getDomain().openExecutionTransaction(FXTypeTool.this);
              }
              Collection<? extends IFXOnTypePolicy> policies = getTargetPolicies(event);
              // active policies are unnecessary because TYPED is not a
              // gesture, just one event at one point in time
              for (IFXOnTypePolicy policy : policies) {
                policy.typed(event);
              }
              if (pressedKeys.isEmpty()) {
                getDomain().closeExecutionTransaction(FXTypeTool.this);
              }
            }
          };
      typedFilterMap.put(scene, typedFilter);

      scene.addEventFilter(KeyEvent.KEY_PRESSED, pressedFilter);
      scene.addEventFilter(KeyEvent.KEY_RELEASED, releasedFilter);
      scene.addEventFilter(KeyEvent.KEY_TYPED, typedFilter);
    }
  }