-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.graphviz.drawable;\r
-\r
-import java.awt.Canvas;\r
-import java.awt.Color;\r
-import java.awt.Graphics;\r
-import java.awt.Graphics2D;\r
-import java.awt.Point;\r
-import java.awt.RenderingHints;\r
-import java.awt.event.ComponentAdapter;\r
-import java.awt.event.ComponentEvent;\r
-import java.awt.event.KeyAdapter;\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.awt.event.MouseWheelEvent;\r
-import java.awt.event.MouseWheelListener;\r
-import java.awt.geom.AffineTransform;\r
-import java.awt.geom.Rectangle2D;\r
-import java.awt.image.VolatileImage;\r
-\r
-/**\r
- * A canvas showing a given Drawable.\r
- * \r
- * @author Hannu Niemist�\r
- */\r
-public class ViewerCanvas extends Canvas {\r
-\r
- private static final long serialVersionUID = -1094658958968314511L;\r
- \r
- AffineTransform transform;\r
- Point prev;\r
- VolatileImage im;\r
- \r
- Drawable drawable;\r
-\r
- public ViewerCanvas(Drawable drawable) {\r
- this.drawable = drawable;\r
- setBackground(Color.WHITE); \r
- addKeyListener(new KeyAdapter() {\r
-\r
- @Override\r
- public void keyPressed(KeyEvent e) {\r
- if(e.getKeyChar()=='1') {\r
- fit();\r
- repaint();\r
- }\r
- }\r
-\r
- });\r
- addMouseListener(new MouseAdapter() {\r
-\r
- @Override\r
- public void mousePressed(MouseEvent e) {\r
- prev = e.getPoint();\r
- } \r
- });\r
- addMouseMotionListener(new MouseAdapter() {\r
- @Override\r
- public void mouseDragged(MouseEvent e) {\r
- Point cur = e.getPoint();\r
- double deltaX = cur.getX()-prev.getX();\r
- double deltaY = cur.getY()-prev.getY(); \r
- transform.preConcatenate(AffineTransform.getTranslateInstance(deltaX, deltaY)); \r
- repaint();\r
- prev = cur;\r
- }\r
- });\r
- addMouseWheelListener(new MouseWheelListener() {\r
-\r
- @Override\r
- public void mouseWheelMoved(MouseWheelEvent e) {\r
- if(transform != null) {\r
- double scale = Math.exp(-0.1*e.getUnitsToScroll());\r
- Point p = e.getPoint();\r
- AffineTransform mod = new AffineTransform();\r
- mod.translate(p.getX(), p.getY());\r
- mod.scale(scale, scale);\r
- mod.translate(-p.getX(), -p.getY());\r
- transform.preConcatenate(mod); \r
- repaint();\r
- }\r
- }\r
-\r
- });\r
- addComponentListener(new ComponentAdapter() {\r
- @Override\r
- public void componentResized(ComponentEvent e) {\r
- if(getWidth() > 0 && getHeight() > 0) {\r
- im = createVolatileImage(getWidth(), getHeight());\r
- repaint();\r
- }\r
- }\r
- });\r
- }\r
-\r
- public void fit() {\r
- Rectangle2D bounds = drawable.getBounds();\r
-\r
- Rectangle2D container = getBounds();\r
- double scale = Math.min(\r
- container.getWidth() / bounds.getWidth(), \r
- container.getHeight() / bounds.getHeight());\r
-\r
- transform = new AffineTransform(\r
- scale, 0.0,\r
- 0.0, scale,\r
- container.getX() + container.getWidth() * 0.5 - bounds.getCenterX() * scale,\r
- container.getY() + container.getHeight() * 0.5 - bounds.getCenterY() * scale\r
- );\r
- }\r
-\r
- @Override\r
- public void paint(Graphics _g) {\r
- do {\r
- if (im == null || im.validate(getGraphicsConfiguration()) ==\r
- VolatileImage.IMAGE_INCOMPATIBLE) {\r
- im = createVolatileImage(getWidth(), getHeight());\r
- }\r
- \r
- Graphics2D g = (Graphics2D)im.getGraphics();\r
- \r
- g.clearRect(0, 0, im.getWidth(null), im.getHeight(null));\r
- \r
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
- g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);\r
- g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);\r
- \r
- if(transform == null)\r
- fit();\r
- g.setTransform(transform);\r
- \r
- drawable.draw(g, null);\r
- g.dispose();\r
- } while(im.contentsLost());\r
-\r
- _g.drawImage(im, 0, 0, this);\r
- }\r
-\r
- @Override\r
- public void update(Graphics g) {\r
- paint(g);\r
- }\r
- \r
- public AffineTransform getTransform() {\r
- return transform;\r
- }\r
-\r
-}\r
-\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.graphviz.drawable;
+
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.RenderingHints;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.VolatileImage;
+
+/**
+ * A canvas showing a given Drawable.
+ *
+ * @author Hannu Niemist�
+ */
+public class ViewerCanvas extends Canvas {
+
+ private static final long serialVersionUID = -1094658958968314511L;
+
+ AffineTransform transform;
+ Point prev;
+ VolatileImage im;
+
+ Drawable drawable;
+
+ public ViewerCanvas(Drawable drawable) {
+ this.drawable = drawable;
+ setBackground(Color.WHITE);
+ addKeyListener(new KeyAdapter() {
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if(e.getKeyChar()=='1') {
+ fit();
+ repaint();
+ }
+ }
+
+ });
+ addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ prev = e.getPoint();
+ }
+ });
+ addMouseMotionListener(new MouseAdapter() {
+ @Override
+ public void mouseDragged(MouseEvent e) {
+ Point cur = e.getPoint();
+ double deltaX = cur.getX()-prev.getX();
+ double deltaY = cur.getY()-prev.getY();
+ transform.preConcatenate(AffineTransform.getTranslateInstance(deltaX, deltaY));
+ repaint();
+ prev = cur;
+ }
+ });
+ addMouseWheelListener(new MouseWheelListener() {
+
+ @Override
+ public void mouseWheelMoved(MouseWheelEvent e) {
+ if(transform != null) {
+ double scale = Math.exp(-0.1*e.getUnitsToScroll());
+ Point p = e.getPoint();
+ AffineTransform mod = new AffineTransform();
+ mod.translate(p.getX(), p.getY());
+ mod.scale(scale, scale);
+ mod.translate(-p.getX(), -p.getY());
+ transform.preConcatenate(mod);
+ repaint();
+ }
+ }
+
+ });
+ addComponentListener(new ComponentAdapter() {
+ @Override
+ public void componentResized(ComponentEvent e) {
+ if(getWidth() > 0 && getHeight() > 0) {
+ im = createVolatileImage(getWidth(), getHeight());
+ repaint();
+ }
+ }
+ });
+ }
+
+ public void fit() {
+ Rectangle2D bounds = drawable.getBounds();
+
+ Rectangle2D container = getBounds();
+ double scale = Math.min(
+ container.getWidth() / bounds.getWidth(),
+ container.getHeight() / bounds.getHeight());
+
+ transform = new AffineTransform(
+ scale, 0.0,
+ 0.0, scale,
+ container.getX() + container.getWidth() * 0.5 - bounds.getCenterX() * scale,
+ container.getY() + container.getHeight() * 0.5 - bounds.getCenterY() * scale
+ );
+ }
+
+ @Override
+ public void paint(Graphics _g) {
+ do {
+ if (im == null || im.validate(getGraphicsConfiguration()) ==
+ VolatileImage.IMAGE_INCOMPATIBLE) {
+ im = createVolatileImage(getWidth(), getHeight());
+ }
+
+ Graphics2D g = (Graphics2D)im.getGraphics();
+
+ g.clearRect(0, 0, im.getWidth(null), im.getHeight(null));
+
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+ g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+
+ if(transform == null)
+ fit();
+ g.setTransform(transform);
+
+ drawable.draw(g, null);
+ g.dispose();
+ } while(im.contentsLost());
+
+ _g.drawImage(im, 0, 0, this);
+ }
+
+ @Override
+ public void update(Graphics g) {
+ paint(g);
+ }
+
+ public AffineTransform getTransform() {
+ return transform;
+ }
+
+}
+