[jboss-svn-commits] JBL Code SVN: r35474 - in labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor: client/factmodel and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Oct 11 05:44:36 EDT 2010


Author: Rikkola
Date: 2010-10-11 05:44:34 -0400 (Mon, 11 Oct 2010)
New Revision: 35474

Added:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactEditorPopup.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldEditor.ui.xml
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldsEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldsEditor.ui.xml
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelEditor.ui.xml
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsEditor.ui.xml
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FieldEditorPopup.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/ModelNameHelper.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/NoSpaceKeyPressHandler.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/AbstractLazyStackPanelHeader.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/AddButton.java
Removed:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelWidget.java
Modified:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/FormStylePopup.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/ImageButton.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactMetaModel.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModels.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FieldMetaModel.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/EditorLauncher.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanel.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanelHeader.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanelRow.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/Guvnor.css
Log:
GUVNOR-641 :  Replace gwtext accordion panels with custom component
-Declaritive Model editor

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/FormStylePopup.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/FormStylePopup.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/FormStylePopup.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -34,6 +34,9 @@
         form = new FormStyleLayout( image,
                                     title );
 
+        setModal( true );
+        setGlassEnabled( true );
+
         setTitle( title );
 
     }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/ImageButton.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/ImageButton.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/ImageButton.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -1,5 +1,5 @@
