diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/src/uk/ac/qmul/eecs/ccmi/gui/GraphToolbar.java	Fri Dec 16 17:35:51 2011 +0000
@@ -0,0 +1,231 @@
+/*  
+ 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;
+}
+