[jboss-svn-commits] JBL Code SVN: r12178 - in labs/jbossrules/trunk/drools-eclipse/drools-guided-editor: META-INF and 11 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon May 28 12:33:17 EDT 2007


Author: ahtik
Date: 2007-05-28 12:33:17 -0400 (Mon, 28 May 2007)
New Revision: 12178

Added:
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/.classpath
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/.project
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/META-INF/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/META-INF/MANIFEST.MF
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/bin/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/build.properties
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/add_connective.gif
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/add_field_to_fact.gif
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/delete_item_small.gif
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/delete_obj.gif
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/drools.gif
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/edit.gif
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/function_assets.gif
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/new_item.gif
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/sample.gif
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/antlr-3.0b7.jar
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/drools-compiler-4.0.0.SNAPSHOT.jar
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/drools-core-4.0.0.SNAPSHOT.jar
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/xstream-1.1.3.jar
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/plugin.xml
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/RuleBuilderPlugin.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/editors/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/editors/BrxmlPage.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/editors/RuleEditor.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/modeldriven/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/modeldriven/HumanReadable.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionAssertFactWidget.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionRetractFactWidget.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionSetFieldDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionSetFieldWidget.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewActionDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewAssertFactFieldDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewConditionDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewFactConstraintDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewFieldConstraintDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/CompositeFactPatternWidget.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/CustomRuleDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/DSLSentenceWidget.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/FactPatternWidget.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/RuleDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/RuleModeller.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ValueEditorTypeSelectionDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/Widget.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/wizards/
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/wizards/NewBrxmlFileWizard.java
   labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/wizards/NewBrxmlFileWizardPage.java
