/** * */ package agg.gui.editor; import java.awt.Dimension; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import agg.editor.impl.EdArc; import agg.editor.impl.EdGraphObject; import agg.editor.impl.EdNode; import agg.gui.AGGAppl; import agg.xt_basis.Arc; import agg.xt_basis.Type; import agg.xt_basis.TypeError; import agg.xt_basis.TypeException; /** * @author olga * */ public class GraphCanvasMouseAdapter extends MouseAdapter { private GraphCanvas canvas; /** * */ public GraphCanvasMouseAdapter(final GraphCanvas graphcanvas) { this.canvas = graphcanvas; this.canvas.addMouseListener(this); } public void mouseEntered(MouseEvent e) { if (this.canvas.isScrolling()) { this.canvas.setScrolling(false); this.canvas.setScrollingByDragging(false); } } public void mouseExited(MouseEvent e) { // this.canvas.repaint() } public void mouseClicked(MouseEvent e) { if (this.canvas.getGraphics() == null || this.canvas.getGraph() == null) { return; } if (SwingUtilities.isLeftMouseButton(e)) { // open attribute editor if ((e.getClickCount() == 1 && this.canvas.getEditMode() == EditorConstants.ATTRIBUTES) || (e.getClickCount() == 2 && !(this.canvas.getEditMode() == EditorConstants.DRAW || this.canvas.getEditMode() == EditorConstants.ARC) )) { if (this.canvas.getGraph().isEditable()) { this.canvas.openAttrEditorForGraphObject(e); } } else if (e.getClickCount() == 1 && this.canvas.getEditMode() == EditorConstants.SELECT) { if (this.canvas.getPickedObject() == null) { this.canvas.deselectAll(); this.canvas.repaint(); } else if (!this.canvas.makeSelectionAt(e.getX(), e.getY())) { this.canvas.deselectAll(); this.canvas.repaint(); } } } else if(SwingUtilities.isMiddleMouseButton(e)) { if (e.getClickCount() == 1 && this.canvas.getEditMode() == EditorConstants.SELECT) { this.canvas.makeSelectionAt(e.getX(), e.getY()); } } else if (e.isPopupTrigger() || SwingUtilities.isRightMouseButton(e) || this.canvas.getEditMode() == EditorConstants.MOVE || this.canvas.getEditMode() == EditorConstants.SELECT) { if (this.canvas.isMagicArc()) { this.canvas.removeMagicArc(); } } } public void mousePressed(MouseEvent e) { // System.out.println(">>> GraphCanvas.mousePressed "); if (this.canvas.getGraphics() == null || this.canvas.getGraph() == null) { return; } if (this.canvas.isScrolling()) { this.canvas.endScrolling(); } int x = e.getX(); int y = e.getY(); this.canvas.setChanged(false); if (e.isPopupTrigger() || SwingUtilities.isRightMouseButton(e)) { this.canvas.setRightPressed(true); if (this.canvas.isLeftPressed() || this.canvas.isMagicArc()) { this.canvas.update(this.canvas.getGraphics()); this.canvas.removeMagicArc(); // if (this.canvas.isMagicArc()) // this.canvas.setEditMode(EditorConstants.DRAW); } if (this.canvas.getPickedObject() != null && this.canvas.getPickedObject().isWeakselected()) { this.canvas.getPickedObject().setWeakselected(false); this.canvas.repaint(); } this.canvas.setSourceObject(this.canvas.getPickedObject(x, y, this.canvas.getGraphics().getFontMetrics())); if (this.canvas.getSourceObject() != null) { if (this.canvas.isLeftPressed()) { this.canvas.setPickedPoint(x, y); // this.canvas.setPickedObject(this.canvas.getSourceObject()); } else if (this.canvas.getSourceObject().isArc()) { this.canvas.setSourceObject(null); this.canvas.update(this.canvas.getGraphics()); } } if (this.canvas.getEditMode() == EditorConstants.ARC) { this.canvas.setAnchorPoint(null); this.canvas.setEditMode(EditorConstants.DRAW); } } else if (SwingUtilities.isMiddleMouseButton(e)) { // System.out.println(">>> GraphCanvas.mousePressed:: isMiddleMouseButton"); if (this.canvas.isMagicArc()) { this.canvas.update(this.canvas.getGraphics()); this.canvas.removeMagicArc(); this.canvas.setEditMode(EditorConstants.DRAW); } else if (this.canvas.isScrolling()) { } else { this.canvas.setPickedPoint(x, y); this.canvas.getPickedObject(x, y, this.canvas.getGraphics().getFontMetrics()); if (this.canvas.getPickedObject() == null) { this.canvas.setScrolling(this.canvas.startScrolling(x, y)); if (!this.canvas.isScrolling()) { this.canvas.startSelectBox(x, y); } } } } else if (SwingUtilities.isLeftMouseButton(e)) { // System.out.println(">>> GraphCanvas.mousePressed:: isLeftMouseButton "+editable); this.canvas.setLeftPressed(true); switch (this.canvas.getEditMode()) { case EditorConstants.HELP: break; case EditorConstants.DRAW: if (!this.canvas.getGraph().isEditable()) return; if (this.canvas.getGraph().getGraGra() == null || this.canvas.getGraph().getGraGra().getSelectedNodeType() == null) { this.canvas.cannotCreateErrorMessage(" Create node ", " a node", "There isn't any node type selected."); return; } if (this.canvas.isRightPressed()) { this.canvas.setPickedObject(this.canvas.getPickedObject(x, y, this.canvas.getGraphics().getFontMetrics())); return; } this.canvas.setPickedPoint(x, y); if (this.canvas.getSourceObject() != null) { this.canvas.getSourceObject().setWeakselected(false); } this.canvas.setSourceObject(this.canvas.getPickedNode(x, y)); if (this.canvas.getSourceObject() == null) { if (this.canvas.getPickedArc(x, y) != null) { return; } // check whether to create a new node is possible Type t = this.canvas.getGraph().getTypeSet().getSelectedNodeType().getBasisType(); this.canvas.canCreateNodeOfType(t, null, null); // and to create a selection box is possible this.canvas.startSelectBox(x, y); } else { this.canvas.setEditMode(EditorConstants.ARC); // this.canvas.getSourceObject().setWeakselected(true); // this.canvas.update(this.canvas.getGraphics()); if (this.canvas.isMagicEdgeSupportEnabled()) { if (!this.canvas.checkSourceOfMagicArc((EdNode) this.canvas.getSourceObject(), x, y)) if (this.canvas.getGraph().getTypeSet().getSelectedArcType() != null) this.canvas.drawErrorImage(x, y); } } break; case EditorConstants.ARC: if (this.canvas.getGraph().getGraGra() == null || this.canvas.getGraph().getGraGra().getSelectedArcType() == null) { this.canvas.cannotCreateErrorMessage(" Create edge ", " an edge", "There isn't any edge type selected."); this.canvas.update(this.canvas.getGraphics()); this.canvas.removeMagicArc(); this.canvas.setEditMode(EditorConstants.DRAW); return; } if (this.canvas.isMagicArc()) { if (this.canvas.getPickedNode(x, y) != null) { this.canvas.makeArcByMagicArc(x, y); this.canvas.setMagicArc(false); } } else if (this.canvas.getSourceObject() != null) { this.canvas.setTargetObject(this.canvas.getPickedNode(x, y)); if (this.canvas.getTargetObject() != null) { if (this.canvas.getSourceObject().isNode() && this.canvas.getTargetObject().isNode() ) { boolean typeErrorOccured = true; if (this.canvas.checkTargetOfArc((EdNode) this.canvas.getSourceObject(), (EdNode) this.canvas.getTargetObject())) { typeErrorOccured = false; try { EdArc ea = this.canvas.addArc(this.canvas.getSourceObject(), this.canvas.getTargetObject(), this.canvas.getAnchorPoint()); typeErrorOccured = false; this.canvas.getGraph().drawArc(this.canvas.getGraphics(), ea); this.canvas.setChanged(true); } catch (TypeException ex) {} } if (typeErrorOccured && !this.canvas.getGraph().isTypeGraph()) { this.canvas.cannotCreateErrorMessage( " Create edge "," the edge", "An edge type  \" " + this.canvas.getGraph().getTypeSet() .getSelectedArcType() .getBasisType().getName() + " \"  between source-target nodes isn't defined in the type graph."); } this.canvas.getSourceObject().setWeakselected(false); this.canvas.update(this.canvas.getGraphics()); } this.canvas.setSourceObject(null); this.canvas.setTargetObject(null); this.canvas.setAnchorPoint(null); this.canvas.setMagicArcStart(null); this.canvas.setEditMode(EditorConstants.DRAW); } else { this.canvas.setAnchorPoint(new Point(x, y)); } } break; case EditorConstants.VIEW: this.canvas.setPickedPoint(x, y); this.canvas.setPickedObject(this.canvas.getPickedObject(x, y, this.canvas.getGraphics().getFontMetrics())); if (this.canvas.getPickedObject() == null) { this.canvas.startSelectBox(x, y); } break; case EditorConstants.MOVE: case EditorConstants.SELECT: this.canvas.setPickedPoint(x, y); this.canvas.getPickedObject(x, y, this.canvas.getGraphics().getFontMetrics()); if (this.canvas.getPickedObject() == null) { this.canvas.startSelectBox(x, y); } break; case EditorConstants.ATTRIBUTES: case EditorConstants.MAP: case EditorConstants.UNMAP: this.canvas.setPickedPoint(x, y); this.canvas.getPickedObject(x, y, this.canvas.getGraphics().getFontMetrics()); if (this.canvas.getPickedObject() == null && this.canvas.getGraph().isEditable()) { this.canvas.startSelectBox(x, y); } break; case EditorConstants.STRAIGHT: break; case EditorConstants.SET_PARENT: if (!this.canvas.getGraph().isEditable()) { return; } // tar is a parent, src is a child this.canvas.setTargetObject(this.canvas.getPickedObject(x, y, this.canvas.getGraphics().getFontMetrics())); if (this.canvas.getTargetObject() == null) { this.canvas.getSourceObject().setWeakselected(false); this.canvas.getGraph().drawNode(this.canvas.getGraphics(), (EdNode)this.canvas.getSourceObject()); this.canvas.getViewport().setLastEditMode(this.canvas.getLastEditMode()); } else { if (this.canvas.getSourceObject() != null) { TypeError error = this.canvas.getGraph().getBasisGraph().getTypeSet() .checkInheritanceValidity( this.canvas.getSourceObject().getBasisObject().getType(), this.canvas.getTargetObject().getBasisObject().getType()); if (error == null) { this.canvas.getGraph().addChangedParentToUndo(this.canvas.getSourceObject()); Arc inheritArc = this.canvas.getGraph().getBasisGraph().getTypeSet() .addValidInheritanceRelation( this.canvas.getSourceObject().getBasisObject().getType(), this.canvas.getTargetObject().getBasisObject().getType()); // EdArc edinheritArc = this.canvas.getGraph().newInheritanceArc( inheritArc, this.canvas.getGraph().getArcs()); this.canvas.getGraph().undoManagerEndEdit(); this.canvas.getGraph().update(); this.canvas.repaint(); } else { JOptionPane.showMessageDialog(null, error.getMessage(), "Type Graph Error", JOptionPane.ERROR_MESSAGE); } this.canvas.getViewport().setEditMode(this.canvas.getLastEditMode()); } this.canvas.getSourceObject().setWeakselected(false); this.canvas.getGraph().drawNode(this.canvas.getGraphics(), (EdNode)this.canvas.getSourceObject()); } this.canvas.setSourceObject(null); this.canvas.setTargetObject(null); this.canvas.setToolTipText(null); if (this.canvas.getViewport().getParentEditor() instanceof GraphEditor) { ((GraphEditor) this.canvas.getViewport().getParentEditor()).getGraGraEditor().setMsg(""); } break; case EditorConstants.UNSET_PARENT: if (!this.canvas.getGraph().isEditable()) { return; } // tar is a parent, src is a child this.canvas.setTargetObject(this.canvas.getPickedObject(x, y, this.canvas.getGraphics().getFontMetrics())); if (this.canvas.getTargetObject() == null) { this.canvas.getViewport().setEditMode(this.canvas.getLastEditMode()); } else if (this.canvas.getSourceObject() != null) { this.canvas.performDeleteInheritanceRel( (EdNode) this.canvas.getSourceObject(), (EdNode) this.canvas.getTargetObject()); this.canvas.updateUndoButton(); this.canvas.getViewport().setEditMode(this.canvas.getLastEditMode()); } this.canvas.setSourceObject(null); this.canvas.setTargetObject(null); this.canvas.setToolTipText(null); if (this.canvas.getViewport().getParentEditor() instanceof GraphEditor) { ((GraphEditor) this.canvas.getViewport().getParentEditor()).getGraGraEditor().setMsg(""); } break; case EditorConstants.COPY: this.canvas.setPickedPoint(x, y); break; case EditorConstants.PASTE: //COPY: if (!this.canvas.getGraph().isEditable()) { return; } this.canvas.setMsg(""); this.canvas.getGraph().eraseSelected(this.canvas.getGraphics(), true); this.canvas.copySelected(x, y); if (this.canvas.getGraph().getMsg().length() != 0) { this.canvas.setMsg("Copy / Paste : " + this.canvas.getGraph().getMsg()); } this.canvas.getGraph().drawSelected(this.canvas.getGraphics()); this.canvas.getGraph().deselectAll(); Dimension dim = this.canvas.getGraph().getGraphDimension(); if ((dim.width != 0) && (dim.height != 0)) { if (dim.width < this.canvas.getWidth()) dim.width = this.canvas.getWidth(); if (dim.height < this.canvas.getHeight()) dim.height = this.canvas.getHeight(); this.canvas.setSize(dim); } this.canvas.repaint(); this.canvas.unsetPicked(); this.canvas.setChanged(true); break; case EditorConstants.COPY_ARC: if (!this.canvas.getGraph().isEditable()) { return; } this.canvas.setMsg(""); if (this.canvas.getSourceObject() == null) this.canvas.setSourceObject(this.canvas.getPickedNode(x, y)); else if (this.canvas.getTargetObject() == null) { this.canvas.setTargetObject(this.canvas.getPickedNode(x, y)); EdArc a = null; if (this.canvas.getTargetObject() != null) a = this.canvas.getGraph().getSelectedArc(); if (a != null) { EdArc ac = this.canvas.getGraph().copyArc(a, this.canvas.getSourceObject(), this.canvas.getTargetObject()); if (ac != null) { if (a.isLine()) { if (!a.hasAnchor()) { if (a.getSource() == ac.getSource() && a.getTarget() == ac.getTarget()) { Point p = new Point( (ac.getSource().getX() + (ac.getTarget().getX() - ac.getSource().getX()) / 2 + 5), (ac.getSource().getY() + (ac.getTarget().getY() - ac.getSource().getY()) / 2 + 5)); ac.setAnchor(p); } } } else { // isLoop if (a.getSource() == ac.getSource() && a.getTarget() == ac.getTarget()) { ac.setWidth(a.getWidth() + 10); ac.setHeight(a.getHeight() + 10); } else { ac.setWidth(a.getWidth()); ac.setHeight(a.getHeight()); } } if (a.getSource() == ac.getSource() && a.getTarget() == ac.getTarget()) { ac.setTextOffset(a.getTextOffset().x + 5, a.getTextOffset().y + 5); } else { ac.setTextOffset(a.getTextOffset().x, a.getTextOffset().y); } this.canvas.getGraph().deselect(a); this.canvas.getGraph().select(ac); this.canvas.getGraph().drawSelected(this.canvas.getGraphics()); this.canvas.unsetPicked(); this.canvas.setSourceObject(null); this.canvas.setTargetObject(null); this.canvas.setChanged(true); } else { JOptionPane.showMessageDialog( null, "Please check the source / target compatibility.", " Edge copy failed", JOptionPane.WARNING_MESSAGE); } } else { JOptionPane.showMessageDialog( null, "Please check the source / target compatibility.", " Edge copy failed", JOptionPane.WARNING_MESSAGE); } this.canvas.unsetPicked(); this.canvas.setSourceObject(null); this.canvas.setTargetObject(null); if (this.canvas.getEditMode() != EditorConstants.SELECT) { AGGAppl.getInstance().getGraGraEditor().resetSelectEditMode(); } } if ((this.canvas.getSourceObject() != null && this.canvas.getTargetObject() != null) || (this.canvas.getSourceObject() == null) || (this.canvas.getTargetObject() == null)) { this.canvas.unsetPicked(); this.canvas.setSourceObject(null); this.canvas.setTargetObject(null); if (this.canvas.getEditMode() != EditorConstants.SELECT) { AGGAppl.getInstance().getGraGraEditor().resetSelectEditMode(); } } break; case EditorConstants.DELETE: case EditorConstants.INTERACT_MATCH: default: break; } } } public void mouseReleased(MouseEvent e) { // System.out.println(">>> GraphCanvas.mouseReleased "); if (this.canvas.getGraphics() == null || this.canvas.getGraph() == null) { return; } if (this.canvas.isLeftAndRightPressed() && this.canvas.getPickedObject() != null) { if (this.canvas.isDragged()) { this.canvas.endDraggingOfObject(); } this.canvas.unsetPicked(); this.canvas.repaint(); return; } if (this.canvas.isScrollingByDragging()) { this.canvas.endScrolling(); return; } if (SwingUtilities.isLeftMouseButton(e)) { if (this.canvas.getEditMode() == EditorConstants.DRAW) { if (this.canvas.canCreateNode()) { this.canvas.addNode(e.getX(), e.getY()); this.canvas.canCreateNode = false; } else { // AGGAppl.getInstance().getGraGraEditor().setEditMode(EditorConstants.MOVE); // AGGAppl.getInstance().getGraGraEditor().forwardModeCommand(EditorConstants.getModeOfID(EditorConstants.MOVE)); } } else if (this.canvas.getEditMode() == EditorConstants.MOVE) { EdGraphObject go = this.canvas.getPickedObject(); if (go != null) { this.canvas.setPickedPoint(e.getX(), e.getY()); this.canvas.getPickedObject(e.getX(), e.getY(), this.canvas.getGraphics().getFontMetrics()); AGGAppl.getInstance().getGraGraEditor().resetSelectEditMode(); } } else if (this.canvas.getEditMode() == EditorConstants.ATTRIBUTES) { EdGraphObject go = this.canvas.getPickedObject(); if (go != null) { if (this.canvas.getViewport().getParentEditor() instanceof GraphEditor) this.canvas.deselectAllWeakselected(); else if (this.canvas.getViewport().getParentEditor() instanceof RuleEditor) { ((RuleEditor) this.canvas.getViewport().getParentEditor()).deselectAllWeakselected(); } go.setWeakselected(true); } } else if (this.canvas.isSelectBoxOpen() && this.canvas.getSelectBoxSize() > 0) { this.canvas.selectObjectsInsideOfSelectBoxAndClose(); if (this.canvas.getEditMode() != EditorConstants.SELECT) { AGGAppl.getInstance().getGraGraEditor().resetSelectEditMode(); } this.canvas.repaint(); } else if (this.canvas.isDragged()) { this.canvas.endDraggingOfObject(); this.canvas.unsetPicked(); this.canvas.repaint(); } } if (this.canvas.getEditMode() == EditorConstants.ARC) { if (SwingUtilities.isLeftMouseButton(e)) { if (this.canvas.isMagicEdgeSupportEnabled() && this.canvas.isMagicArc() && (this.canvas.getAnchorPoint() == null)) { this.canvas.makeArcByMagicArc(e.getX(), e.getY()); } else if (this.canvas.getTargetObject() == null && this.canvas.getSourceObject() != null) { this.canvas.getSourceObject().setWeakselected(true); this.canvas.repaint(); } } else if (this.canvas.isMagicArc()) { this.canvas.removeMagicArc(); this.canvas.setEditMode(EditorConstants.DRAW); } return; } if (SwingUtilities.isMiddleMouseButton(e) || this.canvas.getEditMode() == EditorConstants.MOVE || this.canvas.getEditMode() == EditorConstants.SELECT) { if (this.canvas.getPickedObject() != null) { if (this.canvas.isDragged()) { this.canvas.endDraggingOfObject(); this.canvas.unsetPicked(); this.canvas.repaint(); } } else if (this.canvas.isSelectBoxOpen() && this.canvas.getSelectBoxSize() > 0) { this.canvas.selectObjectsInsideOfSelectBoxAndClose(); this.canvas.update(this.canvas.getGraphics()); if (this.canvas.getEditMode() != EditorConstants.SELECT) { AGGAppl.getInstance().getGraGraEditor().setEditMode(EditorConstants.SELECT); AGGAppl.getInstance().getGraGraEditor().forwardModeCommand(EditorConstants.getModeOfID(EditorConstants.SELECT)); } } if (this.canvas.getEditMode() == EditorConstants.DRAW) { AGGAppl.getInstance().getGraGraEditor().setEditMode(EditorConstants.MOVE); AGGAppl.getInstance().getGraGraEditor().forwardModeCommand(EditorConstants.getModeOfID(EditorConstants.MOVE)); } } } }