[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