Log:
Initial import. Dirty dependencies etc (needs build scripts etc)

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/.classpath	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/.classpath	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry exported="true" kind="lib" path="lib/drools-core-4.0.0.SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/drools-compiler-4.0.0.SNAPSHOT.jar" sourcepath="/drools-compiler"/>
+	<classpathentry exported="true" kind="lib" path="lib/antlr-3.0b7.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/xstream-1.1.3.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/.project
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/.project	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/.project	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>drools-brxml</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/META-INF/MANIFEST.MF
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/META-INF/MANIFEST.MF	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/META-INF/MANIFEST.MF	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: RuleBuilder Plug-in
+Bundle-SymbolicName: org.drools.eclipse.ide.rulebuilder;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Activator: org.drools.eclipse.rulebuilder.RuleBuilderPlugin
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.forms,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.jface.text,
+ org.eclipse.core.resources,
+ org.drools.eclipse,
+ org.eclipse.jdt.core
+Eclipse-LazyStart: true
+Bundle-ClassPath: lib/drools-core-4.0.0.SNAPSHOT.jar,
+ lib/drools-compiler-4.0.0.SNAPSHOT.jar,
+ lib/antlr-3.0b7.jar,
+ lib/xstream-1.1.3.jar,
+ .

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/build.properties
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/build.properties	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/build.properties	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,11 @@
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               icons/,\
+               lib/xstream-1.1.3.jar,\
+               lib/drools-compiler-4.0.0.SNAPSHOT.jar,\
+               lib/drools-core-4.0.0.SNAPSHOT.jar,\
+               lib/antlr-3.0b7.jar
+src.includes = icons/

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/add_connective.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/add_connective.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/add_field_to_fact.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/add_field_to_fact.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/delete_item_small.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/delete_item_small.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/delete_obj.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/delete_obj.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/drools.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/drools.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/edit.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/edit.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/function_assets.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/function_assets.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/new_item.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/new_item.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/sample.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/icons/sample.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/antlr-3.0b7.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/antlr-3.0b7.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/drools-compiler-4.0.0.SNAPSHOT.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/drools-compiler-4.0.0.SNAPSHOT.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/drools-core-4.0.0.SNAPSHOT.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/drools-core-4.0.0.SNAPSHOT.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/xstream-1.1.3.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/lib/xstream-1.1.3.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/plugin.xml
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/plugin.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/plugin.xml	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            class="org.drools.eclipse.rulebuilder.editors.RuleEditor"
+            extensions="brxml"
+            icon="icons/drools.gif"
+            id="org.drools.eclipse.ide.rulebuilder.brxml.editors.RuleEditor"
+            name="RuleBuilder Editor"/>
+   </extension>
+   <extension
+         name="RuleBuilder Editor"
+         point="org.eclipse.ui.newWizards">
+      <category
+            id="org.drools.eclipse.rulebuilder"
+            name="Rule Builder"/>
+      <wizard
+            category="org.drools.eclipse.rulebuilder"
+            class="org.drools.eclipse.rulebuilder.wizards.NewBrxmlFileWizard"
+            icon="icons/drools.gif"
+            id="org.drools.eclipse.rulebuilder.wizards.NewBrxmlFileWizard"
+            name="Rule Builder Editor"/>
+   </extension>
+
+
+</plugin>

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/RuleBuilderPlugin.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/RuleBuilderPlugin.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/RuleBuilderPlugin.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,81 @@
+package org.drools.eclipse.rulebuilder;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class RuleBuilderPlugin extends AbstractUIPlugin {
+
+    private FormColors               formColors;
+
+    // The plug-in ID
+    public static final String       PLUGIN_ID = "org.drools.eclipse.ide.rulebuilder";
+
+    // The shared instance
+    private static RuleBuilderPlugin plugin;
+
+    /**
+     * The constructor
+     */
+    public RuleBuilderPlugin() {
+        plugin = this;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+     */
+    public void start(BundleContext context) throws Exception {
+        super.start( context );
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+     */
+    public void stop(BundleContext context) throws Exception {
+        plugin = null;
+        super.stop( context );
+    }
+
+    /**
+     * Returns the shared instance
+     *
+     * @return the shared instance
+     */
+    public static RuleBuilderPlugin getDefault() {
+        return plugin;
+    }
+
+    /**
+     * Returns an image descriptor for the image file at the given
+     * plug-in relative path
+     *
+     * @param path the path
+     * @return the image descriptor
+     */
+    public static ImageDescriptor getImageDescriptor(String path) {
+        return imageDescriptorFromPlugin( PLUGIN_ID,
+                                          path );
+    }
+
+    /**
+     * Form Colors, default colors for now.
+     * 
+     * @param display
+     * @return
+     */
+    public FormColors getFormColors(Display display) {
+        if ( formColors == null ) {
+            formColors = new FormColors( display );
+            formColors.markShared();
+        }
+        return formColors;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/editors/BrxmlPage.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/editors/BrxmlPage.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/editors/BrxmlPage.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,69 @@
+package org.drools.eclipse.rulebuilder.editors;
+
+import org.drools.brms.client.modeldriven.brxml.RuleModel;
+import org.drools.brms.server.util.BRXMLPersistence;
+import org.drools.eclipse.rulebuilder.ui.RuleModeller;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+
+/**
+ * Rule Builder main page used as a tab in {@link RuleEditor} multipage.
+ * 
+ * @author Ahti Kitsik
+ *
+ */
+public class BrxmlPage extends FormPage {
+
+    private static final String PAGE_NAME = "Rule Builder";
+    private static final String PAGE_ID   = BrxmlPage.class.getName();
+
+    private RuleModeller        modeller;
+    private RuleModel           model;
+    private RuleEditor          editor;
+
+    public BrxmlPage(RuleEditor editor) {
+        super( editor,
+               PAGE_ID,
+               PAGE_NAME );
+        this.editor = editor;
+    }
+
+    protected void createFormContent(IManagedForm managedForm) {
+        ScrolledForm form = managedForm.getForm();
+        FormToolkit toolkit = managedForm.getToolkit();
+
+        modeller = new RuleModeller( form,
+                                     toolkit,
+                                     model,
+                                     editor );
+    }
+
+    public void setModelXML(String xml) {
+        model = BRXMLPersistence.getInstance().unmarshal( xml );
+        modeller.setModel( model );
+        modeller.reloadWidgets();
+    }
+
+    public RuleModel getRuleModel() {
+        return model;
+    }
+
+    public RuleModeller getModeller() {
+        return modeller;
+    }
+
+    public boolean isDirty() {
+        return modeller.isDirty();
+    }
+
+    public void fireDirtyPropertyChanged() {
+        editor.dirtyPropertyChanged();
+    }
+
+    public void refresh() {
+        modeller.refresh();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/editors/RuleEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/editors/RuleEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/editors/RuleEditor.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,227 @@
+package org.drools.eclipse.rulebuilder.editors;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.server.rules.SuggestionCompletionLoader;
+import org.drools.brms.server.util.BRXMLPersistence;
+import org.drools.eclipse.rulebuilder.RuleBuilderPlugin;
+import org.drools.eclipse.util.ProjectClassLoader;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.texteditor.DocumentProviderRegistry;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+
+public class RuleEditor extends FormEditor
+    implements
+    IResourceChangeListener {
+
+    private BrxmlPage                  brxmlPage;
+
+    private TextEditor                 editor        = new TextEditor();
+
+    private TextEditor                 packageEditor = new TextEditor();
+
+    private SuggestionCompletionEngine completion;
+
+    private SuggestionCompletionLoader loader;
+
+    private FileEditorInput            packageEditorInput;
+
+    public RuleEditor() {
+        super();
+        ResourcesPlugin.getWorkspace().addResourceChangeListener( this );
+
+    }
+
+    protected FormToolkit createToolkit(Display display) {
+        // Create a toolkit that shares colors between editors.
+        return new FormToolkit( RuleBuilderPlugin.getDefault().getFormColors( display ) );
+    }
+
+    protected void addPages() {
+        brxmlPage = new BrxmlPage( this );
+        try {
+            addPage( brxmlPage );
+            addPage( editor,
+                     getEditorInput() );
+
+            FileEditorInput existingFile = (FileEditorInput) getEditorInput();
+            IPath fullPath = existingFile.getFile().getFullPath();
+            IPath packagePath = fullPath.removeLastSegments( 1 ).addTrailingSeparator().append( "rule.package" );
+
+            IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile( packagePath );
+
+            IJavaProject javaProject = JavaCore.create( file.getProject() );
+
+            ClassLoader classLoader = ProjectClassLoader.getProjectClassLoader( javaProject );
+
+            loader = new SuggestionCompletionLoader( classLoader );
+
+            if ( !file.exists() ) {
+                InputStream is = new ByteArrayInputStream( "// Header file".getBytes() );
+                try {
+                    file.create( is,
+                                 true,
+                                 null );
+                } catch ( CoreException e ) {
+                    // TODO Handle
+                    e.printStackTrace();
+                }
+            }
+
+            packageEditorInput = new FileEditorInput( file );
+
+            reloadCompletionEngine();
+
+            // addPage(packageEditor, packageEditorInput);
+
+            setPageText( 1,
+                         "BRXML Preview" );
+            // setPageText(2, "Package Description");
+
+        } catch ( PartInitException e ) {
+            e.printStackTrace();
+        }
+    }
+
+    private void reloadCompletionEngine() {
+        try {
+
+            String str = "";
+
+            InputStream is = packageEditorInput.getFile().getContents();
+            StringBuffer out = new StringBuffer();
+            byte[] b = new byte[4096];
+            for ( int n; (n = is.read( b )) != -1; ) {
+                out.append( new String( b,
+                                        0,
+                                        n ) );
+            }
+            str = out.toString();
+            System.out.println( "GOT " + str );
+
+            completion = loader.getSuggestionEngine( str,
+                                                     new ArrayList(),
+                                                     new ArrayList() );
+
+            String[] facts = completion.getFactTypes();
+            System.out.println( "NUMBER OF FACTS NOW " + facts.length );
+            
+            for(int i=0; i<facts.length; i++) {
+                System.out.println("F "+facts[i]);
+            }
+
+        } catch ( Exception e ) {
+            // TODO Handle
+            e.printStackTrace();
+        }
+    }
+
+    public boolean isDirty() {
+        return editor.isDirty() || brxmlPage.isDirty() || packageEditor.isDirty();
+    }
+
+    protected void pageChange(int newPageIndex) {
+        super.pageChange( newPageIndex );
+
+        IDocument document = getInputDocument();
+
+        if ( newPageIndex == 0 ) {
+            brxmlPage.setModelXML( document.get() );
+            brxmlPage.refresh();
+        }
+        if ( newPageIndex == 1 ) {
+            if ( brxmlPage.isDirty() ) {
+                document.set( BRXMLPersistence.getInstance().marshal( brxmlPage.getRuleModel() ) );
+            }
+        }
+
+    }
+
+    public void doSave(IProgressMonitor monitor) {
+        IDocument document = getInputDocument();
+
+        if ( brxmlPage.isDirty() ) {
+            document.set( BRXMLPersistence.getInstance().marshal( brxmlPage.getRuleModel() ) );
+        }
+
+        editor.doSave( monitor );
+        packageEditor.doSave( monitor );
+
+        brxmlPage.getModeller().setDirty( false );
+
+        reloadCompletionEngine();
+
+    }
+
+    private IDocument getInputDocument() {
+        IEditorInput input = getEditorInput();
+        IDocumentProvider docProvider = DocumentProviderRegistry.getDefault().getDocumentProvider( input );
+        IDocument document = docProvider.getDocument( input );
+        return document;
+    }
+
+    public void doSaveAs() {
+        editor.doSaveAs();
+        brxmlPage.getModeller().setDirty( false );
+        setPageText( 0,
+                     editor.getTitle() );
+        setInput( editor.getEditorInput() );
+    }
+
+    public boolean isSaveAsAllowed() {
+        return true;
+    }
+
+    public void resourceChanged(final IResourceChangeEvent event) {
+        if ( event.getType() == IResourceChangeEvent.PRE_CLOSE ) {
+            Display.getDefault().asyncExec( new Runnable() {
+                public void run() {
+                    IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages();
+                    for ( int i = 0; i < pages.length; i++ ) {
+                        if ( ((FileEditorInput) editor.getEditorInput()).getFile().getProject().equals( event.getResource() ) ) {
+                            IEditorPart editorPart = pages[i].findEditor( editor.getEditorInput() );
+                            pages[i].closeEditor( editorPart,
+                                                  true );
+                        }
+                    }
+                }
+            } );
+        }
+    }
+
+    public void dispose() {
+        ResourcesPlugin.getWorkspace().removeResourceChangeListener( this );
+        super.dispose();
+    }
+
+    public void dirtyPropertyChanged() {
+        firePropertyChange( IEditorPart.PROP_DIRTY );
+        brxmlPage.refresh();
+    }
+
+    public SuggestionCompletionEngine getCompletionEngine() {
+        return completion;
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/modeldriven/HumanReadable.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/modeldriven/HumanReadable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/modeldriven/HumanReadable.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,132 @@
+package org.drools.eclipse.rulebuilder.modeldriven;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * This contains some simple mappings between operators, conditional elements
+ * and the human readable equivalent.
+ * 
+ * Yes, I am making the presumption that programmers are not human, but I think
+ * they (we) are cool with that.
+ * 
+ * @author Michael Neale
+ */
+public class HumanReadable {
+
+    public static Map            operatorDisplayMap   = new HashMap();
+
+    public static Map            ceDisplayMap         = new HashMap();
+
+    public static Map            actionDisplayMap     = new HashMap();
+
+    public static final String[] CONDITIONAL_ELEMENTS = new String[]{"not", "exists", "or"};
+
+    static {
+        operatorDisplayMap.put( "==",
+                                "is equal to" );
+        operatorDisplayMap.put( "!=",
+                                "is not equal to" );
+        operatorDisplayMap.put( "<",
+                                "is less than" );
+        operatorDisplayMap.put( "<=",
+                                "less than or equal to" );
+        operatorDisplayMap.put( ">",
+                                "greater than" );
+        operatorDisplayMap.put( ">=",
+                                "greater than or equal to" );
+
+        operatorDisplayMap.put( "| ==",
+                                "or equal to" );
+        operatorDisplayMap.put( "| !=",
+                                "or not equal to" );
+        operatorDisplayMap.put( "& !=",
+                                "and not equal to" );
+        operatorDisplayMap.put( "& >",
+                                "and greater than" );
+        operatorDisplayMap.put( "| >=",
+                                "or greater than (or equal to)" );
+        operatorDisplayMap.put( "| <=",
+                                "or less than (or equal to)" );
+        operatorDisplayMap.put( "& >=",
+                                "and greater than (or equal to)" );
+        operatorDisplayMap.put( "& <=",
+                                "or less than (or equal to)" );
+        operatorDisplayMap.put( "& contains",
+                                "and contains" );
+        operatorDisplayMap.put( "| contains",
+                                "or contains" );
+        operatorDisplayMap.put( "& matches",
+                                "and matches" );
+        operatorDisplayMap.put( "| matches",
+                                "or matches" );
+        operatorDisplayMap.put( "| excludes",
+                                "or excludes" );
+        operatorDisplayMap.put( "& excludes",
+                                "and excludes" );
+
+        ceDisplayMap.put( "not",
+                          "There is no" );
+        ceDisplayMap.put( "exists",
+                          "There exists" );
+        ceDisplayMap.put( "or",
+                          "Any of" );
+
+        actionDisplayMap.put( "assert",
+                              "Assert" );
+        actionDisplayMap.put( "assertLogical",
+                              "Logically assert" );
+        actionDisplayMap.put( "retract",
+                              "Retract" );
+        actionDisplayMap.put( "set",
+                              "Set" );
+        actionDisplayMap.put( "modify",
+                              "Modify" );
+
+    }
+
+    public static String getActionDisplayName(String action) {
+        return lookup( action,
+                       actionDisplayMap );
+    }
+
+    public static String getOperatorDisplayName(String op) {
+        return lookup( op,
+                       operatorDisplayMap );
+    }
+
+    public static String getCEDisplayName(String ce) {
+        return lookup( ce,
+                       ceDisplayMap );
+    }
+
+    private static String lookup(String ce,
+                                 Map map) {
+        if ( map.containsKey( ce ) ) {
+            return (String) map.get( ce );
+        } else {
+            return ce;
+        }
+    }
+
+    /**
+     * get operator by its display name
+     * 
+     * @param op
+     *            operator display name
+     * @return operator
+     */
+    public static String getOperatorName(String op) {
+        Set keys = operatorDisplayMap.keySet();
+        for ( Iterator iter = keys.iterator(); iter.hasNext(); ) {
+            String key = (String) iter.next();
+            if ( op.equals( operatorDisplayMap.get( key ) ) ) {
+                return key;
+            }
+        }
+        throw new RuntimeException( "No operator display name '" + op + "' was found." );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionAssertFactWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionAssertFactWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionAssertFactWidget.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,155 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.ActionAssertFact;
+import org.drools.brms.client.modeldriven.brxml.ActionFieldValue;
+import org.drools.eclipse.rulebuilder.modeldriven.HumanReadable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+/**
+ * 
+ * 
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ * 
+ */
+public class ActionAssertFactWidget extends Widget {
+ 
+    private final ActionAssertFact fact;
+
+    public ActionAssertFactWidget(FormToolkit toolkit,
+                                  Composite parent,
+                                  RuleModeller mod,
+                                  ActionAssertFact fact,
+                                  int index) {
+        super(parent,toolkit,mod,index);
+
+        this.fact = fact;
+
+        GridLayout l = new GridLayout();
+        l.numColumns = 4;
+        l.marginBottom = 0;
+        l.marginHeight = 0;
+        l.marginLeft = 0;
+        l.marginRight = 0;
+        l.marginTop = 0;
+        l.marginWidth = 0;
+        l.verticalSpacing = 0;
+        parent.setLayout( l );
+
+        create();
+    }
+
+    private void create() {
+        toolkit.createLabel( parent,
+                             HumanReadable.getActionDisplayName( this.fact.getType() ) + " " + this.fact.factType );
+        addDeleteRHSAction();
+        addMoreOptionsAction();
+        Composite constraintComposite = toolkit.createComposite( parent );
+        GridLayout constraintLayout = new GridLayout();
+        constraintLayout.numColumns = 3;
+        constraintComposite.setLayout( constraintLayout );
+        createConstraintRows( constraintComposite );
+        toolkit.paintBordersFor( constraintComposite );
+    }
+
+    private void addMoreOptionsAction() {
+        final Shell shell = new Shell( Display.getCurrent() );
+        ImageHyperlink link = addImage( parent,
+                                        "icons/new_item.gif" );
+
+        link.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                RuleDialog popup = new AddNewAssertFactFieldDialog( shell,
+                                                                     toolkit,
+                                                                     getModeller(),
+                                                                     fact );
+                popup.open();
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+        link.setToolTipText( "Add another field to this so you can set its value" );
+    }
+
+    private void createConstraintRows(Composite constraintComposite) {
+        for ( int row = 0; row < fact.fieldValues.length; row++ ) {
+            ActionFieldValue val = fact.fieldValues[row];
+            toolkit.createLabel( constraintComposite,
+                                 val.field );
+            valueEditor( constraintComposite,
+                         val );
+            addRemoveFieldAction( constraintComposite,
+                                  row );
+        }
+    }
+
+    private void addRemoveFieldAction(Composite constraintComposite,
+                                      final int row) {
+        ImageHyperlink delLink = addImage( constraintComposite,
+                                           "icons/delete_item_small.gif" );
+        delLink.setToolTipText( "Remove this field action" );
+
+        delLink.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                MessageBox dialog = new MessageBox( Display.getCurrent().getActiveShell(),
+                                                    SWT.YES | SWT.NO | SWT.ICON_WARNING );
+                dialog.setMessage( "Remove this item?" );
+                dialog.setText( "Remove this item?" );
+                if ( dialog.open() == SWT.YES ) {
+                    fact.removeField( row );
+                    getModeller().setDirty( true );
+                    getModeller().reloadRhs();
+                }
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+    }
+
+    private void valueEditor(Composite parent,
+                             final ActionFieldValue val) {
+        final Text box = toolkit.createText( parent,
+                                             "" );
+
+        if ( val.value != null ) {
+            box.setText( val.value );
+        }
+
+        box.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+
+        box.addModifyListener( new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                getModeller().setDirty( true );
+                val.value = box.getText();
+            }
+        } );
+
+    }
+
+    public SuggestionCompletionEngine getCompletion() {
+        return getModeller().getSuggestionCompletionEngine();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionRetractFactWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionRetractFactWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionRetractFactWidget.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,50 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.brxml.ActionRetractFact;
+import org.drools.eclipse.rulebuilder.modeldriven.HumanReadable;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * 
+ * @author Anton Arhipov
+ *
+ */
+public class ActionRetractFactWidget extends Widget {
+
+    private final ActionRetractFact fact;
+
+    public ActionRetractFactWidget(FormToolkit toolkit,
+                                   Composite parent,
+                                   RuleModeller modeller,
+                                   ActionRetractFact fact,
+                                   int index) {
+
+        super(parent, toolkit, modeller, index);
+        
+        this.fact = fact;
+
+        GridLayout l = new GridLayout();
+        l.numColumns = 4;
+        l.marginBottom = 0;
+        l.marginHeight = 0;
+        l.marginLeft = 0;
+        l.marginRight = 0;
+        l.marginTop = 0;
+        l.marginWidth = 0;
+        l.verticalSpacing = 0;
+        parent.setLayout( l );
+
+        create();
+    }
+
+    private void create() {
+        toolkit.createLabel( parent,
+                             HumanReadable.getActionDisplayName( "retract" ) );
+        toolkit.createLabel( parent,
+                             "[" + fact.variableName + "]" );
+        addDeleteRHSAction();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionSetFieldDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionSetFieldDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionSetFieldDialog.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,75 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.ActionFieldValue;
+import org.drools.brms.client.modeldriven.brxml.ActionSetField;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ *
+ */
+public class ActionSetFieldDialog extends RuleDialog {
+
+    private String[]       fieldCompletions;
+    private FormToolkit    toolkit;
+    private RuleModeller   modeller;
+    private ActionSetField field;
+
+    public ActionSetFieldDialog(FormToolkit toolkit,
+                                Shell parent,
+                                RuleModeller modeller,
+                                ActionSetField field,
+                                String[] fieldCompletions) {
+        super( parent,
+               "Add a field",
+               "Add a field" );
+
+        this.fieldCompletions = fieldCompletions;
+        this.toolkit = toolkit;
+        this.modeller = modeller;
+        this.field = field;
+    }
+
+    protected Control createDialogArea(final Composite parent) {
+        Composite composite = (Composite) super.createDialogArea( parent );
+        toolkit.createLabel( composite,
+                             "Add a field" );
+
+        final Combo fieldsCombo = new Combo( parent,
+                                             SWT.READ_ONLY );
+        fieldsCombo.add( "Choose field..." );
+        for ( int i = 0; i < fieldCompletions.length; i++ ) {
+            fieldsCombo.add( fieldCompletions[i] );
+        }
+        fieldsCombo.select( 0 );
+
+        fieldsCombo.addModifyListener( new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                if ( fieldsCombo.getSelectionIndex() == 0 ) {
+                    return; // no need to change anything
+                }
+
+                //TODO Is Number correct?
+                field.addFieldValue( new ActionFieldValue( fieldsCombo.getText(),
+                                                           "",
+                                                           SuggestionCompletionEngine.TYPE_NUMERIC ) );
+
+                modeller.reloadRhs();
+                modeller.setDirty( true );
+                close();
+            }
+        } );
+
+        return composite;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionSetFieldWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionSetFieldWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ActionSetFieldWidget.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,176 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.ActionFieldValue;
+import org.drools.brms.client.modeldriven.brxml.ActionSetField;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.drools.brms.client.modeldriven.brxml.RuleModel;
+import org.drools.eclipse.rulebuilder.modeldriven.HumanReadable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+/**
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ *
+ */
+public class ActionSetFieldWidget extends Widget {
+
+    private ActionSetField set;
+
+    final private String[] fieldCompletions;
+
+    private boolean        isBoundFact = false;
+
+    public ActionSetFieldWidget(FormToolkit toolkit,
+                                Composite parent,
+                                RuleModeller mod,
+                                RuleModel rule,
+                                ActionSetField set,
+                                int index) {
+
+        super( parent,
+               toolkit,
+               mod,
+               index );
+
+        this.set = set;
+
+        if ( getCompletion().isGlobalVariable( set.variable ) ) {
+            this.fieldCompletions = getCompletion().getFieldCompletionsForGlobalVariable( set.variable );
+        } else {
+            FactPattern pattern = rule.getBoundFact( set.variable );
+            this.fieldCompletions = getCompletion().getFieldCompletions( pattern.factType );
+            this.isBoundFact = true;
+        }
+
+        GridLayout l = new GridLayout();
+        l.numColumns = 6;
+        l.marginBottom = 0;
+        l.marginHeight = 0;
+        l.marginLeft = 0;
+        l.marginRight = 0;
+        l.marginTop = 0;
+        l.marginWidth = 0;
+        l.verticalSpacing = 0;
+        parent.setLayout( l );
+
+        create();
+
+    }
+
+    private void create() {
+        toolkit.createLabel( parent,
+                             HumanReadable.getActionDisplayName( this.set.getType() ) + " [" + this.set.variable + "]" );
+        addDeleteRHSAction();
+        addMoreOptionsAction();
+        addRows();
+    }
+
+    private void addRows() {
+        Composite constraintComposite = toolkit.createComposite( parent );
+        GridLayout constraintLayout = new GridLayout();
+        constraintLayout.numColumns = 3;
+        constraintComposite.setLayout( constraintLayout );
+
+        for ( int i = 0; i < set.fieldValues.length; i++ ) {
+            ActionFieldValue val = set.fieldValues[i];
+            toolkit.createLabel( constraintComposite,
+                                 val.field );
+            valueEditor( constraintComposite,
+                         val );
+            addRemoveFieldAction( constraintComposite,
+                                  i );
+        }
+
+        toolkit.paintBordersFor( constraintComposite );
+    }
+
+    private void addMoreOptionsAction() {
+        // ImageHyperlink link = addImage(parent,
+        // "icons/add_field_to_fact.gif");
+        ImageHyperlink link = addImage( parent,
+                                        "icons/new_item.gif" );
+
+        link.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                RuleDialog popup = new ActionSetFieldDialog( toolkit,
+                                                              parent.getShell(),
+                                                              getModeller(),
+                                                              set,
+                                                              fieldCompletions );
+                popup.open();
+
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+        link.setToolTipText( "Add a field" );
+    }
+
+    private void addRemoveFieldAction(Composite constraintComposite,
+                                      final int currentRow) {
+        ImageHyperlink delLink = addImage( constraintComposite,
+                                           "icons/delete_item_small.gif" );
+        delLink.setToolTipText( "Remove this field action" );
+        delLink.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                MessageBox dialog = new MessageBox( Display.getCurrent().getActiveShell(),
+                                                    SWT.YES | SWT.NO | SWT.ICON_WARNING );
+                dialog.setMessage( "Remove this item?" );
+                dialog.setText( "Remove this item?" );
+                if ( dialog.open() == SWT.YES ) {
+                    set.removeField( currentRow );
+                    getModeller().setDirty( true );
+                    getModeller().reloadRhs();
+                }
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+    }
+
+    private void valueEditor(Composite parent,
+                             final ActionFieldValue val) {
+        final Text box = toolkit.createText( parent,
+                                             "" );
+
+        if ( val.value != null ) {
+            box.setText( val.value );
+        }
+
+        box.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+
+        box.addModifyListener( new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                val.value = box.getText();
+                getModeller().setDirty( true );
+            }
+        } );
+
+    }
+
+    private SuggestionCompletionEngine getCompletion() {
+        return getModeller().getSuggestionCompletionEngine();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewActionDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewActionDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewActionDialog.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,152 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.ActionAssertFact;
+import org.drools.brms.client.modeldriven.brxml.ActionAssertLogicalFact;
+import org.drools.brms.client.modeldriven.brxml.ActionSetField;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * This provides a popup for new RHS action selection.
+ * 
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ */
+public class AddNewActionDialog extends RuleDialog {
+
+    private final FormToolkit toolkit;
+
+    private RuleModeller      modeller;
+
+    public AddNewActionDialog(Shell parent,
+                              FormToolkit toolkit,
+                              RuleModeller modeller) {
+        super( parent,
+               "Add a new action",
+               "Pick the values from combos and confirm the selection." );
+        this.toolkit = toolkit;
+        this.modeller = modeller;
+    }
+
+    protected Control createDialogArea(final Composite parent) {
+        Composite composite = (Composite) super.createDialogArea( parent );
+        String heading = "Choose...";
+
+        createGlobalVariablesPart( composite,
+                                   heading );
+
+        String[] facts = getCompletion().getFactTypes();
+
+        createFactAssertionPart( composite,
+                                 heading,
+                                 facts );
+
+        createFactLogicalAssertionPart( composite,
+                                        heading,
+                                        facts );
+
+        return composite;
+    }
+
+    private void createFactLogicalAssertionPart(Composite composite,
+                                                String heading,
+                                                String[] facts) {
+        toolkit.createLabel( composite,
+                             "Logically assert a new fact" );
+        final Combo factsCombo = createFactsCombo( composite,
+                                                   heading,
+                                                   facts );
+        factsCombo.addListener( SWT.Selection,
+                                new Listener() {
+                                    public void handleEvent(Event event) {
+                                        
+                                        System.out.println("HERE3333! event "+event);
+                                        
+                                        if ( factsCombo.getSelectionIndex() == 0 ) {
+                                            return;
+                                        }
+
+                                        modeller.getModel().addRhsItem( new ActionAssertLogicalFact( factsCombo.getText() ) );
+                                        modeller.setDirty( true );
+                                        modeller.reloadRhs();
+                                        close();
+                                    }
+                                } );
+    }
+
+    private void createFactAssertionPart(Composite composite,
+                                         String heading,
+                                         String[] facts) {
+        toolkit.createLabel( composite,
+                             "Assert a new fact" );
+        final Combo factsCombo = createFactsCombo( composite,
+                                                   heading,
+                                                   facts );
+        factsCombo.addListener( SWT.Selection,
+                                new Listener() {
+                                    public void handleEvent(Event event) {
+                                        if ( factsCombo.getSelectionIndex() == 0 ) {
+                                            return;
+                                        }
+
+                                        modeller.getModel().addRhsItem( new ActionAssertFact( factsCombo.getText() ) );
+                                        modeller.setDirty( true );
+                                        modeller.reloadRhs();
+                                        close();
+                                    }
+                                } );
+    }
+
+    private Combo createFactsCombo(Composite composite,
+                                   String heading,
+                                   String[] facts) {
+        Combo factsCombo = new Combo( composite,
+                                      SWT.READ_ONLY );
+        factsCombo.add( heading );
+        for ( int i = 0; i < facts.length; i++ ) {
+            factsCombo.add( facts[i] );
+        }
+        factsCombo.select( 0 );
+        return factsCombo;
+    }
+
+    private void createGlobalVariablesPart(Composite composite,
+                                           String heading) {
+        toolkit.createLabel( composite,
+                             "Set the values of a field on" );
+        final Combo globalVarsCombo = new Combo( composite,
+                                                 SWT.READ_ONLY );
+        globalVarsCombo.add( heading );
+        String[] globalVars = getCompletion().getGlobalVariables();
+        for ( int i = 0; i < globalVars.length; i++ ) {
+            globalVarsCombo.add( globalVars[i] );
+        }
+        globalVarsCombo.select( 0 );
+
+        globalVarsCombo.addListener( SWT.Selection,
+                                     new Listener() {
+                                         public void handleEvent(Event event) {
+                                             if ( globalVarsCombo.getSelectionIndex() == 0 ) {
+                                                 return;
+                                             }
+
+                                             modeller.getModel().addRhsItem( new ActionSetField( globalVarsCombo.getText() ) );
+                                             modeller.setDirty( true );
+                                             modeller.reloadRhs();
+                                             close();
+                                         }
+                                     } );
+    }
+
+    public SuggestionCompletionEngine getCompletion() {
+        return modeller.getSuggestionCompletionEngine();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewAssertFactFieldDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewAssertFactFieldDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewAssertFactFieldDialog.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,87 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.ActionAssertFact;
+import org.drools.brms.client.modeldriven.brxml.ActionFieldValue;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * 
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ * 
+ */
+public class AddNewAssertFactFieldDialog extends RuleDialog {
+
+    private final FormToolkit      toolkit;
+
+    private RuleModeller           modeller;
+
+    private final ActionAssertFact fact;
+
+    public AddNewAssertFactFieldDialog(Shell parent,
+                                       FormToolkit toolkit,
+                                       RuleModeller modeller,
+                                       ActionAssertFact fact) {
+        super( parent,
+               "Add new condition to the rule",
+               "Pick the values from combos and confirm the selection." );
+        this.toolkit = toolkit;
+        this.modeller = modeller;
+        this.fact = fact;
+    }
+
+    protected Control createDialogArea(final Composite parent) {
+        System.out.println("Creating new ASSERT fact constraint");
+
+        Composite composite = (Composite) super.createDialogArea( parent );
+
+        toolkit.createLabel( composite,
+                             "Field:" );
+
+        final Combo factsCombo = new Combo( composite,
+                                            SWT.READ_ONLY );
+
+        String[] fields = getCompletion().getFieldCompletions( fact.factType );
+        factsCombo.add( "..." );
+        for ( int i = 0; i < fields.length; i++ ) {
+            factsCombo.add( fields[i] );
+        }
+        factsCombo.select( 0 );
+
+        factsCombo.addListener( SWT.Selection,
+                                new Listener() {
+                                    public void handleEvent(Event event) {
+                                        
+                                        System.out.println("HERE2222! event "+event);
+                                        
+                                        if ( factsCombo.getSelectionIndex() == 0 ) {
+                                            return;
+                                        }
+
+                                        // TODO Is NUMBERIC ok?
+                                        fact.addFieldValue( new ActionFieldValue( factsCombo.getText(),
+                                                                                  "",
+                                                                                  SuggestionCompletionEngine.TYPE_NUMERIC ) );
+
+                                        modeller.setDirty( true );
+                                        modeller.reloadRhs();
+                                        close();
+                                    }
+                                } );
+
+        return composite;
+    }
+
+    public SuggestionCompletionEngine getCompletion() {
+        return modeller.getSuggestionCompletionEngine();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewConditionDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewConditionDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewConditionDialog.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,125 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.CompositeFactPattern;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.drools.brms.client.modeldriven.brxml.IPattern;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * This provides a popup for new LHS condition selection. (add new if-condition)
+ * 
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ */
+public class AddNewConditionDialog extends RuleDialog {
+
+    private final FormToolkit toolkit;
+
+    private IPattern          pattern;
+
+    private RuleModeller      modeller;
+
+    public AddNewConditionDialog(Shell parent,
+                                 FormToolkit toolkit,
+                                 RuleModeller modeller) {
+
+        super( parent,
+               "Add new condition to the rule",
+               "Pick the values from combos and confirm the selection." );
+
+        this.toolkit = toolkit;
+        this.modeller = modeller;
+    }
+
+    protected Control createDialogArea(final Composite parent) {
+        Control dialog = super.createDialogArea( parent );
+
+        Composite composite = (Composite) dialog;
+
+        toolkit.createLabel( composite,
+                             "Fact" );
+
+        String[] factTypes = getCompletion().getFactTypes();
+        final Combo factsCombo = new Combo( composite,
+                                            SWT.READ_ONLY );
+        factsCombo.add( "Choose fact type..." );
+        for ( int i = 0; i < factTypes.length; i++ ) {
+            factsCombo.add( factTypes[i] );
+        }
+        factsCombo.select( 0 );
+
+        dialog.addDisposeListener( new DisposeListener() {
+
+            public void widgetDisposed(DisposeEvent e) {
+                System.out.println( "DISPOSED " + e );
+                Thread.dumpStack();
+            }
+
+        } );
+
+        factsCombo.addListener( SWT.Selection,
+                                new Listener() {
+                                    public void handleEvent(Event event) {
+
+                                        System.out.println( "HERE6666! event " + event );
+
+                                        if ( factsCombo.getSelectionIndex() == 0 ) {
+                                            return;
+                                        }
+                                        modeller.getModel().addLhsItem( new FactPattern( factsCombo.getText() ) );
+                                        modeller.reloadLhs();
+                                        modeller.setDirty( true );
+                                        close();
+                                    }
+                                } );
+
+        toolkit.createLabel( composite,
+                             "Condition type" );
+
+        final Combo conditionalsCombo = new Combo( composite,
+                                                   SWT.READ_ONLY );
+        String[] conditionalElements = getCompletion().getConditionalElements();
+        conditionalsCombo.add( "Choose condition type..." );
+        for ( int i = 0; i < conditionalElements.length; i++ ) {
+            conditionalsCombo.add( conditionalElements[i] );
+        }
+        conditionalsCombo.select( 0 );
+
+        conditionalsCombo.addListener( SWT.Selection,
+                                       new Listener() {
+                                           public void handleEvent(Event event) {
+                                               if ( conditionalsCombo.getSelectionIndex() == 0 ) {
+                                                   return;
+                                               }
+
+                                               modeller.getModel().addLhsItem( new CompositeFactPattern( conditionalsCombo.getText() ) );
+                                               modeller.reloadLhs();
+                                               modeller.setDirty( true );
+                                               close();
+                                           }
+                                       } );
+
+        //setBlockOnOpen( true );
+
+        return composite;
+    }
+
+    public IPattern getPattern() {
+        return pattern;
+    }
+
+    private SuggestionCompletionEngine getCompletion() {
+        return modeller.getSuggestionCompletionEngine();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewFactConstraintDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewFactConstraintDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewFactConstraintDialog.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,85 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.CompositeFactPattern;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * Adds new fact pattern to a composite fact
+ * 
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ */
+public class AddNewFactConstraintDialog extends RuleDialog {
+
+    private final FormToolkit    toolkit;
+
+    private RuleModeller         modeller;
+
+    private CompositeFactPattern pattern;
+
+    public AddNewFactConstraintDialog(Shell parent,
+                                      FormToolkit toolkit,
+                                      RuleModeller modeller,
+                                      CompositeFactPattern pattern) {
+        super( parent,
+               "New fact pattern",
+               "Pick the value from combobox." );
+        this.toolkit = toolkit;
+        this.modeller = modeller;
+        this.pattern = pattern;
+    }
+
+    protected Control createDialogArea(final Composite parent) {
+        Composite composite = (Composite) super.createDialogArea( parent );
+
+        System.out.println( "Creating new fact constraint" );
+
+        toolkit.createLabel( composite,
+                             "Choose fact type" );
+
+        String[] fieldCompletitions = getCompletion().getFactTypes();
+        final Combo factsCombo = new Combo( composite,
+                                            SWT.READ_ONLY );
+        factsCombo.add( "Choose fact type..." );
+        for ( int i = 0; i < fieldCompletitions.length; i++ ) {
+            factsCombo.add( fieldCompletitions[i] );
+        }
+        factsCombo.select( 0 );
+
+        factsCombo.addListener( SWT.Selection,
+                                new Listener() {
+                                    public void handleEvent(Event event) {
+
+                                        System.out.println( "HERE! event " + event );
+
+                                        if ( factsCombo.getSelectionIndex() == 0 ) {
+                                            return;
+                                        }
+
+                                        FactPattern factPattern = new FactPattern();
+                                        factPattern.factType = factsCombo.getText();
+                                        pattern.addFactPattern( factPattern );
+
+                                        modeller.setDirty( true );
+                                        modeller.reloadLhs();
+                                        close();
+                                    }
+                                } );
+
+        return composite;
+    }
+
+    private SuggestionCompletionEngine getCompletion() {
+        return modeller.getSuggestionCompletionEngine();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewFieldConstraintDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewFieldConstraintDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/AddNewFieldConstraintDialog.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,161 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.Constraint;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.drools.brms.client.modeldriven.brxml.IConstraint;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * Adding a new constraint for a field of a FactPattern
+ * 
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ * 
+ */
+public class AddNewFieldConstraintDialog extends RuleDialog {
+
+    private final FormToolkit toolkit;
+
+    private RuleModeller      modeller;
+
+    private FactPattern       pattern;
+
+    private boolean           isNested;
+
+    public AddNewFieldConstraintDialog(Shell parent,
+                                       FormToolkit toolkit,
+                                       RuleModeller modeller,
+                                       FactPattern pattern,
+                                       boolean isNested) {
+        super( parent,
+               "Modify constraints",
+               "Pick the values from combos and confirm the selection." );
+        this.toolkit = toolkit;
+        this.modeller = modeller;
+        this.pattern = pattern;
+        this.isNested = isNested;
+    }
+
+    protected Control createDialogArea(final Composite parent) {
+        Composite composite = (Composite) super.createDialogArea( parent );
+
+        GridLayout l = new GridLayout();
+        l.numColumns = 3;
+        l.marginBottom = 0;
+        l.marginHeight = 0;
+        l.marginLeft = 0;
+        l.marginRight = 0;
+        l.marginTop = 0;
+        l.marginWidth = 0;
+        composite.setLayout( l );
+
+        GridData gd = new GridData( GridData.FILL_HORIZONTAL );
+        gd.horizontalSpan = 2;
+
+        createFieldRestrictionCombo( composite,
+                                     gd );
+        createFormulaRow( composite,
+                          gd );
+        if ( !isNested ) {
+            createVariableBindingRow( composite );
+        }
+
+        toolkit.paintBordersFor( composite );
+        return composite;
+    }
+
+    private void createVariableBindingRow(Composite composite) {
+        toolkit.createLabel( composite,
+                             "Variable name" );
+        final Text variableText = toolkit.createText( composite,
+                                                      "" );
+
+        if ( pattern.boundName != null ) {
+            variableText.setText( pattern.boundName );
+        }
+
+        Button varButton = toolkit.createButton( composite,
+                                                 "Set",
+                                                 SWT.PUSH );
+        varButton.addListener( SWT.Selection,
+                               new Listener() {
+                                   public void handleEvent(Event event) {                                                                              
+                                       pattern.boundName = variableText.getText();
+                                       modeller.reloadLhs(); // TODO: refresh problem
+                                       modeller.setDirty( true );
+                                       close();
+                                   }
+                               } );
+    }
+
+    private void createFormulaRow(Composite composite,
+                                  GridData gd) {
+        toolkit.createLabel( composite,
+                             "Add a new formula style expression" );
+        Button formulaButton = toolkit.createButton( composite,
+                                                     "New formula",
+                                                     SWT.PUSH );
+
+        formulaButton.addListener( SWT.Selection,
+                                   new Listener() {
+                                       public void handleEvent(Event event) {
+                                           Constraint con = new Constraint();
+                                           con.constraintValueType = IConstraint.TYPE_PREDICATE;
+                                           pattern.addConstraint( con );
+                                           modeller.setDirty( true );
+                                           modeller.reloadLhs();
+                                           close();
+                                       }
+                                   } );
+
+        formulaButton.setLayoutData( gd );
+    }
+
+    private void createFieldRestrictionCombo(Composite composite,
+                                             GridData gd) {
+        toolkit.createLabel( composite,
+                             "Add a restriction on a field" );
+        String[] fieldCompletitions = getCompletion().getFieldCompletions( pattern.factType );
+        final Combo fieldsCombo = new Combo( composite,
+                                             SWT.READ_ONLY );
+        fieldsCombo.setLayoutData( gd );
+        fieldsCombo.add( "..." );
+        for ( int i = 0; i < fieldCompletitions.length; i++ ) {
+            fieldsCombo.add( fieldCompletitions[i] );
+        }
+        fieldsCombo.select( 0 );
+
+        fieldsCombo.addListener( SWT.Selection,
+                                 new Listener() {
+                                     public void handleEvent(Event event) {
+                                         if ( fieldsCombo.getSelectionIndex() == 0 ) {
+                                             return;
+                                         }
+
+                                         Constraint constraint = new Constraint();
+                                         constraint.fieldName = fieldsCombo.getText();
+                                         pattern.addConstraint( constraint );
+                                         modeller.setDirty( true );
+                                         modeller.reloadLhs();
+                                         close();
+                                     }
+                                 } );
+    }
+
+    private SuggestionCompletionEngine getCompletion() {
+        return modeller.getSuggestionCompletionEngine();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/CompositeFactPatternWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/CompositeFactPatternWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/CompositeFactPatternWidget.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,130 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.brxml.CompositeFactPattern;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.drools.eclipse.rulebuilder.modeldriven.HumanReadable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+/**
+ * This is the new smart widget that works off the model.
+ * 
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ * 
+ */
+public class CompositeFactPatternWidget extends Widget {
+
+    private final CompositeFactPattern pattern;
+
+    public CompositeFactPatternWidget(FormToolkit toolkit,
+                                      Composite parent,
+                                      RuleModeller mod,
+                                      CompositeFactPattern factPattern,
+                                      int idx) {
+
+        super( parent,
+               toolkit,
+               mod,
+               idx );
+        this.pattern = factPattern;
+
+        GridLayout layout = new GridLayout();
+        layout.numColumns = 4;
+        layout.marginBottom = 0;
+        layout.marginHeight = 0;
+        layout.marginLeft = 0;
+        layout.marginRight = 0;
+        layout.marginTop = 0;
+        layout.marginWidth = 0;
+        layout.verticalSpacing = 0;
+        parent.setLayout( layout );
+
+        create();
+    }
+
+    private void create() {
+        toolkit.createLabel( parent,
+                             HumanReadable.getCEDisplayName( pattern.type ) );
+        addDeleteAction();
+        addMoreOptionsAction();
+        Composite composite = toolkit.createComposite( parent );
+        createFactRows( toolkit,
+                        composite );
+    }
+
+    protected void addDeleteAction() {
+        ImageHyperlink delWholeLink = addImage( parent,
+                                                "icons/delete_obj.gif" );
+        delWholeLink.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                MessageBox dialog = new MessageBox( Display.getCurrent().getActiveShell(),
+                                                    SWT.YES | SWT.NO | SWT.ICON_WARNING );
+                dialog.setMessage( "Remove this ENTIRE condition, " + "and all the field constraints that belong to it." );
+                dialog.setText( "Remove this entire condition?" );
+                if ( dialog.open() == SWT.YES ) {
+                    getModeller().setDirty( true );
+
+                    if ( getModeller().getModel().removeLhsItem( index ) ) {
+                        getModeller().reloadLhs();
+                    } else {
+                        showMessage( "Can't remove that item as it is used in the action part of the rule." );
+                    }
+                }
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+        delWholeLink.setToolTipText( "Remove the entire composite condition." );
+    }
+
+    private void addMoreOptionsAction() {
+        final ImageHyperlink link = addImage( parent,
+                                              // "icons/add_field_to_fact.gif");
+                                              "icons/new_item.gif" );
+
+        link.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                RuleDialog popup = new AddNewFactConstraintDialog( parent.getShell(),
+                                                                    toolkit,
+                                                                    getModeller(),
+                                                                    pattern );
+                popup.open();
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+        link.setToolTipText( "Add a fact to this constraint. " + "If it is an 'or' type, it will need at least 2." );
+    }
+
+    private void createFactRows(FormToolkit toolkit,
+                                Composite constraintComposite) {
+        if ( pattern.patterns != null ) {
+            FactPattern[] facts = pattern.patterns;
+            for ( int i = 0; i < facts.length; i++ ) {
+                new FactPatternWidget( toolkit,
+                                       constraintComposite,
+                                       getModeller(),
+                                       facts[i],
+                                       pattern,
+                                       i );
+            }
+        }
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/CustomRuleDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/CustomRuleDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/CustomRuleDialog.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,12 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+public class CustomRuleDialog extends SelectionDialog {
+
+    public CustomRuleDialog(Shell parentShell) {
+        super( parentShell );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/DSLSentenceWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/DSLSentenceWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/DSLSentenceWidget.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,74 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.brxml.DSLSentence;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * This displays a widget to edit a DSL sentence.
+ * 
+ * @author Michael Neale
+ * @author Ahti Kitsik
+ * @author Anton Arhipov
+ */
+public class DSLSentenceWidget extends Widget {
+
+    private final DSLSentence sentence;
+
+    public DSLSentenceWidget(FormToolkit toolkit,
+                             Composite parent,
+                             DSLSentence sentence, RuleModeller modeller, int index) {
+        super(parent,toolkit,modeller,index);
+        
+        this.sentence = sentence;
+        init();
+    }
+
+    private void init() {
+        GridLayout l = new GridLayout();
+        l.numColumns = sentence.sentence.length();//sentence.elements.length;
+        l.verticalSpacing = 0;
+        l.marginTop = 0;
+        l.marginHeight = 2;
+        l.marginBottom = 0;
+        parent.setLayout( l );
+
+        toolkit.createLabel( parent,
+                             sentence.toString() );
+
+        final Text box = toolkit.createText( parent,
+                                             sentence.toString() );
+        box.setTabs( sentence.toString().length() );
+
+        box.addModifyListener( new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                sentence.sentence = box.getText();
+                getModeller().setDirty( true );
+            }
+        } );
+
+        /*for (int i = 0; i < sentence.length; i++) {
+         //final DSLSentenceFragment el = sentence.elements[i];
+         
+         if (!el.isEditableField) {
+         toolkit.createLabel(parent, sentence.toString());
+         } else {
+         final Text box = toolkit.createText(parent, el.value);
+         box.setTabs(el.value.length());
+
+         box.addModifyListener(new ModifyListener() {
+         public void modifyText(ModifyEvent e) {
+         el.value = box.getText();
+         }
+         });
+
+         }
+         }*/
+        toolkit.paintBordersFor( parent );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/FactPatternWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/FactPatternWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/FactPatternWidget.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,472 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.CompositeFactPattern;
+import org.drools.brms.client.modeldriven.brxml.ConnectiveConstraint;
+import org.drools.brms.client.modeldriven.brxml.Constraint;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.drools.brms.client.modeldriven.brxml.IConstraint;
+import org.drools.eclipse.rulebuilder.modeldriven.HumanReadable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+/**
+ * This is the new smart widget that works off the model.
+ * 
+ * @author Michael Neale
+ * @author Ahti Kitsik
+ * @author Anton Arhipov
+ * 
+ */
+public class FactPatternWidget extends Widget {
+
+    private final CompositeFactPattern parentPattern;
+
+    private final FactPattern          pattern;
+
+    public FactPatternWidget(FormToolkit toolkit,
+                             Composite parent,
+                             RuleModeller mod,
+                             FactPattern factPattern,
+                             CompositeFactPattern parentPattern,
+                             int idx) {
+
+        super( parent,
+               toolkit,
+               mod,
+               idx );
+
+        this.pattern = factPattern;
+        this.parentPattern = parentPattern;
+
+        GridLayout l = new GridLayout();
+        l.numColumns = 4;
+        l.marginBottom = 0;
+        l.marginHeight = 0;
+        l.marginLeft = 0;
+        l.marginRight = 0;
+        l.marginTop = 0;
+        l.marginWidth = 0;
+        l.verticalSpacing = 0;
+        parent.setLayout( l );
+
+        create();
+    }
+
+    private void create() {
+        toolkit.createLabel( parent,
+                             getPatternLabel() );
+        addDeleteAction();
+        addMoreOptionsAction();
+        Composite constraintComposite = toolkit.createComposite( parent );
+        GridLayout constraintLayout = new GridLayout();
+        constraintLayout.numColumns = 6;
+        constraintComposite.setLayout( constraintLayout );
+        createConstraintRows( constraintComposite );
+        toolkit.paintBordersFor( constraintComposite );
+    }
+
+    private void addMoreOptionsAction() {
+        ImageHyperlink link = addImage( parent,
+                                        "icons/new_item.gif" );
+
+        link.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                RuleDialog popup = new AddNewFieldConstraintDialog( parent.getShell(),
+                                                                     toolkit,
+                                                                     getModeller(),
+                                                                     pattern,
+                                                                     parentPattern != null );
+                popup.open();
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+        link.setToolTipText( "Add a field to this condition, or bind a varible to this fact." );
+    }
+
+    private void addDeleteAction() {
+        ImageHyperlink delWholeLink = addImage( parent,
+                                                "icons/delete_obj.gif" );
+        delWholeLink.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                MessageBox dialog = new MessageBox( Display.getCurrent().getActiveShell(),
+                                                    SWT.YES | SWT.NO | SWT.ICON_WARNING );
+                dialog.setMessage( "Remove this ENTIRE condition, " + "and all the field constraints that belong to it." );
+                dialog.setText( "Remove this entire condition?" );
+                if ( dialog.open() == SWT.YES ) {
+                    if ( parentPattern == null ) {
+                        if ( getModeller().getModel().removeLhsItem( index ) ) {
+                            getModeller().reloadLhs();
+                        } else {
+                            showMessage( "Can't remove that item as it is used in the action part of the rule." );
+                        }
+                    } else {
+                        deleteBindedFact();
+                    }
+                    getModeller().setDirty( true );
+                }
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+        delWholeLink.setToolTipText( "Remove this condition." );
+    }
+
+    private void createConstraintRows(Composite constraintComposite) {
+        for ( int row = 0; row < pattern.constraints.length; row++ ) {
+            final Constraint c = pattern.constraints[row];
+            if ( c.constraintValueType != IConstraint.TYPE_PREDICATE ) {
+                createConstraintRow( constraintComposite,
+                                     row,
+                                     c );
+            } else {
+                createPredicateConstraintRow( constraintComposite,
+                                              row,
+                                              c );
+            }
+        }
+    }
+
+    private void createPredicateConstraintRow(Composite constraintComposite,
+                                              int row,
+                                              final Constraint c) {
+        GridData gd = new GridData( GridData.FILL_HORIZONTAL );
+        gd.horizontalSpan = 4;
+        addImage( constraintComposite, "icons/function_assets.gif" );
+        formulaValueEditor( constraintComposite, c, gd );
+        addRemoveFieldAction( constraintComposite, row );
+    }
+
+    private void createConstraintRow(Composite constraintComposite,
+                                     int row,
+                                     final Constraint c) {
+        toolkit.createLabel( constraintComposite, c.fieldName );
+        if ( c.connectives == null || c.connectives.length == 0 ) {
+            addRemoveFieldAction( constraintComposite, row );
+        } else {
+            toolkit.createLabel( constraintComposite, "" );
+        }
+        operatorDropDown( constraintComposite, c );
+        constraintValueEditor( constraintComposite, c );
+        createConnectives( constraintComposite, c );
+        addConnectiveAction( constraintComposite, c );
+    }
+
+    private void createConnectives(Composite parent,
+                                   Constraint c) {
+        if ( c.connectives != null && c.connectives.length > 0 ) {
+            for ( int i = 0; i < c.connectives.length; i++ ) {
+
+                toolkit.createLabel( parent, "" ); // dummy
+                toolkit.createLabel( parent, "" ); // dummy
+                // toolkit.createLabel(parent, ""); // dummy
+
+                ConnectiveConstraint con = c.connectives[i];
+                addRemoveConstraintAction( parent,  c, con );
+                connectiveOperatorDropDown( parent, con, c.fieldName );
+                constraintValueEditor( parent, con );
+
+            }
+        }
+    }
+
+    private void addConnectiveAction(Composite constraintComposite,
+                                     final Constraint c) {
+        ImageHyperlink link = addImage( constraintComposite,
+                                        "icons/add_connective.gif" );
+        link.setToolTipText( "Add more options to this fields values." );
+        link.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                c.addNewConnective();
+                getModeller().reloadLhs();
+                getModeller().setDirty( true );
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+    }
+
+    private void addRemoveFieldAction(Composite constraintComposite,
+                                      final int currentRow) {
+        ImageHyperlink delLink = addImage( constraintComposite,
+                                           "icons/delete_item_small.gif" );
+        delLink.setToolTipText( "Remove this fieldconstraint" );
+        delLink.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                MessageBox dialog = new MessageBox( Display.getCurrent().getActiveShell(),
+                                                    SWT.YES | SWT.NO | SWT.ICON_WARNING );
+                dialog.setMessage( "Remove this item?" );
+                dialog.setText( "Remove this item?" );
+                if ( dialog.open() == SWT.YES ) {
+                    pattern.removeConstraint( currentRow );
+                    getModeller().reloadLhs();
+                    getModeller().setDirty( true );
+                }
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+        delLink.setLayoutData( new GridData( GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END ) );
+    }
+
+    private void addRemoveConstraintAction(Composite composite,
+                                           final Constraint constraint,
+                                           final ConnectiveConstraint connConstraint) {
+        ImageHyperlink delLink = addImage( composite,
+                                           "icons/delete_item_small.gif" );
+        delLink.setToolTipText( "Remove this field constraint" );
+        delLink.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                MessageBox dialog = new MessageBox( Display.getCurrent().getActiveShell(),
+                                                    SWT.YES | SWT.NO | SWT.ICON_WARNING );
+                dialog.setMessage( "Remove this item?" );
+                dialog.setText( "Remove this item?" );
+                if ( dialog.open() == SWT.YES ) {
+                    ConnectiveConstraint[] connectives = constraint.connectives;
+                    List nConnectives = new ArrayList();
+                    for ( int i = 0; i < connectives.length; i++ ) {
+                        if ( connectives[i] != connConstraint ) {
+                            nConnectives.add( connectives[i] );
+                        }
+                    }
+                    constraint.connectives = (ConnectiveConstraint[]) nConnectives.toArray( new ConnectiveConstraint[nConnectives.size()] );
+
+                    getModeller().reloadLhs();
+                    getModeller().setDirty( true );
+                }
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+        delLink.setLayoutData( new GridData( GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END ) );
+    }
+
+    /**
+     * This returns the pattern label.
+     */
+    private String getPatternLabel() {
+        if ( pattern.boundName != null ) {
+            return pattern.factType + " [" + pattern.boundName + "]";
+        }
+        return pattern.factType;
+    }
+
+    private void operatorDropDown(Composite parent,
+                                  final Constraint c) {
+        String[] ops = getCompletions().getOperatorCompletions( pattern.factType,
+                                                                c.fieldName );
+        final Combo box = new Combo( parent,
+                                     SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY );
+        for ( int i = 0; i < ops.length; i++ ) {
+            String op = ops[i];
+            box.add( HumanReadable.getOperatorDisplayName( op ) );
+            if ( op.equals( c.operator ) ) {
+                box.select( i );
+            }
+        }
+        box.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        box.addListener( SWT.Selection,
+                         new Listener() {
+                             public void handleEvent(Event event) {
+                                 c.operator = HumanReadable.getOperatorName( box.getText() );
+                                 getModeller().setDirty( true );
+                             }
+                         } );
+    }
+
+    private void connectiveOperatorDropDown(Composite parent,
+                                            final ConnectiveConstraint con,
+                                            String fieldName) {
+        String[] ops = getCompletions().getConnectiveOperatorCompletions( pattern.factType,
+                                                                          fieldName );
+        final Combo box = new Combo( parent,
+                                     SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY );
+        for ( int i = 0; i < ops.length; i++ ) {
+            String op = ops[i];
+            box.add( HumanReadable.getOperatorDisplayName( op ) );
+            if ( op.equals( con.operator ) ) {
+                box.select( i );
+            }
+        }
+        box.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        box.addModifyListener( new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                con.operator = HumanReadable.getOperatorName( box.getText() );
+                getModeller().setDirty( true );
+            }
+        } );
+    }
+
+    // from org.drools.brms.client.modeldriven.ui.ConstraintValueEditor
+    private void constraintValueEditor(final Composite parent,
+                                       final IConstraint c) {
+        if ( c.constraintValueType == IConstraint.TYPE_UNDEFINED ) {
+            ImageHyperlink link = addImage( parent,
+                                            "icons/edit.gif" );
+            link.setToolTipText( "Choose value editor type" );
+            link.addHyperlinkListener( new IHyperlinkListener() {
+                public void linkActivated(HyperlinkEvent e) {
+                    RuleDialog popup = new ValueEditorTypeSelectionDialog( parent.getShell(),
+                                                                            toolkit,
+                                                                            getModeller(),
+                                                                            c );
+                    popup.open();
+                }
+
+                public void linkEntered(HyperlinkEvent e) {
+                }
+
+                public void linkExited(HyperlinkEvent e) {
+                }
+            } );
+
+            toolkit.createLabel( parent,
+                                 "" );// dummy
+        } else {
+            switch ( c.constraintValueType ) {
+                case IConstraint.TYPE_LITERAL :
+                    literalValueEditor( parent,
+                                        c,
+                                        new GridData( GridData.FILL_HORIZONTAL ) );
+                    break;
+                case IConstraint.TYPE_RET_VALUE :
+                    addImage( parent,
+                              "icons/function_assets.gif" );
+                    formulaValueEditor( parent,
+                                        c,
+                                        new GridData( GridData.FILL_HORIZONTAL ) );
+                    break;
+                case IConstraint.TYPE_VARIABLE :
+                    variableEditor( parent,
+                                    c );
+                    break;
+                default :
+                    break;
+            }
+        }
+    }
+
+    private void variableEditor(Composite composite,
+                                final IConstraint c) {
+        List vars = getModeller().getModel().getBoundVariablesInScope( c );
+
+        final Combo combo = new Combo( composite,
+                                       SWT.READ_ONLY );
+
+        if ( c.value == null ) {
+            combo.add( "Choose ..." );
+        }
+
+        for ( int i = 0; i < vars.size(); i++ ) {
+            String var = (String) vars.get( i );
+            if ( c.value != null && c.value.equals( var ) ) {
+                combo.select( i );
+            }
+            combo.add( var );
+        }
+
+        combo.addModifyListener( new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                c.value = combo.getText();
+            }
+        } );
+
+    }
+
+    private void literalValueEditor(Composite parent,
+                                    final IConstraint c,
+                                    GridData gd) {
+        final Text box = toolkit.createText( parent,
+                                             "" );
+
+        if ( c.value != null ) {
+            box.setText( c.value );
+        }
+
+        gd.horizontalSpan = 2;
+        box.setLayoutData( gd );
+
+        box.addModifyListener( new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                c.value = box.getText();
+                getModeller().setDirty( true );
+            }
+        } );
+    }
+
+    private void formulaValueEditor(Composite parent,
+                                    final IConstraint c,
+                                    GridData gd) {
+
+        final Text box = toolkit.createText( parent,
+                                             "" );
+
+        if ( c.value != null ) {
+            box.setText( c.value );
+        }
+
+        box.setLayoutData( gd );
+
+        box.addModifyListener( new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                c.value = box.getText();
+                getModeller().setDirty( true );
+            }
+        } );
+
+    }
+
+    private void deleteBindedFact() {
+        List newPatterns = new ArrayList();
+        for ( int i = 0; i < parentPattern.patterns.length; i++ ) {
+            if ( parentPattern.patterns[i] != pattern ) {
+                newPatterns.add( parentPattern.patterns[i] );
+            }
+        }
+        parentPattern.patterns = (FactPattern[]) newPatterns.toArray( new FactPattern[newPatterns.size()] );
+        getModeller().reloadLhs();
+    }
+
+    private SuggestionCompletionEngine getCompletions() {
+        return getModeller().getSuggestionCompletionEngine();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/RuleDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/RuleDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/RuleDialog.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,12 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.eclipse.jface.dialogs.PopupDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class RuleDialog extends PopupDialog {
+
+    public RuleDialog(Shell parent, String title, String hint) {
+        super(parent,INFOPOPUPRESIZE_SHELLSTYLE,true,true,true,true,title,hint);
+    }
+    
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/RuleModeller.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/RuleModeller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/RuleModeller.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,329 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.ActionAssertFact;
+import org.drools.brms.client.modeldriven.brxml.ActionRetractFact;
+import org.drools.brms.client.modeldriven.brxml.ActionSetField;
+import org.drools.brms.client.modeldriven.brxml.CompositeFactPattern;
+import org.drools.brms.client.modeldriven.brxml.DSLSentence;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.drools.brms.client.modeldriven.brxml.IAction;
+import org.drools.brms.client.modeldriven.brxml.IPattern;
+import org.drools.brms.client.modeldriven.brxml.RuleModel;
+import org.drools.eclipse.rulebuilder.editors.RuleEditor;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.forms.widgets.ColumnLayout;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * Main modeling class responsible for Eclipse Forms-based rule builder widget
+ * rendering
+ * 
+ * @author Anton Arhipov
+ * @author Ahti Kitsik
+ * 
+ */
+public class RuleModeller {
+
+    private Composite          ifComposite;
+
+    private Composite          thenComposite;
+
+    private final ScrolledForm form;
+
+    private final FormToolkit  toolkit;
+
+    private RuleModel          model;
+
+    private boolean            dirty;
+
+    private RuleEditor         editor;
+
+    public boolean isDirty() {
+        return dirty;
+    }
+
+    public void setDirty(boolean dirty) {
+        this.dirty = dirty;
+        editor.dirtyPropertyChanged();
+    }
+
+    public RuleModeller(ScrolledForm form,
+                        FormToolkit toolkit,
+                        RuleModel model,
+                        RuleEditor editor) {
+
+        this.form = form;
+        this.toolkit = toolkit;
+        this.model = model;
+        this.editor = editor;
+
+        form.setText( "Rule Builder" );
+
+        ColumnLayout colLayout = new ColumnLayout();
+        colLayout.minNumColumns = 1;
+        colLayout.maxNumColumns = 1;
+
+        form.getBody().setLayout( colLayout );
+
+        // addToolBar(toolkit, form);
+
+        Shell shell = new Shell( Display.getCurrent() );
+        Window conditionPopup = new AddNewConditionDialog( shell,
+                                                                toolkit,
+                                                                this );
+        Window actionPopup = new AddNewActionDialog( shell,
+                                                          toolkit,
+                                                          this );
+
+        Section ifSection = createMainSection( form,
+                                               toolkit,
+                                               "IF",
+                                               conditionPopup );
+        Section thenSection = createMainSection( form,
+                                                 toolkit,
+                                                 "THEN",
+                                                 actionPopup );
+
+        ColumnLayout layout = new ColumnLayout();
+        layout.minNumColumns = 1;
+        layout.maxNumColumns = 1;
+        // layout.verticalSpacing = 0;
+
+        ((Composite) (ifSection.getClient())).setLayout( layout );
+        ((Composite) (thenSection.getClient())).setLayout( layout );
+        ifSection.setLayout( layout );
+        thenSection.setLayout( layout );
+
+        ifComposite = (Composite) ifSection.getClient();
+        thenComposite = (Composite) thenSection.getClient();
+
+    }
+
+    public SuggestionCompletionEngine getSuggestionCompletionEngine() {
+        return editor.getCompletionEngine();
+    }
+
+    public RuleModel getModel() {
+        return model;
+    }
+
+    public void setModel(RuleModel model) {
+        this.model = model;
+    }
+
+    private void clearComposite(Composite composite) {
+        System.out.println( "clear composite" );
+        if ( composite != null ) {
+            Control[] c = composite.getChildren();
+            for ( int i = 0; i < c.length; i++ ) {
+                Control c2 = c[i];
+                c2.dispose();
+            }
+        }
+    }
+
+    private void reloadCommon() {
+        toolkit.paintBordersFor( form.getBody() );
+        form.redraw();
+        Dialog.applyDialogFont( form.getBody() );
+        form.reflow( true );
+    }
+
+    public void reloadRhs() {
+        clearComposite( thenComposite );
+        redrawRhs();
+        reloadCommon();
+    }
+
+    public void reloadLhs() {
+        clearComposite( ifComposite );
+        redrawLhs();
+        reloadCommon();
+    }
+
+    public void reloadWidgets() {
+        reloadLhs();
+        reloadRhs();
+    }
+
+    private void redrawRhs() {
+        for ( int i = 0; i < model.rhs.length; i++ ) {
+            IAction action = model.rhs[i];
+
+            if ( action instanceof ActionSetField ) {
+                addActionSetFieldWidget( action,
+                                         i );
+            } else if ( action instanceof ActionAssertFact ) {
+                addActionAssertFactWidget( action,
+                                           i );
+            } else if ( action instanceof ActionRetractFact ) {
+                addActionRetractFactWidget( action,
+                                            i );
+            } else if ( action instanceof DSLSentence ) {
+                addDSLSentenceWidget( action );
+            }
+
+        }
+    }
+
+    private void redrawLhs() {
+
+        System.out.println( "redrawing lhs part..." );
+        for ( int i = 0; i < model.lhs.length; i++ ) {
+            IPattern pattern = model.lhs[i];
+
+            System.out.println( "pattern = " + pattern );
+
+            if ( pattern instanceof FactPattern ) {
+                addFactPatternWidget( i,
+                                      (FactPattern) pattern );
+            }
+            if ( pattern instanceof CompositeFactPattern ) {
+                addCompositeFactPatternWidget( i,
+                                               (CompositeFactPattern) pattern );
+            } else if ( pattern instanceof DSLSentence ) {
+                // skip for now
+            } else {
+                // TODO: handle unknown instances properly
+            }
+        }
+
+        for ( int i = 0; i < model.lhs.length; i++ ) {
+            IPattern pattern = model.lhs[i];
+            if ( pattern instanceof DSLSentence ) {
+                //TODO  Is it OK to use index here? I added this to reflect general API (From: Ahti Kitsik)
+                addDSLSentenceWidget( i,
+                                      (DSLSentence) pattern );
+            }
+        }
+    }
+
+    private void addDSLSentenceWidget(IAction action) {
+    }
+
+    private void addActionRetractFactWidget(IAction action,
+                                            int i) {
+        Composite comp = toolkit.createComposite( thenComposite );
+        new ActionRetractFactWidget( toolkit,
+                                     comp,
+                                     this,
+                                     (ActionRetractFact) action,
+                                     i );
+    }
+
+    private void addActionAssertFactWidget(IAction action,
+                                           int i) {
+        Composite comp = toolkit.createComposite( thenComposite );
+        new ActionAssertFactWidget( toolkit,
+                                    comp,
+                                    this,
+                                    (ActionAssertFact) action,
+                                    i );
+
+    }
+
+    private void addActionSetFieldWidget(IAction action,
+                                         int i) {
+        Composite comp = toolkit.createComposite( thenComposite );
+        new ActionSetFieldWidget( toolkit,
+                                  comp,
+                                  this,
+                                  model,
+                                  (ActionSetField) action,
+                                  i );
+    }
+
+    private void addDSLSentenceWidget(int idx,
+                                      DSLSentence pattern) {
+        Composite comp = toolkit.createComposite( ifComposite );
+        new DSLSentenceWidget( toolkit,
+                               comp,
+                               pattern,
+                               this,
+                               idx );
+    }
+
+    private void addCompositeFactPatternWidget(int idx,
+                                               CompositeFactPattern pattern) {
+        Composite comp = toolkit.createComposite( ifComposite );
+        new CompositeFactPatternWidget( toolkit,
+                                        comp,
+                                        this,
+                                        pattern,
+                                        idx );
+    }
+
+    private void addFactPatternWidget(int idx,
+                                      FactPattern pattern) {
+        Composite comp = toolkit.createComposite( ifComposite );
+        new FactPatternWidget( toolkit,
+                               comp,
+                               this,
+                               pattern,
+                               null,
+                               idx );
+    }
+
+    private Section createMainSection(final ScrolledForm form,
+                                      FormToolkit toolkit,
+                                      String title,
+                                      Window popup) {
+        ColumnLayout layout = new ColumnLayout();
+        layout.minNumColumns = 1;
+        layout.maxNumColumns = 1;
+        Section l1Sect = toolkit.createSection( form.getBody(),
+                                                ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED );
+        l1Sect.setActiveToggleColor( toolkit.getHyperlinkGroup().getActiveForeground() );
+        l1Sect.setToggleColor( toolkit.getColors().getColor( FormColors.SEPARATOR ) );
+        l1Sect.setText( title );
+        createAddToolItem( l1Sect,
+                           popup );
+        Composite comp = toolkit.createComposite( l1Sect );
+        l1Sect.setClient( comp );
+        return l1Sect;
+    }
+
+    private void createAddToolItem(Section sect,
+                                   final Window popup) {
+        ToolBar tbar = new ToolBar( sect,
+                                    SWT.FLAT | SWT.HORIZONTAL );
+        ToolItem titem = new ToolItem( tbar,
+                                       SWT.SEPARATOR );
+        titem = new ToolItem( tbar,
+                              SWT.PUSH );
+        titem.setImage( PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_TOOL_NEW_WIZARD ) );
+
+        titem.addListener( SWT.Selection,
+                           new Listener() {
+                               public void handleEvent(Event event) {
+                                   popup.open();
+                               }
+                           } );
+        sect.setTextClient( tbar );
+    }
+
+    public void refresh() {
+        ifComposite.layout();
+        ifComposite.redraw();
+        thenComposite.layout();
+        thenComposite.redraw();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ValueEditorTypeSelectionDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ValueEditorTypeSelectionDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/ValueEditorTypeSelectionDialog.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,68 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.brms.client.modeldriven.brxml.IConstraint;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+public class ValueEditorTypeSelectionDialog extends RuleDialog {
+
+    private final FormToolkit toolkit;
+
+    private RuleModeller      modeller;
+
+    private IConstraint       constraint;
+
+    public ValueEditorTypeSelectionDialog(Shell parent,
+                                          FormToolkit toolkit,
+                                          RuleModeller modeller,
+                                          IConstraint constraint) {
+        super(parent,"Select value editor type","Select value editor type" );
+        this.toolkit = toolkit;
+        this.modeller = modeller;
+        this.constraint = constraint;
+    }
+
+    protected Control createDialogArea(final Composite parent) {
+        Composite composite = (Composite) super.createDialogArea( parent );
+
+        toolkit.createLabel( composite,
+                             "Field value:" );
+        final Combo valueTypeCombo = new Combo( composite,
+                                                SWT.READ_ONLY );
+        valueTypeCombo.add( "Literal value" ); // 0
+        valueTypeCombo.add( "A formula" ); // 1
+
+        if ( modeller.getModel().getBoundVariablesInScope( constraint ).size() > 0 ) {
+            valueTypeCombo.add( "Bound variable" ); // 2
+        }
+
+        valueTypeCombo.addModifyListener( new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                switch ( valueTypeCombo.getSelectionIndex() ) {
+                    case 0 :
+                        constraint.constraintValueType = IConstraint.TYPE_LITERAL;
+                        break;
+                    case 1 :
+                        constraint.constraintValueType = IConstraint.TYPE_RET_VALUE;
+                        break;
+                    case 2 :
+                        constraint.constraintValueType = IConstraint.TYPE_VARIABLE;
+                        break;
+                }
+                modeller.reloadLhs();
+                modeller.setDirty( true );
+                close();
+            }
+        } );
+
+        toolkit.paintBordersFor( composite );
+        return composite;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/Widget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/Widget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/ui/Widget.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,80 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.drools.eclipse.rulebuilder.RuleBuilderPlugin;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+public abstract class Widget {
+
+    final protected Composite   parent;
+
+    final protected FormToolkit toolkit;
+
+    final private RuleModeller  modeller;
+
+    final protected int         index;
+
+    public Widget(Composite parent,
+                  FormToolkit toolkit,
+                  RuleModeller modeller,
+                  int index) {
+        this.parent = parent;
+        this.toolkit = toolkit;
+        this.modeller = modeller;
+        this.index = index;
+    }
+
+    public ImageHyperlink addImage(Composite parent,
+                                   String fileName) {
+        ImageHyperlink imageHyperlink = toolkit.createImageHyperlink( parent,
+                                                                      0 );
+        ImageDescriptor imageDescriptor = RuleBuilderPlugin.getImageDescriptor( fileName );
+        imageHyperlink.setImage( imageDescriptor.createImage() );
+        return imageHyperlink;
+    }
+
+    protected void addDeleteRHSAction() {
+        ImageHyperlink delWholeLink = addImage( parent,
+                                                "icons/delete_obj.gif" );
+        delWholeLink.addHyperlinkListener( new IHyperlinkListener() {
+            public void linkActivated(HyperlinkEvent e) {
+                MessageBox dialog = new MessageBox( Display.getCurrent().getActiveShell(),
+                                                    SWT.YES | SWT.NO | SWT.ICON_WARNING );
+                dialog.setMessage( "Remove this action?" );
+                dialog.setText( "Remove this action?" );
+                if ( dialog.open() == SWT.YES ) {
+                    getModeller().getModel().removeRhsItem( index );
+                    getModeller().setDirty( true );
+                    getModeller().reloadRhs();
+                }
+            }
+
+            public void linkEntered(HyperlinkEvent e) {
+            }
+
+            public void linkExited(HyperlinkEvent e) {
+            }
+        } );
+        delWholeLink.setToolTipText( "Remove this action." );
+    }
+
+    protected void showMessage(String msg) {
+        MessageBox dialog = new MessageBox( Display.getDefault().getActiveShell(),
+                                            SWT.OK | SWT.ICON_INFORMATION );
+        dialog.setMessage( msg );
+        dialog.setText( "Information" );
+        dialog.open();
+    }
+
+    protected RuleModeller getModeller() {
+        return modeller;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/wizards/NewBrxmlFileWizard.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/wizards/NewBrxmlFileWizard.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/wizards/NewBrxmlFileWizard.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,151 @@
+package org.drools.eclipse.rulebuilder.wizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.core.runtime.*;
+import org.eclipse.jface.operation.*;
+import java.lang.reflect.InvocationTargetException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.CoreException;
+import java.io.*;
+import org.eclipse.ui.*;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * This is a sample new wizard. Its role is to create a new file 
+ * resource in the provided container. If the container resource
+ * (a folder or a project) is selected in the workspace 
+ * when the wizard is opened, it will accept it as the target
+ * container. The wizard creates one file with the extension
+ * "brxml". If a sample multi-page editor (also available
+ * as a template) is registered for the same extension, it will
+ * be able to open it.
+ */
+
+public class NewBrxmlFileWizard extends Wizard implements INewWizard {
+	private NewBrxmlFileWizardPage page;
+	private ISelection selection;
+
+	/**
+	 * Constructor for NewBrxmlFileWizard.
+	 */
+	public NewBrxmlFileWizard() {
+		super();
+		setNeedsProgressMonitor(true);
+	}
+	
+	/**
+	 * Adding the page to the wizard.
+	 */
+
+	public void addPages() {
+		page = new NewBrxmlFileWizardPage(selection);
+		addPage(page);
+	}
+
+	/**
+	 * This method is called when 'Finish' button is pressed in
+	 * the wizard. We will create an operation and run it
+	 * using wizard as execution context.
+	 */
+	public boolean performFinish() {
+		final String containerName = page.getContainerName();
+		final String fileName = page.getFileName();
+		IRunnableWithProgress op = new IRunnableWithProgress() {
+			public void run(IProgressMonitor monitor) throws InvocationTargetException {
+				try {
+					doFinish(containerName, fileName, monitor);
+				} catch (CoreException e) {
+					throw new InvocationTargetException(e);
+				} finally {
+					monitor.done();
+				}
+			}
+		};
+		try {
+			getContainer().run(true, false, op);
+		} catch (InterruptedException e) {
+			return false;
+		} catch (InvocationTargetException e) {
+			Throwable realException = e.getTargetException();
+			MessageDialog.openError(getShell(), "Error", realException.getMessage());
+			return false;
+		}
+		return true;
+	}
+	
+	/**
+	 * The worker method. It will find the container, create the
+	 * file if missing or just replace its contents, and open
+	 * the editor on the newly created file.
+	 */
+
+	private void doFinish(
+		String containerName,
+		String fileName,
+		IProgressMonitor monitor)
+		throws CoreException {
+		// create a sample file
+		monitor.beginTask("Creating " + fileName, 2);
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IResource resource = root.findMember(new Path(containerName));
+		if (!resource.exists() || !(resource instanceof IContainer)) {
+			throwCoreException("Container \"" + containerName + "\" does not exist.");
+		}
+		IContainer container = (IContainer) resource;
+		final IFile file = container.getFile(new Path(fileName));
+		try {
+			InputStream stream = openContentStream();
+			if (file.exists()) {
+				file.setContents(stream, true, true, monitor);
+			} else {
+				file.create(stream, true, monitor);
+			}
+			stream.close();
+		} catch (IOException e) {
+		}
+		monitor.worked(1);
+		monitor.setTaskName("Opening file for editing...");
+		getShell().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				IWorkbenchPage page =
+					PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+				try {
+					IDE.openEditor(page, file, true);
+				} catch (PartInitException e) {
+				}
+			}
+		});
+		monitor.worked(1);
+	}
+	
+	/**
+	 * We will initialize file contents with a sample text.
+	 */
+
+	private InputStream openContentStream() {
+		//String contents =
+		//	"This is the initial file contents for *.brxml file that should be word-sorted in the Preview page of the multi-page editor";
+		String contents = "";
+		return new ByteArrayInputStream(contents.getBytes());
+	}
+
+	private void throwCoreException(String message) throws CoreException {
+		IStatus status =
+			new Status(IStatus.ERROR, "org.drools.eclipse.rulebuilder", IStatus.OK, message, null);
+		throw new CoreException(status);
+	}
+
+	/**
+	 * We will accept the selection in the workbench to see if
+	 * we can initialize from it.
+	 * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
+	 */
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		this.selection = selection;
+	}
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/wizards/NewBrxmlFileWizardPage.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/wizards/NewBrxmlFileWizardPage.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-guided-editor/src/org/drools/eclipse/rulebuilder/wizards/NewBrxmlFileWizardPage.java	2007-05-28 16:33:17 UTC (rev 12178)
@@ -0,0 +1,185 @@
+package org.drools.eclipse.rulebuilder.wizards;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+
+/**
+ * The "New" wizard page allows setting the container for the new file as well
+ * as the file name. The page will only accept file name without the extension
+ * OR with the extension that matches the expected one (brxml).
+ */
+
+public class NewBrxmlFileWizardPage extends WizardPage {
+	private Text containerText;
+
+	private Text fileText;
+
+	private ISelection selection;
+
+	/**
+	 * Constructor for SampleNewWizardPage.
+	 * 
+	 * @param pageName
+	 */
+	public NewBrxmlFileWizardPage(ISelection selection) {
+		super("wizardPage");
+		setTitle("RuleBuilder Editor File");
+		setDescription("This wizard creates a new file with *.brxml extension that can be opened by a multi-page editor.");
+		this.selection = selection;
+	}
+
+	/**
+	 * @see IDialogPage#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		Composite container = new Composite(parent, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		container.setLayout(layout);
+		layout.numColumns = 3;
+		layout.verticalSpacing = 9;
+		Label label = new Label(container, SWT.NULL);
+		label.setText("&Container:");
+
+		containerText = new Text(container, SWT.BORDER | SWT.SINGLE);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		containerText.setLayoutData(gd);
+		containerText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+
+		Button button = new Button(container, SWT.PUSH);
+		button.setText("Browse...");
+		button.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				handleBrowse();
+			}
+		});
+		label = new Label(container, SWT.NULL);
+		label.setText("&File name:");
+
+		fileText = new Text(container, SWT.BORDER | SWT.SINGLE);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		fileText.setLayoutData(gd);
+		fileText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+		initialize();
+		dialogChanged();
+		setControl(container);
+	}
+
+	/**
+	 * Tests if the current workbench selection is a suitable container to use.
+	 */
+
+	private void initialize() {
+		if (selection != null && selection.isEmpty() == false
+				&& selection instanceof IStructuredSelection) {
+			IStructuredSelection ssel = (IStructuredSelection) selection;
+			if (ssel.size() > 1)
+				return;
+			Object obj = ssel.getFirstElement();
+			if (obj instanceof IResource) {
+				IContainer container;
+				if (obj instanceof IContainer)
+					container = (IContainer) obj;
+				else
+					container = ((IResource) obj).getParent();
+				containerText.setText(container.getFullPath().toString());
+			}
+		}
+		fileText.setText("rules.brxml");
+	}
+
+	/**
+	 * Uses the standard container selection dialog to choose the new value for
+	 * the container field.
+	 */
+
+	private void handleBrowse() {
+		ContainerSelectionDialog dialog = new ContainerSelectionDialog(
+				getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
+				"Select new file container");
+		if (dialog.open() == ContainerSelectionDialog.OK) {
+			Object[] result = dialog.getResult();
+			if (result.length == 1) {
+				containerText.setText(((Path) result[0]).toString());
+			}
+		}
+	}
+
+	/**
+	 * Ensures that both text fields are set.
+	 */
+
+	private void dialogChanged() {
+		IResource container = ResourcesPlugin.getWorkspace().getRoot()
+				.findMember(new Path(getContainerName()));
+		String fileName = getFileName();
+
+		if (getContainerName().length() == 0) {
+			updateStatus("File container must be specified");
+			return;
+		}
+		if (container == null
+				|| (container.getType() & (IResource.PROJECT | IResource.FOLDER)) == 0) {
+			updateStatus("File container must exist");
+			return;
+		}
+		if (!container.isAccessible()) {
+			updateStatus("Project must be writable");
+			return;
+		}
+		if (fileName.length() == 0) {
+			updateStatus("File name must be specified");
+			return;
+		}
+		if (fileName.replace('\\', '/').indexOf('/', 1) > 0) {
+			updateStatus("File name must be valid");
+			return;
+		}
+		int dotLoc = fileName.lastIndexOf('.');
+		if (dotLoc != -1) {
+			String ext = fileName.substring(dotLoc + 1);
+			if (ext.equalsIgnoreCase("brxml") == false) {
+				updateStatus("File extension must be \"brxml\"");
+				return;
+			}
+		}
+		updateStatus(null);
+	}
+
+	private void updateStatus(String message) {
+		setErrorMessage(message);
+		setPageComplete(message == null);
+	}
+
+	public String getContainerName() {
+		return containerText.getText();
+	}
+
+	public String getFileName() {
+		return fileText.getText();
+	}
+}
\ No newline at end of file




More information about the jboss-svn-commits mailing list