예제 #1
0
 @Override
 protected void attachToAnchorageVisual(IVisualPart<Node, ? extends Node> anchorage, String role) {
   @SuppressWarnings("serial")
   Provider<? extends IFXAnchor> anchorProvider =
       anchorage.getAdapter(AdapterKey.get(new TypeToken<Provider<? extends IFXAnchor>>() {}));
   IFXAnchor anchor = anchorProvider == null ? null : anchorProvider.get();
   if (role.equals("START")) {
     getVisual().setStartAnchor(anchor);
   } else if (role.equals("END")) {
     getVisual().setEndAnchor(anchor);
   } else {
     throw new IllegalStateException("Cannot attach to anchor with role <" + role + ">.");
   }
 }
예제 #2
0
 @Override
 public void setContent(Object content) {
   super.setContent(content);
   if (content == null) {
     return;
   }
   if (!(content instanceof Edge)) {
     throw new IllegalArgumentException("Content of wrong type!");
   }
   final FXConnection visual = getVisual();
   setAdapter(
       AdapterKey.get(
           Provider.class, FXDefaultFeedbackPartFactory.SELECTION_FEEDBACK_GEOMETRY_PROVIDER),
       new Provider<IGeometry>() {
         @Override
         public IGeometry get() {
           return FXUtils.localToParent(
               visual,
               FXUtils.localToParent(
                   visual.getCurveNode(),
                   ((FXGeometryNode<?>) visual.getCurveNode()).getGeometry()));
         }
       });
   setAdapter(
       AdapterKey.get(
           Provider.class, FXDefaultFeedbackPartFactory.HOVER_FEEDBACK_GEOMETRY_PROVIDER),
       new Provider<IGeometry>() {
         @Override
         public IGeometry get() {
           return FXUtils.localToParent(
               visual,
               FXUtils.localToParent(
                   visual.getCurveNode(),
                   ((FXGeometryNode<?>) visual.getCurveNode()).getGeometry()));
         }
       });
 }
예제 #3
0
  @Override
  public IUndoableOperation commit() {
    final IUndoableOperation updateVisualOperation = super.commit();
    if (updateVisualOperation == null) {
      return null;
    }

    // commit changes to model
    final FXGeometricShapePart host = getHost();
    final FXGeometricShape hostContent = host.getContent();

    // determine transformation
    @SuppressWarnings("serial")
    Provider<Affine> affineProvider =
        host.getAdapter(
            AdapterKey.<Provider<? extends Affine>>get(
                new TypeToken<Provider<? extends Affine>>() {},
                FXTransformPolicy.TRANSFORMATION_PROVIDER_ROLE));
    AffineTransform tx = JavaFX2Geometry.toAffineTransform(affineProvider.get());
    final AffineTransform oldTransform = hostContent.getTransform();
    final AffineTransform newTransform =
        new AffineTransform(
            tx.getM00(),
            tx.getM10(),
            tx.getM01(),
            tx.getM11(),
            tx.getTranslateX(),
            tx.getTranslateY());

    // create operation to write the changes to the model
    final IUndoableOperation updateModelOperation =
        new AbstractOperation("Update Model") {

          @Override
          public IStatus execute(IProgressMonitor monitor, IAdaptable info)
              throws ExecutionException {
            hostContent.setTransform(newTransform);
            return Status.OK_STATUS;
          }

          @Override
          public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
            return execute(monitor, info);
          }

          @Override
          public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
            hostContent.setTransform(oldTransform);
            return Status.OK_STATUS;
          }
        };
    // compose operations
    IUndoableOperation compositeOperation =
        new ForwardUndoCompositeOperation(updateVisualOperation.getLabel()) {
          {
            add(updateVisualOperation);
            add(updateModelOperation);
          }
        };

    return compositeOperation;
  }
예제 #4
0
  @SuppressWarnings("serial")
  protected List<IHandlePart<Node, ? extends Node>> createSingleSelectionHandleParts(
      final IVisualPart<Node, ? extends Node> target, Map<Object, Object> contextMap) {
    List<IHandlePart<Node, ? extends Node>> handleParts =
        new ArrayList<IHandlePart<Node, ? extends Node>>();

    // handle geometry is in target visual local coordinate space.
    final Provider<IGeometry> selectionHandlesGeometryInTargetLocalProvider =
        target.<Provider<IGeometry>>getAdapter(
            AdapterKey.get(
                new TypeToken<Provider<? extends IGeometry>>() {},
                SELECTION_HANDLES_GEOMETRY_PROVIDER));

    // generate handles from selection handles geometry
    IGeometry selectionHandlesGeometry =
        (selectionHandlesGeometryInTargetLocalProvider != null)
            ? selectionHandlesGeometryInTargetLocalProvider.get()
            : null;

    if (selectionHandlesGeometry == null) {
      return handleParts; // empty
    }

    // we will need a provider that returns the geometry in scene
    // coordinates
    final Provider<IGeometry> selectionHandlesGeometryInSceneProvider =
        new Provider<IGeometry>() {
          @Override
          public IGeometry get() {
            return FXUtils.localToScene(
                target.getVisual(), selectionHandlesGeometryInTargetLocalProvider.get());
          }
        };
    Provider<BezierCurve[]> selectionHandlesSegmentsInSceneProvider =
        createSegmentsProvider(selectionHandlesGeometryInSceneProvider);

    if (selectionHandlesGeometry instanceof ICurve) {
      // assure the geometry provider that is handed over returns the
      // geometry in scene coordinates
      handleParts.addAll(
          createCurveSelectionHandleParts(
              target, selectionHandlesSegmentsInSceneProvider, contextMap));
    } else if (selectionHandlesGeometry instanceof IShape) {
      if (selectionHandlesGeometry instanceof Rectangle) {
        // create corner handles
        handleParts.addAll(
            createTightBoundsSelectionHandleParts(
                Collections.singletonList(target),
                selectionHandlesSegmentsInSceneProvider,
                contextMap));
      } else {
        // create segment handles (based on outline)
        BezierCurve[] segments = selectionHandlesSegmentsInSceneProvider.get();
        for (int i = 0; i < segments.length; i++) {
          IHandlePart<Node, ? extends Node> hp =
              createSelectionSegmentHandlePart(
                  target, selectionHandlesSegmentsInSceneProvider, segments.length, i, contextMap);
          if (hp != null) {
            handleParts.add(hp);
          }
        }
      }
    } else {
      throw new IllegalStateException(
          "Unable to generate handles for this handle geometry. Expected ICurve or IShape, but got: "
              + selectionHandlesGeometry);
    }
    return handleParts;
  }
예제 #5
0
  @SuppressWarnings("serial")
  protected List<IHandlePart<Node, ? extends Node>> createHoverHandleParts(
      final IVisualPart<Node, ? extends Node> target,
      final HoverBehavior<Node> contextBehavior,
      final Map<Object, Object> contextMap) {
    List<IHandlePart<Node, ? extends Node>> handleParts =
        new ArrayList<IHandlePart<Node, ? extends Node>>();

    // handle geometry is in target visual local coordinate space.
    final Provider<? extends IGeometry> hoverHandlesGeometryInTargetLocalProvider =
        target.getAdapter(
            AdapterKey.get(
                new TypeToken<Provider<? extends IGeometry>>() {},
                HOVER_HANDLES_GEOMETRY_PROVIDER));

    // generate handles from selection handles geometry
    IGeometry hoverHandlesGeometry =
        (hoverHandlesGeometryInTargetLocalProvider != null)
            ? hoverHandlesGeometryInTargetLocalProvider.get()
            : null;
    if (hoverHandlesGeometry == null) {
      return handleParts; // empty
    }

    // we will need a provider that returns the geometry in scene
    // coordinates
    final Provider<? extends IGeometry> hoverHandlesGeometryInSceneProvider =
        new Provider<IGeometry>() {
          @Override
          public IGeometry get() {
            return FXUtils.localToScene(
                target.getVisual(), hoverHandlesGeometryInTargetLocalProvider.get());
          }
        };

    // the handle parts are located based on the segments of the handle
    // geometry
    Provider<BezierCurve[]> hoverHandlesSegmentsInSceneProvider =
        new Provider<BezierCurve[]>() {
          @Override
          public BezierCurve[] get() {
            IGeometry handleGeometry = hoverHandlesGeometryInSceneProvider.get();
            if (handleGeometry instanceof IShape) {
              List<BezierCurve> segments = new ArrayList<BezierCurve>();
              for (ICurve os : ((IShape) handleGeometry).getOutlineSegments()) {
                segments.addAll(Arrays.asList(os.toBezier()));
              }
              return segments.toArray(new BezierCurve[] {});
            } else if (handleGeometry instanceof ICurve) {
              return ((ICurve) handleGeometry).toBezier();
            } else {
              throw new IllegalStateException(
                  "Unable to determine handle position: Expected IShape or ICurve but got: "
                      + handleGeometry);
            }
          }
        };

    // create segment handles (based on outline)
    BezierCurve[] segments = hoverHandlesSegmentsInSceneProvider.get();
    for (int i = 0; i < segments.length; i++) {
      IHandlePart<Node, ? extends Node> hp =
          createHoverSegmentHandlePart(
              target, hoverHandlesSegmentsInSceneProvider, segments.length, i, contextMap);
      if (hp != null) {
        handleParts.add(hp);
      }
    }

    return handleParts;
  }
예제 #6
0
 /**
  * Adds (default) {@link AdapterMap} bindings for {@link AbstractViewer} and all sub-classes. May
  * be overwritten by sub-classes to change the default bindings.
  *
  * @param adapterMapBinder The {@link MapBinder} to be used for the binding registration. In this
  *     case, will be obtained from {@link AdapterMaps#getAdapterMapBinder(Binder, Class)} using
  *     {@link AbstractViewer} as a key.
  * @see AdapterMaps#getAdapterMapBinder(Binder, Class)
  */
 protected void bindAbstractViewerAdapters(MapBinder<AdapterKey<?>, Object> adapterMapBinder) {
   // bind (default) viewer models as adapters
   adapterMapBinder.addBinding(AdapterKey.get(ContentModel.class)).to(ContentModel.class);
   adapterMapBinder.addBinding(AdapterKey.get(ViewportModel.class)).to(ViewportModel.class);
   adapterMapBinder.addBinding(AdapterKey.get(GridModel.class)).to(GridModel.class);
 }