Mercurial > hg > ccmieditor
view java/src/uk/ac/qmul/eecs/ccmi/gui/GraphToolbar.java @ 0:9418ab7b7f3f
Initial import
author | Fiore Martin <fiore@eecs.qmul.ac.uk> |
---|---|
date | Fri, 16 Dec 2011 17:35:51 +0000 |
parents | |
children | d66dd5880081 |
line wrap: on
line source
/* CCmI Editor - A Collaborative Cross-Modal Diagram Editing Tool Copyright (C) 2002 Cay S. Horstmann (http://horstmann.com) Copyright (C) 2011 Queen Mary University of London (http://ccmi.eecs.qmul.ac.uk/) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package uk.ac.qmul.eecs.ccmi.gui; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.Enumeration; import java.util.ResourceBundle; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JToggleButton; import javax.swing.JToolBar; /** A Toolbar that contains node and edge prototype icons. By using the toolbar the user can create nodes and edges in the diagram out of clonation from the prototype. */ @SuppressWarnings("serial") public class GraphToolbar extends JToolBar { /** Constructs a tool bar with no icons. */ public GraphToolbar(Diagram diagram){ /* creates icon for select button */ Icon icon = new Icon(){ public int getIconHeight() { return BUTTON_SIZE; } public int getIconWidth() { return BUTTON_SIZE; } public void paintIcon(Component c, Graphics g, int x, int y){ Graphics2D g2 = (Graphics2D)g; GraphPanel.drawGrabber(g2, x + OFFSET, y + OFFSET); GraphPanel.drawGrabber(g2, x + OFFSET, y + BUTTON_SIZE - OFFSET); GraphPanel.drawGrabber(g2, x + BUTTON_SIZE - OFFSET, y + OFFSET); GraphPanel.drawGrabber(g2, x + BUTTON_SIZE - OFFSET, y + BUTTON_SIZE - OFFSET); } }; /* add selection button */ ResourceBundle resources = ResourceBundle.getBundle(EditorFrame.class.getName()); String text = resources.getString("grabber.text"); selectButton = new NodeButton(null,icon); selectButton.setToolTipText(text); nodeButtonsGroup = new ButtonGroup(); nodeButtonsGroup.add(selectButton); add(selectButton); /* add diagram buttons to the toolbar */ Node[] nodeTypes = diagram.getNodePrototypes(); for (int i = 0; i < nodeTypes.length; i++){ text = nodeTypes[i].getType(); add(nodeTypes[i], text ); } /* select the select-button as default */ nodeButtonsGroup.setSelected(selectButton.getModel(), true); /* separate node buttons from edge buttons */ addSeparator(); /* add diagram edges to the toolbar */ Edge[] edgeTypes = diagram.getEdgePrototypes(); for (int i = 0; i < edgeTypes.length; i++){ text = edgeTypes[i].getType(); add(edgeTypes[i], text ); } } /** Gets the node prototype that is associated with the currently selected button @return a Node or Edge prototype */ public Node getSelectedTool() { @SuppressWarnings("rawtypes") Enumeration elements = nodeButtonsGroup.getElements(); while (elements.hasMoreElements()) { NodeButton b = (NodeButton)elements.nextElement(); if (b.isSelected()) { /* switch back to the select-button */ nodeButtonsGroup.setSelected(selectButton.getModel(), true); return b.getNode(); } } /* getting here means the selection button is selected */ return null; } /** Adds a node to the tool bar. @param n the node to add @param tip the tool tip */ public void add(final Node n, String text){ Icon icon = new Icon(){ public int getIconHeight() { return BUTTON_SIZE; } public int getIconWidth() { return BUTTON_SIZE; } public void paintIcon(Component c, Graphics g, int x, int y){ double width = n.getBounds().getWidth(); double height = n.getBounds().getHeight(); Graphics2D g2 = (Graphics2D)g; double scaleX = (BUTTON_SIZE - OFFSET)/ width; double scaleY = (BUTTON_SIZE - OFFSET)/ height; double scale = Math.min(scaleX, scaleY); AffineTransform oldTransform = g2.getTransform(); g2.translate(x, y); g2.translate(OFFSET/2*scaleX,OFFSET/2*scaleY); g2.scale(scale, scale); g2.setColor(Color.black); n.draw(g2); g2.setTransform(oldTransform); } }; NodeButton button = new NodeButton(n, icon); button.setToolTipText(text); add(button); nodeButtonsGroup.add(button); } /** Adds an edge to the tool bar. @param n the node to add @param tip the tool tip */ public void add(final Edge e, String text){ Icon icon = new Icon(){ public int getIconHeight() { return BUTTON_SIZE; } public int getIconWidth() { return BUTTON_SIZE; } public void paintIcon(Component c, Graphics g, int x, int y){ Graphics2D g2 = (Graphics2D)g; /* create two points */ Point2D p = new Point2D.Double(); Point2D q = new Point2D.Double(); p.setLocation(OFFSET, OFFSET); q.setLocation(BUTTON_SIZE - OFFSET, BUTTON_SIZE - OFFSET); Line2D line = new Line2D.Double(p,q); Rectangle2D bounds = new Rectangle2D.Double(); bounds.add(line.getBounds2D()); double width = bounds.getWidth(); double height = bounds.getHeight(); double scaleX = (BUTTON_SIZE - OFFSET)/ width; double scaleY = (BUTTON_SIZE - OFFSET)/ height; double scale = Math.min(scaleX, scaleY); AffineTransform oldTransform = g2.getTransform(); g2.translate(x, y); g2.scale(scale, scale); g2.translate(Math.max((height - width) / 2, 0), Math.max((width - height) / 2, 0)); g2.setColor(Color.black); g2.setStroke(e.getStyle().getStroke()); g2.draw(line); g2.setTransform(oldTransform); } }; final JButton button = new JButton(icon); button.setToolTipText(text); button.setFocusable(false); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent evt) { edgeCreatedListener.edgeCreated((Edge)e.clone()); }}); add(button); } public void addEdgeCreatedListener(EdgeCreatedListener edgeCreatedListener){ this.edgeCreatedListener = edgeCreatedListener; } private class NodeButton extends JToggleButton{ public NodeButton(Node node, Icon icon){ super(icon); setFocusable(false); this.node = node; } public Node getNode(){ return node; } Node node; } public interface EdgeCreatedListener { void edgeCreated(Edge e); } private ButtonGroup nodeButtonsGroup; private EdgeCreatedListener edgeCreatedListener; private NodeButton selectButton; private static final int BUTTON_SIZE = 30; private static final int OFFSET = 5; }