-/**
- * Copyright 2010 JBoss Inc
+/*
+ * Copyright 2005 JBoss Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,21 +16,6 @@
 
 package org.drools.guvnor.client.common;
 
-/*
- * Copyright 2005 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
 
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.uibinder.client.UiConstructor;

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactEditorPopup.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactEditorPopup.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactEditorPopup.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.drools.guvnor.client.factmodel;
+
+import org.drools.guvnor.client.common.FormStylePopup;
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.util.Format;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.TextBox;
+
+/**
+ * 
+ * @author rikkola
+ *
+ */
+public class FactEditorPopup {
+
+    private static Constants      constants = ((Constants) GWT.create( Constants.class ));
+
+    private final FactMetaModel   factModel;
+    private final ModelNameHelper modelNameHelper;
+
+    private Command               okCommand;
+
+    public FactEditorPopup(ModelNameHelper modelNameHelper) {
+        this( new FactMetaModel(),
+              modelNameHelper );
+    }
+
+    public FactEditorPopup(FactMetaModel factModel,
+                           ModelNameHelper modelNameHelper) {
+        this.factModel = factModel;
+        this.modelNameHelper = modelNameHelper;
+    }
+
+    public FactMetaModel getFactModel() {
+        return factModel;
+    }
+
+    public void setOkCommand(Command okCommand) {
+        this.okCommand = okCommand;
+    }
+
+    public void show() {
+
+        final FormStylePopup pop = new FormStylePopup();
+        pop.setTitle( constants.Name() );
+        HorizontalPanel changeName = new HorizontalPanel();
+        final TextBox name = new TextBox();
+        name.setText( factModel.name );
+        changeName.add( name );
+        Button nameButton = new Button( constants.OK() );
+
+        nameButton.addKeyPressHandler( new NoSpaceKeyPressHandler() );
+
+        nameButton.addClickHandler( new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                if ( doesTheNameExist() ) {
+                    Window.alert( Format.format( constants.NameTakenForModel(),
+                                                 name.getText() ) );
+                    return;
+                }
+
+                if ( factModelAlreadyHasAName() ) {
+                    if ( isTheUserSureHeWantsToChangeTheName() ) {
+                        setNameAndClose();
+                    }
+                } else {
+                    setNameAndClose();
+                }
+            }
+
+            private boolean factModelAlreadyHasAName() {
+                return factModel.name != null;
+            }
+
+            private void setNameAndClose() {
+                String oldName = factModel.name;
+                String newName = name.getText();
+
+                modelNameHelper.changeNameInModelNameHelper( oldName,
+                                                             newName );
+                factModel.name = newName;
+
+                okCommand.execute();
+
+                pop.hide();
+            }
+
+            private boolean isTheUserSureHeWantsToChangeTheName() {
+                return Window.confirm( constants.ModelNameChangeWarning() );
+            }
+
+            private boolean doesTheNameExist() {
+                return !modelNameHelper.isUniqueName( name.getText() );
+            }
+        } );
+        changeName.add( nameButton );
+        pop.addAttribute( constants.Name(),
+                          changeName );
+
+        pop.show();
+    }
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldEditor.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.drools.guvnor.client.factmodel;
+
+import org.drools.guvnor.client.messages.Constants;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * 
+ * @author rikkola
+ *
+ */
+public class FactFieldEditor extends Composite {
+
+    private static Constants constants = ((Constants) GWT.create( Constants.class ));
+
+    interface FactFieldsEditorBinder
+        extends
+        UiBinder<Widget, FactFieldEditor> {
+    }
+
+    private static FactFieldsEditorBinder uiBinder = GWT.create( FactFieldsEditorBinder.class );
+
+    @UiField
+    Label                                 fieldType;
+    @UiField
+    Label                                 fieldName;
+    @UiField
+    Image                                 editFieldIcon;
+    @UiField
+    Image                                 deleteFieldIcon;
+
+    private FieldMetaModel                field;
+    private final ModelNameHelper         modelNameHelper;
+
+    private Command                       deleteCommand;
+
+    public FactFieldEditor(final FieldMetaModel field,
+                           final ModelNameHelper modelNameHelper) {
+
+        this.field = field;
+        this.modelNameHelper = modelNameHelper;
+
+        initWidget( uiBinder.createAndBindUi( this ) );
+
+        fieldName.setStyleName( "guvnor-bold-label" );
+
+        setTypeText( field.type );
+        fieldName.setText( field.name );
+
+        editFieldIcon.setTitle( constants.Rename() );
+        deleteFieldIcon.setTitle( constants.Delete() );
+    }
+
+    @UiHandler("editFieldIcon")
+    void editFieldIconClick(ClickEvent event) {
+        final FieldEditorPopup popup = new FieldEditorPopup( field,
+                                                             modelNameHelper );
+        popup.setOkCommand( new Command() {
+            public void execute() {
+                setTypeText( field.type );
+                fieldName.setText( field.name );
+            }
+        } );
+
+        popup.show();
+    }
+
+    @UiHandler("deleteFieldIcon")
+    void deleteFieldIconClick(ClickEvent event) {
+        deleteCommand.execute();
+    }
+
+    private void setTypeText(String typeName) {
+        String easierTypeNameForMostPeopleWhoAreNotProgrammers = modelNameHelper.getTypeDescriptions().get( typeName );
+
+        fieldType.setText( easierTypeNameForMostPeopleWhoAreNotProgrammers );
+    }
+
+    public void setDeleteCommand(Command deleteCommand) {
+        this.deleteCommand = deleteCommand;
+    }
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldEditor.ui.xml
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldEditor.ui.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldEditor.ui.xml	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,37 @@
+<!--
+  Copyright 2010 JBoss Inc
+ 
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+ 
+       http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
+<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
+	xmlns:gwt='urn:import:com.google.gwt.user.client.ui' xmlns:guvnor='urn:import:org.drools.guvnor.client.common'>
+
+	<gwt:HTMLPanel>
+		<div style="float:left; padding-left:40px;">
+			<gwt:HorizontalPanel>
+				<gwt:Label ui:field="fieldName"></gwt:Label>
+				<gwt:Label text=" : "></gwt:Label>
+				<gwt:Label ui:field="fieldType" ></gwt:Label>
+			</gwt:HorizontalPanel>
+		</div>
+		<div style="float:right;">
+			<gwt:HorizontalPanel>
+				<gwt:Image ui:field="editFieldIcon" url="images/edit.gif" ></gwt:Image>
+				<gwt:Image ui:field="deleteFieldIcon" url="images/delete_item_small.gif" ></gwt:Image>
+			</gwt:HorizontalPanel>
+		</div>
+		<div style="clear:both;"></div>
+	</gwt:HTMLPanel>
+
+</ui:UiBinder>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldsEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldsEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldsEditor.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.drools.guvnor.client.factmodel;
+
+import java.util.List;
+
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.util.AddButton;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+import org.drools.guvnor.client.util.Format;
+
+/**
+ * 
+ * @author rikkola
+ *
+ */
+public class FactFieldsEditor extends Composite {
+
+    private static Constants constants = ((Constants) GWT.create( Constants.class ));
+
+    interface FactFieldsEditorBinder
+        extends
+        UiBinder<Widget, FactFieldsEditor> {
+    }
+
+    private static FactFieldsEditorBinder uiBinder = GWT.create( FactFieldsEditorBinder.class );
+
+    @UiField
+    VerticalPanel                         fieldsPanel;
+    @UiField
+    AddButton                             addFieldIcon;
+
+    private final ModelNameHelper         modelNameHelper;
+
+    private final List<FieldMetaModel>    fields;
+
+    public FactFieldsEditor(final List<FieldMetaModel> fields,
+                            final ModelNameHelper modelNameHelper) {
+
+        this.fields = fields;
+        this.modelNameHelper = modelNameHelper;
+
+        initWidget( uiBinder.createAndBindUi( this ) );
+
+        addFieldRows();
+
+        addFieldIcon.setTitle( constants.AddField() );
+        addFieldIcon.setText( constants.AddField() );
+    }
+
+    @UiHandler("addFieldIcon")
+    void addNewFieldClick(ClickEvent event) {
+        final FieldEditorPopup popup = new FieldEditorPopup( modelNameHelper );
+
+        popup.setOkCommand( new Command() {
+
+            public void execute() {
+                createNewField( popup );
+            }
+
+            private void createNewField(final FieldEditorPopup popup) {
+                FieldMetaModel field = popup.getField();
+                fields.add( field );
+                addFieldRow( field );
+            }
+        } );
+
+        popup.show();
+
+    }
+
+    private void addFieldRows() {
+        for ( FieldMetaModel fieldMetaModel : fields ) {
+            addFieldRow( fieldMetaModel );
+        }
+    }
+
+    private void addFieldRow(final FieldMetaModel fieldMetaModel) {
+        final FactFieldEditor editor = new FactFieldEditor( fieldMetaModel,
+                                                            modelNameHelper );
+
+        editor.setDeleteCommand( new Command() {
+            public void execute() {
+                if ( Window.confirm( Format.format( constants.AreYouSureYouWantToRemoveTheField0(),
+                                                    fieldMetaModel.name ) ) ) {
+                    fieldsPanel.remove( editor );
+                    fields.remove( fieldMetaModel );
+                }
+            }
+        } );
+
+        fieldsPanel.add( editor );
+    }
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldsEditor.ui.xml
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldsEditor.ui.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactFieldsEditor.ui.xml	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,33 @@
+<!--
+  Copyright 2010 JBoss Inc
+ 
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+ 
+       http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
+<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
+	xmlns:gwt='urn:import:com.google.gwt.user.client.ui' xmlns:guvnor='urn:import:org.drools.guvnor.client.util'>
+
+	<gwt:HTMLPanel>
+		<div style="background-color:#EBEBEB; border: 1px solid #BBBBBB;">
+			<div style="float:right;padding-right:20px;">
+				<guvnor:AddButton ui:field="addFieldIcon"></guvnor:AddButton>
+			</div>
+			<div style="clear:both;">
+			</div>
+		</div>
+		<div style="padding-left:40px;">
+			<gwt:VerticalPanel ui:field="fieldsPanel" ></gwt:VerticalPanel>
+		</div>
+	</gwt:HTMLPanel>
+
+</ui:UiBinder>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactMetaModel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactMetaModel.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactMetaModel.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright 2010 JBoss Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,19 +26,27 @@
  *
  * @author Michael Neale
  */
-public class FactMetaModel implements PortableObject {
+public class FactMetaModel
+    implements
+    PortableObject {
 
-	public String name;
+    private static final long   serialVersionUID = 510L;
 
-	public List<FieldMetaModel> fields = new ArrayList<FieldMetaModel>();
+    public String               name;
 
-	public FactMetaModel() {}
-	public FactMetaModel(String name, List fields) {
-		this.name = name;
-		this.fields = fields;
-	}
+    public List<FieldMetaModel> fields           = new ArrayList<FieldMetaModel>();
 
+    public FactMetaModel() {
+    }
 
+    public FactMetaModel(String name) {
+        this.name = name;
+    }
 
+    public FactMetaModel(String name,
+                         List<FieldMetaModel> fields) {
+        this.name = name;
+        this.fields = fields;
+    }
+
 }
-

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelEditor.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.drools.guvnor.client.factmodel;
+
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.util.AbstractLazyStackPanelHeader;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.logical.shared.CloseEvent;
+import com.google.gwt.event.logical.shared.CloseHandler;
+import com.google.gwt.event.logical.shared.OpenEvent;
+import com.google.gwt.event.logical.shared.OpenHandler;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * 
+ * @author rikkola
+ *
+ */
+public class FactModelEditor extends AbstractLazyStackPanelHeader {
+
+    private static Constants constants = ((Constants) GWT.create( Constants.class ));
+
+    interface FactModelEditorBinder
+        extends
+        UiBinder<Widget, FactModelEditor> {
+    }
+
+    private static FactModelEditorBinder uiBinder           = GWT.create( FactModelEditorBinder.class );
+
+    @UiField
+    Image                                icon;
+    @UiField
+    Label                                titleLabel;
+    @UiField
+    Image                                editIcon;
+    @UiField
+    Image                                moveUpIcon;
+    @UiField
+    Image                                moveDownIcon;
+    @UiField
+    Image                                deleteIcon;
+
+    private ClickHandler                 expandClickHandler = new ClickHandler() {
+
+                                                                public void onClick(ClickEvent event) {
+                                                                    onTitleClicked();
+                                                                }
+                                                            };
+
+    private final FactMetaModel          factMetaModel;
+    private Command                      deleteEvent;
+
+    private Command                      moveUpCommand;
+    private Command                      moveDownCommand;
+
+    private ModelNameHelper              modelNameHelper;
+
+    public void setDeleteEvent(Command deleteEvent) {
+
+        this.deleteEvent = deleteEvent;
+    }
+
+    public FactModelEditor(FactMetaModel factMetaModel) {
+
+        this.factMetaModel = factMetaModel;
+
+        add( uiBinder.createAndBindUi( this ) );
+
+        titleLabel.setText( factMetaModel.name );
+
+        icon.addClickHandler( expandClickHandler );
+        titleLabel.addClickHandler( expandClickHandler );
+
+        setIconImage();
+
+        moveUpIcon.setTitle( constants.MoveUp() );
+        moveDownIcon.setTitle( constants.MoveDown() );
+        deleteIcon.setTitle( constants.RemoveThisFactType() );
+
+        addOpenHandler( new OpenHandler<AbstractLazyStackPanelHeader>() {
+            public void onOpen(OpenEvent<AbstractLazyStackPanelHeader> event) {
+                expanded = true;
+                setIconImage();
+            }
+        } );
+
+        addCloseHandler( new CloseHandler<AbstractLazyStackPanelHeader>() {
+            public void onClose(CloseEvent<AbstractLazyStackPanelHeader> event) {
+                expanded = false;
+                setIconImage();
+            }
+        } );
+    }
+
+    @UiHandler("editIcon")
+    void editIconClick(ClickEvent event) {
+        final FactEditorPopup popup = new FactEditorPopup( factMetaModel,
+                                                           modelNameHelper );
+
+        popup.setOkCommand( new Command() {
+            public void execute() {
+                titleLabel.setText( factMetaModel.name );
+            }
+        } );
+
+        popup.show();
+    }
+
+    @UiHandler("moveUpIcon")
+    void moveUpClick(ClickEvent event) {
+        moveUpCommand.execute();
+    }
+
+    @UiHandler("moveDownIcon")
+    void moveDownClick(ClickEvent event) {
+        moveDownCommand.execute();
+    }
+
+    @UiHandler("deleteIcon")
+    void deleteClick(ClickEvent event) {
+        if ( Window.confirm( constants.AreYouSureYouWantToRemoveThisFact() ) ) {
+            deleteEvent.execute();
+        }
+    }
+
+    public void setModelNameHelper(ModelNameHelper modelNameHelper) {
+        this.modelNameHelper = modelNameHelper;
+    }
+
+    private void setIconImage() {
+        if ( expanded ) {
+            icon.setUrl( "images/collapse.gif" );
+        } else {
+            icon.setUrl( "images/expand.gif" );
+        }
+
+    }
+
+    public void setMoveDownCommand(Command moveDownCommand) {
+        this.moveDownCommand = moveDownCommand;
+    }
+
+    public void setMoveUpCommand(Command moveUpCommand) {
+        this.moveUpCommand = moveUpCommand;
+    }
+
+    public void setUpVisible(boolean visible) {
+        moveUpIcon.setVisible( visible );
+    }
+
+    public void setDownVisible(boolean visible) {
+        moveDownIcon.setVisible( visible );
+    }
+
+    private void onTitleClicked() {
+        if ( expanded ) {
+            CloseEvent.fire( this,
+                             this );
+        } else {
+            OpenEvent.fire( this,
+                            this );
+        }
+    }
+
+    public FactMetaModel getFactModel() {
+        return factMetaModel;
+    }
+
+    public Widget getContent() {
+        return new FactFieldsEditor( factMetaModel.fields,
+                                     modelNameHelper );
+    }
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelEditor.ui.xml
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelEditor.ui.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelEditor.ui.xml	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,48 @@
+<!--
+  Copyright 2010 JBoss Inc
+ 
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+ 
+       http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
+<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
+	xmlns:gwt='urn:import:com.google.gwt.user.client.ui' xmlns:guvnor='urn:import:org.drools.guvnor.client.common'>
+
+	<gwt:HTMLPanel>
+		<div style="float:left;">
+				<gwt:HorizontalPanel >
+					<gwt:Image ui:field="icon" styleName="guvnor-LazyStackPanel-row-header-icon"></gwt:Image>
+					<gwt:Label ui:field="titleLabel" ></gwt:Label>
+				</gwt:HorizontalPanel>
+			</div>
+			<div style="float:right;">
+	  			<table>
+			  			<tr>
+				  			<td width="17px">			
+								<gwt:Image ui:field="editIcon" url="images/edit.gif"></gwt:Image>
+							</td>
+				  			<td width="17px">			
+				  				<gwt:Image ui:field="moveUpIcon" url="images/shuffle_up.gif"></gwt:Image>
+							</td>
+				  			<td width="17px">
+				  				<gwt:Image ui:field="moveDownIcon" url="images/shuffle_down.gif"></gwt:Image>
+							</td>
+				  			<td width="17px">
+				  				<gwt:Image ui:field="deleteIcon" url="images/delete_item_small.gif"></gwt:Image>
+							</td>
+			  			</tr>
+	  			</table>
+			</div>
+			<div style="clear:both;"></div>
+	</gwt:HTMLPanel>
+
+</ui:UiBinder>
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelWidget.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelWidget.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -1,472 +0,0 @@
-/*
- * Copyright 2010 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.drools.guvnor.client.factmodel;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.drools.guvnor.client.common.FormStylePopup;
-import org.drools.guvnor.client.common.ImageButton;
-import org.drools.guvnor.client.common.LoadingPopup;
-import org.drools.guvnor.client.common.SmallLabel;
-import org.drools.guvnor.client.messages.Constants;
-import org.drools.guvnor.client.packages.SuggestionCompletionCache;
-import org.drools.guvnor.client.rpc.RuleAsset;
-import org.drools.guvnor.client.rpc.RuleContentText;
-import org.drools.guvnor.client.ruleeditor.DefaultRuleContentWidget;
-import org.drools.guvnor.client.ruleeditor.RuleViewer;
-import org.drools.guvnor.client.ruleeditor.SaveEventListener;
-import org.drools.guvnor.client.util.Format;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.ChangeListener;
-import com.google.gwt.user.client.ui.ClickListener;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.FlexTable;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.HasHorizontalAlignment;
-import com.google.gwt.user.client.ui.HasVerticalAlignment;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.KeyboardListener;
-import com.google.gwt.user.client.ui.ListBox;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
-import com.gwtext.client.widgets.form.FormPanel;
-
-/**
- * The editor for fact models (drl declared types).
- *
- * @author Michael Neale
- */
-public class FactModelWidget extends Composite
-    implements
-    SaveEventListener {
-
-    private RuleAsset                  asset;
-    private VerticalPanel              layout;
-    private int                        editingFact       = -1;
-    private static Constants           constants         = ((Constants) GWT.create( Constants.class ));
-    private static Map<String, String> TYPE_DESCRIPTIONS = new HashMap<String, String>() {
-                                                             private static final long serialVersionUID = 510l;
-                                                             {
-                                                                 put( "Integer",
-                                                                      constants.WholeNumberInteger() );
-                                                                 put( "Boolean",
-                                                                      constants.TrueOrFalse() );
-                                                                 put( "java.util.Date",
-                                                                      constants.Date() );
-                                                                 put( "java.math.BigDecimal",
-                                                                      constants.DecimalNumber() );
-                                                                 put( "String",
-                                                                      constants.Text() );
-
-                                                             }
-                                                         };
-
-    public FactModelWidget(RuleAsset asset,
-                           RuleViewer viewer) {
-        this( asset );
-    }
-
-    public FactModelWidget(final RuleAsset asset) {
-        this.asset = asset;
-        this.layout = new VerticalPanel();
-
-        if ( asset.content instanceof RuleContentText ) {
-            layout.add( new DefaultRuleContentWidget( asset ) );
-        } else {
-            //loadTestData(asset);
-            if ( asset.content == null ) {
-                asset.content = new FactModels();
-            }
-            renderEditor();
-        }
-
-        layout.setWidth( "100%" );
-        initWidget( layout );
-        setStyleName( "model-builder-Background" ); //NON-NLS
-    }
-
-    private void renderEditor() {
-        layout.clear();
-        final FactModels m = (FactModels) asset.content;
-
-        String factHeaderStyle = "modeller-fact-TypeHeader"; //NON-NLS
-        for ( int i = 0; i < m.models.size(); i++ ) {
-
-            final FactMetaModel mm = (FactMetaModel) m.models.get( i );
-
-            FormPanel config = new FormPanel();
-            config.setTitle( mm.name );
-            config.setCollapsible( true );
-            config.setCollapsed( !(editingFact == i) );
-
-            FlexTable tb = new FlexTable();
-            config.add( tb );
-            tb.setStyleName( "modeller-fact-pattern-Widget" ); //NON-NLS
-            tb.setWidth( "100%" );
-            //layout.add(tb);
-            layout.add( config );
-
-            final HorizontalPanel headerPanel = new HorizontalPanel();
-            //headerPanel.add(new HTML("<b><small>" + mm.name + "</small></b>"));
-
-            headerPanel.setVerticalAlignment( HasVerticalAlignment.ALIGN_MIDDLE );
-            headerPanel.add( getMovePanel( m.models,
-                                           mm,
-                                           m.models.indexOf( mm ) ) );
-
-            //ImageButton addField = new ImageButton("images/add_field_to_fact.gif");
-            Button addField = new Button( constants.AddField() );
-            addField.addClickListener( new ClickListener() {
-                public void onClick(Widget arg0) {
-                    showFieldEditor( m,
-                                     mm,
-                                     null );
-                }
-            } );
-            headerPanel.add( addField );
-
-            Button changeName = new Button( constants.ChangeFactName() );
-            changeName.addClickListener( new ClickListener() {
-                public void onClick(Widget arg0) {
-                    final FormStylePopup pop = new FormStylePopup();
-                    HorizontalPanel changeName = new HorizontalPanel();
-                    final TextBox name = new TextBox();
-                    name.setText( mm.name );
-                    changeName.add( name );
-                    Button nameBut = new Button( constants.ChangeName() );
-
-                    nameBut.addKeyboardListener( noSpaceListener() );
-
-                    nameBut.addClickListener( new ClickListener() {
-                        public void onClick(Widget w) {
-                            if ( !uniqueName( name.getText(),
-                                              m.models ) ) {
-                                Window.alert( Format.format( constants.NameTakenForModel(),
-                                                             name.getText() ) );
-                                return;
-                            }
-                            if ( Window.confirm( constants.ModelNameChangeWarning() ) ) {
-                                mm.name = name.getText();
-                                pop.hide();
-                                renderEditor();
-                            }
-                        }
-                    } );
-                    changeName.add( nameBut );
-                    pop.addAttribute( constants.ChangeFactName(),
-                                      changeName );
-
-                    pop.show();
-                }
-            } );
-            headerPanel.add( changeName );
-
-            Button deleteFact = new Button( constants.Delete() );
-            deleteFact.addClickListener( new ClickListener() {
-                public void onClick(Widget arg0) {
-                    final FormStylePopup pop = new FormStylePopup();
-
-                    Button delFact = new Button( constants.Delete() );
-                    delFact.addClickListener( new ClickListener() {
-                        public void onClick(Widget w) {
-                            if ( Window.confirm( constants.AreYouSureYouWantToRemoveThisFact() ) ) {
-                                m.models.remove( mm );
-                                pop.hide();
-                                renderEditor();
-                            }
-                        }
-                    } );
-                    pop.addAttribute( constants.RemoveThisFactType(),
-                                      delFact );
-
-                    pop.show();
-                }
-            } );
-            headerPanel.add( deleteFact );
-
-            tb.setWidget( 0,
-                          0,
-                          new VerticalPanel() {
-                              {
-                                  add( headerPanel );
-                                  setStyleName( "fact-model-fact-edit-selections" );
-                                  setWidth( "100%" );
-                              }
-                          } );
-            FlexCellFormatter formatter = tb.getFlexCellFormatter();
-            formatter.setColSpan( 0,
-                                  0,
-                                  2 );
-            formatter.setStyleName( 0,
-                                    0,
-                                    factHeaderStyle );
-            formatter.setHorizontalAlignment( 0,
-                                              0,
-                                              HasHorizontalAlignment.ALIGN_LEFT );
-
-            for ( int j = 0; j < mm.fields.size(); j++ ) {
-                final FieldMetaModel fm = (FieldMetaModel) mm.fields.get( j );
-                String ms = Format.format( constants.FieldName(),
-                                           fm.name );
-                tb.setWidget( j + 1,
-                              0,
-                              new HTML( ms ) );
-                formatter.setHorizontalAlignment( j + 1,
-                                                  0,
-                                                  HasHorizontalAlignment.ALIGN_RIGHT );
-
-                HorizontalPanel type = new HorizontalPanel();
-                type.setVerticalAlignment( HasVerticalAlignment.ALIGN_MIDDLE );
-                type.add( new SmallLabel( getDesc( fm ) ) );
-                ImageButton del = new ImageButton( "images/delete_item_small.gif" ); //NON-NLS
-                del.addClickListener( new ClickListener() {
-                    public void onClick(Widget w) {
-                        if ( Window.confirm( Format.format( constants.AreYouSureYouWantToRemoveTheField0(),
-                                                            fm.name ) ) ) {
-                            mm.fields.remove( fm );
-                            editingFact = m.models.indexOf( mm );
-                            renderEditor();
-                        }
-                    }
-                } );
-
-                ImageButton edit = new ImageButton( "images/edit.gif" ); //NON-NLS
-                edit.addClickListener( new ClickListener() {
-                    public void onClick(Widget arg0) {
-                        showFieldEditor( m,
-                                         mm,
-                                         fm );
-                    }
-                } );
-
-                type.add( edit );
-                type.add( del );
-
-                tb.setWidget( j + 1,
-                              1,
-                              type );
-                formatter.setHorizontalAlignment( j + 1,
-                                                  1,
-                                                  HasHorizontalAlignment.ALIGN_LEFT );
-            }
-
-        }
-        final Button addNewFact = new Button( constants.AddNewFactType() );
-        addNewFact.addClickListener( new ClickListener() {
-            public void onClick(Widget w) {
-                String type = Window.prompt( constants.NewType(),
-                                             constants.EnterNewTypeName() );
-                if ( type != null ) {
-                    if ( uniqueName( type,
-                                     m.models ) ) {
-                        m.models.add( new FactMetaModel( type,
-                                                         new ArrayList() ) );
-                        editingFact = m.models.size() - 1;
-                        renderEditor();
-                    } else {
-                        Window.alert( Format.format( constants.TypeNameExistsWarning(),
-                                                     type ) );
-                        addNewFact.click();
-                    }
-                }
-            }
-        } );
-        layout.add( addNewFact );
-
-    }
-
-    private VerticalPanel getMovePanel(final List< ? extends Object> list,
-                                       final Object object,
-                                       final int editingFactIndex) {
-        final int index = list.indexOf( object );
-        VerticalPanel arrows = new VerticalPanel();
-        ImageButton up = new ImageButton( "images/arrow-up.gif",
-                                          constants.MoveUp() );
-        // Topmost item can not be moved up. So hide the button.
-        up.setVisible( index != 0 );
-        up.addClickListener( new ClickListener() {
-            public void onClick(Widget arg0) {
-                Collections.swap( list,
-                                  index,
-                                  index - 1 );
-
-                if ( object instanceof FactMetaModel ) {
-                    editingFact = index - 1;
-                } else {
-                    editingFact = editingFactIndex;
-                }
-
-                renderEditor();
-            }
-        } );
-        arrows.add( up );
-
-        ImageButton down = new ImageButton( "images/arrow-down.gif",
-                                            constants.MoveDown() );
-        // Last item can not be moved down. So hide the button.
-        down.setVisible( index != (list.size() - 1) );
-        down.addClickListener( new ClickListener() {
-            public void onClick(Widget arg0) {
-                Collections.swap( list,
-                                  index,
-                                  index + 1 );
-
-                if ( object instanceof FactMetaModel ) {
-                    editingFact = index + 1;
-                } else {
-                    editingFact = editingFactIndex;
-                }
-
-                renderEditor();
-            }
-        } );
-        arrows.add( down );
-        return arrows;
-    }
-
-    private boolean uniqueName(String type,
-                               List<FactMetaModel> models) {
-        for ( FactMetaModel m : models ) {
-            if ( m.name.equals( type ) ) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private String getDesc(FieldMetaModel fm) {
-        if ( TYPE_DESCRIPTIONS.containsKey( fm.type ) ) {
-            return TYPE_DESCRIPTIONS.get( fm.type );
-        }
-        return fm.type;
-    }
-
-    /**
-     * Display the field editor.
-     */
-    private void showFieldEditor(final FactModels models,
-                                 final FactMetaModel mm,
-                                 final FieldMetaModel field) {
-        final FormStylePopup pop = new FormStylePopup();
-        final TextBox fieldName = new TextBox();
-        final TextBox fieldType = new TextBox();
-        fieldName.addKeyboardListener( noSpaceListener() );
-        fieldType.addKeyboardListener( noSpaceListener() );
-        if ( field != null ) {
-            fieldName.setText( field.name );
-            fieldType.setText( field.type );
-        }
-        HorizontalPanel typeP = new HorizontalPanel();
-        typeP.add( fieldType );
-        final ListBox typeChoice = new ListBox();
-        typeChoice.addItem( constants.chooseType() );
-
-        for ( String k : TYPE_DESCRIPTIONS.keySet() ) {
-            typeChoice.addItem( TYPE_DESCRIPTIONS.get( k ),
-                                k );
-        }
-
-        int idx = models.models.indexOf( mm );
-        for ( int i = 0; i < idx; i++ ) {
-            FactMetaModel mm_ = (FactMetaModel) models.models.get( i );
-            typeChoice.addItem( mm_.name );
-        }
-        typeChoice.setSelectedIndex( 0 );
-        typeChoice.addChangeListener( new ChangeListener() {
-            public void onChange(Widget w) {
-                fieldType.setText( typeChoice.getValue( typeChoice.getSelectedIndex() ) );
-            }
-        } );
-
-        typeP.add( typeChoice );
-
-        pop.addAttribute( constants.FieldNameAttribute(),
-                          fieldName );
-        pop.addAttribute( constants.Type(),
-                          typeP );
-
-        Button ok = new Button( constants.OK() );
-        ok.addClickListener( new ClickListener() {
-            public void onClick(Widget arg0) {
-                FieldMetaModel fld = field;
-                if ( field == null ) {
-                    fld = new FieldMetaModel();
-                    mm.fields.add( fld );
-                }
-                fld.name = fieldName.getText();
-                fld.type = fieldType.getText();
-                editingFact = models.models.indexOf( mm );
-                renderEditor();
-                pop.hide();
-            }
-        } );
-        pop.addAttribute( "",
-                          ok );
-
-        pop.show();
-    }
-
-    private KeyboardListener noSpaceListener() {
-        return new KeyboardListener() {
-            public void onKeyDown(Widget arg0,
-                                  char arg1,
-                                  int arg2) {
-            }
-
-            public void onKeyPress(Widget w,
-                                   char c,
-                                   int i) {
-                if ( c == ' ' ) {
-                    ((TextBox) w).cancelKey();
-                }
-            }
-
-            public void onKeyUp(Widget arg0,
-                                char arg1,
-                                int arg2) {
-
-            }
-
-        };
-    }
-
-    public void onAfterSave() {
-        LoadingPopup.showMessage( constants.RefreshingModel() );
-        SuggestionCompletionCache.getInstance().loadPackage( this.asset.metaData.packageName,
-                                                             new Command() {
-                                                                 public void execute() {
-                                                                     LoadingPopup.close();
-                                                                 }
-                                                             } );
-    }
-
-    public void onSave() {
-        //not needed.
-
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModels.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModels.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModels.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright 2010 JBoss Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,15 +16,22 @@
 
 package org.drools.guvnor.client.factmodel;
 
-import org.drools.ide.common.client.modeldriven.brl.PortableObject;
-
 import java.util.ArrayList;
 import java.util.List;
-import java.io.Serializable;
 
-public class FactModels implements PortableObject {
+import org.drools.ide.common.client.modeldriven.brl.PortableObject;
 
-	public List<FactMetaModel> models = new ArrayList<FactMetaModel>();
+/**
+ * 
+ * @author rikkola
+ *
+ */
+public class FactModels
+    implements
+    PortableObject {
 
+    private static final long  serialVersionUID = 510L;
 
+    public List<FactMetaModel> models           = new ArrayList<FactMetaModel>();
+
 }

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsEditor.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.drools.guvnor.client.factmodel;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.util.AbstractLazyStackPanelHeader;
+import org.drools.guvnor.client.util.AddButton;
+import org.drools.guvnor.client.util.LazyStackPanel;
+import org.drools.guvnor.client.util.LoadContentCommand;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * 
+ * @author rikkola
+ *
+ */
+public class FactModelsEditor extends Composite {
+
+    private static Constants constants = ((Constants) GWT.create( Constants.class ));
+
+    interface FactModelsEditorBinder
+        extends
+        UiBinder<Widget, FactModelsEditor> {
+    }
+
+    private static FactModelsEditorBinder uiBinder        = GWT.create( FactModelsEditorBinder.class );
+
+    @UiField
+    LazyStackPanel                        factModelsPanel;
+
+    @UiField
+    AddButton                             addFactIcon;
+
+    private final List<FactMetaModel>     factModels;
+
+    private final ModelNameHelper         modelNameHelper = new ModelNameHelper();
+
+    public FactModelsEditor(List<FactMetaModel> factModels) {
+        this.factModels = factModels;
+
+        initWidget( uiBinder.createAndBindUi( this ) );
+
+        addFactIcon.setTitle( constants.AddNewFactType() );
+        addFactIcon.setText( constants.AddNewFactType() );
+
+        fillModels();
+    }
+
+    public void addFactModelToStackPanel(final FactMetaModel factMetaModel) {
+        final FactModelEditor editor = new FactModelEditor( factMetaModel );
+
+        modelNameHelper.getTypeDescriptions().put( factMetaModel.name,
+                                                   factMetaModel.name );
+
+        editor.setModelNameHelper( modelNameHelper );
+
+        editor.setMoveDownCommand( getMoveDownCommand( factMetaModel ) );
+
+        editor.setMoveUpCommand( getMoveUpCommand( factMetaModel ) );
+
+        editor.setDeleteEvent( getDeleteCommand( factMetaModel ) );
+
+        factModelsPanel.add( editor,
+                             new LoadContentCommand() {
+                                 public Widget load() {
+                                     return editor.getContent();
+                                 }
+                             } );
+
+        renderEditorArrows();
+    }
+
+    private Command getDeleteCommand(final FactMetaModel factMetaModel) {
+        return new Command() {
+            public void execute() {
+                int index = factModels.indexOf( factMetaModel );
+
+                modelNameHelper.getTypeDescriptions().remove( factMetaModel.name );
+                factModels.remove( factMetaModel );
+                factModelsPanel.remove( index );
+            }
+        };
+    }
+
+    private Command getMoveUpCommand(final FactMetaModel factMetaModel) {
+        return new Command() {
+
+            public void execute() {
+                int editingFactIndex = factModels.indexOf( factMetaModel );
+                int newIndex = editingFactIndex - 1;
+
+                swap( editingFactIndex,
+                      newIndex );
+
+                renderEditorArrows();
+            }
+
+        };
+    }
+
+    private Command getMoveDownCommand(final FactMetaModel factMetaModel) {
+        return new Command() {
+
+            public void execute() {
+                int editingFactIndex = factModels.indexOf( factMetaModel );
+                int newIndex = editingFactIndex + 1;
+
+                swap( editingFactIndex,
+                      newIndex );
+
+                renderEditorArrows();
+            }
+        };
+    }
+
+    private void swap(int editingFactIndex,
+                      int newIndex) {
+        Collections.swap( factModels,
+                          editingFactIndex,
+                          newIndex );
+
+        factModelsPanel.swap( editingFactIndex,
+                              newIndex );
+    }
+
+    private void renderEditorArrows() {
+        Iterator<AbstractLazyStackPanelHeader> iterator = factModelsPanel.getHeaderIterator();
+
+        while ( iterator.hasNext() ) {
+            AbstractLazyStackPanelHeader widget = (AbstractLazyStackPanelHeader) iterator.next();
+
+            if ( widget instanceof FactModelEditor ) {
+                FactModelEditor editor = (FactModelEditor) widget;
+
+                int index = factModels.indexOf( editor.getFactModel() );
+                editor.setUpVisible( index != 0 );
+                editor.setDownVisible( index != (factModels.size() - 1) );
+            }
+        }
+    }
+
+    private void fillModels() {
+        for ( final FactMetaModel factMetaModel : factModels ) {
+            addFactModelToStackPanel( factMetaModel );
+        }
+    }
+
+    @UiHandler("addFactIcon")
+    void addFactClick(ClickEvent event) {
+        final FactEditorPopup popup = new FactEditorPopup( modelNameHelper );
+
+        popup.setOkCommand( new Command() {
+            public void execute() {
+                FactMetaModel factMetaModel = popup.getFactModel();
+
+                factModels.add( factMetaModel );
+                addFactModelToStackPanel( factMetaModel );
+            }
+        } );
+        popup.show();
+    }
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsEditor.ui.xml
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsEditor.ui.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsEditor.ui.xml	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,25 @@
+<!--
+  Copyright 2010 JBoss Inc
+ 
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+ 
+       http://www.apache.org/licenses/LICENSE-2.0
+ 
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ -->
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
+<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
+	xmlns:gwt='urn:import:com.google.gwt.user.client.ui' xmlns:guvnor='urn:import:org.drools.guvnor.client.util'>
+
+	<gwt:HTMLPanel>
+		<guvnor:AddButton ui:field="addFactIcon" ></guvnor:AddButton>
+		<guvnor:LazyStackPanel ui:field="factModelsPanel"></guvnor:LazyStackPanel>
+	</gwt:HTMLPanel>
+
+</ui:UiBinder>
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsWidget.java (from rev 35400, labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelWidget.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FactModelsWidget.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.guvnor.client.factmodel;
+
+import org.drools.guvnor.client.common.LoadingPopup;
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.packages.SuggestionCompletionCache;
+import org.drools.guvnor.client.rpc.RuleAsset;
+import org.drools.guvnor.client.rpc.RuleContentText;
+import org.drools.guvnor.client.ruleeditor.DefaultRuleContentWidget;
+import org.drools.guvnor.client.ruleeditor.RuleViewer;
+import org.drools.guvnor.client.ruleeditor.SaveEventListener;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * The editor for fact models (DRL declared types).
+ *
+ * @author Michael Neale
+ */
+public class FactModelsWidget extends Composite
+    implements
+    SaveEventListener {
+
+    private RuleAsset        asset;
+    private static Constants constants = ((Constants) GWT.create( Constants.class ));
+
+    public FactModelsWidget(RuleAsset asset,
+                           RuleViewer viewer) {
+        this( asset );
+    }
+
+    public FactModelsWidget(final RuleAsset asset) {
+        this.asset = asset;
+
+        if ( isContentPlainText() ) {
+            initWidget( getPlainTextEditor() );
+        } else {
+            initWidget( getFactModelsEditor() );
+        }
+
+        setWidth( "100%" );
+
+        setStyleName( "model-builder-Background" ); //NON-NLS
+    }
+
+    private boolean isContentPlainText() {
+        return asset.content instanceof RuleContentText;
+    }
+
+    private Widget getPlainTextEditor() {
+        return new DefaultRuleContentWidget( asset );
+    }
+
+    private Widget getFactModelsEditor() {
+        if ( asset.content == null ) {
+            asset.content = new FactModels();
+        }
+
+        return new FactModelsEditor( ((FactModels) asset.content).models );
+
+    }
+
+    public void onAfterSave() {
+        LoadingPopup.showMessage( constants.RefreshingModel() );
+        SuggestionCompletionCache.getInstance().loadPackage( this.asset.metaData.packageName,
+                                                             new Command() {
+                                                                 public void execute() {
+                                                                     LoadingPopup.close();
+                                                                 }
+                                                             } );
+    }
+
+    public void onSave() {
+        //not needed.
+
+    }
+
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FieldEditorPopup.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FieldEditorPopup.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FieldEditorPopup.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.drools.guvnor.client.factmodel;
+
+import java.util.Map;
+
+import org.drools.guvnor.client.common.FormStylePopup;
+import org.drools.guvnor.client.messages.Constants;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ChangeEvent;
+import com.google.gwt.event.dom.client.ChangeHandler;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.TextBox;
+
+/**
+ * 
+ * @author rikkola
+ *
+ */
+public class FieldEditorPopup {
+
+    private static Constants      constants = ((Constants) GWT.create( Constants.class ));
+
+    private final FieldMetaModel  field;
+
+    private final ModelNameHelper modelNameHelper;
+
+    private Command               okCommand;
+
+    public FieldEditorPopup(ModelNameHelper modelNameHelper) {
+        this( new FieldMetaModel(),
+              modelNameHelper );
+    }
+
+    public FieldEditorPopup(FieldMetaModel field,
+                            ModelNameHelper modelNameHelper) {
+        this.field = field;
+        this.modelNameHelper = modelNameHelper;
+    }
+
+    public FieldMetaModel getField() {
+        return field;
+    }
+
+    public void setOkCommand(Command okCommand) {
+        this.okCommand = okCommand;
+    }
+
+    public void show() {
+        final FormStylePopup pop = new FormStylePopup();
+        final TextBox fieldName = new TextBox();
+        final TextBox fieldType = new TextBox();
+        fieldName.addKeyPressHandler( new NoSpaceKeyPressHandler() );
+        fieldType.addKeyPressHandler( new NoSpaceKeyPressHandler() );
+        if ( field != null ) {
+            fieldName.setText( field.name );
+            fieldType.setText( field.type );
+        }
+        HorizontalPanel typeP = new HorizontalPanel();
+        typeP.add( fieldType );
+        final ListBox typeChoice = new ListBox();
+        typeChoice.addItem( constants.chooseType() );
+
+        for ( Map.Entry<String, String> entry : modelNameHelper.getTypeDescriptions().entrySet() ) {
+            typeChoice.addItem( entry.getValue(),
+                                entry.getKey() );
+        }
+
+        typeChoice.setSelectedIndex( 0 );
+        typeChoice.addChangeHandler( new ChangeHandler() {
+            public void onChange(ChangeEvent event) {
+                fieldType.setText( typeChoice.getValue( typeChoice.getSelectedIndex() ) );
+            }
+        } );
+
+        typeP.add( typeChoice );
+
+        pop.addAttribute( constants.FieldNameAttribute(),
+                          fieldName );
+        pop.addAttribute( constants.Type(),
+                          typeP );
+
+        Button ok = new Button( constants.OK() );
+        ok.addClickHandler( new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+
+                field.name = fieldName.getText();
+                field.type = fieldType.getText();
+
+                okCommand.execute();
+
+                pop.hide();
+            }
+        } );
+        pop.addAttribute( "",
+                          ok );
+
+        pop.show();
+    }
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FieldMetaModel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FieldMetaModel.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/FieldMetaModel.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright 2010 JBoss Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,20 +13,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.drools.guvnor.client.factmodel;
 
 import org.drools.ide.common.client.modeldriven.brl.PortableObject;
 
-public class FieldMetaModel implements PortableObject {
+public class FieldMetaModel
+    implements
+    PortableObject {
 
-	public String name;
-	public String type;
+    private static final long serialVersionUID = 510l;
+    public String             name;
+    public String             type;
 
-	public FieldMetaModel() {}
-	public FieldMetaModel(String name, String type) {
-		this.name = name;
-		this.type = type;
-	}
+    public FieldMetaModel() {
+    }
 
+    public FieldMetaModel(String name,
+                          String type) {
+        this.name = name;
+        this.type = type;
+    }
+
 }

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/ModelNameHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/ModelNameHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/ModelNameHelper.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.drools.guvnor.client.factmodel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.guvnor.client.messages.Constants;
+
+import com.google.gwt.core.client.GWT;
+
+/**
+ * 
+ * @author rikkola
+ *
+ */
+public class ModelNameHelper {
+
+    private static Constants           constants         = ((Constants) GWT.create( Constants.class ));
+
+    private static Map<String, String> TYPE_DESCRIPTIONS = new HashMap<String, String>() {
+                                                             private static final long serialVersionUID = 510l;
+                                                             {
+                                                                 put( "Integer",
+                                                                      constants.WholeNumberInteger() );
+                                                                 put( "Boolean",
+                                                                      constants.TrueOrFalse() );
+                                                                 put( "java.util.Date",
+                                                                      constants.Date() );
+                                                                 put( "java.math.BigDecimal",
+                                                                      constants.DecimalNumber() );
+                                                                 put( "String",
+                                                                      constants.Text() );
+
+                                                             }
+                                                         };
+
+    public String getDesc(FieldMetaModel fieldMetaModel) {
+        if ( TYPE_DESCRIPTIONS.containsKey( fieldMetaModel.type ) ) {
+            return TYPE_DESCRIPTIONS.get( fieldMetaModel.type );
+        }
+        return fieldMetaModel.type;
+    }
+
+    public Map<String, String> getTypeDescriptions() {
+        return TYPE_DESCRIPTIONS;
+    }
+
+    public boolean isUniqueName(String type) {
+        if ( getTypeDescriptions().containsKey( type ) ) {
+            return false;
+        }
+        return true;
+    }
+
+    public void changeNameInModelNameHelper(String oldName,
+                                            String newName) {
+        getTypeDescriptions().remove( oldName );
+        getTypeDescriptions().put( newName,
+                                   newName );
+    }
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/NoSpaceKeyPressHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/NoSpaceKeyPressHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/factmodel/NoSpaceKeyPressHandler.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.drools.guvnor.client.factmodel;
+
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.user.client.ui.TextBox;
+
+/**
+ * 
+ * @author rikkola
+ *
+ */
+public class NoSpaceKeyPressHandler
+    implements
+    KeyPressHandler {
+
+    public void onKeyPress(KeyPressEvent event) {
+        if ( isTheCharacterSpace( event ) ) {
+            ((TextBox) event.getSource()).cancelKey();
+        }
+    }
+
+    private boolean isTheCharacterSpace(KeyPressEvent event) {
+        return event.getCharCode() == ' ';
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/EditorLauncher.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/EditorLauncher.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/EditorLauncher.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -42,7 +42,7 @@
 import org.drools.guvnor.client.decisiontable.DecisionTableXLSWidget;
 import org.drools.guvnor.client.decisiontable.GuidedDecisionTableWidget;
 import org.drools.guvnor.client.explorer.Preferences;
-import org.drools.guvnor.client.factmodel.FactModelWidget;
+import org.drools.guvnor.client.factmodel.FactModelsWidget;
 import org.drools.guvnor.client.modeldriven.ui.RuleModeller;
 import org.drools.guvnor.client.modeldriven.ui.RuleModellerWidgetFactory;
 import org.drools.guvnor.client.packages.ModelAttachmentFileWidget;
@@ -119,7 +119,7 @@
         } else if ( asset.metaData.format.equals( AssetFormats.DECISION_TABLE_GUIDED ) ) {
             return new GuidedDecisionTableWidget( asset );
         } else if ( asset.metaData.format.equals( AssetFormats.DRL_MODEL ) ) {
-            return new FactModelWidget( asset );
+            return new FactModelsWidget( asset );
         } else if ( asset.metaData.format.equals( AssetFormats.DSL ) ) {
             return new DefaultRuleContentWidget( asset );
         } else if ( asset.metaData.format.equals( AssetFormats.PROPERTIES ) ) {

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/AbstractLazyStackPanelHeader.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/AbstractLazyStackPanelHeader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/AbstractLazyStackPanelHeader.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,29 @@
+package org.drools.guvnor.client.util;
+
+import com.google.gwt.event.logical.shared.CloseEvent;
+import com.google.gwt.event.logical.shared.CloseHandler;
+import com.google.gwt.event.logical.shared.HasCloseHandlers;
+import com.google.gwt.event.logical.shared.HasOpenHandlers;
+import com.google.gwt.event.logical.shared.OpenEvent;
+import com.google.gwt.event.logical.shared.OpenHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.user.client.ui.SimplePanel;
+
+public abstract class AbstractLazyStackPanelHeader extends SimplePanel
+    implements
+    HasCloseHandlers<AbstractLazyStackPanelHeader>,
+    HasOpenHandlers<AbstractLazyStackPanelHeader> {
+
+    protected boolean expanded = false;
+
+    public HandlerRegistration addOpenHandler(OpenHandler<AbstractLazyStackPanelHeader> handler) {
+        return addHandler( handler,
+                           OpenEvent.getType() );
+    }
+
+    public HandlerRegistration addCloseHandler(CloseHandler<AbstractLazyStackPanelHeader> handler) {
+        return addHandler( handler,
+                           CloseEvent.getType() );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/AddButton.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/AddButton.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/AddButton.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -0,0 +1,35 @@
+package org.drools.guvnor.client.util;
+
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.HasClickHandlers;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+
+public class AddButton extends Composite
+    implements
+    HasClickHandlers {
+
+    private Image plusButton = new Image( "images/new_item.gif" );
+
+    private Label textLabel  = new Label();
+
+    public AddButton() {
+        HorizontalPanel panel = new HorizontalPanel();
+        panel.add( plusButton );
+        panel.add( textLabel );
+
+        initWidget( panel );
+    }
+
+    public void setText(String text) {
+        textLabel.setText( text );
+    }
+
+    public HandlerRegistration addClickHandler(ClickHandler handler) {
+        textLabel.addClickHandler( handler );
+        return plusButton.addClickHandler( handler );
+    }
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanel.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanel.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -15,14 +15,21 @@
  */
 package org.drools.guvnor.client.util;
 
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.google.gwt.event.logical.shared.CloseHandler;
 import com.google.gwt.event.logical.shared.HasSelectionHandlers;
+import com.google.gwt.event.logical.shared.OpenEvent;
+import com.google.gwt.event.logical.shared.OpenHandler;
 import com.google.gwt.event.logical.shared.SelectionEvent;
 import com.google.gwt.event.logical.shared.SelectionHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.FlexTable;
 import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.Widget;
 
 /**
  * The GWT StackPanel is not working as we want. So doing a custom one.
@@ -30,13 +37,21 @@
  * @author rikkola
  *
  */
-public class LazyStackPanel extends FlexTable
+public class LazyStackPanel extends Composite
     implements
     HasSelectionHandlers<LazyStackPanelRow> {
 
-    private int rowIndex = 0;
+    private FlexTable flexTable = new FlexTable();
 
+    private int       rowIndex  = 0;
+
     public LazyStackPanel() {
+
+        initWidget( flexTable );
+
+        
+        flexTable.setStyleName( "guvnor-lazyStackPanel" );
+        
         addSelectionHandler( new SelectionHandler<LazyStackPanelRow>() {
             public void onSelection(SelectionEvent<LazyStackPanelRow> event) {
                 LazyStackPanelRow row = event.getSelectedItem();
@@ -54,35 +69,47 @@
 
         LazyStackPanelHeader header = new LazyStackPanelHeader( headerText );
 
+        add( header,
+             contentLoad );
+
+    }
+
+    public void add(AbstractLazyStackPanelHeader header,
+                    LoadContentCommand contentLoad) {
         final LazyStackPanelRow row = new LazyStackPanelRow( header,
                                                              contentLoad );
 
-        header.addClickHandler( new ClickHandler() {
-            public void onClick(ClickEvent event) {
+        header.addOpenHandler( new OpenHandler<AbstractLazyStackPanelHeader>() {
+            public void onOpen(OpenEvent<AbstractLazyStackPanelHeader> event) {
                 selectRow( row );
             }
         } );
 
+        header.addCloseHandler( new CloseHandler<AbstractLazyStackPanelHeader>() {
+            public void onClose(com.google.gwt.event.logical.shared.CloseEvent<AbstractLazyStackPanelHeader> event) {
+                selectRow( row );
+            }
+        } );
+
         addHeaderRow( row );
 
         addContentRow( row.getContentPanel() );
-
     }
 
     private void addHeaderRow(final LazyStackPanelRow row) {
-        setWidget( rowIndex,
-                   0,
-                   row );
-        getFlexCellFormatter().setStyleName( rowIndex,
-                                             0,
-                                             "guvnor-LazyStackPanel-row-header" );
+        flexTable.setWidget( rowIndex,
+                             0,
+                             row );
+        flexTable.getFlexCellFormatter().setStyleName( rowIndex,
+                                                       0,
+                                                       "guvnor-LazyStackPanel-row-header" );
         rowIndex++;
     }
 
     private void addContentRow(final SimplePanel panel) {
-        setWidget( rowIndex++,
-                   0,
-                   panel );
+        flexTable.setWidget( rowIndex++,
+                             0,
+                             panel );
     }
 
     private void selectRow(LazyStackPanelRow row) {
@@ -94,4 +121,57 @@
         return addHandler( handler,
                            SelectionEvent.getType() );
     }
+
+    public void swap(int firstIndex,
+                     int secondIndex) {
+
+        // Every list item is made of the header and content row.
+        // So we have twice as many rows.
+        firstIndex = firstIndex * 2;
+        secondIndex = secondIndex * 2;
+
+        Widget firstHeader = flexTable.getWidget( firstIndex,
+                                                  0 );
+        Widget firstContent = flexTable.getWidget( firstIndex + 1,
+                                                   0 );
+        Widget secondHeader = flexTable.getWidget( secondIndex,
+                                                   0 );
+        Widget secondContent = flexTable.getWidget( secondIndex + 1,
+                                                    0 );
+
+        flexTable.setWidget( firstIndex,
+                             0,
+                             secondHeader );
+        flexTable.setWidget( firstIndex + 1,
+                             0,
+                             secondContent );
+        flexTable.setWidget( secondIndex,
+                             0,
+                             firstHeader );
+        flexTable.setWidget( secondIndex + 1,
+                             0,
+                             firstContent );
+    }
+
+    public Iterator<AbstractLazyStackPanelHeader> getHeaderIterator() {
+        List<AbstractLazyStackPanelHeader> result = new ArrayList<AbstractLazyStackPanelHeader>();
+        Iterator<Widget> iterator = flexTable.iterator();
+
+        while ( iterator.hasNext() ) {
+            Widget widget = (Widget) iterator.next();
+            if ( widget instanceof LazyStackPanelRow ) {
+                result.add( ((LazyStackPanelRow) widget).getHeader() );
+            }
+        }
+
+        return result.iterator();
+    }
+
+    public void remove(int index) {
+
+        index = index * 2;
+
+        flexTable.removeRow( index + 1 );
+        flexTable.removeRow( index );
+    }
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanelHeader.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanelHeader.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanelHeader.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -16,10 +16,14 @@
 package org.drools.guvnor.client.util;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.logical.shared.CloseEvent;
+import com.google.gwt.event.logical.shared.CloseHandler;
+import com.google.gwt.event.logical.shared.OpenEvent;
+import com.google.gwt.event.logical.shared.OpenHandler;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
-import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.Image;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.Widget;
@@ -29,14 +33,14 @@
  * @author rikkola
  *
  */
-public class LazyStackPanelHeader extends Composite {
+public class LazyStackPanelHeader extends AbstractLazyStackPanelHeader {
 
     interface LazyStackPanelHeaderBinder
         extends
         UiBinder<Widget, LazyStackPanelHeader> {
     }
 
-    private static LazyStackPanelHeaderBinder uiBinder = GWT.create( LazyStackPanelHeaderBinder.class );
+    private static LazyStackPanelHeaderBinder uiBinder           = GWT.create( LazyStackPanelHeaderBinder.class );
 
     @UiField
     Image                                     icon;
@@ -44,15 +48,55 @@
     @UiField
     Label                                     titleLabel;
 
+    private ClickHandler                      expandClickHandler = new ClickHandler() {
+
+                                                                     public void onClick(ClickEvent event) {
+                                                                         onTitleClicked();
+                                                                     }
+                                                                 };
+
     public LazyStackPanelHeader(String headerText) {
 
-        initWidget( uiBinder.createAndBindUi( this ) );
+        add( uiBinder.createAndBindUi( this ) );
 
         titleLabel.setText( headerText );
+
+        icon.addClickHandler( expandClickHandler );
+        titleLabel.addClickHandler( expandClickHandler );
+
+        setIconImage();
+
+        addOpenHandler( new OpenHandler<AbstractLazyStackPanelHeader>() {
+            public void onOpen(OpenEvent<AbstractLazyStackPanelHeader> event) {
+                expanded = true;
+                setIconImage();
+            }
+        } );
+
+        addCloseHandler( new CloseHandler<AbstractLazyStackPanelHeader>() {
+            public void onClose(CloseEvent<AbstractLazyStackPanelHeader> event) {
+                expanded = false;
+                setIconImage();
+            }
+        } );
     }
 
-    public void addClickHandler(ClickHandler clickHandler) {
-        icon.addClickHandler( clickHandler );
-        titleLabel.addClickHandler( clickHandler );
+    private void setIconImage() {
+        if ( expanded ) {
+            icon.setUrl( "images/collapse.gif" );
+        } else {
+            icon.setUrl( "images/expand.gif" );
+        }
+
     }
+
+    private void onTitleClicked() {
+        if ( expanded ) {
+            CloseEvent.fire( this,
+                             this );
+        } else {
+            OpenEvent.fire( this,
+                            this );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanelRow.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanelRow.java	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/util/LazyStackPanelRow.java	2010-10-11 09:44:34 UTC (rev 35474)
@@ -24,18 +24,20 @@
  * @author rikkola
  *
  */
-class LazyStackPanelRow extends VerticalPanel {
+public class LazyStackPanelRow extends VerticalPanel {
 
-    private final LazyStackPanelHeader header;
-    private final LoadContentCommand   contentLoad;
-    private Widget                     contentWidget = null;
-    private SimplePanel                contentPanel  = new SimplePanel();
+    private final AbstractLazyStackPanelHeader header;
+    private final LoadContentCommand           contentLoad;
+    private Widget                             contentWidget = null;
+    private SimplePanel                        contentPanel  = new SimplePanel();
 
-    private boolean                    expanded;
+    private boolean                            expanded;
 
-    public LazyStackPanelRow(LazyStackPanelHeader titleWidget,
-                         LoadContentCommand contentLoad) {
+    public LazyStackPanelRow(AbstractLazyStackPanelHeader titleWidget,
+                             LoadContentCommand contentLoad) {
 
+        this.setWidth( "100%" );
+
         this.header = titleWidget;
         this.contentLoad = contentLoad;
         init();
@@ -44,12 +46,6 @@
     private void init() {
         clear();
 
-        if ( expanded ) {
-            header.icon.setUrl( "images/collapse.gif" );
-        } else {
-            header.icon.setUrl( "images/expand.gif" );
-        }
-
         add( header );
 
         if ( contentWidget != null ) {
@@ -59,6 +55,10 @@
 
     }
 
+    public AbstractLazyStackPanelHeader getHeader() {
+        return header;
+    }
+
     public SimplePanel getContentPanel() {
         return contentPanel;
     }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/Guvnor.css
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/Guvnor.css	2010-10-08 19:34:47 UTC (rev 35473)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/Guvnor.css	2010-10-11 09:44:34 UTC (rev 35474)
@@ -31,25 +31,31 @@
 }
 
 .my-DisclosurePanel {
+	
 }
+
 .my-DisclosurePanel-open {
+	
 }
+
 .my-DisclosurePanel-closed {
+	
 }
-.my-DisclosurePanel .header,
-.my-DisclosurePanel .header a,
-.my-DisclosurePanel .header td {
-  height:30px;
-  background: white;
-  text-decoration: none;  /* Remove underline from header */
-  color: white; 
-  cursor: pointer;
-  cursor: hand;
+
+.my-DisclosurePanel .header,.my-DisclosurePanel .header a,.my-DisclosurePanel .header td
+	{
+	height: 30px;
+	background: white;
+	text-decoration: none; /* Remove underline from header */
+	color: white;
+	cursor: pointer;
+	cursor: hand;
 }
+
 .my-DisclosurePanel .content {
-  border-left: 3px solid #e3e3e3;
-  padding: 4px 0px 4px 8px;
-  margin-left: 16px;
+	border-left: 3px solid #e3e3e3;
+	padding: 4px 0px 4px 8px;
+	margin-left: 16px;
 }
 
 .VerticalSplitPanel .vsplitter {
@@ -628,4 +634,12 @@
 .guvnor-FormPanel {
 	background-color: #E3E3E3;
 	padding: 2px;
+}
+
+.guvnor-bold-label {
+	font-weight: bold;
+}
+
+.guvnor-lazyStackPanel {
+	border-collapse:collapse;
 }
\ No newline at end of file



More information about the jboss-svn-commits mailing list