X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.graphviz%2Fsrc%2Forg%2Fsimantics%2Fgraphviz%2Fdrawable%2FJViewer.java;h=d50f577567977129748c62e246c1c7883ae345f9;hb=91e878ce39c9db112d658b3236f29a13e12724e6;hp=6f972d746d4e22620e8c7328acdb8bd54c8b14ab;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.graphviz/src/org/simantics/graphviz/drawable/JViewer.java b/bundles/org.simantics.graphviz/src/org/simantics/graphviz/drawable/JViewer.java index 6f972d746..d50f57756 100644 --- a/bundles/org.simantics.graphviz/src/org/simantics/graphviz/drawable/JViewer.java +++ b/bundles/org.simantics.graphviz/src/org/simantics/graphviz/drawable/JViewer.java @@ -33,6 +33,7 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.io.File; import java.io.IOException; +import java.util.HashMap; import javax.swing.AbstractAction; import javax.swing.JFileChooser; @@ -41,6 +42,7 @@ import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileView; @@ -51,12 +53,16 @@ import org.simantics.graphviz.Graphs; * A stand alone frame that shows and makes it * possible to navigate a given Drawable. * - * @author Hannu Niemistö + * @author Hannu Niemist� */ public class JViewer extends JFrame { + private static final HashMap VIEWER_MAP = new HashMap(); + private static final long serialVersionUID = 3022682167091092801L; Drawable drawable; ViewerCanvas canvas = new ViewerCanvas(); + + private String windowName; class ViewerCanvas extends Canvas { private static final long serialVersionUID = -5330090168115281754L; @@ -91,6 +97,8 @@ public class JViewer extends JFrame { addMouseMotionListener(new MouseAdapter() { @Override public void mouseDragged(MouseEvent e) { + if(transform == null) + return; Point cur = e.getPoint(); if (prev == null) prev = cur; @@ -105,16 +113,16 @@ public class JViewer extends JFrame { @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(); - } + if(transform == null) + return; + 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(); } }); @@ -129,8 +137,11 @@ public class JViewer extends JFrame { private void fit() { Rectangle2D bounds = drawable.getBounds(); - Rectangle2D container = getBounds(); + + if(bounds == null || container == null) + return; + double scale = container == null ? 1 : Math.min( container.getWidth() / bounds.getWidth(), container.getHeight() / bounds.getHeight()); @@ -155,8 +166,15 @@ public class JViewer extends JFrame { g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - if(transform == null) + if(transform == null) { fit(); + if(transform == null) { + g.setTransform(new AffineTransform()); + g.setColor(Color.BLACK); + g.drawString("No data available yet", 20f, 20f); + return; + } + } g.setTransform(transform); drawable.draw(g, null); @@ -205,6 +223,12 @@ public class JViewer extends JFrame { setVisible(true); } + public void updateDrawable(Drawable drawable) { + this.drawable = drawable; + canvas.fit(); + canvas.repaint(); + } + public class ExitAction extends AbstractAction { private static final long serialVersionUID = 5680421985865931443L; @@ -324,5 +348,26 @@ public class JViewer extends JFrame { return null; } } - + + public static void getOrCreateViewer(String windowName, GraphDrawable graphDrawable) { + JViewer viewer = VIEWER_MAP.get(windowName); + if(viewer == null) { + viewer = new JViewer(graphDrawable); + viewer.setTitle(windowName); + viewer.windowName = windowName; + VIEWER_MAP.put(windowName, viewer); + viewer.toFront(); + } + else { + viewer.updateDrawable(graphDrawable); + viewer.toFront(); + } + } + + @Override + public void dispose() { + if(windowName != null) + VIEWER_MAP.remove(windowName); + super.dispose(); + } }