]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graphviz/src/org/simantics/graphviz/drawable/JViewer.java
Prevent some NPEs in Graphviz plugin
[simantics/platform.git] / bundles / org.simantics.graphviz / src / org / simantics / graphviz / drawable / JViewer.java
index 6f972d746d4e22620e8c7328acdb8bd54c8b14ab..d50f577567977129748c62e246c1c7883ae345f9 100644 (file)
@@ -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<String, JViewer> VIEWER_MAP = new HashMap<String, JViewer>(); 
+    
        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();
+    }
 }