[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