Example #1
0
 public void setSelected(Collection<CanvasObject> shapes, boolean value) {
   if (value) {
     ArrayList<CanvasObject> added;
     added = new ArrayList<>(shapes.size());
     for (CanvasObject shape : shapes) {
       if (selected.add(shape)) {
         added.add(shape);
       }
     }
     if (!added.isEmpty()) {
       fireChanged(SelectionEvent.ACTION_ADDED, added);
     }
   } else {
     ArrayList<CanvasObject> removed;
     removed = new ArrayList<>(shapes.size());
     for (CanvasObject shape : shapes) {
       if (selected.remove(shape)) {
         suppressed.remove(shape);
         Handle h = selectedHandle;
         if (h != null && h.getObject() == shape) setHandleSelected(null);
         removed.add(shape);
       }
     }
     if (!removed.isEmpty()) {
       fireChanged(SelectionEvent.ACTION_REMOVED, removed);
     }
   }
 }
Example #2
0
 void modelChanged(CanvasModelEvent event) {
   int action = event.getAction();
   switch (action) {
     case CanvasModelEvent.ACTION_REMOVED:
       Collection<? extends CanvasObject> affected = event.getAffected();
       if (affected != null) {
         selected.removeAll(affected);
         suppressed.keySet().removeAll(affected);
         Handle h = selectedHandle;
         if (h != null && affected.contains(h.getObject())) {
           setHandleSelected(null);
         }
       }
       break;
     case CanvasModelEvent.ACTION_HANDLE_DELETED:
       if (event.getHandle().equals(selectedHandle)) {
         setHandleSelected(null);
       }
       break;
     case CanvasModelEvent.ACTION_HANDLE_MOVED:
       HandleGesture gesture = event.getHandleGesture();
       if (gesture.getHandle().equals(selectedHandle)) {
         setHandleSelected(gesture.getResultingHandle());
       }
   }
 }
Example #3
0
  public void setHandleGesture(HandleGesture gesture) {
    HandleGesture g = curHandleGesture;
    if (g != null) suppressed.remove(g.getHandle().getObject());

    Handle h = gesture.getHandle();
    suppressed.put(h.getObject(), MOVING_HANDLE);
    curHandleGesture = gesture;
  }
Example #4
0
 public void setHandleSelected(Handle handle) {
   Handle cur = selectedHandle;
   boolean same = cur == null ? handle == null : cur.equals(handle);
   if (!same) {
     selectedHandle = handle;
     curHandleGesture = null;
     Collection<CanvasObject> objs;
     if (handle == null) {
       objs = Collections.emptySet();
     } else {
       objs = Collections.singleton(handle.getObject());
     }
     fireChanged(SelectionEvent.ACTION_HANDLE, objs);
   }
 }
