[jboss-svn-commits] JBL Code SVN: r7242 - in labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors: . rete rete/model rete/part

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Oct 30 19:38:56 EST 2006


Author: ahtik
Date: 2006-10-30 19:38:48 -0500 (Mon, 30 Oct 2006)
New Revision: 7242

Modified:
   labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor2.java
   labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/ReteViewer.java
   labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/model/ReteGraph.java
   labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/part/ConnectionEditPart.java
   labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/part/DiagramEditPart.java
Log:
JBRULES-517: graph layout optimizations, lazy graph loading, using active editor buffer for rete graph, better error handling, progress monitor and non-UI thread for rete loader, centered diagram

Modified: labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor2.java
===================================================================
--- labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor2.java	2006-10-31 00:33:08 UTC (rev 7241)
+++ labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor2.java	2006-10-31 00:38:48 UTC (rev 7242)
@@ -16,11 +16,18 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.InvocationTargetException;
+
 import org.drools.ide.DroolsIDEPlugin;
 import org.drools.ide.editors.rete.ReteViewer;
+import org.drools.ide.editors.rete.model.ReteGraph;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.gef.editparts.ZoomManager;
 import org.eclipse.gef.ui.actions.ZoomComboContributionItem;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocumentListener;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.PartInitException;
@@ -44,6 +51,8 @@
     private ZoomInAction2             zoomIn;
     private ZoomOutAction2            zoomOut;
 
+    protected ReteGraph               graph;
+
     /* (non-Javadoc)
      * @see org.eclipse.ui.forms.editor.FormEditor#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
      */
@@ -72,8 +81,9 @@
                     DRLRuleEditor2.this.setPartName( partName );
                 }
             };
-            reteViewer = new ReteViewer( textEditor.getDocumentProvider() );
 
+            reteViewer = new ReteViewer();
+
             int text = addPage( textEditor,
                                 getEditorInput() );
 
@@ -84,6 +94,18 @@
                          "Text Editor" );
             setPageText( rete,
                          "Rete Tree" );
+
+            textEditor.getDocumentProvider().getDocument( getEditorInput() ).addDocumentListener( new IDocumentListener() {
+
+                public void documentAboutToBeChanged(DocumentEvent event) {
+                }
+
+                public void documentChanged(DocumentEvent event) {
+                    reteViewer.fireDocumentChanged();
+                }
+
+            } );
+
         } catch ( PartInitException e ) {
             DroolsIDEPlugin.log( e );
         }
@@ -95,7 +117,6 @@
     public void doSave(IProgressMonitor monitor) {
         textEditor.doSave( monitor );
         setInput( getEditorInput() );
-        reteViewer.loadReteModel();
     }
 
     /* (non-Javadoc)
@@ -103,7 +124,6 @@
      */
     public void doSaveAs() {
         textEditor.doSaveAs();
-        reteViewer.loadReteModel();
     }
 
     /* (non-Javadoc)
@@ -207,14 +227,78 @@
     }
 
     public void setFocus() {
+        if ( getActivePage() == 1 ) {
+            boolean reteFailed = false;
+            graph = null;
+            try {
+                final String contents = textEditor.getDocumentProvider().getDocument( getEditorInput() ).get();
+                final IRunnableWithProgress runnable = new IRunnableWithProgress() {
+
+                    public void run(IProgressMonitor monitor) throws InvocationTargetException,
+                                                             InterruptedException {
+                        try {
+                            graph = reteViewer.loadReteModel( monitor,
+                                                              contents );
+                        } catch ( Throwable e ) {
+                            if ( e instanceof InvocationTargetException ) {
+                                throw (InvocationTargetException) e;
+                            } else if ( e instanceof InterruptedException ) {
+                                throw (InterruptedException) e;
+                            }
+                            throw new InvocationTargetException( e );
+                        }
+
+                    }
+
+                };
+
+                getEditorSite().getWorkbenchWindow().getWorkbench().getProgressService().busyCursorWhile( runnable );
+
+                reteViewer.drawGraph( graph );
+
+            } catch ( InvocationTargetException e ) {
+                handleError( e );
+                reteFailed = true;
+            } catch ( InterruptedException e ) {
+                MessageDialog.openError( getSite().getShell(),
+                                         "Rete Tree Error!",
+                                         "Rete Tree Calculation Cancelled!" );
+                reteFailed = true;
+            } catch ( Throwable t ) {
+                handleError( t );
+                reteFailed = true;
+            }
+            if ( reteFailed ) {
+                setActivePage( 0 );
+            }
+        }
+
         super.setFocus();
         updateZoomItems();
+
     }
 
+    private void handleError(Throwable t) {
+        DroolsIDEPlugin.log( t );
+        Throwable cause = t.getCause();
+        if ( cause == null ) {
+            cause = t;
+        }
+        String message = cause.getMessage();
+        if ( message == null || message.length() == 0 ) {
+            message = "Uncategorized Error!";
+        }
+        MessageDialog.openError( getSite().getShell(),
+                                 "Rete Tree Error!",
+                                 message );
+
+    }
+
     /**
      * Increasing visibility to allow switching tabs by page index
      */
     public void setActivePage(int pageIndex) {
         super.setActivePage( pageIndex );
     }
