diff java/src/uk/ac/qmul/eecs/ccmi/gui/Grid.java @ 0:78b7fc5391a2

first import, outcome of NIME 2014 hackaton
author Fiore Martin <f.martin@qmul.ac.uk>
date Tue, 08 Jul 2014 16:28:59 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/src/uk/ac/qmul/eecs/ccmi/gui/Grid.java	Tue Jul 08 16:28:59 2014 +0100
@@ -0,0 +1,134 @@
+/*  
+ 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.Graphics2D;
+import java.awt.Stroke;
+import java.awt.geom.Line2D;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.RectangularShape;
+
+/**
+   A grid to which nodes can be "snapped". The
+   snapping operation moves a point to the nearest grid point.
+*/
+public class Grid
+{
+   /**
+      Constructs a grid with no grid points.
+   */
+   public Grid()
+   {
+      setGrid(0, 0);
+   }
+   
+   /**
+      Sets the grid point distances in x- and y-direction
+      @param x the grid point distance in x-direction
+      @param y the grid point distance in y-direction
+   */
+   public void setGrid(double x, double y)
+   {
+      gridx = x;
+      gridy = y;
+   }
+   
+   /**
+      Draws this grid inside a rectangle.
+      @param g2 the graphics context
+      @param bounds the bounding rectangle
+   */
+   public void draw(Graphics2D g2, Rectangle2D bounds)
+   {
+      Color PALE_BLUE = new Color(0.9F, 0.8F, 0.9F);
+      Color oldColor = g2.getColor();
+      g2.setColor(PALE_BLUE);
+      Stroke oldStroke = g2.getStroke();
+      for (double x = bounds.getX(); x < bounds.getMaxX(); x += gridx)
+         g2.draw(new Line2D.Double(x, bounds.getY(), x, bounds.getMaxY()));
+      for (double y = bounds.getY(); y < bounds.getMaxY(); y += gridy)
+         g2.draw(new Line2D.Double(bounds.getX(), y, bounds.getMaxX(), y));
+      g2.setStroke(oldStroke);
+      g2.setColor(oldColor);
+   }
+
+   /**
+      Snaps a point to the nearest grid point
+      @param p the point to snap. After the call, the 
+      coordinates of p are changed so that p falls on the grid.
+   */
+   public void snap(Point2D p)
+   {
+      double x;
+      if (gridx == 0)
+         x = p.getX();
+      else
+         x = Math.round(p.getX() / gridx) * gridx;
+      double y;
+      if (gridy == 0)
+         y = p.getY();
+      else
+         y = Math.round(p.getY() / gridy) * gridy;
+         
+      p.setLocation(x, y);
+   }
+
+   /**
+      Snaps a rectangle to the nearest grid points
+      @param r the rectangle to snap. After the call, the 
+      coordinates of r are changed so that all of its corners
+      falls on the grid.
+   */
+   public void snap(RectangularShape r)
+   {
+      double x;
+      double w;
+      w = r.getWidth();
+      if (gridx == 0)
+      {
+         x = r.getX();
+      }
+      else
+      {
+         x = Math.round(r.getX() / gridx) * gridx;
+//         w = Math.ceil(r.getWidth() / (2 * gridx)) * (2 * gridx);
+      }
+      double y;
+      double h;
+      h = r.getHeight();
+      if (gridy == 0)
+      {
+         y = r.getY();
+      }
+      else
+      {
+         y = Math.round(r.getY() / gridy) * gridy;
+//         h = Math.ceil(r.getHeight() / (2 * gridy)) * (2 * gridy);
+      }
+         
+      r.setFrame(x, y, w, h);      
+   }
+
+   private double gridx;
+   private double gridy;
+}