Example #5
0
 private Handle[] getHandleArray(HandleGesture gesture) {
     if (gesture == null) {
         return new Handle[] { new Handle(this, p0), new Handle(this, p1),
                 new Handle(this, p2) };
     } else {
         Handle g = gesture.getHandle();
         int gx = g.getX() + gesture.getDeltaX();
         int gy = g.getY() + gesture.getDeltaY();
         Handle[] ret = { new Handle(this, p0), new Handle(this, p1),
                 new Handle(this, p2) };
         if (g.isAt(p0)) {
             if (gesture.isShiftDown()) {
                 Location p = LineUtil.snapTo8Cardinals(p2, gx, gy);
                 ret[0] = new Handle(this, p);
             } else {
                 ret[0] = new Handle(this, gx, gy);
             }
         } else if (g.isAt(p2)) {
             if (gesture.isShiftDown()) {
                 Location p = LineUtil.snapTo8Cardinals(p0, gx, gy);
                 ret[2] = new Handle(this, p);
             } else {
                 ret[2] = new Handle(this, gx, gy);
             }
         } else if (g.isAt(p1)) {
             if (gesture.isShiftDown()) {
                 double x0 = p0.getX();
                 double y0 = p0.getY();
                 double x1 = p2.getX();
                 double y1 = p2.getY();
                 double midx = (x0 + x1) / 2;
                 double midy = (y0 + y1) / 2;
                 double dx = x1 - x0;
                 double dy = y1 - y0;
                 double[] p = LineUtil.nearestPointInfinite(gx, gy,
                         midx, midy, midx - dy, midy + dx);
                 gx = (int) Math.round(p[0]);
                 gy = (int) Math.round(p[1]);
             }
             if (gesture.isAltDown()) {
                 double[] e0 = { p0.getX(), p0.getY() };
                 double[] e1 = { p2.getX(), p2.getY() };
                 double[] mid = { gx, gy };
                 double[] ct = CurveUtil.interpolate(e0, e1, mid);
                 gx = (int) Math.round(ct[0]);
                 gy = (int) Math.round(ct[1]);
             }
             ret[1] = new Handle(this, gx, gy);
         }
         return ret;
     }
 }
	@Override
	public Collection<CanvasObject> getObjects() {
		return Collections.singleton(handle.getObject());
	}
  @Override
  public void computeEnabled() {
    Project proj = canvas.getProject();
    Circuit circ = canvas.getCircuit();
    Selection sel = canvas.getSelection();
    boolean selEmpty = sel.isEmpty();
    boolean canChange = proj.getLogisimFile().contains(circ);
    boolean clipExists = !Clipboard.isEmpty();
    boolean selHasRemovable = false;
    for (CanvasObject o : sel.getSelected()) {
      if (!(o instanceof AppearanceElement)) {
        selHasRemovable = true;
      }
    }
    boolean canRaise;
    boolean canLower;
    if (!selEmpty && canChange) {
      Map<CanvasObject, Integer> zs = ZOrder.getZIndex(sel.getSelected(), canvas.getModel());
      int zmin = Integer.MAX_VALUE;
      int zmax = Integer.MIN_VALUE;
      int count = 0;
      for (Map.Entry<CanvasObject, Integer> entry : zs.entrySet()) {
        if (!(entry.getKey() instanceof AppearanceElement)) {
          count++;
          int z = entry.getValue().intValue();
          if (z < zmin) zmin = z;
          if (z > zmax) zmax = z;
        }
      }
      int maxPoss = AppearanceCanvas.getMaxIndex(canvas.getModel());
      if (count > 0 && count <= maxPoss) {
        canRaise = zmin <= maxPoss - count;
        canLower = zmax >= count;
      } else {
        canRaise = false;
        canLower = false;
      }
    } else {
      canRaise = false;
      canLower = false;
    }
    boolean canAddCtrl = false;
    boolean canRemCtrl = false;
    Handle handle = sel.getSelectedHandle();
    if (handle != null && canChange) {
      CanvasObject o = handle.getObject();
      canAddCtrl = o.canInsertHandle(handle.getLocation()) != null;
      canRemCtrl = o.canDeleteHandle(handle.getLocation()) != null;
    }

    setEnabled(LogisimMenuBar.CUT, selHasRemovable && canChange);
    setEnabled(LogisimMenuBar.COPY, !selEmpty);
    setEnabled(LogisimMenuBar.PASTE, canChange && clipExists);
    setEnabled(LogisimMenuBar.DELETE, selHasRemovable && canChange);
    setEnabled(LogisimMenuBar.DUPLICATE, !selEmpty && canChange);
    setEnabled(LogisimMenuBar.SELECT_ALL, true);
    setEnabled(LogisimMenuBar.RAISE, canRaise);
    setEnabled(LogisimMenuBar.LOWER, canLower);
    setEnabled(LogisimMenuBar.RAISE_TOP, canRaise);
    setEnabled(LogisimMenuBar.LOWER_BOTTOM, canLower);
    setEnabled(LogisimMenuBar.ADD_CONTROL, canAddCtrl);
    setEnabled(LogisimMenuBar.REMOVE_CONTROL, canRemCtrl);
  }
  private CanvasModelEvent(CanvasModel source, int action, Handle handle) {
    this(source, action, Collections.singleton(handle.getObject()));

    this.handle = handle;
  }