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;
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;
* 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;
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
+ if(transform == null)
+ return;
Point cur = e.getPoint();
if (prev == null)
prev = cur;
@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();
}
});
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());
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);
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;
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();
+ }
}