Пример #1
0
  /**
   * On mouse release add the elements to the diagram
   *
   * @param me the mouse event
   */
  @Override
  public void mouseReleased(final MouseEvent me) {
    if (me.isConsumed()) {
      if (LOG.isDebugEnabled()) {
        LOG.debug("MouseReleased but rejected as already consumed");
      }
      return;
    }
    // TODO: Use per-project undo manager, not global
    UndoManager.getInstance().addMementoLock(this);
    start();
    MutableGraphModel gm = (MutableGraphModel) editor.getGraphModel();

    final int x = me.getX();
    final int y = me.getY();
    editor.damageAll();
    final Point snapPt = new Point(x, y);
    editor.snap(snapPt);
    editor.damageAll();
    int count = 0;

    Layer lay = editor.getLayerManager().getActiveLayer();
    GraphNodeRenderer renderer = editor.getGraphNodeRenderer();

    final List<FigNode> placedFigs = new ArrayList<FigNode>(modelElements.size());

    ArgoDiagram diag = DiagramUtils.getActiveDiagram();
    if (diag instanceof UMLDiagram) {
      for (final Object node : modelElements) {
        if (((UMLDiagram) diag).doesAccept(node)) {
          final FigNode pers = renderer.getFigNodeFor(gm, lay, node, null);
          pers.setLocation(snapPt.x + (count++ * 100), snapPt.y);
          if (LOG.isDebugEnabled()) {
            LOG.debug("mouseMoved: Location set (" + pers.getX() + "," + pers.getY() + ")");
          }
          // TODO: Use per-project undo manager, not global
          UndoManager.getInstance().startChain();
          editor.add(pers);
          gm.addNode(node);
          if (addRelatedEdges) {
            gm.addNodeRelatedEdges(node);
          }

          Fig encloser = null;
          final Rectangle bbox = pers.getBounds();
          final List<Fig> otherFigs = lay.getContents();
          for (final Fig otherFig : otherFigs) {
            if (!(otherFig.getUseTrapRect())) {
              continue;
            }
            if (!(otherFig instanceof FigNode)) {
              continue;
            }
            if (!otherFig.isVisible()) {
              continue;
            }
            if (otherFig.equals(pers)) {
              continue;
            }
            final Rectangle trap = otherFig.getTrapRect();
            if (trap != null
                && trap.contains(bbox.x, bbox.y)
                && trap.contains(bbox.x + bbox.width, bbox.y + bbox.height)) {
              encloser = otherFig;
            }
          }
          pers.setEnclosingFig(encloser);

          placedFigs.add(pers);
        }
      }
    }

    // TODO: Use per-project undo manager, not global
    UndoManager.getInstance().removeMementoLock(this);
    if (UndoManager.getInstance().isGenerateMementos()) {
      AddToDiagramMemento memento = new AddToDiagramMemento(editor, placedFigs);
      UndoManager.getInstance().addMemento(memento);
    }
    UndoManager.getInstance().addMementoLock(this);
    editor.getSelectionManager().select(placedFigs);

    done();
    me.consume();
  }