📄 newobjectdiagram.java
字号:
linkEnd.associationEnd().multiplicity().toString(), this, link.association() ); fGraph.addEdge(e); halfEdges.add( e ); } if ( fLinkObjectToNodeEdge.get( link ) != null ) { halfEdges.add( fLinkObjectToNodeEdge.get( link ) ); } node.setHalfEdges( halfEdges ); fHalfLinkToEdgeMap.put( link, halfEdges ); fLayouter = null; } } /** * Removes a link from the diagram. */ public void deleteLink(MLink link) { if (link.linkEnds().size() == 2) { EdgeBase e = null; if (link instanceof MObject) { // MLinkObject ??? e = (NodeEdge) fLinkObjectToNodeEdge.get(link); // TODO: this is just a tempory solution if (e == null) { return; } } else { e = (BinaryEdge) fBinaryLinkToEdgeMap.get(link); } if ( e != null && !(link instanceof MLinkObject ) && fHiddenEdges.contains(link) ) { fHiddenEdges.remove(link); fLog.println("Deleted link `" + link + "' from hidden links."); } if (e == null) { throw new RuntimeException( "no edge for link `" + link + "' in current state." ); } synchronized (fLock) { fGraph.removeEdge(e); if (link instanceof MObject) { fLinkObjectToNodeEdge.remove(link); } else { fBinaryLinkToEdgeMap.remove(link); } fLayouter = null; } } else { DiamondNode n = (DiamondNode) fNaryLinkToDiamondNodeMap.get( link ); //NodeEdge ne = (NodeEdge) fLinkToAssociationClass.get( (MLinkObject) link ); if ( n == null ) {//&& ne == null ) { if ( fHiddenEdges.contains(link) ) { fHiddenEdges.remove(link); fLog.println("Deleted link `" + link + "' from hidden links."); } else { throw new RuntimeException( "no diamond node for n-ary link `" + link + "' in current state."); } } synchronized (fLock) { // all dangling HalfLinkEdges are removed by the graph fGraph.remove(n); fNaryLinkToDiamondNodeMap.remove(link); fHalfLinkToEdgeMap.remove( link ); fLayouter = null; } synchronized (fLock) { if (link instanceof MObject) { NodeEdge edge = (NodeEdge) fLinkObjectToNodeEdge.get( link ); if (edge != null) { fGraph.removeEdge( edge ); fLinkObjectToNodeEdge.remove( link ); } } } } } /** * Adds a new Link to the objectdiagram. */ class ActionInsertLink extends AbstractAction { private Set fObjects; private String fAssocName; ActionInsertLink(String text, Set objects, String assocName) { super(text); fObjects = objects; fAssocName = assocName; } public void actionPerformed(ActionEvent e) { fParent.insertLink(fAssocName, fObjects); } } /** * Deletes a Link from the objectdiagram. */ class ActionDeleteLink extends AbstractAction { private Set fObjects; private String fAssocName; ActionDeleteLink(String text, Set objects, String assocName) { super(text); fObjects = objects; fAssocName = assocName; } public void actionPerformed(ActionEvent e) { fParent.deleteLink( fAssocName, fObjects ); fEdgeSelection.clear(); } } /** * Deletes the selected objects. */ class ActionDelete extends AbstractAction { private Set fObjects; ActionDelete(String text, Set objects) { super(text); fObjects = objects; } public void actionPerformed(ActionEvent e) { fParent.deleteObjects(fObjects); fNodeSelection.clear(); } } /** * Deletes all hidden elements form this diagram. */ public void deleteHiddenElementsFromDiagram( Set objectsToHide, Set linksToHide ) { Iterator it = objectsToHide.iterator(); while ( it.hasNext() ) { MObject obj = (MObject) it.next(); deleteObject( obj ); } it = linksToHide.iterator(); while ( it.hasNext() ) { MLink link = (MLink) it.next(); deleteLink( link ); } fHiddenNodes.addAll( objectsToHide ); fHiddenEdges.addAll( linksToHide ); } /** * Creates and shows popup menu if mouse event is the trigger for popups. */ public boolean maybeShowPopup(MouseEvent e) { boolean separatorNeeded = false; if (!e.isPopupTrigger()) return false; // create the popup menu JPopupMenu popupMenu = unionOfPopUpMenu(); // position for the popupMenu items int pos = 0; // get all associations that exist between the classes of the // selected objects if (!fNodeSelection.isEmpty()) { HashSet selectedObjects = new HashSet(); Set classesOfSelectedObjects = new HashSet(); Iterator nodeIterator = fNodeSelection.iterator(); while (nodeIterator.hasNext()) { PlaceableNode node = (PlaceableNode) nodeIterator.next(); if (node instanceof ObjectNode && node.isDeletable()) { selectedObjects.add(((ObjectNode) node).object()); classesOfSelectedObjects.add(((ObjectNode) node).object() .cls()); } } Set associations = fParent .getAllAssociationsBetweenClasses(classesOfSelectedObjects); Log.trace(this, "associations = " + associations); // for each association, check if there already exists a // link between the objects. Add "Delete link" menu item // in this case, otherwise add an "Insert link" item. Iterator assocIterator = associations.iterator(); boolean addedInsertLinkAction = false; while (assocIterator.hasNext()) { MAssociation assoc = (MAssociation) assocIterator.next(); if (!fParent.hasLinkBetweenObjects(assoc, selectedObjects)) { popupMenu.insert(new ActionInsertLink("Insert " + assoc.name() + " link", selectedObjects, assoc.name()), pos++ ); addedInsertLinkAction = true; } if ( fParent.hasLinkBetweenObjects(assoc, selectedObjects) ) { popupMenu.insert(new ActionDeleteLink("Delete " + assoc.name() + " link", selectedObjects, assoc.name()), pos++); addedInsertLinkAction = true; } } if ( addedInsertLinkAction ) popupMenu.insert( new JSeparator(), pos++ ); String txt = null; if (selectedObjects.size() == 1) { txt = "'"+((MObject) selectedObjects.iterator().next()).name()+"'"; } else if (selectedObjects.size() > 1) { txt = selectedObjects.size() + " objects"; } if (txt != null && txt.length() > 0) { popupMenu.insert( new ActionDelete("Delete " + txt, selectedObjects), pos++ ); popupMenu.insert( fHideAdmin.setValues("Hide " + txt, selectedObjects), pos++ ); popupMenu.insert( fHideAdmin.setValues("Crop " + txt, getNoneSelectedNodes( selectedObjects )), pos++ ); separatorNeeded = true; } } if (!fHiddenNodes.isEmpty()) { final JMenuItem showAllObjects = new JMenuItem("Show hidden objects"); showAllObjects.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { fHideAdmin.showAllHiddenElements(); repaint(); } }); popupMenu.insert( showAllObjects, pos++ ); separatorNeeded = true; } if (separatorNeeded) { popupMenu.insert( new JSeparator(), pos++ ); separatorNeeded = false; } popupMenu.show(e.getComponent(), e.getX(), e.getY()); return true; } /** * Finds all nodes which are not selected. * @param selectedNodes Nodes which are selected at this point in the diagram. * @return A HashSet of the none selected objects in the diagram. */ private Set getNoneSelectedNodes( Set selectedNodes ) { Set noneSelectedNodes = new HashSet(); Iterator it = fGraph.iterator(); while ( it.hasNext() ) { Object o = it.next(); if ( o instanceof ObjectNode ) { MObject obj = ((ObjectNode) o).object(); if ( !selectedNodes.contains( obj ) ) { noneSelectedNodes.add( obj ); } } } return noneSelectedNodes; } private JWindow fObjectInfoWin = null; private void displayObjectInfo(MObject obj, MouseEvent e) { if (fObjectInfoWin != null) { fObjectInfoWin.setVisible(false); fObjectInfoWin.dispose(); } Box attrBox = Box.createVerticalBox(); Box valueBox = Box.createVerticalBox(); MObjectState objState = obj.state(fParent.system().state()); Map attributeValueMap = objState.attributeValueMap(); Iterator it = attributeValueMap.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); MAttribute attr = (MAttribute) entry.getKey(); Value v = (Value) entry.getValue(); attrBox.add(new JLabel(attr.name() + " = ")); valueBox.add(new JLabel(v.toString())); } fObjectInfoWin = new JWindow(); JPanel contentPane = new JPanel(); Border border = BorderFactory.createCompoundBorder(BorderFactory .createRaisedBevelBorder(), BorderFactory .createLoweredBevelBorder()); contentPane.setBorder(border); Box b = Box.createHorizontalBox(); b.add(attrBox); b.add(valueBox); contentPane.add(b); fObjectInfoWin.setContentPane(contentPane); Point p = e.getPoint(); SwingUtilities.convertPointToScreen(p, (JComponent) e.getSource()); fObjectInfoWin.setLocation(p);//e.getPoint()); fObjectInfoWin.pack(); fObjectInfoWin.setVisible(true); } /** * * Accepts a drag of a class from the ModelBrowser. A new object of this * class will be created. * @param dtde */ public void dropObjectFromModelBrowser( DropTargetDropEvent dtde ) { //Log.trace(this, "dtde = " + dtde); try { dtde.acceptDrop(DnDConstants.ACTION_MOVE); Transferable transferable = dtde.getTransferable(); // we accept only Strings if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) { String s = (String) transferable .getTransferData(DataFlavor.stringFlavor); //Log.trace(this, "transfer = " + s); if (s.startsWith("CLASS-")) { Point p = dtde.getLocation(); if ( isDoAutoLayout() ) { fNextNodeX = Math.random() * Math.max(100, getWidth()); fNextNodeY = Math.random() * Math.max(100, getHeight()); } else { fNextNodeX = p.getX(); fNextNodeY = p.getY(); } String clsName = s.substring(6); fParent.createObject(clsName); } } dtde.dropComplete(true); } catch (IOException exception) { exception.printStackTrace(); System.err.println("Exception" + exception.getMessage()); dtde.dropComplete(false); } catch (UnsupportedFlavorException ufException) { ufException.printStackTrace(); System.err.println("Exception" + ufException.getMessage()); dtde.dropComplete(false); } } /** * Checks if the object info window should be displayed. * @param e MouseEvent */ public void mayBeShowObjectInfo( MouseEvent e ) { if (fNodeSelection.size() == 1) { PlaceableNode node = (PlaceableNode) fNodeSelection.iterator().next(); if (node instanceof ObjectNode) { displayObjectInfo(((ObjectNode) node).object(), e); } } } /** * Checks if the object info window should be disposed. */ public void mayBeDisposeObjectInfo() { if (fObjectInfoWin != null) { fObjectInfoWin.setVisible(false); fObjectInfoWin.dispose(); fObjectInfoWin = null; } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -