Mercurial > hg > accesspd
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; +}