Search in sources :

Example 1 with ElipseShape

use of cbit.gui.graph.ElipseShape in project vcell by virtualcell.

the class ReactionCartoonTool method mouseDragged.

@Override
public void mouseDragged(MouseEvent event) {
    if (getGraphPane().getComponentCount() > 0) {
        // we're editing, cancel
        stopEditing();
    }
    if (event.isPopupTrigger()) {
        return;
    }
    boolean bShift = (event.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK;
    boolean bCntrl = (event.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK;
    if (mode == Mode.SELECT && bStartRxContainerLabel) {
        if (dragStructTimer != null) {
            dragStructTimer.stop();
        }
        Point dragPointWorld = getGraphModel().getResizeManager().unzoom(event.getPoint());
        RXContainerDropTargetInfo lastTrueRXContainerDropTargetInfo = getSelectedContainerDropTargetInfo();
        lastRXContainerDropTargetInfoMap = updateRXContainerDropTargetInfoMap(dragPointWorld);
        RXContainerDropTargetInfo currentTrueRXContainerDropTargetInfo = getSelectedContainerDropTargetInfo();
        // System.out.println(lastTrueRXContainerDropTargetInfo+" "+currentTrueRXContainerDropTargetInfo);
        if (dragStructTimer != null || !Compare.isEqualOrNull(lastTrueRXContainerDropTargetInfo, currentTrueRXContainerDropTargetInfo)) {
            activateDropTargetEnable();
            getGraphPane().repaint();
        }
        return;
    }
    try {
        switch(mode) {
            case SELECT:
                {
                    Point worldPoint = screenToWorld(event.getX(), event.getY());
                    if (bMoving) {
                        if (movingShape instanceof ReactionContainerShape) {
                            bMoving = false;
                            return;
                        }
                        List<Shape> selectedShapes = getReactionCartoon().getSelectedShapes();
                        // constrain to stay within the corresponding parent for the
                        // "movingShape" as well as all other selected (hence
                        // moving) shapes.
                        Point movingParentLoc = movingShape.getParent().getSpaceManager().getAbsLoc();
                        Dimension movingParentSize = movingShape.getParent().getSpaceManager().getSize();
                        worldPoint.x = Math.max(movingOffsetWorld.x + movingParentLoc.x, Math.min(movingOffsetWorld.x + movingParentLoc.x + movingParentSize.width - movingShape.getSpaceManager().getSize().width, worldPoint.x));
                        worldPoint.y = Math.max(movingOffsetWorld.y + movingParentLoc.y, Math.min(movingOffsetWorld.x + movingParentLoc.y + movingParentSize.height - movingShape.getSpaceManager().getSize().height, worldPoint.y));
                        for (Shape shape : selectedShapes) {
                            if (shape != movingShape) {
                                Point selectedParentLoc = shape.getParent().getSpaceManager().getAbsLoc();
                                Dimension selectedParentSize = shape.getParent().getSpaceManager().getSize();
                                int selectedMovingOffsetX = movingOffsetWorld.x + (movingShape.getSpaceManager().getAbsLoc().x - shape.getSpaceManager().getAbsLoc().x);
                                int selectedMovingOffsetY = movingOffsetWorld.y + (movingShape.getSpaceManager().getAbsLoc().y - shape.getSpaceManager().getAbsLoc().y);
                                worldPoint.x = Math.max(selectedMovingOffsetX + selectedParentLoc.x, Math.min(selectedMovingOffsetX + selectedParentLoc.x + selectedParentSize.width - shape.getSpaceManager().getSize().width, worldPoint.x));
                                worldPoint.y = Math.max(selectedMovingOffsetY + selectedParentLoc.y, Math.min(selectedMovingOffsetY + selectedParentLoc.y + selectedParentSize.height - shape.getSpaceManager().getSize().height, worldPoint.y));
                            }
                        }
                        getGraphPane().setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
                        Point newMovingPoint = new Point(worldPoint.x - movingOffsetWorld.x, worldPoint.y - movingOffsetWorld.y);
                        int deltaX = newMovingPoint.x - movingPointWorld.x;
                        int deltaY = newMovingPoint.y - movingPointWorld.y;
                        movingPointWorld = newMovingPoint;
                        movingShape.getSpaceManager().setRelPos(movingPointWorld.x - movingParentLoc.x, movingPointWorld.y - movingParentLoc.y);
                        // them also
                        for (Shape shape : selectedShapes) {
                            if (shape != movingShape) {
                                shape.getSpaceManager().move(deltaX, deltaY);
                            }
                        }
                        getGraphPane().invalidate();
                        ((JViewport) getGraphPane().getParent()).revalidate();
                        getGraphPane().repaint();
                    } else if (bRectStretch) {
                        // constain to stay within parent
                        Point parentLoc = rectShape.getParent().getSpaceManager().getAbsLoc();
                        Dimension parentSize = rectShape.getParent().getSpaceManager().getSize();
                        worldPoint.x = Math.max(1, Math.min(parentSize.width - 1, worldPoint.x - parentLoc.x)) + parentLoc.x;
                        worldPoint.y = Math.max(1, Math.min(parentSize.height - 1, worldPoint.y - parentLoc.y)) + parentLoc.y;
                        getGraphPane().setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
                        // getGraphPane().repaint();
                        Graphics2D g = (Graphics2D) getGraphPane().getGraphics();
                        AffineTransform oldTransform = g.getTransform();
                        g.scale(0.01 * getReactionCartoon().getZoomPercent(), 0.01 * getReactionCartoon().getZoomPercent());
                        g.setXORMode(Color.white);
                        rectShape.setEnd(endPointWorld);
                        rectShape.paint(g, 0, 0);
                        endPointWorld = worldPoint;
                        rectShape.setEnd(endPointWorld);
                        rectShape.paint(g, 0, 0);
                        g.setTransform(oldTransform);
                    } else {
                        Shape shape = (getGraphModel().getSelectedShape() != null ? getGraphModel().getSelectedShape() : getReactionCartoon().pickWorld(worldPoint));
                        if (!bCntrl && !bShift && (shape instanceof SpeciesContextShape || shape instanceof ReactionStepShape || shape instanceof RuleParticipantSignatureDiagramShape || shape instanceof ReactionRuleDiagramShape)) {
                            bMoving = true;
                            movingShape = shape;
                            movingPointWorld = shape.getSpaceManager().getAbsLoc();
                            movingOffsetWorld = new Point(worldPoint.x - movingPointWorld.x, worldPoint.y - movingPointWorld.y);
                        } else if (shape instanceof ReactionContainerShape || bShift || bCntrl) {
                            if (rectShape == null) {
                                return;
                            }
                            if (startPointWorld != null && worldPoint != null && startPointWorld.equals(worldPoint)) {
                                // Don't start stretching until mouse moves at least 1 from startpoint
                                return;
                            }
                            bRectStretch = true;
                            endPointWorld = new Point((startPointWorld != null ? startPointWorld.x : worldPoint.x), (startPointWorld != null ? startPointWorld.y : worldPoint.y));
                            rectShape.setEnd(endPointWorld);
                            if (!(shape instanceof ReactionContainerShape)) {
                                shape.getParent().addChildShape(rectShape);
                            } else {
                                shape.addChildShape(rectShape);
                            }
                            Graphics2D g = (Graphics2D) getGraphPane().getGraphics();
                            AffineTransform oldTransform = g.getTransform();
                            g.scale(0.01 * getReactionCartoon().getZoomPercent(), 0.01 * getReactionCartoon().getZoomPercent());
                            g.setXORMode(Color.white);
                            rectShape.paint(g, 0, 0);
                            g.setTransform(oldTransform);
                        }
                    }
                    break;
                }
            case LINE:
            case LINEDIRECTED:
            case LINECATALYST:
                {
                    int x = event.getX();
                    int y = event.getY();
                    Point worldPoint = new Point((int) (x * 100.0 / getReactionCartoon().getZoomPercent()), (int) (y * 100.0 / getReactionCartoon().getZoomPercent()));
                    if (bLineStretch) {
                        // repaint last location with XOR
                        Graphics2D g = (Graphics2D) getGraphPane().getGraphics();
                        g.setXORMode(Color.white);
                        edgeShape.setEnd(endPointWorld);
                        AffineTransform oldTransform = g.getTransform();
                        g.scale(getReactionCartoon().getZoomPercent() * 0.01, getReactionCartoon().getZoomPercent() * 0.01);
                        edgeShape.paint_NoAntiAlias(g, 0, 0);
                        g.setTransform(oldTransform);
                        // set label and color for line depending on attachment area on ReactionStepShape
                        LineType lineType;
                        if (Mode.LINE.equals(mode)) {
                            SpeciesContext speciesContext = (SpeciesContext) edgeShape.getStartShape().getModelObject();
                            lineType = getLineTypeFromAttachment(speciesContext, worldPoint);
                        } else if (Mode.LINECATALYST.equals(mode)) {
                            lineType = LineType.CATALYST;
                        } else if (edgeShape.getStartShape() instanceof SpeciesContextShape) {
                            lineType = LineType.REACTANT;
                        } else {
                            lineType = LineType.PRODUCT;
                        }
                        edgeShape.setLabel(lineType.getLabel());
                        edgeShape.setForgroundColor(lineType.getColor());
                        getGraphPane().setCursor(lineType.getCursor());
                        // move line and paint with XOR
                        endPointWorld = worldPoint;
                        edgeShape.setEnd(worldPoint);
                        oldTransform = g.getTransform();
                        g.scale(getReactionCartoon().getZoomPercent() * 0.01, getReactionCartoon().getZoomPercent() * 0.01);
                        edgeShape.paint_NoAntiAlias(g, 0, 0);
                        g.setTransform(oldTransform);
                    } else {
                        if (edgeShape != null) {
                            return;
                        }
                        if (startShape instanceof SpeciesContextShape || ((Mode.LINEDIRECTED.equals(mode) || Mode.LINECATALYST.equals(mode)) && startShape instanceof ElipseShape)) {
                            ElipseShape startElipseShape = (ElipseShape) startShape;
                            bLineStretch = true;
                            endPointWorld = worldPoint;
                            edgeShape = new RubberBandEdgeShape(startElipseShape, null, getReactionCartoon());
                            edgeShape.setEnd(worldPoint);
                            Graphics2D g = (Graphics2D) getGraphPane().getGraphics();
                            g.setXORMode(Color.white);
                            AffineTransform oldTransform = g.getTransform();
                            g.scale(getReactionCartoon().getZoomPercent() * 0.01, getReactionCartoon().getZoomPercent() * 0.01);
                            edgeShape.paint(g, 0, 0);
                            g.setTransform(oldTransform);
                        } else if ((Mode.LINEDIRECTED.equals(mode) || Mode.LINECATALYST.equals(mode)) && startShape instanceof ContainerShape) {
                            bLineStretch = true;
                            endPointWorld = worldPoint;
                            edgeShape = new RubberBandEdgeShape((ElipseShape) null, null, getReactionCartoon());
                            edgeShape.setStart(startPointWorld);
                            edgeShape.setEnd(worldPoint);
                            Graphics2D g = (Graphics2D) getGraphPane().getGraphics();
                            g.setXORMode(Color.white);
                            AffineTransform oldTransform = g.getTransform();
                            g.scale(getReactionCartoon().getZoomPercent() * 0.01, getReactionCartoon().getZoomPercent() * 0.01);
                            edgeShape.paint(g, 0, 0);
                            g.setTransform(oldTransform);
                        }
                    }
                    break;
                }
            default:
                {
                    break;
                }
        }
    } catch (Exception e) {
        System.out.println("CartoonTool.mouseDragged: uncaught exception");
        e.printStackTrace(System.out);
    }
}
Also used : ReactionContainerShape(cbit.vcell.graph.ReactionContainerShape) SpeciesContextShape(cbit.vcell.graph.SpeciesContextShape) RubberBandRectShape(cbit.gui.graph.RubberBandRectShape) ProductShape(cbit.vcell.graph.ProductShape) ContainerShape(cbit.gui.graph.ContainerShape) CatalystShape(cbit.vcell.graph.CatalystShape) FluxReactionShape(cbit.vcell.graph.FluxReactionShape) ContainerContainerShape(cbit.vcell.graph.ContainerContainerShape) ReactantShape(cbit.vcell.graph.ReactantShape) ElipseShape(cbit.gui.graph.ElipseShape) SimpleReactionShape(cbit.vcell.graph.SimpleReactionShape) ReactionStepShape(cbit.vcell.graph.ReactionStepShape) ReactionContainerShape(cbit.vcell.graph.ReactionContainerShape) Shape(cbit.gui.graph.Shape) RuleParticipantSignatureDiagramShape(cbit.vcell.graph.RuleParticipantSignatureDiagramShape) ReactionRuleDiagramShape(cbit.vcell.graph.ReactionRuleDiagramShape) RubberBandEdgeShape(cbit.gui.graph.RubberBandEdgeShape) ReactionParticipantShape(cbit.vcell.graph.ReactionParticipantShape) SpeciesContextShape(cbit.vcell.graph.SpeciesContextShape) ReactionRuleDiagramShape(cbit.vcell.graph.ReactionRuleDiagramShape) Point(java.awt.Point) Dimension(java.awt.Dimension) SpeciesContext(cbit.vcell.model.SpeciesContext) ReactionStepShape(cbit.vcell.graph.ReactionStepShape) PropertyVetoException(java.beans.PropertyVetoException) UtilCancelException(org.vcell.util.UtilCancelException) ExpressionException(cbit.vcell.parser.ExpressionException) UserCancelException(org.vcell.util.UserCancelException) Graphics2D(java.awt.Graphics2D) ContainerShape(cbit.gui.graph.ContainerShape) ContainerContainerShape(cbit.vcell.graph.ContainerContainerShape) ReactionContainerShape(cbit.vcell.graph.ReactionContainerShape) AffineTransform(java.awt.geom.AffineTransform) ArrayList(java.util.ArrayList) List(java.util.List) RuleParticipantSignatureDiagramShape(cbit.vcell.graph.RuleParticipantSignatureDiagramShape) ElipseShape(cbit.gui.graph.ElipseShape) RubberBandEdgeShape(cbit.gui.graph.RubberBandEdgeShape)

Aggregations

ContainerShape (cbit.gui.graph.ContainerShape)1 ElipseShape (cbit.gui.graph.ElipseShape)1 RubberBandEdgeShape (cbit.gui.graph.RubberBandEdgeShape)1 RubberBandRectShape (cbit.gui.graph.RubberBandRectShape)1 Shape (cbit.gui.graph.Shape)1 CatalystShape (cbit.vcell.graph.CatalystShape)1 ContainerContainerShape (cbit.vcell.graph.ContainerContainerShape)1 FluxReactionShape (cbit.vcell.graph.FluxReactionShape)1 ProductShape (cbit.vcell.graph.ProductShape)1 ReactantShape (cbit.vcell.graph.ReactantShape)1 ReactionContainerShape (cbit.vcell.graph.ReactionContainerShape)1 ReactionParticipantShape (cbit.vcell.graph.ReactionParticipantShape)1 ReactionRuleDiagramShape (cbit.vcell.graph.ReactionRuleDiagramShape)1 ReactionStepShape (cbit.vcell.graph.ReactionStepShape)1 RuleParticipantSignatureDiagramShape (cbit.vcell.graph.RuleParticipantSignatureDiagramShape)1 SimpleReactionShape (cbit.vcell.graph.SimpleReactionShape)1 SpeciesContextShape (cbit.vcell.graph.SpeciesContextShape)1 SpeciesContext (cbit.vcell.model.SpeciesContext)1 ExpressionException (cbit.vcell.parser.ExpressionException)1 Dimension (java.awt.Dimension)1