+
 }

Modified: labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/ReteViewer.java
===================================================================
--- labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/ReteViewer.java	2006-10-31 00:33:08 UTC (rev 7241)
+++ labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/ReteViewer.java	2006-10-31 00:38:48 UTC (rev 7242)
@@ -39,14 +39,20 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.ConnectionLayer;
+import org.eclipse.draw2d.ConnectionRouter;
 import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ShortestPathConnectionRouter;
+import org.eclipse.draw2d.geometry.Dimension;
 import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.gef.DefaultEditDomain;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.GraphicalEditPart;
 import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.LayerConstants;
 import org.eclipse.gef.MouseWheelHandler;
 import org.eclipse.gef.MouseWheelZoomHandler;
+import org.eclipse.gef.editparts.LayerManager;
 import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
 import org.eclipse.gef.editparts.ZoomManager;
 import org.eclipse.gef.ui.parts.GraphicalEditor;
@@ -55,7 +61,6 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.swt.SWT;
 import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.texteditor.IDocumentProvider;
 
 /**
  * GEF-based RETE Viewer
@@ -65,22 +70,25 @@
  */
 public class ReteViewer extends GraphicalEditor {
 
-    private static final String  JAVA_NATURE  = "org.eclipse.jdt.core.javanature";
+    private static final String  MSG_PARSE_ERROR         = "Unable to parse rules to show RETE view!";
 
-    ScalableFreeformRootEditPart rootEditPart = new ScalableFreeformRootEditPart();
+    private static final String  JAVA_NATURE             = "org.eclipse.jdt.core.javanature";
 
-    private IDocumentProvider    documentProvider;
+    private static final int     SIMPLE_ROUTER_MIN_NODES = 100;
 
-    private ReteGraph            diagram      = new ReteGraph();
+    ScalableFreeformRootEditPart rootEditPart            = new ScalableFreeformRootEditPart();
 
+    private ReteGraph            diagram                 = new ReteGraph();
+
+    private boolean              relayoutRequired        = true;
+
     /**
      * Constructor.
      * 
      * @param documentProvider documentProvider must contain Document with rules.
      */
-    public ReteViewer(IDocumentProvider documentProvider) {
+    public ReteViewer() {
         super();
-        this.documentProvider = documentProvider;
         setEditDomain( new DefaultEditDomain( this ) );
     }
 
@@ -108,10 +116,9 @@
         return super.getAdapter( type );
     }
 
-    private RuleBase getRuleBase() {
+    private RuleBase getRuleBase(String contents) {
         if ( getEditorInput() instanceof IFileEditorInput ) {
             try {
-                String contents = documentProvider.getDocument( getEditorInput() ).get();
 
                 ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
                 ClassLoader newLoader = DroolsBuilder.class.getClassLoader();
@@ -180,31 +187,62 @@
     /**
      * Loads model from rule base,
      * calculates rete view and initializes diagram model.
+     * @param monitor 
+     * @param contents 
+     * @return
      */
-    public void loadReteModel() {
+    public ReteGraph loadReteModel(IProgressMonitor monitor,
+                                   String contents) throws Throwable {
+        if ( relayoutRequired == false ) {
+            return diagram;
+        }
+
+        ReteGraph newDiagram = new ReteGraph();
+
         try {
 
-            diagram.removeAll();
+            monitor.beginTask( "Loading RETE Tree",
+                               100 );
 
-            RuleBase ruleBase = getRuleBase();
+            monitor.subTask( "Loading Rule Base" );
+            RuleBase ruleBase = getRuleBase( contents );
             if ( ruleBase == null ) {
-                DroolsIDEPlugin.log( new Exception( "Unable to load rule base!" ) );
-            } else {
+                final Exception error = new Exception( MSG_PARSE_ERROR );
+                throw error;
+            }
+            monitor.worked( 50 );
+            if ( monitor.isCanceled() ) {
+                throw new InterruptedException();
+            }
 
-                final ReteooVisitor visitor = new ReteooVisitor( diagram );
-                visitor.visit( ruleBase );
+            monitor.subTask( "Building RETE Tree" );
+            final ReteooVisitor visitor = new ReteooVisitor( newDiagram );
+            visitor.visit( ruleBase );
+            monitor.worked( 30 );
+            if ( monitor.isCanceled() ) {
+                throw new InterruptedException();
+            }
 
-                BaseVertex rootVertex = visitor.getRootVertex();
+            monitor.subTask( "Calculating RETE Tree Layout" );
+            BaseVertex rootVertex = visitor.getRootVertex();
+            RowList rowList = ReteooLayoutFactory.calculateReteRows( rootVertex );
+            ReteooLayoutFactory.layoutRowList( newDiagram,
+                                               rowList );
+            zeroBaseDiagram( newDiagram );
+            monitor.worked( 20 );
+            if ( monitor.isCanceled() ) {
+                throw new InterruptedException();
+            }
+            monitor.done();
 
-                RowList rowList = ReteooLayoutFactory.calculateReteRows( rootVertex );
-                ReteooLayoutFactory.layoutRowList( diagram,
-                                                   rowList );
-
+        } catch ( Throwable t ) {
+            if ( !(t instanceof InterruptedException) ) {
+                DroolsIDEPlugin.log( t );
             }
-        } catch ( Throwable t ) {
-            t.printStackTrace();
-            DroolsIDEPlugin.log( t );
+            throw t;
         }
+        relayoutRequired = false;
+        return newDiagram;
     }
 
     private ReteGraph getModel() {
@@ -216,16 +254,6 @@
      * 
      */
     protected void initializeGraphicalViewer() {
-        GraphicalViewer viewer = getGraphicalViewer();
-
-        // Generate rete and layout
-        loadReteModel();
-
-        zeroBaseDiagram();
-
-        // Make rete graph visible
-        viewer.setContents( getModel() ); // set the contents of this editor
-
         ZoomManager zoomManager = rootEditPart.getZoomManager();
 
         //List<String>
@@ -248,22 +276,27 @@
      * and shifting to right if neccessary to get rid of negative XY coordinates.
      * 
      */
-    private void zeroBaseDiagram() {
-        int minx = 0;
-        int miny = 0;
+    private void zeroBaseDiagram(ReteGraph graph) {
 
-        final Iterator nodeIter = diagram.getChildren().iterator();
+        Dimension dim = rootEditPart.getContentPane().getSize();
+
+        int minx = 0, miny = 0, maxx = 0, x = dim.width;
+
+        final Iterator nodeIter = graph.getChildren().iterator();
         while ( nodeIter.hasNext() ) {
             Point loc = ((BaseVertex) (nodeIter.next())).getLocation();
             minx = Math.min( loc.x,
                              minx );
+            maxx = Math.max( loc.x,
+                             maxx );
             miny = Math.min( loc.y,
                              miny );
         }
 
-        minx = minx - 10;
+        int delta = (x - (maxx - minx + 20)) / 2;
+        minx = minx - (delta);
 
-        final Iterator nodeIter2 = diagram.getChildren().iterator();
+        final Iterator nodeIter2 = graph.getChildren().iterator();
         while ( nodeIter2.hasNext() ) {
             final BaseVertex vertex = (BaseVertex) (nodeIter2.next());
             Point loc = vertex.getLocation();
@@ -288,4 +321,48 @@
         return false;
     }
 
+    /**
+     * Fired when underlying source is modified.
+     * Marks graph viewer to be relayouted when activated.
+     */
+    public void fireDocumentChanged() {
+        relayoutRequired = true;
+    }
+
+    /**
+     * Draws graph.
+     * 
+     * @param newGraph used to replace existing graph. if null then existing graph is simply redrawn.
+     */
+    public void drawGraph(ReteGraph newGraph) {
+
+        LayerManager manager = (LayerManager) getGraphicalViewer().getEditPartRegistry().get( LayerManager.ID );
+        ConnectionLayer connLayer = (ConnectionLayer) manager.getLayer( LayerConstants.CONNECTION_LAYER );
+
+        // Lazy-init model initialization
+        if ( getGraphicalViewer().getContents() == null ) {
+            getGraphicalViewer().setContents( getModel() );
+        }
+
+        final boolean isNewDiagram = newGraph != null && newGraph != diagram;
+
+        if ( isNewDiagram ) {
+            diagram.removeAll();
+        }
+
+        // Update connection router according to new model size
+        ConnectionRouter router;
+        if ( (isNewDiagram && newGraph.getChildren().size() < SIMPLE_ROUTER_MIN_NODES) || (!isNewDiagram && getModel().getChildren().size() < SIMPLE_ROUTER_MIN_NODES) ) {
+            router = new ShortestPathConnectionRouter( (IFigure) rootEditPart.getContentPane().getChildren().get( 0 ) );
+        } else {
+            router = ConnectionRouter.NULL;
+        }
+        connLayer.setConnectionRouter( router );
+
+        if ( newGraph != null && newGraph != diagram ) {
+            diagram.addAll( newGraph.getChildren() );
+        }
+
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/model/ReteGraph.java
===================================================================
--- labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/model/ReteGraph.java	2006-10-31 00:33:08 UTC (rev 7241)
+++ labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/model/ReteGraph.java	2006-10-31 00:38:48 UTC (rev 7242)
@@ -1,6 +1,7 @@
 package org.drools.ide.editors.rete.model;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import org.drools.reteoo.BaseVertex;
@@ -67,4 +68,12 @@
         }
     }
 
+    public void addAll(List children) {
+        final Iterator iter = children.iterator();
+        while ( iter.hasNext() ) {
+            BaseVertex vertex = (BaseVertex) iter.next();
+            addChild( vertex );
+        }
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/part/ConnectionEditPart.java
===================================================================
--- labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/part/ConnectionEditPart.java	2006-10-31 00:33:08 UTC (rev 7241)
+++ labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/part/ConnectionEditPart.java	2006-10-31 00:38:48 UTC (rev 7242)
@@ -20,7 +20,6 @@
 
 import org.drools.ide.editors.rete.figure.ConnectionFigure;
 import org.drools.ide.editors.rete.model.ModelElement;
-import org.eclipse.draw2d.BendpointConnectionRouter;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.PolylineConnection;
 import org.eclipse.draw2d.PolylineDecoration;
@@ -60,8 +59,6 @@
         PolylineConnection connection = new ConnectionFigure();
         PolylineDecoration decoration = new PolylineDecoration();
         connection.setTargetDecoration( decoration );
-        BendpointConnectionRouter router = new BendpointConnectionRouter();
-        connection.setConnectionRouter( router );
         return connection;
     }
 

Modified: labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/part/DiagramEditPart.java
===================================================================
--- labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/part/DiagramEditPart.java	2006-10-31 00:33:08 UTC (rev 7241)
+++ labs/jbossrules/branches/3.0.x/drools-ide/src/main/java/org/drools/ide/editors/rete/part/DiagramEditPart.java	2006-10-31 00:38:48 UTC (rev 7242)
@@ -23,17 +23,14 @@
 import org.drools.ide.editors.rete.model.ModelElement;
 import org.drools.ide.editors.rete.model.ReteGraph;
 import org.drools.reteoo.BaseVertex;
-import org.eclipse.draw2d.ConnectionLayer;
 import org.eclipse.draw2d.Figure;
 import org.eclipse.draw2d.FreeformLayer;
 import org.eclipse.draw2d.FreeformLayout;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.ShortestPathConnectionRouter;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.LayerConstants;
 import org.eclipse.gef.NodeEditPart;
 import org.eclipse.gef.commands.Command;
 import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
@@ -46,7 +43,7 @@
  * EditPart for ReteGraph
  * 
  */
-class DiagramEditPart extends AbstractGraphicalEditPart
+public class DiagramEditPart extends AbstractGraphicalEditPart
     implements
     PropertyChangeListener {
 
@@ -77,9 +74,6 @@
         Figure f = new FreeformLayer();
         f.setBorder( new MarginBorder( 3 ) );
         f.setLayoutManager( new FreeformLayout() );
-
-        ConnectionLayer connLayer = (ConnectionLayer) getLayer( LayerConstants.CONNECTION_LAYER );
-        connLayer.setConnectionRouter( new ShortestPathConnectionRouter( f ) );
         return f;
     }
 




More information about the jboss-svn-commits mailing list