changeset 4495:bf4c1e7d71b3

Experiments with Actions API.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Fri, 03 Feb 2012 21:35:31 +0100
parents e55e2fca50fa
children de4e6eb7265b
files src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/AbstractCfgEditorAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/AbstractRouterAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/Bundle.properties src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ColorAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ExportAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/HideEdgesAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/HierarchicalCompoundLayoutAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/HierarchicalNodeLayoutAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ShowAllAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ShowCFGEditorAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ShowEdgesAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/SwitchLoopClustersAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/UseBezierRouterAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/UseDirectLineRouterAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ZoominAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ZoomoutAction.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/editor/CfgEditorSupport.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/editor/CfgEditorTopComponent.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/graph/CfgScene.java src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/layer.xml src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/preferences/CfgPreferences.java src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/DiagramViewModel.java src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/EditorTopComponent.java src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/SplitCompilationViewer.java src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/actions/TestAction.java src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java
diffstat 28 files changed, 191 insertions(+), 620 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/AbstractCfgEditorAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/AbstractCfgEditorAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,16 +1,12 @@
 package at.ssw.visualizer.cfg.action;
 
 
-import at.ssw.visualizer.cfg.graph.CfgEventListener;
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
 import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JMenuItem;
+import org.openide.util.Utilities;
 import org.openide.util.actions.CallableSystemAction;
-import org.openide.windows.TopComponent;
 
 /**
  * The common superclass of all concrete actions related to the CFG visualizer.
@@ -18,36 +14,19 @@
  * @author Bernhard Stiftner
  * @author Rumpfhuber Stefan
  */
-public abstract class AbstractCfgEditorAction extends CallableSystemAction implements CfgEventListener , PropertyChangeListener {
+public abstract class AbstractCfgEditorAction extends CallableSystemAction {
 
-    CfgEditorTopComponent topComponent = null;
+    CfgScene topComponent = null;
     
     public AbstractCfgEditorAction() {        
-        TopComponent.getRegistry().addPropertyChangeListener(this);
         setEnabled(false);
 
     }
        
-    protected CfgEditorTopComponent getEditor() {
-        return topComponent;
+    protected CfgScene getEditor() {
+        return Utilities.actionsGlobalContext().lookup(CfgScene.class);
     }
     
-    protected void setEditor(CfgEditorTopComponent newTopComponent) {    
-        CfgEditorTopComponent oldTopComponent = getEditor();
-        if(newTopComponent != oldTopComponent){
-            if(oldTopComponent != null) {
-                oldTopComponent.getCfgScene().removeCfgEventListener(this);
-            }
-            this.topComponent = newTopComponent;         
-            if (newTopComponent != null) {
-                newTopComponent.getCfgScene().addCfgEventListener(this);
-                selectionChanged(newTopComponent.getCfgScene());
-            }
-            this.setEnabled(newTopComponent!=null);
-        }
-    }
-
-    
     @Override
     public JMenuItem getMenuPresenter() {
         return new JMenuItem(this);
@@ -75,20 +54,4 @@
     protected boolean asynchronous() {
         return false;
     }
-     
-    
-    public void propertyChange(PropertyChangeEvent e) {  
-        if ( e.getPropertyName().equals(TopComponent.Registry.PROP_ACTIVATED)) {
-            if(e.getNewValue() instanceof CfgEditorTopComponent){  
-                CfgEditorTopComponent tc = (CfgEditorTopComponent)e.getNewValue();
-                setEditor(tc);
-                selectionChanged(tc.getCfgScene());
-            } 
-        }
-    }
-    
-    
-    public void selectionChanged(CfgScene scene) {   
-    }
-
 }
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/AbstractRouterAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/AbstractRouterAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,6 +1,6 @@
 package at.ssw.visualizer.cfg.action;
 
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
+import at.ssw.visualizer.cfg.graph.CfgScene;
 import javax.swing.JComponent;
 import javax.swing.JMenuItem;
 import javax.swing.JRadioButtonMenuItem;
@@ -16,13 +16,13 @@
 public abstract class AbstractRouterAction extends AbstractCfgEditorAction implements Presenter.Menu, Presenter.Popup, Presenter.Toolbar {
        
     public void performAction() {
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {  
             setLinkRouter(tc);
         }
     }
 
-    protected abstract void setLinkRouter(CfgEditorTopComponent editor);
+    protected abstract void setLinkRouter(CfgScene editor);
     
     @Override
     public JMenuItem getMenuPresenter() {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/Bundle.properties	Fri Feb 03 21:35:31 2012 +0100
@@ -0,0 +1,2 @@
+CTL_SomeAction=test
+CTL_SomeAction2=test
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ColorAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ColorAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,7 +1,6 @@
 package at.ssw.visualizer.cfg.action;
 
 import at.ssw.visualizer.cfg.graph.CfgEventListener;
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import at.ssw.visualizer.cfg.model.CfgNode;
 import java.awt.Color;
@@ -12,15 +11,7 @@
 import java.awt.event.MouseListener;
 import java.awt.image.BufferedImage;
 import java.util.Set;
-import javax.swing.AbstractAction;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.SwingConstants;
+import javax.swing.*;
 import javax.swing.plaf.basic.BasicArrowButton;
 import org.openide.util.HelpCtx;
 import org.openide.util.actions.Presenter;
@@ -53,9 +44,9 @@
     }
 
     protected void performAction(Color color) {
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {
-            tc.getCfgScene().setSelectedNodesColor(color);
+            tc.setSelectedNodesColor(color);
         }
     }
 
@@ -95,8 +86,8 @@
         }
         
         protected void initGUI() {  
-            CfgEditorTopComponent tc = getEditor();
-            if( tc != null && tc.getCfgScene().getSelectedNodes().size()==0) {
+            CfgScene tc = getEditor();
+            if( tc != null && tc.getSelectedNodes().size()==0) {
                 //no node selected
                 setEnabled(false);
             } else {
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ExportAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ExportAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,6 +1,5 @@
 package at.ssw.visualizer.cfg.action;
 
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import java.io.File;
 import javax.swing.JComponent;
@@ -26,8 +25,7 @@
     
     @Override
     public void performAction() {       
-        CfgEditorTopComponent tc = this.getEditor();
-        CfgScene scene = tc.getCfgScene();
+        CfgScene scene = this.getEditor();
         JComponent view = scene.getView();
            
         JFileChooser chooser = new JFileChooser ();
@@ -41,10 +39,11 @@
         chooser.addChoosableFileFilter(new FileNameExtensionFilter(DESCRIPTION_GIF, EXT_GIF));
         if(lastDirectory != null)
             chooser.setCurrentDirectory(new File(lastDirectory));
-        chooser.setSelectedFile(new File(tc.getName()));
+        // TODO: chose file.
+        chooser.setSelectedFile(new File("output"));
         
                               
-        if (chooser.showSaveDialog (tc) != JFileChooser.APPROVE_OPTION)
+        if (chooser.showSaveDialog (scene.getView()) != JFileChooser.APPROVE_OPTION)
             return;
 
         File file = chooser.getSelectedFile ();
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/HideEdgesAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/HideEdgesAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,7 +1,6 @@
 package at.ssw.visualizer.cfg.action;
 
 
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import at.ssw.visualizer.cfg.graph.EdgeWidget;
 import at.ssw.visualizer.cfg.model.CfgEdge;
@@ -17,9 +16,9 @@
 public class HideEdgesAction extends AbstractCfgEditorAction {
 
     public void performAction() {
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {
-             tc.getCfgScene().setSelectedEdgesVisibility(false);
+             tc.setSelectedEdgesVisibility(false);
         }
     }
 
@@ -35,18 +34,4 @@
     public HelpCtx getHelpCtx() {
         return HelpCtx.DEFAULT_HELP;
     }
-     
-    @Override  
-    public void selectionChanged(CfgScene scene) {        
-        for (CfgNode n : scene.getSelectedNodes()) {  
-            for (CfgEdge e : scene.findNodeEdges(n, true, true) ){
-                EdgeWidget ew = (EdgeWidget) scene.findWidget(e);
-                if(ew.isVisible()) { 
-                    setEnabled(true);
-                    return;
-                }
-            }
-        }
-        setEnabled(false);
-    }   
 }
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/HierarchicalCompoundLayoutAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/HierarchicalCompoundLayoutAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,7 +1,6 @@
 package at.ssw.visualizer.cfg.action;
 
 import at.ssw.visualizer.cfg.CfgEditorContext;
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import org.openide.util.HelpCtx;
 
@@ -9,11 +8,10 @@
 public class HierarchicalCompoundLayoutAction extends AbstractCfgEditorAction {
     
       public void performAction() {
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {
-            CfgScene scene = tc.getCfgScene();
-            scene.setSceneLayout(CfgEditorContext.LAYOUT_HIERARCHICALCOMPOUNDLAYOUT);           
-            scene.applyLayout();                   
+            tc.setSceneLayout(CfgEditorContext.LAYOUT_HIERARCHICALCOMPOUNDLAYOUT);           
+            tc.applyLayout();                   
         }
     }
 
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/HierarchicalNodeLayoutAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/HierarchicalNodeLayoutAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,7 +1,6 @@
 package at.ssw.visualizer.cfg.action;
 
 import at.ssw.visualizer.cfg.CfgEditorContext;
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import org.openide.util.HelpCtx;
 
@@ -10,9 +9,9 @@
 
     @Override
     public void performAction() {
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {
-            CfgScene scene = tc.getCfgScene();
+            CfgScene scene = tc;
             scene.setSceneLayout(CfgEditorContext.LAYOUT_HIERARCHICALNODELAYOUT);
             scene.applyLayout();                                 
         }
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ShowAllAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ShowAllAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,6 +1,5 @@
 package at.ssw.visualizer.cfg.action;
 
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import org.openide.util.HelpCtx;
 
@@ -14,9 +13,9 @@
     
     @Override
     public void performAction() {    
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {
-            CfgScene scene = tc.getCfgScene();  
+            CfgScene scene = tc;  
             scene.zoomScene();        
 
         }        
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ShowCFGEditorAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-package at.ssw.visualizer.cfg.action;
-
-import at.ssw.visualizer.cfg.editor.CfgEditorSupport;
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
-import at.ssw.visualizer.cfg.icons.Icons;
-import at.ssw.visualizer.model.cfg.ControlFlowGraph;
-import org.openide.nodes.Node;
-import org.openide.util.HelpCtx;
-import org.openide.util.actions.CookieAction;
-import org.openide.windows.TopComponent;
-
-/**
- * Shows the CFG visualizer for the currently selected compilation.
- *
- * @author Bernhard Stiftner
- * @author Christian Wimmer
- */
-public final class ShowCFGEditorAction extends CookieAction {
-         
-    protected void performAction(Node[] activatedNodes) {       
-        ControlFlowGraph cfg = activatedNodes[0].getLookup().lookup(ControlFlowGraph.class);
-        CfgEditorSupport editor = new CfgEditorSupport(cfg);
-        editor.open();
-    }
-
-    @Override
-    protected boolean enable(Node[] activatedNodes) {
-        if (!super.enable(activatedNodes)) {
-            return false;
-        }
-        ControlFlowGraph cfg = activatedNodes[0].getLookup().lookup(ControlFlowGraph.class);
-        return cfg.getBasicBlocks().size() > 0;
-    }
-
-    public String getName() {
-        return "Open Control Flow Graph";
-    }
-
-    @Override
-    protected String iconResource() {
-        return Icons.CFG;
-    }
-
-    protected int mode() {
-        return CookieAction.MODE_EXACTLY_ONE;
-    }
-
-    protected Class[] cookieClasses() {
-        return new Class[]{ControlFlowGraph.class};
-    }
-
-    public HelpCtx getHelpCtx() {
-        return HelpCtx.DEFAULT_HELP;
-    }
-
-    @Override
-    protected boolean asynchronous() {
-        return false;
-    }
-}
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ShowEdgesAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ShowEdgesAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,6 +1,5 @@
 package at.ssw.visualizer.cfg.action;
 
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import at.ssw.visualizer.cfg.graph.EdgeWidget;
 import at.ssw.visualizer.cfg.model.CfgEdge;
@@ -16,9 +15,9 @@
 public class ShowEdgesAction extends AbstractCfgEditorAction {
 
     public void performAction() {
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {
-            tc.getCfgScene().setSelectedEdgesVisibility(true);
+            tc.setSelectedEdgesVisibility(true);
         }
     }
 
@@ -35,18 +34,4 @@
     public HelpCtx getHelpCtx() {
         return HelpCtx.DEFAULT_HELP;
     }
-
-    @Override  
-    public void selectionChanged(CfgScene scene) {      
-        for (CfgNode n : scene.getSelectedNodes()) {  
-            for (CfgEdge e : scene.findNodeEdges(n, true, true) ){
-                EdgeWidget ew = (EdgeWidget) scene.findWidget(e);
-                if(!ew.isVisible()) {
-                    setEnabled(true);
-                    return;
-                }
-            }
-        }
-        setEnabled(false);
-    }
 }
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/SwitchLoopClustersAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/SwitchLoopClustersAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,6 +1,5 @@
 package at.ssw.visualizer.cfg.action;
 
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
@@ -13,9 +12,9 @@
 
     @Override
     public void performAction() {
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {  
-            CfgScene scene = tc.getCfgScene();
+            CfgScene scene = tc;
             boolean visible = scene.isLoopClusterVisible();
             scene.setLoopWidgets(!visible);
         }
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/UseBezierRouterAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/UseBezierRouterAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,15 +1,15 @@
 package at.ssw.visualizer.cfg.action;
 
 import at.ssw.visualizer.cfg.CfgEditorContext;
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
+import at.ssw.visualizer.cfg.graph.CfgScene;
 import org.openide.util.HelpCtx;
 
 
 public class UseBezierRouterAction extends AbstractRouterAction {
     
     @Override
-    protected void setLinkRouter(CfgEditorTopComponent editor) {      
-        editor.getCfgScene().setRouter(CfgEditorContext.ROUTING_BEZIER);
+    protected void setLinkRouter(CfgScene editor) {      
+        editor.setRouter(CfgEditorContext.ROUTING_BEZIER);
     }
     
     @Override
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/UseDirectLineRouterAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/UseDirectLineRouterAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,15 +1,15 @@
 package at.ssw.visualizer.cfg.action;
 
 import at.ssw.visualizer.cfg.CfgEditorContext;
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
+import at.ssw.visualizer.cfg.graph.CfgScene;
 import org.openide.util.HelpCtx;
 
 
 public class UseDirectLineRouterAction extends AbstractRouterAction {
  
     @Override
-    protected void setLinkRouter(CfgEditorTopComponent editor) {
-        editor.getCfgScene().setRouter(CfgEditorContext.ROUTING_DIRECTLINES);
+    protected void setLinkRouter(CfgScene editor) {
+        editor.setRouter(CfgEditorContext.ROUTING_DIRECTLINES);
     }
     
     @Override
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ZoominAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ZoominAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,6 +1,5 @@
 package at.ssw.visualizer.cfg.action;
 
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import org.openide.util.HelpCtx;
 
@@ -9,9 +8,9 @@
        
     @Override
     public void performAction() {
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {            
-            CfgScene scene = tc.getCfgScene();    
+            CfgScene scene = tc;    
             scene.animateZoom(1.1);
         }
     }
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ZoomoutAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/action/ZoomoutAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,6 +1,5 @@
 package at.ssw.visualizer.cfg.action;
 
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.CfgScene;
 import org.openide.util.HelpCtx;
 
@@ -8,9 +7,9 @@
 
     @Override
     public void performAction() {
-        CfgEditorTopComponent tc = getEditor();
+        CfgScene tc = getEditor();
         if (tc != null) {   
-            CfgScene scene = tc.getCfgScene();     
+            CfgScene scene = tc;     
             scene.animateZoom(0.9);
         }
     }
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/editor/CfgEditorSupport.java	Thu Feb 02 17:51:39 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-package at.ssw.visualizer.cfg.editor;
-
-import at.ssw.visualizer.model.cfg.ControlFlowGraph;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.beans.VetoableChangeListener;
-import java.beans.VetoableChangeSupport;
-import java.io.IOException;
-import org.openide.cookies.OpenCookie;
-import org.openide.windows.CloneableOpenSupport;
-import org.openide.windows.CloneableTopComponent;
-
-
-public class CfgEditorSupport extends CloneableOpenSupport implements OpenCookie  {
-    private ControlFlowGraph cfg;
-
-    public CfgEditorSupport(ControlFlowGraph cfg) {
-        super(new Env());
-        ((Env) env).editorSupport = this;
-        this.cfg = cfg;
-    }
-
-    protected CloneableTopComponent createCloneableTopComponent() {    
-         return new CfgEditorTopComponent(cfg);       
-    }
-
-    public String messageOpened() {
-        return "Opened " + cfg.getName();
-    }
-
-    public String messageOpening() {
-        return "Opening " + cfg.getName();
-    }
-    
- 
-    public static class Env implements CloneableOpenSupport.Env {
-        private PropertyChangeSupport prop = new PropertyChangeSupport(this);
-        private VetoableChangeSupport veto = new VetoableChangeSupport(this);
-        private CfgEditorSupport editorSupport;
-
-        public boolean isValid() {
-            return true;
-        }
-
-        public boolean isModified() {
-            return false;
-        }
-
-        public void markModified() throws IOException {
-            throw new IOException("Editor is readonly");
-        }
-
-        public void unmarkModified() {
-            // Nothing to do.
-        }
-
-        public CloneableOpenSupport findCloneableOpenSupport() {
-            return editorSupport;
-        }
-
-        public void addPropertyChangeListener(PropertyChangeListener l) {
-            prop.addPropertyChangeListener(l);
-        }
-
-        public void removePropertyChangeListener(PropertyChangeListener l) {
-            prop.removePropertyChangeListener(l);
-        }
-
-        public void addVetoableChangeListener(VetoableChangeListener l) {
-            veto.addVetoableChangeListener(l);
-        }
-
-        public void removeVetoableChangeListener(VetoableChangeListener l) {
-            veto.removeVetoableChangeListener(l);
-        }
-    }
-}
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/editor/CfgEditorTopComponent.java	Thu Feb 02 17:51:39 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
-package at.ssw.visualizer.cfg.editor;
-
-import at.ssw.visualizer.cfg.action.ShowAllAction;
-import at.ssw.visualizer.cfg.action.ColorAction;
-import at.ssw.visualizer.cfg.action.ExportAction;
-import at.ssw.visualizer.cfg.action.HideEdgesAction;
-import at.ssw.visualizer.cfg.action.HierarchicalCompoundLayoutAction;
-import at.ssw.visualizer.cfg.action.HierarchicalNodeLayoutAction;
-import at.ssw.visualizer.cfg.action.ShowEdgesAction;
-import at.ssw.visualizer.cfg.action.SwitchLoopClustersAction;
-import at.ssw.visualizer.cfg.action.UseBezierRouterAction;
-import at.ssw.visualizer.cfg.action.UseDirectLineRouterAction;
-import at.ssw.visualizer.cfg.action.ZoominAction;
-import at.ssw.visualizer.cfg.action.ZoomoutAction;
-import at.ssw.visualizer.cfg.graph.CfgEventListener;
-import at.ssw.visualizer.cfg.graph.CfgScene;
-import at.ssw.visualizer.cfg.graph.EdgeWidget;
-import at.ssw.visualizer.cfg.graph.NodeWidget;
-import at.ssw.visualizer.cfg.model.CfgEdge;
-import at.ssw.visualizer.cfg.model.CfgNode;
-import at.ssw.visualizer.cfg.preferences.CfgPreferences;
-import at.ssw.visualizer.cfg.preferences.FlagsSetting;
-import javax.swing.ScrollPaneConstants;
-import at.ssw.visualizer.model.cfg.ControlFlowGraph;
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import javax.swing.BorderFactory;
-import javax.swing.ButtonGroup;
-import javax.swing.JComponent;
-import javax.swing.JScrollPane;
-import javax.swing.JToggleButton;
-import javax.swing.UIManager;
-import javax.swing.border.Border;
-import org.netbeans.api.visual.widget.Widget;
-import org.openide.awt.Toolbar;
-import org.openide.util.ImageUtilities;
-import org.openide.windows.CloneableTopComponent;
-import org.openide.windows.TopComponent;
-import org.openide.util.actions.SystemAction;
-
-public class CfgEditorTopComponent extends CloneableTopComponent implements PropertyChangeListener {
-
-    private CfgScene scene;
-    private JScrollPane jScrollPane;
-    private ControlFlowGraph cfg;
-    private JComponent myView;
-
-    public CfgEditorTopComponent(ControlFlowGraph cfg) {
-        this.cfg = cfg;
-
-        setIcon(ImageUtilities.loadImage("at/ssw/visualizer/cfg/icons/cfg.gif"));
-//        setName(cfg.getParent().getShortName());
-//        setToolTipText(cfg.getCompilation().getMethod() + " - " + cfg.getName());
-        // TODO(tw): Add title.
-
-        //panel setup
-        this.jScrollPane = new JScrollPane();
-        this.jScrollPane.setOpaque(true);
-        this.jScrollPane.setBorder(BorderFactory.createEmptyBorder());
-        this.jScrollPane.setViewportBorder(BorderFactory.createEmptyBorder());
-        this.scene = new CfgScene(jScrollPane, cfg);
-        this.myView = scene.createView();
-        this.jScrollPane.setViewportView(myView);
-        this.setLayout(new BorderLayout());
-        this.add(createToolbar(), BorderLayout.NORTH);
-        this.add(jScrollPane, BorderLayout.CENTER);
-        jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
-        jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
-        jScrollPane.getVerticalScrollBar().setEnabled(true);
-        jScrollPane.getHorizontalScrollBar().setEnabled(true);
-
-        //setup enviroment,register listeners
-        // TODO(tw): Add to lookup.
-//        selection = new Selection();
-//        selection.put(cfg);
-//        selection.put(scene);
-//        selection.addChangeListener(scene);
-
-        scene.validate();
-        scene.applyLayout();
-    }
-
-    public ControlFlowGraph getCfg() {
-        return cfg;
-    }
-
-    public JScrollPane getJScrollPanel() {
-        return jScrollPane;
-    }
-
-    public CfgScene getCfgScene() {
-        return scene;
-    }
-
-    @Override
-    public int getPersistenceType() {
-        return TopComponent.PERSISTENCE_NEVER;
-    }
-
-    @Override
-    protected void componentOpened() {
-        super.componentOpened();
-        CfgPreferences.getInstance().addPropertyChangeListener(this);
-    }
-
-    @Override
-    protected void componentActivated() {
-        super.componentActivated();
-//        SelectionManager.getDefault().setSelection(selection);
-        this.getCfgScene().updateGlobalSelection();
-        this.getCfgScene().fireSelectionChanged();
-    }
-
-    @Override
-    protected void componentClosed() {
-        super.componentClosed();
-//        SelectionManager.getDefault().removeSelection(selection);
-        CfgPreferences.getInstance().removePropertyChangeListener(this);
-    }
-
-    @Override
-    protected CloneableTopComponent createClonedObject() {
-        CfgEditorTopComponent component = new CfgEditorTopComponent(cfg);
-        component.setActivatedNodes(getActivatedNodes());
-        return component;
-    }
-
-    public void propertyChange(PropertyChangeEvent evt) {
-        if (this.scene != null) {
-
-            String propName = evt.getPropertyName();
-            CfgPreferences prefs = CfgPreferences.getInstance();
-            if (propName.equals(CfgPreferences.PROP_BACKGROUND_COLOR)) {
-                scene.setBackground(prefs.getBackgroundColor());
-                scene.revalidate();
-            } else if (propName.equals(CfgPreferences.PROP_NODE_COLOR)) {
-                for (NodeWidget nw : scene.getNodeWidgets()) {
-                    //only change the node color if its not a custom color
-                    if (!nw.isNodeColorCustomized()) {
-                        nw.setNodeColor(prefs.getNodeColor(), false);
-                    }
-                }
-            } else if (propName.equals(CfgPreferences.PROP_EDGE_COLOR)) {
-                for (CfgEdge e : scene.getEdges()) {
-                    if (!e.isBackEdge() && !e.isXhandler()) {
-                        EdgeWidget w = (EdgeWidget) scene.findWidget(e);
-                        w.setLineColor(prefs.getEdgeColor());
-                    }
-                }
-            } else if (propName.equals(CfgPreferences.PROP_BACK_EDGE_COLOR)) {
-                for (CfgEdge e : scene.getEdges()) {
-                    if (e.isBackEdge()) {
-                        EdgeWidget w = (EdgeWidget) scene.findWidget(e);
-                        w.setLineColor(prefs.getBackedgeColor());
-                    }
-                }
-            } else if (propName.equals(CfgPreferences.PROP_EXCEPTION_EDGE_COLOR)) {
-                for (CfgEdge e : scene.getEdges()) {
-                    if (e.isXhandler()) {
-                        EdgeWidget w = (EdgeWidget) scene.findWidget(e);
-                        w.setLineColor(prefs.getExceptionEdgeColor());
-                    }
-                }
-            } else if (propName.equals(CfgPreferences.PROP_BORDER_COLOR)) {
-                for (CfgNode n : scene.getNodes()) {
-                    NodeWidget nw = (NodeWidget) scene.findWidget(n);
-                    nw.setBorderColor(prefs.getBorderColor());
-                }
-            } else if (propName.equals(CfgPreferences.PROP_TEXT_FONT)) {
-                for (CfgNode n : scene.getNodes()) {
-                    NodeWidget nw = (NodeWidget) scene.findWidget(n);
-                    nw.adjustFont(prefs.getTextFont());
-                }
-            } else if (propName.equals(CfgPreferences.PROP_TEXT_COLOR)) {
-                for (CfgNode n : scene.getNodes()) {
-                    NodeWidget nw = (NodeWidget) scene.findWidget(n);
-                    nw.setForeground(prefs.getTextColor());
-                }
-            } else if (propName.equals(CfgPreferences.PROP_FLAGS)) {
-                FlagsSetting fs = CfgPreferences.getInstance().getFlagsSetting();
-                for (CfgNode n : scene.getNodes()) {
-                    NodeWidget nw = (NodeWidget) scene.findWidget(n);
-                    Color nodeColor = fs.getColor(n.getBasicBlock().getFlags());
-                    if (nodeColor != null) {
-                        nw.setNodeColor(nodeColor, true);
-                    } else {
-                        nw.setNodeColor(CfgPreferences.getInstance().getNodeColor(), false);
-                    }
-                }
-            } else if (propName.equals(CfgPreferences.PROP_SELECTION_COLOR_BG) || propName.equals(CfgPreferences.PROP_SELECTION_COLOR_FG)) {
-                for (CfgNode n : scene.getNodes()) {
-                    Widget w = scene.findWidget(n);
-                    w.revalidate();
-                }
-            }
-            scene.validate();
-        }
-
-    }
-
-    private Toolbar createToolbar() {
-        Toolbar tb = new Toolbar("CfgToolbar");
-
-        tb.setBorder((Border) UIManager.get("Nb.Editor.Toolbar.border"));
-
-        //zoomin/zoomout buttons
-        tb.add(SystemAction.get(ZoominAction.class).getToolbarPresenter());
-        tb.add(SystemAction.get(ZoomoutAction.class).getToolbarPresenter());
-        tb.addSeparator();
-
-        //router buttons
-        ButtonGroup routerButtons = new ButtonGroup();
-        UseDirectLineRouterAction direct = SystemAction.get(UseDirectLineRouterAction.class);
-        UseBezierRouterAction bezier = SystemAction.get(UseBezierRouterAction.class);
-        JToggleButton button = (JToggleButton) direct.getToolbarPresenter();
-        button.getModel().setGroup(routerButtons);
-        button.setSelected(true);
-        tb.add(button);
-        button = (JToggleButton) bezier.getToolbarPresenter();
-        button.getModel().setGroup(routerButtons);
-        tb.add(button);
-        tb.addSeparator();
-
-        //layout buttons
-        tb.add(SystemAction.get(HierarchicalNodeLayoutAction.class).getToolbarPresenter());
-        tb.add(SystemAction.get(HierarchicalCompoundLayoutAction.class).getToolbarPresenter());
-
-        tb.addSeparator();
-        tb.add(SystemAction.get(ShowAllAction.class).getToolbarPresenter());
-        tb.addSeparator();
-
-        //cluster button
-        tb.add(SystemAction.get(SwitchLoopClustersAction.class).getToolbarPresenter());
-        tb.addSeparator();
-
-        //show/hide edge button
-        tb.add(SystemAction.get(ShowEdgesAction.class).getToolbarPresenter());
-        tb.add(SystemAction.get(HideEdgesAction.class).getToolbarPresenter());
-        tb.addSeparator();
-
-        //color button       
-        JComponent colorButton = SystemAction.get(ColorAction.class).getToolbarPresenter();
-        getCfgScene().addCfgEventListener((CfgEventListener) colorButton);
-        tb.add(colorButton);
-
-        //export button           
-        tb.add(SystemAction.get(ExportAction.class).getToolbarPresenter());
-        tb.doLayout();
-
-        return tb;
-    }
-}
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/graph/CfgScene.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/graph/CfgScene.java	Fri Feb 03 21:35:31 2012 +0100
@@ -6,7 +6,6 @@
 import at.ssw.visualizer.cfg.action.ColorAction;
 import at.ssw.visualizer.cfg.action.HideEdgesAction;
 import at.ssw.visualizer.cfg.action.ShowEdgesAction;
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import at.ssw.visualizer.cfg.graph.layout.HierarchicalCompoundLayout;
 import at.ssw.visualizer.cfg.graph.layout.HierarchicalNodeLayout;
 import at.ssw.visualizer.cfg.model.CfgEnv;
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/layer.xml	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/layer.xml	Fri Feb 03 21:35:31 2012 +0100
@@ -51,6 +51,11 @@
     </folder>
 
     <folder name="Menu">
+        <folder name="BuildProject_hidden">
+            <file name="at-ssw-visualizer-cfg-action-SomeAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Build/at-ssw-visualizer-cfg-action-SomeAction.instance"/>
+            </file>
+        </folder>
         <folder name="Window">
             <file name="ShowCFGEditor.shadow">
                 <attr name="originalFile" stringvalue="Actions/Window/ShowCFGEditor.instance"/>
--- a/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/preferences/CfgPreferences.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlowEditor/src/at/ssw/visualizer/cfg/preferences/CfgPreferences.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,6 +1,5 @@
 package at.ssw.visualizer.cfg.preferences;
 
-import at.ssw.visualizer.cfg.editor.CfgEditorTopComponent;
 import java.awt.Color;
 import java.awt.Font;
 import java.beans.PropertyChangeEvent;
@@ -58,14 +57,6 @@
         return instance;
     }
 
-    public void addPropertyChangeListener(CfgEditorTopComponent listener) {
-        listenerList.add(PropertyChangeListener.class, listener);   
-    }
-
-    public void removePropertyChangeListener(CfgEditorTopComponent listener) {
-        listenerList.remove(PropertyChangeListener.class, listener);
-    }
- 
     protected final Preferences getPreferences() {
         return NbPreferences.forModule(this.getClass()).node("options").node(nodeName);
     }
--- a/src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/DiagramViewModel.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/DiagramViewModel.java	Fri Feb 03 21:35:31 2012 +0100
@@ -42,8 +42,6 @@
  */
 public class DiagramViewModel {
 
-    // Warning: Update setData method if fields are added
-    private Group group;
     private Set<Integer> hiddenNodes;
     private Set<Integer> onScreenNodes;
     private Set<Integer> selectedNodes;
@@ -80,7 +78,6 @@
         this.firstGraph = firstGraph;
         this.secondGraph = secondGraph;
         this.showNodeHull = true;
-        this.group = g;
         assert filterChain != null;
         this.filterChain = filterChain;
         assert sequenceFilterChain != null;
--- a/src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/EditorTopComponent.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/EditorTopComponent.java	Fri Feb 03 21:35:31 2012 +0100
@@ -48,6 +48,8 @@
 import org.openide.awt.Toolbar;
 import org.openide.awt.ToolbarPool;
 import org.openide.awt.UndoRedo;
+import org.openide.filesystems.FileUtil;
+import org.openide.util.ContextAwareAction;
 import org.openide.util.Lookup;
 import org.openide.util.Lookup.Provider;
 import org.openide.util.NbBundle;
@@ -57,9 +59,7 @@
 import org.openide.util.lookup.InstanceContent;
 import org.openide.util.lookup.Lookups;
 import org.openide.util.lookup.ProxyLookup;
-import org.openide.windows.Mode;
-import org.openide.windows.TopComponent;
-import org.openide.windows.WindowManager;
+import org.openide.windows.*;
 
 /**
  * 
@@ -80,14 +80,23 @@
     private final CardLayout viewerPanelCardLayout;
     private final Map<String, CompilationViewer> createdComponents = new HashMap<>();
     private final Lookup proxyLookup;
+    private Lookup currentLookup = Lookups.fixed();
     
     private final Lookup.Provider currentViewLookupProvider = new Lookup.Provider() {
 
         @Override
         public Lookup getLookup() {
-            return (activeViewer == null) ? Lookups.fixed() : activeViewer.getLookup();
+            return currentLookup;
         }
     };
+
+    private InputGraph getFirstGraph() {
+        return group.getGraphs().get(getModel().getFirstPosition());
+    }
+
+    private InputGraph getSecondGraph() {
+        return group.getGraphs().get(getModel().getSecondPosition());
+    }
     
     private void updateDisplayName() {
         int first = getModel().getFirstPosition();
@@ -125,8 +134,7 @@
         rangeSliderModel = new RangeSliderModel(calculateStringList(group));
         int graphPos = group.getGraphs().indexOf(graph);
         rangeSliderModel.setPositions(graphPos, graphPos);
-        rangeSlider = new RangeSlider();
-        rangeSlider.setModel(rangeSliderModel);
+        rangeSlider = new RangeSlider(rangeSliderModel);
 
         Collection<? extends CompilationViewerFactory> factories = Lookup.getDefault().lookupAll(CompilationViewerFactory.class);
         content = new InstanceContent();
@@ -142,6 +150,10 @@
         toolBar.add(UndoAction.get(UndoAction.class));
         toolBar.add(RedoAction.get(RedoAction.class));
         
+        ContextAwareAction a = FileUtil.getConfigObject("Actions/View/com-oracle-graal-visualizer-editor-actions-TestAction.instance", ContextAwareAction.class);
+        FileUtil.getConfigFile("Actions/View/com-oracle-graal-visualizer-editor-actions-TestAction.instance");
+        toolBar.add(a.createContextAwareInstance(proxyLookup));
+        
         ButtonGroup factoryButtonGroup = new ButtonGroup();
         for (CompilationViewerFactory factory : factories) {
             AbstractButton button = createFactoryChangeButton(factory);
@@ -207,7 +219,7 @@
         }
         return null;
     }
-
+    
     /** This method is called from within the constructor to
      * initialize the form.
      * WARNING: Do NOT modify this code. The content of this method is
@@ -259,7 +271,7 @@
         updateDisplayName();
         String id = getViewStringIdentifier();
         if (!createdComponents.containsKey(id)) {
-            CompilationViewer newViewer = createViewer(activeFactory, getModel().getFirstPosition(), getModel().getSecondPosition());
+            CompilationViewer newViewer = createViewer(activeFactory);
             createdComponents.put(id, newViewer);
             viewerPanel.add(newViewer.getComponent(), id);
             viewerToolBarPanel.add(newViewer.getToolBarComponent(), id);
@@ -272,6 +284,7 @@
             viewerToolBarPanelCardLayout.show(viewerToolBarPanel, id);
             
             // Make sure that lookup is updated.
+            currentLookup = new ProxyLookup(activeViewer.getLookup(), Lookups.fixed(getFirstGraph(), getSecondGraph()));
             proxyLookup.lookup(Object.class);
         }
     }
@@ -292,9 +305,9 @@
         return toggleButton;
     }
     
-    private CompilationViewer createViewer(CompilationViewerFactory activeFactory, int firstPosition, int secondPosition) {
-        InputGraph firstSnapshot = group.getGraphs().get(firstPosition);
-        InputGraph secondSnapshot = group.getGraphs().get(secondPosition);
+    private CompilationViewer createViewer(CompilationViewerFactory activeFactory) {
+        InputGraph firstSnapshot = getFirstGraph();
+        InputGraph secondSnapshot = getSecondGraph();
         return activeFactory.createViewer(firstSnapshot, secondSnapshot);
     }
 }
--- a/src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/SplitCompilationViewer.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/SplitCompilationViewer.java	Fri Feb 03 21:35:31 2012 +0100
@@ -44,6 +44,8 @@
         splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
         firstPanel = createPanel(firstViewer);
         secondPanel = createPanel(secondViewer);
+        splitPane.add(firstPanel);
+        splitPane.add(secondPanel);
     }
 
     @Override
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/tools/IdealGraphVisualizer/Editor/src/com/oracle/graal/visualizer/editor/actions/TestAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+package com.oracle.graal.visualizer.editor.actions;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
+import javax.swing.JOptionPane;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+import org.openide.awt.ActionRegistration;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+@ActionID(id = "com.oracle.graal.visualizer.editor.actions.TestAction", category = "View")
+@ActionRegistration(displayName = "My test action", iconBase="com/sun/hotspot/igv/view/images/next_diagram.png")
+@ActionReference(path = "Menu/View", position = 150)
+public final class TestAction implements ActionListener {
+    
+    List<InputGraph> inputs;
+    
+    public TestAction(List<InputGraph> inputs) {
+        this.inputs = inputs;
+    }
+    
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        JOptionPane.showMessageDialog(null, "number of input graphs: " + inputs.size());
+        
+    }
+
+}
--- a/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java	Fri Feb 03 21:35:31 2012 +0100
@@ -93,13 +93,11 @@
         Point mouseLocation = scene.convertSceneToView(event.getPoint());
         int xOffset = 0;
         int yOffset = 0;
-        Point oldViewPosition = null;
         Rectangle bounds = new Rectangle(scene.getBounds());
         Dimension componentSize = new Dimension(scene.getView().getPreferredSize());
 
         if (scrollPane != null) {
             viewPosition = new Point(scrollPane.getViewport().getViewPosition());
-            oldViewPosition = new Point(viewPosition);
             xOffset = (mouseLocation.x - viewPosition.x);
             yOffset = (mouseLocation.y - viewPosition.y);
             viewPosition.x += xOffset;
--- a/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java	Fri Feb 03 21:35:31 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,11 +32,7 @@
 import java.util.List;
 import javax.swing.JComponent;
 
-/**
- *
- * @author Thomas Wuerthinger
- */
-public class RangeSlider extends JComponent implements ChangedListener<RangeSliderModel>, MouseListener, MouseMotionListener {
+public class RangeSlider extends JComponent {
 
     public static final int BAR_THICKNESS = 2;
     public static final int BAR_CIRCLE_SIZE = 9;
@@ -52,22 +48,11 @@
     private RangeSliderModel tempModel;
     private Point lastMouseMove;
 
-    public RangeSlider() {
-        this.addMouseMotionListener(this);
-        this.addMouseListener(this);
-    }
-
-    public void setModel(RangeSliderModel newModel) {
-        if (model != null) {
-            model.getChangedEvent().removeListener(this);
-            model.getColorChangedEvent().removeListener(this);
-        }
-        if (newModel != null) {
-            newModel.getChangedEvent().addListener(this);
-            newModel.getColorChangedEvent().addListener(this);
-        }
+    public RangeSlider(RangeSliderModel newModel) {
+        this.addMouseMotionListener(mouseMotionListener);
+        this.addMouseListener(mouseListener);
+        newModel.getChangedEvent().addListener(modelChangedListener);
         this.model = newModel;
-        update();
     }
 
     private RangeSliderModel getPaintingModel() {
@@ -97,11 +82,13 @@
         d.height = ITEM_HEIGHT * list.size();
         return d;
     }
-
-    @Override
-    public void changed(RangeSliderModel source) {
-        update();
-    }
+    
+    private ChangedListener<RangeSliderModel> modelChangedListener = new ChangedListener<RangeSliderModel>() {
+        @Override
+        public void changed(RangeSliderModel source) {
+            update();
+        }
+    };
 
     private void update() {
         this.repaint();
@@ -191,15 +178,6 @@
         return new Rectangle(0, startY, getWidth(), endY - startY);
     }
 
-    @Override
-    public void mouseDragged(MouseEvent e) {
-        if (startPoint != null) {
-            int startIndex = getIndexFromPosition(startPoint.y);
-            int curIndex = getIndexFromPosition(e.getPoint().y);
-            tempModel.setPositions(startIndex, curIndex);
-        }
-    }
-
     private int getIndexFromPosition(int y) {
         for (int i = 0; i < getPaintingModel().getPositions().size() - 1; i++) {
             Rectangle bounds = getItemBounds(i);
@@ -209,42 +187,57 @@
         }
         return getPaintingModel().getPositions().size() - 1;
     }
+    private final MouseMotionListener mouseMotionListener = new MouseMotionListener() {
 
-    @Override
-    public void mouseMoved(MouseEvent e) {
-        lastMouseMove = e.getPoint();
-        update();
-    }
+        @Override
+        public void mouseDragged(MouseEvent e) {
+            if (startPoint != null) {
+                int startIndex = getIndexFromPosition(startPoint.y);
+                int curIndex = getIndexFromPosition(e.getPoint().y);
+                tempModel.setPositions(startIndex, curIndex);
+            }
+        }
 
-    @Override
-    public void mouseClicked(MouseEvent e) {
-        int index = getIndexFromPosition(e.getPoint().y);
-        model.setPositions(index, index);
-    }
+        @Override
+        public void mouseMoved(MouseEvent e) {
+            lastMouseMove = e.getPoint();
+            update();
+        }
+    };
+    private final MouseListener mouseListener = new MouseListener() {
+
+        @Override
+        public void mouseClicked(MouseEvent e) {
+            int index = getIndexFromPosition(e.getPoint().y);
+            model.setPositions(index, index);
+        }
 
-    @Override
-    public void mousePressed(MouseEvent e) {
-        int index = getIndexFromPosition(e.getPoint().y);
-        startPoint = e.getPoint();
-        tempModel = model.copy();
-        tempModel.getChangedEvent().addListener(this);
-        tempModel.setPositions(index, index);
-    }
+        @Override
+        public void mousePressed(MouseEvent e) {
+            int index = getIndexFromPosition(e.getPoint().y);
+            startPoint = e.getPoint();
+            tempModel = model.copy();
+            tempModel.getChangedEvent().addListener(modelChangedListener);
+            tempModel.setPositions(index, index);
+        }
 
-    @Override
-    public void mouseReleased(MouseEvent e) {
-        model.setPositions(tempModel.getFirstPosition(), tempModel.getSecondPosition());
-        tempModel = null;
-        startPoint = null;
-    }
+        @Override
+        public void mouseReleased(MouseEvent e) {
+            if (tempModel != null) {
+                model.setPositions(tempModel.getFirstPosition(), tempModel.getSecondPosition());
+                tempModel = null;
+                startPoint = null;
+            }
+        }
 
-    @Override
-    public void mouseEntered(MouseEvent e) {
-    }
+        @Override
+        public void mouseEntered(MouseEvent e) {
+        }
 
-    @Override
-    public void mouseExited(MouseEvent e) {
-        lastMouseMove = null;
-        repaint();
-    }
+        @Override
+        public void mouseExited(MouseEvent e) {
+            lastMouseMove = null;
+            repaint();
+        }
+    };
 }
--- a/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java	Thu Feb 02 17:51:39 2012 +0100
+++ b/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java	Fri Feb 03 21:35:31 2012 +0100
@@ -39,7 +39,6 @@
 
     // Warning: Update setData method if fields are added
     private ChangedEvent<RangeSliderModel> changedEvent;
-    private ChangedEvent<RangeSliderModel> colorChangedEvent;
     private List<String> positions;
     private int firstPosition;
     private int secondPosition;
@@ -53,20 +52,16 @@
         firstPosition = model.firstPosition;
         changed |= (secondPosition != model.secondPosition);
         secondPosition = model.secondPosition;
-        boolean colorChanged = (colors != model.colors);
+        changed |= (colors != model.colors);
         colors = model.colors;
         if (changed) {
             changedEvent.fire();
         }
-        if (colorChanged) {
-            colorChangedEvent.fire();
-        }
     }
 
     public RangeSliderModel(List<String> positions) {
         assert positions.size() > 0;
         this.changedEvent = new ChangedEvent<>(this);
-        this.colorChangedEvent = new ChangedEvent<>(this);
         setPositions(positions);
     }
 
@@ -79,12 +74,11 @@
         firstPosition = Math.min(firstPosition, positions.size() - 1);
         secondPosition = Math.min(secondPosition, positions.size() - 1);
         changedEvent.fire();
-        colorChangedEvent.fire();
     }
 
     public void setColors(List<Color> colors) {
         this.colors = colors;
-        colorChangedEvent.fire();
+        changedEvent.fire();
     }
 
     public List<Color> getColors() {
@@ -126,10 +120,6 @@
         }
     }
 
-    public ChangedEvent<RangeSliderModel> getColorChangedEvent() {
-        return colorChangedEvent;
-    }
-
     @Override
     public ChangedEvent<RangeSliderModel> getChangedEvent() {
         return changedEvent;