[mapguide-commits] r5376 - in sandbox/maestro-3.0: Generated Maestro.Base/Editor Maestro.Editors Maestro.Editors/Fusion Maestro.Editors/Fusion/WidgetEditors Maestro.Editors/Properties Maestro.Editors/Resources MaestroAPITests OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/Expression OSGeo.MapGuide.MaestroAPI/Mapping OSGeo.MapGuide.MaestroAPI/ObjectModels OSGeo.MapGuide.MaestroAPI/Resource/Validation OSGeo.MapGuide.MaestroAPI/Services OSGeo.MapGuide.MaestroAPI.Http OSGeo.MapGuide.MaestroAPI.Native

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Nov 8 09:40:04 EST 2010


Author: jng
Date: 2010-11-08 06:40:03 -0800 (Mon, 08 Nov 2010)
New Revision: 5376

Added:
   sandbox/maestro-3.0/Maestro.Editors/Fusion/
   sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditorFactory.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CenterSelectionWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CenterSelectionWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ClearSelectionCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ClearSelectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/IWidgetEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LinkToViewWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LinkToViewWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/NavigatorWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/NavigatorWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/PanWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/PanWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/RefreshMapWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/RefreshMapWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/SelectionPanelWidgetCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/SelectionPanelWidgetCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.resx
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Resources/gear--arrow.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/gear--exclamation.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/gear--minus.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/gear--pencil.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/gear--plus.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/gear.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/map--minus.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/map--plus.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/question-frame.png
   sandbox/maestro-3.0/MaestroAPITests/App.config
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinitionInfo.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinitionInterfaces.cs
Modified:
   sandbox/maestro-3.0/Generated/ApplicationDefinition-1.0.0.designer.cs
   sandbox/maestro-3.0/Generated/ApplicationDefinitionInfo-1.0.0.designer.cs
   sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs
   sandbox/maestro-3.0/Maestro.Base/Editor/ResourcePreviewEngine.cs
   sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs
   sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
   sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj
   sandbox/maestro-3.0/MaestroAPITests/ResourceTests.cs
   sandbox/maestro-3.0/MaestroAPITests/RuntimeMapTests.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionFeatureReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMap.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMapGroup.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMapLayer.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/MgServerConnectionBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/PlatformConnectionBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ApplicationDefinitionValidator.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFusionService.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IMappingService.cs
Log:
3.0 sandbox changes:
 - Port over Runtime Map API from 2.x. Sadly, I have discovered that runtime maps created with this API are not usable for rendering unless you either know the meters-per-unit value up front or have access to the MgCoordinateSystem API (kinda defeats the purpose doesn't it?). Unit tests have been added to ensure state changes are properly persisted between saves back to the MapGuide Server and that calling Rendering APIs produces the correct images given the correct meters per unit value.
 - Check in a work-in-progress of the Fusion Editor. Nothing works at the moment. The only reason this is part of the submission is because I did the incredibly clever thing of working on two things at once forgetting that a human brain context switch is much worse than an Operating System one. This submission is just to ensure this revision is a buildable "unit"

Modified: sandbox/maestro-3.0/Generated/ApplicationDefinition-1.0.0.designer.cs
===================================================================
--- sandbox/maestro-3.0/Generated/ApplicationDefinition-1.0.0.designer.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/Generated/ApplicationDefinition-1.0.0.designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -5,7 +5,7 @@
 //    <NameSpace>OSGeo.MapGuide.ObjectModels.ApplicationDefinition</NameSpace><Collection>BindingList</Collection><codeType>CSharp</codeType><EnableDataBinding>True</EnableDataBinding><EnableLasyLoading>False</EnableLasyLoading><HidePrivateFieldInIDE>True</HidePrivateFieldInIDE><EnableSummaryComment>True</EnableSummaryComment><IncludeSerializeMethod>True</IncludeSerializeMethod><UseBaseClass>False</UseBaseClass><GenerateCloneMethod>True</GenerateCloneMethod><GenerateDataContracts>False</GenerateDataContracts><CodeBaseTag>Net20</CodeBaseTag><SerializeMethodName>Serialize</SerializeMethodName><DeserializeMethodName>Deserialize</DeserializeMethodName><SaveToFileMethodName>SaveToFile</SaveToFileMethodName><LoadFromFileMethodName>LoadFromFile</LoadFromFileMethodName><GenerateXMLAttributes>True</GenerateXMLAttributes><AutomaticProperties>False</AutomaticProperties><DisableDebug>False</DisableDebug><CustomUsings></CustomUsings><ExcludeIncludedTypes>False</ExcludeIncludedTypes><Enab
 leInitializeFields>False</EnableInitializeFields>
 //  </auto-generated>
 // ------------------------------------------------------------------------------
-namespace OSGeo.MapGuide.ObjectModels.ApplicationDefinition {
+namespace OSGeo.MapGuide.ObjectModels.ApplicationDefinition_1_0_0 {
     using System;
     using System.Diagnostics;
     using System.Xml.Serialization;
@@ -13,8 +13,8 @@
     using System.Xml.Schema;
     using System.ComponentModel;
     using System.IO;
+    using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
     
-    
     [System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.3.0.33572")]
     [System.SerializableAttribute()]
     [System.Diagnostics.DebuggerStepThroughAttribute()]
@@ -1977,20 +1977,6 @@
     
     [System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.3.0.33572")]
     [System.SerializableAttribute()]
-    public enum UiItemFunctionType {
-        
-        /// <remarks/>
-        Separator,
-        
-        /// <remarks/>
-        Widget,
-        
-        /// <remarks/>
-        Flyout,
-    }
-    
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.3.0.33572")]
-    [System.SerializableAttribute()]
     [System.Diagnostics.DebuggerStepThroughAttribute()]
     [System.ComponentModel.DesignerCategoryAttribute("code")]
     [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=true)]

Modified: sandbox/maestro-3.0/Generated/ApplicationDefinitionInfo-1.0.0.designer.cs
===================================================================
--- sandbox/maestro-3.0/Generated/ApplicationDefinitionInfo-1.0.0.designer.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/Generated/ApplicationDefinitionInfo-1.0.0.designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -5,7 +5,7 @@
 //    <NameSpace>OSGeo.MapGuide.ObjectModels.ApplicationDefinition</NameSpace><Collection>BindingList</Collection><codeType>CSharp</codeType><EnableDataBinding>True</EnableDataBinding><EnableLasyLoading>False</EnableLasyLoading><HidePrivateFieldInIDE>True</HidePrivateFieldInIDE><EnableSummaryComment>True</EnableSummaryComment><IncludeSerializeMethod>True</IncludeSerializeMethod><UseBaseClass>False</UseBaseClass><GenerateCloneMethod>True</GenerateCloneMethod><GenerateDataContracts>False</GenerateDataContracts><CodeBaseTag>Net20</CodeBaseTag><SerializeMethodName>Serialize</SerializeMethodName><DeserializeMethodName>Deserialize</DeserializeMethodName><SaveToFileMethodName>SaveToFile</SaveToFileMethodName><LoadFromFileMethodName>LoadFromFile</LoadFromFileMethodName><GenerateXMLAttributes>True</GenerateXMLAttributes><AutomaticProperties>False</AutomaticProperties><DisableDebug>False</DisableDebug><CustomUsings></CustomUsings><ExcludeIncludedTypes>False</ExcludeIncludedTypes><Enab
 leInitializeFields>False</EnableInitializeFields>
 //  </auto-generated>
 // ------------------------------------------------------------------------------
-namespace OSGeo.MapGuide.ObjectModels.ApplicationDefinition {
+namespace OSGeo.MapGuide.ObjectModels.ApplicationDefinition_1_0_0 {
     using System;
     using System.Diagnostics;
     using System.Xml.Serialization;
@@ -13,8 +13,8 @@
     using System.Xml.Schema;
     using System.ComponentModel;
     using System.IO;
+    using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
     
-    
     /// <summary>
     /// Application definition widget info set
     /// </summary>

Modified: sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -316,5 +316,20 @@
             get;
             set;
         }
+
+        public object GetCustomProperty(string name)
+        {
+            return _conn.GetCustomProperty(name);
+        }
+
+        public IService GetService(int serviceType)
+        {
+            return _conn.GetService(serviceType);
+        }
+
+        public int[] SupportedServiceTypes
+        {
+            get { return _conn.Capabilities.SupportedServices; }
+        }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Base/Editor/ResourcePreviewEngine.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Editor/ResourcePreviewEngine.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/Maestro.Base/Editor/ResourcePreviewEngine.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -162,7 +162,7 @@
 
             //Create temp flex layout
             var sessionId = _edSvc.SessionID;
-            var appDef = (ApplicationDefinitionType)res;
+            var appDef = (IApplicationDefinition)res;
             var conn = appDef.CurrentConnection;
             var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".ApplicationDefinition";
             

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,133 @@
+namespace Maestro.Editors.Fusion
+{
+    partial class FlexLayoutSettingsCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.lstTemplates = new System.Windows.Forms.ListView();
+            this.txtTitle = new System.Windows.Forms.TextBox();
+            this.tplImageList = new System.Windows.Forms.ImageList(this.components);
+            this.txtTemplateUrl = new System.Windows.Forms.TextBox();
+            this.contentPanel.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // contentPanel
+            // 
+            this.contentPanel.Controls.Add(this.txtTemplateUrl);
+            this.contentPanel.Controls.Add(this.txtTitle);
+            this.contentPanel.Controls.Add(this.groupBox1);
+            this.contentPanel.Controls.Add(this.label2);
+            this.contentPanel.Controls.Add(this.label1);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(20, 20);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(27, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Title";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(20, 182);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(67, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Template Url";
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.lstTemplates);
+            this.groupBox1.Location = new System.Drawing.Point(14, 43);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(422, 126);
+            this.groupBox1.TabIndex = 2;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Selected Template";
+            // 
+            // lstTemplates
+            // 
+            this.lstTemplates.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lstTemplates.Location = new System.Drawing.Point(3, 16);
+            this.lstTemplates.Name = "lstTemplates";
+            this.lstTemplates.Size = new System.Drawing.Size(416, 107);
+            this.lstTemplates.TabIndex = 0;
+            this.lstTemplates.UseCompatibleStateImageBehavior = false;
+            this.lstTemplates.SelectedIndexChanged += new System.EventHandler(this.lstTemplates_SelectedIndexChanged);
+            // 
+            // txtTitle
+            // 
+            this.txtTitle.Location = new System.Drawing.Point(93, 17);
+            this.txtTitle.Name = "txtTitle";
+            this.txtTitle.Size = new System.Drawing.Size(343, 20);
+            this.txtTitle.TabIndex = 3;
+            // 
+            // tplImageList
+            // 
+            this.tplImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+            this.tplImageList.ImageSize = new System.Drawing.Size(16, 16);
+            this.tplImageList.TransparentColor = System.Drawing.Color.Transparent;
+            // 
+            // txtTemplateUrl
+            // 
+            this.txtTemplateUrl.Location = new System.Drawing.Point(93, 179);
+            this.txtTemplateUrl.Name = "txtTemplateUrl";
+            this.txtTemplateUrl.ReadOnly = true;
+            this.txtTemplateUrl.Size = new System.Drawing.Size(340, 20);
+            this.txtTemplateUrl.TabIndex = 4;
+            // 
+            // FlexLayoutSettingsCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.HeaderText = "Flexible Layout Settings";
+            this.Name = "FlexLayoutSettingsCtrl";
+            this.contentPanel.ResumeLayout(false);
+            this.contentPanel.PerformLayout();
+            this.groupBox1.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TextBox txtTitle;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.ListView lstTemplates;
+        private System.Windows.Forms.ImageList tplImageList;
+        private System.Windows.Forms.TextBox txtTemplateUrl;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,129 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using Maestro.Editors.Common;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using System.Net;
+using Maestro.Shared.UI;
+
+namespace Maestro.Editors.Fusion
+{
+    internal delegate void TemplateChangeEventHandler(IApplicationDefinitionTemplateInfo selectedTemplate);
+
+    /// <summary>
+    /// Editor control for Fusion Flexible Layouts (Application Definitions)
+    /// </summary>
+    public partial class FlexLayoutSettingsCtrl : EditorBindableCollapsiblePanel
+    {
+        public FlexLayoutSettingsCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IFusionService _fsvc;
+        private IApplicationDefinition _flexLayout;
+        private string _baseUrl;
+
+        public override void Bind(IEditorService service)
+        {
+            try
+            {
+                _fsvc = (IFusionService)service.GetService((int)ServiceType.Fusion);
+                _baseUrl = service.GetCustomProperty("BaseUrl").ToString();
+
+                if (!_baseUrl.EndsWith("/"))
+                    _baseUrl += "/";
+            }
+            catch 
+            {
+                throw new NotSupportedException(Properties.Resources.IncompatibleConnection);
+            }
+            service.RegisterCustomNotifier(this);
+            _flexLayout = (IApplicationDefinition)service.GetEditedResource();
+            TextBoxBinder.BindText(txtTemplateUrl, _flexLayout, "TemplateUrl");
+            TextBoxBinder.BindText(txtTitle, _flexLayout, "Title");
+            var templates = _fsvc.GetApplicationTemplates();
+            InitializeTemplateList(templates);
+        }
+
+        private void InitializeTemplateList(IApplicationDefinitionTemplateInfoSet templates)
+        {
+            lstTemplates.Clear();
+            tplImageList.Images.Clear();
+
+            foreach (var tpl in templates.TemplateInfo)
+            {
+                Image img = null;
+                string prevUrl = _baseUrl + tpl.PreviewImageUrl;
+                try
+                {
+                    var req = (HttpWebRequest)HttpWebRequest.Create(prevUrl);
+                    using (var resp = (HttpWebResponse)req.GetResponse())
+                    {
+                        using (var stream = resp.GetResponseStream())
+                        {
+                            img = Image.FromStream(stream);
+                        }
+                    }
+                }
+                catch
+                {
+                    img = Properties.Resources.question;
+                }
+                tplImageList.Images.Add(tpl.PreviewImageUrl, img);
+
+                var item = new ListViewItem();
+                item.Tag = tpl;
+                item.Name = tpl.Name;
+                item.Text = tpl.Name;
+                item.ImageKey = tpl.PreviewImageUrl;
+
+                if (tpl.LocationUrl == _flexLayout.TemplateUrl)
+                    item.Selected = true;
+
+                lstTemplates.Items.Add(item);
+            }
+        }
+
+        internal event TemplateChangeEventHandler TemplateChanged;
+
+        private void lstTemplates_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (lstTemplates.SelectedItems.Count == 1)
+            {
+                var item = lstTemplates.SelectedItems[0];
+                var template = (IApplicationDefinitionTemplateInfo)item.Tag;
+                txtTemplateUrl.Text = template.LocationUrl;
+                var handler = this.TemplateChanged;
+                if (handler != null)
+                {
+                    handler(template);
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexLayoutSettingsCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="tplImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,45 @@
+namespace Maestro.Editors.Fusion
+{
+    partial class FlexibleLayoutEditor
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.SuspendLayout();
+            // 
+            // FlexibleLayoutEditor
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Name = "FlexibleLayoutEditor";
+            this.Size = new System.Drawing.Size(778, 574);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,45 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion
+{
+    public partial class FlexibleLayoutEditor : EditorBase
+    {
+        public FlexibleLayoutEditor()
+        {
+            InitializeComponent();
+        }
+
+        private IApplicationDefinition _flexLayout;
+
+        public override void Bind(IEditorService service)
+        {
+            
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/FlexibleLayoutEditor.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,116 @@
+namespace Maestro.Editors.Fusion
+{
+    partial class MapSettingsCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MapSettingsCtrl));
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.lstMaps = new System.Windows.Forms.ListView();
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.btnAddMap = new System.Windows.Forms.ToolStripButton();
+            this.btnRemoveMap = new System.Windows.Forms.ToolStripButton();
+            this.propertiesPanel = new System.Windows.Forms.Panel();
+            this.contentPanel.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.toolStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // contentPanel
+            // 
+            this.contentPanel.Controls.Add(this.propertiesPanel);
+            this.contentPanel.Controls.Add(this.groupBox1);
+            resources.ApplyResources(this.contentPanel, "contentPanel");
+            // 
+            // groupBox1
+            // 
+            resources.ApplyResources(this.groupBox1, "groupBox1");
+            this.groupBox1.Controls.Add(this.lstMaps);
+            this.groupBox1.Controls.Add(this.toolStrip1);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.TabStop = false;
+            // 
+            // lstMaps
+            // 
+            resources.ApplyResources(this.lstMaps, "lstMaps");
+            this.lstMaps.Name = "lstMaps";
+            this.lstMaps.UseCompatibleStateImageBehavior = false;
+            this.lstMaps.View = System.Windows.Forms.View.List;
+            this.lstMaps.SelectedIndexChanged += new System.EventHandler(this.lstMaps_SelectedIndexChanged);
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnAddMap,
+            this.btnRemoveMap});
+            resources.ApplyResources(this.toolStrip1, "toolStrip1");
+            this.toolStrip1.Name = "toolStrip1";
+            // 
+            // btnAddMap
+            // 
+            this.btnAddMap.Image = global::Maestro.Editors.Properties.Resources.map__plus;
+            resources.ApplyResources(this.btnAddMap, "btnAddMap");
+            this.btnAddMap.Name = "btnAddMap";
+            this.btnAddMap.Click += new System.EventHandler(this.btnAddMap_Click);
+            // 
+            // btnRemoveMap
+            // 
+            resources.ApplyResources(this.btnRemoveMap, "btnRemoveMap");
+            this.btnRemoveMap.Image = global::Maestro.Editors.Properties.Resources.map__minus;
+            this.btnRemoveMap.Name = "btnRemoveMap";
+            this.btnRemoveMap.Click += new System.EventHandler(this.btnRemoveMap_Click);
+            // 
+            // propertiesPanel
+            // 
+            resources.ApplyResources(this.propertiesPanel, "propertiesPanel");
+            this.propertiesPanel.Name = "propertiesPanel";
+            // 
+            // MapSettingsCtrl
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.HeaderText = "Maps";
+            this.Name = "MapSettingsCtrl";
+            this.contentPanel.ResumeLayout(false);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.ListView lstMaps;
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.ToolStripButton btnAddMap;
+        private System.Windows.Forms.ToolStripButton btnRemoveMap;
+        private System.Windows.Forms.Panel propertiesPanel;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,136 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using Maestro.Editors.Common;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using Maestro.Editors.Generic;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+
+namespace Maestro.Editors.Fusion
+{
+    public partial class MapSettingsCtrl : EditorBindableCollapsiblePanel
+    {
+        public MapSettingsCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IEditorService _edsvc;
+        private IFusionService _fsvc;
+        private IApplicationDefinition _flexLayout;
+        private string _baseUrl;
+
+        public override void Bind(IEditorService service)
+        {
+            try
+            {
+                _fsvc = (IFusionService)service.GetService((int)ServiceType.Fusion);
+                _baseUrl = service.GetCustomProperty("BaseUrl").ToString();
+
+                if (!_baseUrl.EndsWith("/"))
+                    _baseUrl += "/";
+            }
+            catch
+            {
+                throw new NotSupportedException(Properties.Resources.IncompatibleConnection);
+            }
+            _edsvc = service;
+            _edsvc.RegisterCustomNotifier(this);
+            _flexLayout = (IApplicationDefinition)service.GetEditedResource();
+            
+        }
+
+        private void AddMap(IMapGroup group)
+        {
+            var item = new ListViewItem();
+            item.ImageIndex = 0;
+            item.Text = item.Name = group.id;
+            item.Tag = group;
+            group.PropertyChanged += (s, e) =>
+            {
+                if (e.PropertyName == "id")
+                    item.Text = group.id;
+            };
+            lstMaps.Items.Add(item);
+        }
+
+        internal IMapGroup SelectedGroup
+        {
+            get
+            {
+                if (lstMaps.SelectedItems.Count == 1)
+                {
+                    var item = lstMaps.SelectedItems[0];
+                    var group = (IMapGroup)item.Tag;
+
+                    return group;
+                }
+                return null;
+            }
+        }
+
+        private void lstMaps_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            
+        }
+
+        private void btnRemoveMap_Click(object sender, EventArgs e)
+        {
+            if (lstMaps.SelectedItems.Count == 1)
+            {
+                var item = lstMaps.SelectedItems[0];
+                var group = (IMapGroup)item.Tag;
+
+                _flexLayout.MapSet.RemoveGroup(group);
+
+                lstMaps.Items.Remove(item);
+            }
+        }
+
+        private void btnAddMap_Click(object sender, EventArgs e)
+        {
+            using (var picker = new ResourcePicker(_edsvc.ResourceService, ResourceTypes.MapDefinition, ResourcePickerMode.OpenResource))
+            {
+                if (picker.ShowDialog() == DialogResult.OK)
+                {
+                    string prefix = ResourceIdentifier.GetName(picker.ResourceID);
+                    int counter = 0;
+                    string name = prefix;
+
+                    while (_flexLayout.MapSet.GetGroupById(name) != null)
+                    {
+                        counter++;
+                        name = prefix + counter;
+                    }
+
+                    _flexLayout.AddMapGroup(name, true, picker.ResourceID);
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/MapSettingsCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,288 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="propertiesPanel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="propertiesPanel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>209, 6</value>
+  </data>
+  <data name="propertiesPanel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>426, 251</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="propertiesPanel.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;propertiesPanel.Name" xml:space="preserve">
+    <value>propertiesPanel</value>
+  </data>
+  <data name="&gt;&gt;propertiesPanel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;propertiesPanel.Parent" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;propertiesPanel.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="groupBox1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left</value>
+  </data>
+  <data name="lstMaps.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="lstMaps.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 41</value>
+  </data>
+  <data name="lstMaps.Size" type="System.Drawing.Size, System.Drawing">
+    <value>194, 210</value>
+  </data>
+  <data name="lstMaps.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;lstMaps.Name" xml:space="preserve">
+    <value>lstMaps</value>
+  </data>
+  <data name="&gt;&gt;lstMaps.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;lstMaps.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;lstMaps.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>3, 16</value>
+  </metadata>
+  <data name="btnAddMap.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
+    <value>Magenta</value>
+  </data>
+  <data name="btnAddMap.Size" type="System.Drawing.Size, System.Drawing">
+    <value>49, 22</value>
+  </data>
+  <data name="btnAddMap.Text" xml:space="preserve">
+    <value>Add</value>
+  </data>
+  <data name="btnRemoveMap.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="btnRemoveMap.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
+    <value>Magenta</value>
+  </data>
+  <data name="btnRemoveMap.Size" type="System.Drawing.Size, System.Drawing">
+    <value>70, 22</value>
+  </data>
+  <data name="btnRemoveMap.Text" xml:space="preserve">
+    <value>Remove</value>
+  </data>
+  <data name="toolStrip1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 16</value>
+  </data>
+  <data name="toolStrip1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>194, 25</value>
+  </data>
+  <data name="toolStrip1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="toolStrip1.Text" xml:space="preserve">
+    <value>toolStrip1</value>
+  </data>
+  <data name="&gt;&gt;toolStrip1.Name" xml:space="preserve">
+    <value>toolStrip1</value>
+  </data>
+  <data name="&gt;&gt;toolStrip1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;toolStrip1.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;toolStrip1.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 6</value>
+  </data>
+  <data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>200, 254</value>
+  </data>
+  <data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="groupBox1.Text" xml:space="preserve">
+    <value>Currently Available Maps</value>
+  </data>
+  <data name="&gt;&gt;groupBox1.Name" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;groupBox1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBox1.Parent" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;groupBox1.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="contentPanel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>638, 263</value>
+  </data>
+  <data name="&gt;&gt;contentPanel.Name" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;contentPanel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;contentPanel.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;contentPanel.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 13</value>
+  </data>
+  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
+    <value>638, 290</value>
+  </data>
+  <data name="&gt;&gt;btnAddMap.Name" xml:space="preserve">
+    <value>btnAddMap</value>
+  </data>
+  <data name="&gt;&gt;btnAddMap.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;btnRemoveMap.Name" xml:space="preserve">
+    <value>btnRemoveMap</value>
+  </data>
+  <data name="&gt;&gt;btnRemoveMap.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>MapSettingsCtrl</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>Maestro.Editors.Common.EditorBindableCollapsiblePanel, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+  </data>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditorFactory.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditorFactory.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditorFactory.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,55 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion
+{
+    using WidgetEditors;
+
+    public static class WidgetEditorFactory
+    {
+        private static Dictionary<string, Type> _editorTypes;
+
+        static WidgetEditorFactory()
+        {
+            _editorTypes = new Dictionary<string, Type>();
+        }
+
+        public static void RegisterEditor(string name, Type type)
+        {
+            if (!typeof(IWidgetEditor).IsAssignableFrom(type))
+                throw new InvalidOperationException(Properties.Resources.NoWidgetEditorIface);
+
+            _editorTypes[name] = type;
+        }
+
+        public static IWidgetEditor GetEditorForWidget(string name)
+        {
+            if (_editorTypes.ContainsKey(name))
+            {
+                return (IWidgetEditor)Activator.CreateInstance(_editorTypes[name]);
+            }
+            return new GenericWidgetCtrl();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,100 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class AboutWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.txtUrl = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(657, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtUrl);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(4, 119);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(650, 57);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "About Widget";
+            // 
+            // txtUrl
+            // 
+            this.txtUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtUrl.Location = new System.Drawing.Point(89, 25);
+            this.txtUrl.Name = "txtUrl";
+            this.txtUrl.Size = new System.Drawing.Size(543, 20);
+            this.txtUrl.TabIndex = 1;
+            this.txtUrl.TextChanged += new System.EventHandler(this.txtUrl_TextChanged);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(17, 28);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(29, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "URL";
+            // 
+            // AboutWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "AboutWidgetCtrl";
+            this.Size = new System.Drawing.Size(657, 179);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TextBox txtUrl;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,57 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class AboutWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public AboutWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+            txtUrl.Text = _widget.GetValue("AboutURL");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void txtUrl_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("AboutURL", txtUrl.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/AboutWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,100 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class ActivityIndicatorWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtElementId = new System.Windows.Forms.TextBox();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(523, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtElementId);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(4, 119);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(516, 73);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Activity Indicator";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(16, 31);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(59, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Element ID";
+            // 
+            // txtElementId
+            // 
+            this.txtElementId.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtElementId.Location = new System.Drawing.Point(92, 28);
+            this.txtElementId.Name = "txtElementId";
+            this.txtElementId.Size = new System.Drawing.Size(405, 20);
+            this.txtElementId.TabIndex = 1;
+            this.txtElementId.TextChanged += new System.EventHandler(this.txtElementId_TextChanged);
+            // 
+            // ActivityIndicatorWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "ActivityIndicatorWidgetCtrl";
+            this.Size = new System.Drawing.Size(523, 195);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TextBox txtElementId;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,57 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class ActivityIndicatorWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public ActivityIndicatorWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+            txtElementId.Text = _widget.GetValue("ElementId");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void txtElementId_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("ElementId", txtElementId.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ActivityIndicatorWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,99 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class BufferPanelWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtTarget = new System.Windows.Forms.TextBox();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(431, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtTarget);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(4, 119);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(424, 96);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Buffer Panel";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(19, 35);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(38, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Target";
+            // 
+            // txtTarget
+            // 
+            this.txtTarget.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtTarget.Location = new System.Drawing.Point(90, 32);
+            this.txtTarget.Name = "txtTarget";
+            this.txtTarget.Size = new System.Drawing.Size(315, 20);
+            this.txtTarget.TabIndex = 1;
+            // 
+            // BufferPanelWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "BufferPanelWidgetCtrl";
+            this.Size = new System.Drawing.Size(431, 218);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TextBox txtTarget;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,73 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using Maestro.Shared.UI;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class BufferPanelWidgetCtrl : UserControl, IWidgetEditor, INotifyPropertyChanged
+    {
+        public BufferPanelWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+
+            TextBoxBinder.BindText(txtTarget, this, "Target");
+        }
+
+        public string Target
+        {
+            get { return _widget.GetValue("Target"); }
+            set 
+            { 
+                _widget.SetValue("Target", value);
+                OnPropertyChanged("Target");
+            }
+        }
+
+        private void OnPropertyChanged(string name)
+        {
+            var handler = this.PropertyChanged;
+            if (handler != null)
+                handler(this, new PropertyChangedEventArgs(name));
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        public event PropertyChangedEventHandler PropertyChanged;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferPanelWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,330 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class BufferWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.txtFillColorInput = new System.Windows.Forms.TextBox();
+            this.txtBorderColorInput = new System.Windows.Forms.TextBox();
+            this.txtBufferUnitsInput = new System.Windows.Forms.TextBox();
+            this.txtBufferDistanceInput = new System.Windows.Forms.TextBox();
+            this.txtBufferDistance = new System.Windows.Forms.TextBox();
+            this.txtLayerNameInput = new System.Windows.Forms.TextBox();
+            this.txtLayerName = new System.Windows.Forms.TextBox();
+            this.cmbBorderColor = new Maestro.Editors.Common.ColorComboBox();
+            this.cmbFillColor = new Maestro.Editors.Common.ColorComboBox();
+            this.label10 = new System.Windows.Forms.Label();
+            this.label9 = new System.Windows.Forms.Label();
+            this.label8 = new System.Windows.Forms.Label();
+            this.label7 = new System.Windows.Forms.Label();
+            this.label6 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtBufferUnits = new System.Windows.Forms.TextBox();
+            this.btnBrowseBufferUnits = new System.Windows.Forms.Button();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(430, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.btnBrowseBufferUnits);
+            this.groupBox1.Controls.Add(this.txtBufferUnits);
+            this.groupBox1.Controls.Add(this.txtFillColorInput);
+            this.groupBox1.Controls.Add(this.txtBorderColorInput);
+            this.groupBox1.Controls.Add(this.txtBufferUnitsInput);
+            this.groupBox1.Controls.Add(this.txtBufferDistanceInput);
+            this.groupBox1.Controls.Add(this.txtBufferDistance);
+            this.groupBox1.Controls.Add(this.txtLayerNameInput);
+            this.groupBox1.Controls.Add(this.txtLayerName);
+            this.groupBox1.Controls.Add(this.cmbBorderColor);
+            this.groupBox1.Controls.Add(this.cmbFillColor);
+            this.groupBox1.Controls.Add(this.label10);
+            this.groupBox1.Controls.Add(this.label9);
+            this.groupBox1.Controls.Add(this.label8);
+            this.groupBox1.Controls.Add(this.label7);
+            this.groupBox1.Controls.Add(this.label6);
+            this.groupBox1.Controls.Add(this.label5);
+            this.groupBox1.Controls.Add(this.label4);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(3, 118);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(424, 303);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Buffer";
+            // 
+            // txtFillColorInput
+            // 
+            this.txtFillColorInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtFillColorInput.Location = new System.Drawing.Point(142, 261);
+            this.txtFillColorInput.Name = "txtFillColorInput";
+            this.txtFillColorInput.Size = new System.Drawing.Size(262, 20);
+            this.txtFillColorInput.TabIndex = 19;
+            // 
+            // txtBorderColorInput
+            // 
+            this.txtBorderColorInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtBorderColorInput.Location = new System.Drawing.Point(142, 208);
+            this.txtBorderColorInput.Name = "txtBorderColorInput";
+            this.txtBorderColorInput.Size = new System.Drawing.Size(262, 20);
+            this.txtBorderColorInput.TabIndex = 18;
+            // 
+            // txtBufferUnitsInput
+            // 
+            this.txtBufferUnitsInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtBufferUnitsInput.Location = new System.Drawing.Point(142, 156);
+            this.txtBufferUnitsInput.Name = "txtBufferUnitsInput";
+            this.txtBufferUnitsInput.Size = new System.Drawing.Size(262, 20);
+            this.txtBufferUnitsInput.TabIndex = 17;
+            // 
+            // txtBufferDistanceInput
+            // 
+            this.txtBufferDistanceInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtBufferDistanceInput.Location = new System.Drawing.Point(142, 104);
+            this.txtBufferDistanceInput.Name = "txtBufferDistanceInput";
+            this.txtBufferDistanceInput.Size = new System.Drawing.Size(262, 20);
+            this.txtBufferDistanceInput.TabIndex = 16;
+            // 
+            // txtBufferDistance
+            // 
+            this.txtBufferDistance.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtBufferDistance.Location = new System.Drawing.Point(142, 77);
+            this.txtBufferDistance.Name = "txtBufferDistance";
+            this.txtBufferDistance.Size = new System.Drawing.Size(262, 20);
+            this.txtBufferDistance.TabIndex = 15;
+            // 
+            // txtLayerNameInput
+            // 
+            this.txtLayerNameInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtLayerNameInput.Location = new System.Drawing.Point(142, 50);
+            this.txtLayerNameInput.Name = "txtLayerNameInput";
+            this.txtLayerNameInput.Size = new System.Drawing.Size(262, 20);
+            this.txtLayerNameInput.TabIndex = 14;
+            // 
+            // txtLayerName
+            // 
+            this.txtLayerName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtLayerName.Location = new System.Drawing.Point(142, 24);
+            this.txtLayerName.Name = "txtLayerName";
+            this.txtLayerName.Size = new System.Drawing.Size(262, 20);
+            this.txtLayerName.TabIndex = 12;
+            // 
+            // cmbBorderColor
+            // 
+            this.cmbBorderColor.FormattingEnabled = true;
+            this.cmbBorderColor.Location = new System.Drawing.Point(142, 182);
+            this.cmbBorderColor.Name = "cmbBorderColor";
+            this.cmbBorderColor.Size = new System.Drawing.Size(109, 21);
+            this.cmbBorderColor.TabIndex = 11;
+            this.cmbBorderColor.SelectedIndexChanged += new System.EventHandler(this.cmbBorderColor_SelectedIndexChanged);
+            // 
+            // cmbFillColor
+            // 
+            this.cmbFillColor.FormattingEnabled = true;
+            this.cmbFillColor.Location = new System.Drawing.Point(142, 234);
+            this.cmbFillColor.Name = "cmbFillColor";
+            this.cmbFillColor.Size = new System.Drawing.Size(109, 21);
+            this.cmbFillColor.TabIndex = 10;
+            this.cmbFillColor.SelectedIndexChanged += new System.EventHandler(this.cmbFillColor_SelectedIndexChanged);
+            // 
+            // label10
+            // 
+            this.label10.AutoSize = true;
+            this.label10.Location = new System.Drawing.Point(16, 264);
+            this.label10.Name = "label10";
+            this.label10.Size = new System.Drawing.Size(73, 13);
+            this.label10.TabIndex = 9;
+            this.label10.Text = "Fill Color Input";
+            // 
+            // label9
+            // 
+            this.label9.AutoSize = true;
+            this.label9.Location = new System.Drawing.Point(16, 237);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(46, 13);
+            this.label9.TabIndex = 8;
+            this.label9.Text = "Fill Color";
+            // 
+            // label8
+            // 
+            this.label8.AutoSize = true;
+            this.label8.Location = new System.Drawing.Point(16, 211);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(92, 13);
+            this.label8.TabIndex = 7;
+            this.label8.Text = "Border Color Input";
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Location = new System.Drawing.Point(16, 185);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(65, 13);
+            this.label7.TabIndex = 6;
+            this.label7.Text = "Border Color";
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(16, 159);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(89, 13);
+            this.label6.TabIndex = 5;
+            this.label6.Text = "Buffer Units Input";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(16, 133);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(62, 13);
+            this.label5.TabIndex = 4;
+            this.label5.Text = "Buffer Units";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(16, 107);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(107, 13);
+            this.label4.TabIndex = 3;
+            this.label4.Text = "Buffer Distance Input";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(16, 80);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(80, 13);
+            this.label3.TabIndex = 2;
+            this.label3.Text = "Buffer Distance";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(16, 53);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(91, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Layer Name Input";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(16, 27);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(64, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Layer Name";
+            // 
+            // txtBufferUnits
+            // 
+            this.txtBufferUnits.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtBufferUnits.Location = new System.Drawing.Point(142, 130);
+            this.txtBufferUnits.Name = "txtBufferUnits";
+            this.txtBufferUnits.ReadOnly = true;
+            this.txtBufferUnits.Size = new System.Drawing.Size(224, 20);
+            this.txtBufferUnits.TabIndex = 20;
+            // 
+            // btnBrowseBufferUnits
+            // 
+            this.btnBrowseBufferUnits.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnBrowseBufferUnits.Location = new System.Drawing.Point(372, 128);
+            this.btnBrowseBufferUnits.Name = "btnBrowseBufferUnits";
+            this.btnBrowseBufferUnits.Size = new System.Drawing.Size(32, 23);
+            this.btnBrowseBufferUnits.TabIndex = 21;
+            this.btnBrowseBufferUnits.Text = "...";
+            this.btnBrowseBufferUnits.UseVisualStyleBackColor = true;
+            this.btnBrowseBufferUnits.Click += new System.EventHandler(this.btnBrowseBufferUnits_Click);
+            // 
+            // BufferWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "BufferWidgetCtrl";
+            this.Size = new System.Drawing.Size(430, 424);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private Maestro.Editors.Common.ColorComboBox cmbFillColor;
+        private System.Windows.Forms.Label label10;
+        private System.Windows.Forms.Label label9;
+        private System.Windows.Forms.Label label8;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtBufferUnitsInput;
+        private System.Windows.Forms.TextBox txtBufferDistanceInput;
+        private System.Windows.Forms.TextBox txtBufferDistance;
+        private System.Windows.Forms.TextBox txtLayerNameInput;
+        private System.Windows.Forms.TextBox txtLayerName;
+        private Maestro.Editors.Common.ColorComboBox cmbBorderColor;
+        private System.Windows.Forms.TextBox txtFillColorInput;
+        private System.Windows.Forms.TextBox txtBorderColorInput;
+        private System.Windows.Forms.TextBox txtBufferUnits;
+        private System.Windows.Forms.Button btnBrowseBufferUnits;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,203 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using System.Globalization;
+using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Shared.UI;
+using Maestro.Editors.Common;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class BufferWidgetCtrl : UserControl, IWidgetEditor, INotifyPropertyChanged
+    {
+        public BufferWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private string[] _units = { "meters", "feet", "miles", "kilometers" };
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+
+            TextBoxBinder.BindText(txtBorderColorInput, this, "BorderColorInput");
+            TextBoxBinder.BindText(txtBufferDistance, this, "BufferDistance");
+            TextBoxBinder.BindText(txtBufferDistanceInput, this, "BufferDistanceInput");
+            TextBoxBinder.BindText(txtBufferUnitsInput, this, "BufferUnitsInput");
+            TextBoxBinder.BindText(txtFillColorInput, this, "FillColorInput");
+            TextBoxBinder.BindText(txtLayerName, this, "LayerName");
+            TextBoxBinder.BindText(txtLayerNameInput, this, "LayerNameInput");
+            TextBoxBinder.BindText(txtBufferUnits, this, "BufferUnits");
+
+            cmbBorderColor.CurrentColor = this.BorderColor;
+            cmbFillColor.CurrentColor = this.FillColor;
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        public string LayerName
+        {
+            get { return _widget.GetValue("LayerName"); }
+            set
+            {
+                _widget.SetValue("LayerName", value);
+                OnPropertyChanged("LayerName");
+            }
+        }
+
+        public string LayerNameInput
+        {
+            get { return _widget.GetValue("LayerNameInput"); }
+            set
+            {
+                _widget.SetValue("LayerNameInput", value);
+                OnPropertyChanged("LayerNameInput");
+            }
+        }
+
+        public double BufferDistance
+        {
+            get
+            {
+                double value;
+                if (double.TryParse(_widget.GetValue("BufferDistance"), out value))
+                    return value;
+                return 100.0;
+            }
+            set
+            {
+                _widget.SetValue("BufferDistance", value.ToString(CultureInfo.InvariantCulture));
+                OnPropertyChanged("BufferDistance");
+            }
+        }
+
+        public string BufferDistanceInput
+        {
+            get { return _widget.GetValue("BufferDistanceInput"); }
+            set
+            {
+                _widget.SetValue("BufferDistanceInput", value);
+                OnPropertyChanged("BufferDistanceInput");
+            }
+        }
+
+        public string BufferUnits
+        {
+            get { return _widget.GetValue("BufferUnits"); }
+            set
+            {
+                _widget.SetValue("BufferUnits", value);
+                OnPropertyChanged("BufferUnits");
+            }
+        }
+
+        public string BufferUnitsInput
+        {
+            get { return _widget.GetValue("BufferUnitsInput"); }
+            set
+            {
+                _widget.SetValue("BufferUnitsInput", value);
+                OnPropertyChanged("BufferUnitsInput");
+            }
+        }
+
+        public Color BorderColor
+        {
+            get { return Utility.ParseHTMLColor(_widget.GetValue("BorderColor")); }
+            set
+            {
+                _widget.SetValue("BorderColor", Utility.SerializeHTMLColor(value, true));
+                OnPropertyChanged("BorderColor");
+            }
+        }
+
+        public string BorderColorInput
+        {
+            get { return _widget.GetValue("BorderColorInput"); }
+            set
+            {
+                _widget.SetValue("BorderColorInput", value);
+                OnPropertyChanged("BorderColorInput");
+            }
+        }
+
+        public Color FillColor
+        {
+            get { return Utility.ParseHTMLColor(_widget.GetValue("FillColor")); }
+            set
+            {
+                _widget.SetValue("FillColor", Utility.SerializeHTMLColor(value, true));
+                OnPropertyChanged("FillColor");
+            }
+        }
+
+        public string FillColorInput
+        {
+            get { return _widget.GetValue("FillColorInput"); }
+            set
+            {
+                _widget.SetValue("FillColorInput", value);
+                OnPropertyChanged("FillColorInput");
+            }
+        }
+
+        private void OnPropertyChanged(string propertyName)
+        {
+            var handler = this.PropertyChanged;
+            if (handler != null)
+                handler(this, new PropertyChangedEventArgs(propertyName));
+        }
+
+        public event PropertyChangedEventHandler PropertyChanged;
+
+        private void btnBrowseBufferUnits_Click(object sender, EventArgs e)
+        {
+            var item = GenericItemSelectionDialog.SelectItem("Buffer Units", "Select Buffer Units", _units);
+            if (item != null)
+            {
+                txtBufferUnits.Text = item;
+            }
+        }
+
+        private void cmbBorderColor_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            this.BorderColor = cmbBorderColor.CurrentColor;
+        }
+
+        private void cmbFillColor_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            this.FillColor = cmbFillColor.CurrentColor;
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/BufferWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CenterSelectionWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CenterSelectionWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CenterSelectionWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class CenterSelectionWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+        }
+
+        #endregion
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CenterSelectionWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CenterSelectionWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CenterSelectionWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class CenterSelectionWidgetCtrl : WidgetEditorBase
+    {
+        public CenterSelectionWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ClearSelectionCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ClearSelectionCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ClearSelectionCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class ClearSelectionCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+        }
+
+        #endregion
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ClearSelectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ClearSelectionCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ClearSelectionCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class ClearSelectionCtrl : WidgetEditorBase
+    {
+        public ClearSelectionCtrl()
+        {
+            InitializeComponent();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,100 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class ColorPickerWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtColorInputId = new System.Windows.Forms.TextBox();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(269, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtColorInputId);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(3, 108);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(263, 63);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Color Picker";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(18, 28);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(72, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Color Input ID";
+            // 
+            // txtColorInputId
+            // 
+            this.txtColorInputId.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtColorInputId.Location = new System.Drawing.Point(105, 25);
+            this.txtColorInputId.Name = "txtColorInputId";
+            this.txtColorInputId.Size = new System.Drawing.Size(138, 20);
+            this.txtColorInputId.TabIndex = 1;
+            this.txtColorInputId.TextChanged += new System.EventHandler(this.txtColorInputId_TextChanged);
+            // 
+            // ColorPickerWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "ColorPickerWidgetCtrl";
+            this.Size = new System.Drawing.Size(269, 174);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtColorInputId;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,58 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class ColorPickerWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public ColorPickerWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+
+            txtColorInputId.Text = _widget.GetValue("ColorInputId");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void txtColorInputId_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("ColorInputId", txtColorInputId.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ColorPickerWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,153 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class CursorPositionWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.txtUnits = new System.Windows.Forms.TextBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.numPrecision = new System.Windows.Forms.NumericUpDown();
+            this.label2 = new System.Windows.Forms.Label();
+            this.txtTemplate = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numPrecision)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(415, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtUnits);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.numPrecision);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.txtTemplate);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(3, 118);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(409, 119);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Cursor Position";
+            // 
+            // txtUnits
+            // 
+            this.txtUnits.Location = new System.Drawing.Point(91, 79);
+            this.txtUnits.Name = "txtUnits";
+            this.txtUnits.Size = new System.Drawing.Size(100, 20);
+            this.txtUnits.TabIndex = 5;
+            this.txtUnits.TextChanged += new System.EventHandler(this.txtUnits_TextChanged);
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(20, 82);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(31, 13);
+            this.label3.TabIndex = 4;
+            this.label3.Text = "Units";
+            // 
+            // numPrecision
+            // 
+            this.numPrecision.Location = new System.Drawing.Point(91, 53);
+            this.numPrecision.Maximum = new decimal(new int[] {
+            15,
+            0,
+            0,
+            0});
+            this.numPrecision.Name = "numPrecision";
+            this.numPrecision.Size = new System.Drawing.Size(99, 20);
+            this.numPrecision.TabIndex = 3;
+            this.numPrecision.ValueChanged += new System.EventHandler(this.numPrecision_ValueChanged);
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(20, 55);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(50, 13);
+            this.label2.TabIndex = 2;
+            this.label2.Text = "Precision";
+            // 
+            // txtTemplate
+            // 
+            this.txtTemplate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtTemplate.Location = new System.Drawing.Point(91, 27);
+            this.txtTemplate.Name = "txtTemplate";
+            this.txtTemplate.Size = new System.Drawing.Size(299, 20);
+            this.txtTemplate.TabIndex = 1;
+            this.txtTemplate.TextChanged += new System.EventHandler(this.txtTemplate_TextChanged);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(20, 30);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(51, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Template";
+            // 
+            // CursorPositionWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "CursorPositionWidgetCtrl";
+            this.Size = new System.Drawing.Size(415, 240);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numPrecision)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox txtTemplate;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtUnits;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.NumericUpDown numPrecision;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,71 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using System.Globalization;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class CursorPositionWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public CursorPositionWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+
+            txtTemplate.Text = _widget.GetValue("Template");
+            numPrecision.Value = Convert.ToDecimal(_widget.GetValue("Precision"));
+            txtUnits.Text = _widget.GetValue("Units");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void txtTemplate_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("Template", txtTemplate.Text);
+        }
+
+        private void numPrecision_ValueChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("Precision", numPrecision.Value.ToString(CultureInfo.InvariantCulture));
+        }
+
+        private void txtUnits_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("Units", txtUnits.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/CursorPositionWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,105 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class EditableScaleWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.numPrecision = new System.Windows.Forms.NumericUpDown();
+            this.groupBox1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numPrecision)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(269, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.numPrecision);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(3, 118);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(263, 70);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Editable Scale";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(17, 31);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(50, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Precision";
+            // 
+            // numPrecision
+            // 
+            this.numPrecision.Location = new System.Drawing.Point(90, 29);
+            this.numPrecision.Maximum = new decimal(new int[] {
+            15,
+            0,
+            0,
+            0});
+            this.numPrecision.Name = "numPrecision";
+            this.numPrecision.Size = new System.Drawing.Size(120, 20);
+            this.numPrecision.TabIndex = 1;
+            this.numPrecision.ValueChanged += new System.EventHandler(this.numPrecision_ValueChanged);
+            // 
+            // EditableScaleWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "EditableScaleWidgetCtrl";
+            this.Size = new System.Drawing.Size(269, 191);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numPrecision)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.NumericUpDown numPrecision;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,59 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using System.Globalization;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class EditableScaleWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public EditableScaleWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+
+            numPrecision.Value = Convert.ToDecimal(_widget.GetValue("Precision"));
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void numPrecision_ValueChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("Precision", numPrecision.Value.ToString(CultureInfo.InvariantCulture));
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/EditableScaleWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,112 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class ExtentHistoryWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtDirection = new System.Windows.Forms.TextBox();
+            this.btnBrowse = new System.Windows.Forms.Button();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(321, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.btnBrowse);
+            this.groupBox1.Controls.Add(this.txtDirection);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(3, 118);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(315, 80);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Extent History";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(17, 30);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(49, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Direction";
+            // 
+            // txtDirection
+            // 
+            this.txtDirection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtDirection.Location = new System.Drawing.Point(90, 27);
+            this.txtDirection.Name = "txtDirection";
+            this.txtDirection.ReadOnly = true;
+            this.txtDirection.Size = new System.Drawing.Size(173, 20);
+            this.txtDirection.TabIndex = 1;
+            this.txtDirection.TextChanged += new System.EventHandler(this.txtDirection_TextChanged);
+            // 
+            // btnBrowse
+            // 
+            this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnBrowse.Location = new System.Drawing.Point(269, 25);
+            this.btnBrowse.Name = "btnBrowse";
+            this.btnBrowse.Size = new System.Drawing.Size(26, 23);
+            this.btnBrowse.TabIndex = 2;
+            this.btnBrowse.Text = "...";
+            this.btnBrowse.UseVisualStyleBackColor = true;
+            this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
+            // 
+            // ExtentHistoryWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "ExtentHistoryWidgetCtrl";
+            this.Size = new System.Drawing.Size(321, 201);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Button btnBrowse;
+        private System.Windows.Forms.TextBox txtDirection;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,69 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using Maestro.Editors.Common;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class ExtentHistoryWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public ExtentHistoryWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+            txtDirection.Text = _widget.GetValue("Direction");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private string[] _values = { "Next", "Previous" };
+
+        private void btnBrowse_Click(object sender, EventArgs e)
+        {
+            var item = GenericItemSelectionDialog.SelectItem("Direction", "Specify Direction to traverse extent history", _values);
+            if (item != null)
+            {
+                txtDirection.Text = item;
+            }
+        }
+
+        private void txtDirection_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("Direction", txtDirection.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/ExtentHistoryWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,97 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class FeatureInfoWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtTarget = new System.Windows.Forms.TextBox();
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.txtTarget);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(4, 119);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(417, 94);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Feature Info";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(20, 32);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(38, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Target";
+            // 
+            // txtTarget
+            // 
+            this.txtTarget.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtTarget.Location = new System.Drawing.Point(88, 29);
+            this.txtTarget.Name = "txtTarget";
+            this.txtTarget.Size = new System.Drawing.Size(309, 20);
+            this.txtTarget.TabIndex = 1;
+            this.txtTarget.TextChanged += new System.EventHandler(this.txtTarget_TextChanged);
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(424, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // FeatureInfoWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "FeatureInfoWidgetCtrl";
+            this.Size = new System.Drawing.Size(424, 216);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TextBox txtTarget;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,57 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class FeatureInfoWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public FeatureInfoWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+            txtTarget.Text = _widget.GetValue("Target");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void txtTarget_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("Target", txtTarget.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/FeatureInfoWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,89 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class GenericWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtXmlContent = new System.Windows.Forms.TextBox();
+            this.btnSave = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(15, 11);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(69, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "XML Content";
+            // 
+            // txtXmlContent
+            // 
+            this.txtXmlContent.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtXmlContent.Location = new System.Drawing.Point(18, 27);
+            this.txtXmlContent.Multiline = true;
+            this.txtXmlContent.Name = "txtXmlContent";
+            this.txtXmlContent.Size = new System.Drawing.Size(397, 347);
+            this.txtXmlContent.TabIndex = 1;
+            this.txtXmlContent.TextChanged += new System.EventHandler(this.txtXmlContent_TextChanged);
+            // 
+            // btnSave
+            // 
+            this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+            this.btnSave.Enabled = false;
+            this.btnSave.Location = new System.Drawing.Point(18, 380);
+            this.btnSave.Name = "btnSave";
+            this.btnSave.Size = new System.Drawing.Size(75, 23);
+            this.btnSave.TabIndex = 2;
+            this.btnSave.Text = "Save";
+            this.btnSave.UseVisualStyleBackColor = true;
+            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+            // 
+            // GenericWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.btnSave);
+            this.Controls.Add(this.txtXmlContent);
+            this.Controls.Add(this.label1);
+            this.Name = "GenericWidgetCtrl";
+            this.Size = new System.Drawing.Size(432, 412);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtXmlContent;
+        private System.Windows.Forms.Button btnSave;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,134 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    /// <summary>
+    /// A generic widget editor that edits the underlying XML content
+    /// </summary>
+    public partial class GenericWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public GenericWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private string _xml;
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            _xml = _widget.ToXml();
+            txtXmlContent.Text = _xml;
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void txtXmlContent_TextChanged(object sender, EventArgs e)
+        {
+            btnSave.Enabled = (txtXmlContent.Text.Equals(_xml));
+        }
+
+        private void btnSave_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                XmlDocument doc = new XmlDocument();
+                doc.LoadXml(txtXmlContent.Text);
+
+                //Base widget properties
+                XmlNode node = doc.SelectSingleNode("//Widget/Name");
+                if (node != null)
+                    _widget.Name = node.InnerText;
+
+                node = doc.SelectSingleNode("//Widget/Type");
+                if (node != null)
+                    _widget.Type = node.InnerText;
+
+                node = doc.SelectSingleNode("//Widget/Location");
+                if (node != null)
+                    _widget.Location = node.InnerText;
+
+                //Extension elements
+                node = doc.SelectSingleNode("//Widget/Extension");
+                if (node != null)
+                {
+                    List<XmlElement> elements = new List<XmlElement>();
+                    foreach (XmlNode child in node.ChildNodes)
+                    {
+                        elements.Add(node[child.Name]);
+                    }
+                    _widget.Extension.Content = elements.ToArray();
+                }
+
+                //If a UI widget, set its properties
+                var uiw = _widget as IUIWidget;
+                if (uiw != null)
+                {
+                    node = doc.SelectSingleNode("//Widget/StatusItem");
+                    if (node != null)
+                        uiw.StatusText = node.InnerText;
+
+                    node = doc.SelectSingleNode("//Widget/ImageUrl");
+                    if (node != null)
+                        uiw.ImageUrl = node.InnerText;
+
+                    node = doc.SelectSingleNode("//Widget/ImageClass");
+                    if (node != null)
+                        uiw.ImageClass = node.InnerText;
+
+                    node = doc.SelectSingleNode("//Widget/Tooltip");
+                    if (node != null)
+                        uiw.Tooltip = node.InnerText;
+
+                    node = doc.SelectSingleNode("//Widget/Label");
+                    if (node != null)
+                        uiw.Label = node.InnerText;
+
+                    node = doc.SelectSingleNode("//Widget/Disabled");
+                    if (node != null)
+                        uiw.Disabled = node.InnerText;
+                }
+
+                MessageBox.Show(Properties.Resources.WidgetUpdated);
+
+                _xml = _widget.ToXml();
+                txtXmlContent.Text = _xml;
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/GenericWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,122 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class HelpWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.txtTarget = new System.Windows.Forms.TextBox();
+            this.txtUrl = new System.Windows.Forms.TextBox();
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.txtUrl);
+            this.groupBox1.Controls.Add(this.txtTarget);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(4, 110);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(395, 79);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Help";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(16, 28);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(38, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Target";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(16, 54);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(20, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Url";
+            // 
+            // txtTarget
+            // 
+            this.txtTarget.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtTarget.Location = new System.Drawing.Point(86, 25);
+            this.txtTarget.Name = "txtTarget";
+            this.txtTarget.Size = new System.Drawing.Size(289, 20);
+            this.txtTarget.TabIndex = 2;
+            this.txtTarget.TextChanged += new System.EventHandler(this.txtTarget_TextChanged);
+            // 
+            // txtUrl
+            // 
+            this.txtUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtUrl.Location = new System.Drawing.Point(86, 51);
+            this.txtUrl.Name = "txtUrl";
+            this.txtUrl.Size = new System.Drawing.Size(289, 20);
+            this.txtUrl.TabIndex = 3;
+            this.txtUrl.TextChanged += new System.EventHandler(this.txtUrl_TextChanged);
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(402, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // HelpWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "HelpWidgetCtrl";
+            this.Size = new System.Drawing.Size(402, 192);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtUrl;
+        private System.Windows.Forms.TextBox txtTarget;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,63 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class HelpWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public HelpWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+            txtTarget.Text = _widget.GetValue("Target");
+            txtUrl.Text = _widget.GetValue("Url");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void txtTarget_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("Target", txtTarget.Text);
+        }
+
+        private void txtUrl_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("Url", txtUrl.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/HelpWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/IWidgetEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/IWidgetEditor.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/IWidgetEditor.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,34 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public interface IWidgetEditor
+    {
+        void Setup(IWidget widget, IEditorService edsvc);
+
+        Control Content { get; }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,115 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class InitialMapViewWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtViewType = new System.Windows.Forms.TextBox();
+            this.btnBrowse = new System.Windows.Forms.Button();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(414, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.btnBrowse);
+            this.groupBox1.Controls.Add(this.txtViewType);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(4, 119);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(407, 134);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Initial Map View";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(19, 32);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(57, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "View Type";
+            // 
+            // txtViewType
+            // 
+            this.txtViewType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtViewType.Location = new System.Drawing.Point(91, 29);
+            this.txtViewType.Name = "txtViewType";
+            this.txtViewType.ReadOnly = true;
+            this.txtViewType.Size = new System.Drawing.Size(260, 20);
+            this.txtViewType.TabIndex = 1;
+            this.txtViewType.TextChanged += new System.EventHandler(this.txtViewType_TextChanged);
+            // 
+            // btnBrowse
+            // 
+            this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnBrowse.Location = new System.Drawing.Point(357, 27);
+            this.btnBrowse.Name = "btnBrowse";
+            this.btnBrowse.Size = new System.Drawing.Size(31, 23);
+            this.btnBrowse.TabIndex = 2;
+            this.btnBrowse.Text = "...";
+            this.btnBrowse.UseVisualStyleBackColor = true;
+            this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
+            // 
+            // InitialMapViewWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "InitialMapViewWidgetCtrl";
+            this.Size = new System.Drawing.Size(414, 256);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Button btnBrowse;
+        private System.Windows.Forms.TextBox txtViewType;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,69 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using Maestro.Editors.Common;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class InitialMapViewWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public InitialMapViewWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+            txtViewType.Text = _widget.GetValue("ViewType");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private string[] _values = { "full", "initial" };
+
+        private void btnBrowse_Click(object sender, EventArgs e)
+        {
+            var item = GenericItemSelectionDialog.SelectItem("View Type", "Select zoom extents option", _values);
+            if (item != null)
+            {
+                txtViewType.Text = item;
+            }
+        }
+
+        private void txtViewType_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("ViewType", txtViewType.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InitialMapViewWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,102 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class InvokeScriptWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.txtScript = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(391, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtScript);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(3, 118);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(385, 170);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Invoke Script";
+            // 
+            // txtScript
+            // 
+            this.txtScript.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtScript.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.txtScript.Location = new System.Drawing.Point(22, 45);
+            this.txtScript.Multiline = true;
+            this.txtScript.Name = "txtScript";
+            this.txtScript.Size = new System.Drawing.Size(344, 110);
+            this.txtScript.TabIndex = 1;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(19, 29);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(34, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Script";
+            // 
+            // InvokeScriptWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "InvokeScriptWidgetCtrl";
+            this.Size = new System.Drawing.Size(391, 291);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TextBox txtScript;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,51 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class InvokeScriptWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public InvokeScriptWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeScriptWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,157 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class InvokeUrlWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.grdParams = new System.Windows.Forms.DataGridView();
+            this.label3 = new System.Windows.Forms.Label();
+            this.chkDisableEmpty = new System.Windows.Forms.CheckBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtTarget = new System.Windows.Forms.TextBox();
+            this.txtUrl = new System.Windows.Forms.TextBox();
+            this.groupBox1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdParams)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(446, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtUrl);
+            this.groupBox1.Controls.Add(this.txtTarget);
+            this.groupBox1.Controls.Add(this.grdParams);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.chkDisableEmpty);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(4, 119);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(439, 201);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Invoke Url";
+            // 
+            // grdParams
+            // 
+            this.grdParams.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.grdParams.Location = new System.Drawing.Point(19, 107);
+            this.grdParams.Name = "grdParams";
+            this.grdParams.Size = new System.Drawing.Size(397, 75);
+            this.grdParams.TabIndex = 4;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(16, 91);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(109, 13);
+            this.label3.TabIndex = 3;
+            this.label3.Text = "Additional Parameters";
+            // 
+            // chkDisableEmpty
+            // 
+            this.chkDisableEmpty.AutoSize = true;
+            this.chkDisableEmpty.Location = new System.Drawing.Point(89, 71);
+            this.chkDisableEmpty.Name = "chkDisableEmpty";
+            this.chkDisableEmpty.Size = new System.Drawing.Size(149, 17);
+            this.chkDisableEmpty.TabIndex = 2;
+            this.chkDisableEmpty.Text = "Disable If Selection Empty";
+            this.chkDisableEmpty.UseVisualStyleBackColor = true;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(16, 48);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(20, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Url";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(16, 22);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(38, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Target";
+            // 
+            // txtTarget
+            // 
+            this.txtTarget.Location = new System.Drawing.Point(89, 19);
+            this.txtTarget.Name = "txtTarget";
+            this.txtTarget.Size = new System.Drawing.Size(327, 20);
+            this.txtTarget.TabIndex = 5;
+            // 
+            // txtUrl
+            // 
+            this.txtUrl.Location = new System.Drawing.Point(89, 45);
+            this.txtUrl.Name = "txtUrl";
+            this.txtUrl.Size = new System.Drawing.Size(327, 20);
+            this.txtUrl.TabIndex = 6;
+            // 
+            // InvokeUrlWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "InvokeUrlWidgetCtrl";
+            this.Size = new System.Drawing.Size(446, 323);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdParams)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.CheckBox chkDisableEmpty;
+        private System.Windows.Forms.DataGridView grdParams;
+        private System.Windows.Forms.TextBox txtUrl;
+        private System.Windows.Forms.TextBox txtTarget;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using System.Xml;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class InvokeUrlWidgetCtrl : UserControl, IWidgetEditor
+    {
+        class Pair
+        {
+            public string Key { get; set; }
+
+            public string Value { get; set; }
+        }
+
+        private BindingList<Pair> _params;
+
+        public InvokeUrlWidgetCtrl()
+        {
+            InitializeComponent();
+            _doc = new XmlDocument();
+            _params = new BindingList<Pair>();
+            grdParams.DataSource = _params;
+        }
+
+        private IWidget _widget;
+        private XmlDocument _doc;
+
+        public void Setup(IWidget widget)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget);
+
+            txtTarget.Text = _widget.GetValue("Target");
+            txtUrl.Text = _widget.GetValue("Url");
+            chkDisableEmpty.Checked = Convert.ToBoolean(_widget.GetValue("DisableIfSelectionEmpty"));
+
+            //Would be nice if this particular bit was documented
+            _doc.LoadXml(_widget.GetValue("AdditionalParameter"));
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/InvokeUrlWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,292 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class LegendWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.chkHideInvisibleLayers = new System.Windows.Forms.CheckBox();
+            this.chkShowRootFolder = new System.Windows.Forms.CheckBox();
+            this.chkShowMapFolder = new System.Windows.Forms.CheckBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.label6 = new System.Windows.Forms.Label();
+            this.label7 = new System.Windows.Forms.Label();
+            this.txtLayerRasterIcon = new System.Windows.Forms.TextBox();
+            this.txtLayerDwfIcon = new System.Windows.Forms.TextBox();
+            this.txtLayerThemeIcon = new System.Windows.Forms.TextBox();
+            this.txtDisabledLayerIcon = new System.Windows.Forms.TextBox();
+            this.txtLayerInfoIcon = new System.Windows.Forms.TextBox();
+            this.txtGroupInfoIcon = new System.Windows.Forms.TextBox();
+            this.txtRootFolderIcon = new System.Windows.Forms.TextBox();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(445, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtRootFolderIcon);
+            this.groupBox1.Controls.Add(this.txtGroupInfoIcon);
+            this.groupBox1.Controls.Add(this.txtLayerInfoIcon);
+            this.groupBox1.Controls.Add(this.txtDisabledLayerIcon);
+            this.groupBox1.Controls.Add(this.txtLayerThemeIcon);
+            this.groupBox1.Controls.Add(this.txtLayerDwfIcon);
+            this.groupBox1.Controls.Add(this.txtLayerRasterIcon);
+            this.groupBox1.Controls.Add(this.label7);
+            this.groupBox1.Controls.Add(this.label6);
+            this.groupBox1.Controls.Add(this.label5);
+            this.groupBox1.Controls.Add(this.label4);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Controls.Add(this.chkShowMapFolder);
+            this.groupBox1.Controls.Add(this.chkShowRootFolder);
+            this.groupBox1.Controls.Add(this.chkHideInvisibleLayers);
+            this.groupBox1.Location = new System.Drawing.Point(3, 118);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(439, 300);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Legend";
+            // 
+            // chkHideInvisibleLayers
+            // 
+            this.chkHideInvisibleLayers.AutoSize = true;
+            this.chkHideInvisibleLayers.Location = new System.Drawing.Point(21, 28);
+            this.chkHideInvisibleLayers.Name = "chkHideInvisibleLayers";
+            this.chkHideInvisibleLayers.Size = new System.Drawing.Size(123, 17);
+            this.chkHideInvisibleLayers.TabIndex = 0;
+            this.chkHideInvisibleLayers.Text = "Hide Invisible Layers";
+            this.chkHideInvisibleLayers.UseVisualStyleBackColor = true;
+            this.chkHideInvisibleLayers.CheckedChanged += new System.EventHandler(this.chkHideInvisibleLayers_CheckedChanged);
+            // 
+            // chkShowRootFolder
+            // 
+            this.chkShowRootFolder.AutoSize = true;
+            this.chkShowRootFolder.Location = new System.Drawing.Point(21, 51);
+            this.chkShowRootFolder.Name = "chkShowRootFolder";
+            this.chkShowRootFolder.Size = new System.Drawing.Size(111, 17);
+            this.chkShowRootFolder.TabIndex = 1;
+            this.chkShowRootFolder.Text = "Show Root Folder";
+            this.chkShowRootFolder.UseVisualStyleBackColor = true;
+            this.chkShowRootFolder.CheckedChanged += new System.EventHandler(this.chkShowRootFolder_CheckedChanged);
+            // 
+            // chkShowMapFolder
+            // 
+            this.chkShowMapFolder.AutoSize = true;
+            this.chkShowMapFolder.Location = new System.Drawing.Point(21, 74);
+            this.chkShowMapFolder.Name = "chkShowMapFolder";
+            this.chkShowMapFolder.Size = new System.Drawing.Size(109, 17);
+            this.chkShowMapFolder.TabIndex = 2;
+            this.chkShowMapFolder.Text = "Show Map Folder";
+            this.chkShowMapFolder.UseVisualStyleBackColor = true;
+            this.chkShowMapFolder.CheckedChanged += new System.EventHandler(this.chkShowMapFolder_CheckedChanged);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(21, 109);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(91, 13);
+            this.label1.TabIndex = 3;
+            this.label1.Text = "Layer Raster Icon";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(21, 134);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(85, 13);
+            this.label2.TabIndex = 4;
+            this.label2.Text = "Layer DWF Icon";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(21, 160);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(93, 13);
+            this.label3.TabIndex = 5;
+            this.label3.Text = "Layer Theme Icon";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(21, 187);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(101, 13);
+            this.label4.TabIndex = 6;
+            this.label4.Text = "Disabled Layer Icon";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(21, 212);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(78, 13);
+            this.label5.TabIndex = 7;
+            this.label5.Text = "Layer Info Icon";
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(21, 239);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(81, 13);
+            this.label6.TabIndex = 8;
+            this.label6.Text = "Group Info Icon";
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Location = new System.Drawing.Point(21, 266);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(86, 13);
+            this.label7.TabIndex = 9;
+            this.label7.Text = "Root Folder Icon";
+            // 
+            // txtLayerRasterIcon
+            // 
+            this.txtLayerRasterIcon.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtLayerRasterIcon.Location = new System.Drawing.Point(138, 106);
+            this.txtLayerRasterIcon.Name = "txtLayerRasterIcon";
+            this.txtLayerRasterIcon.Size = new System.Drawing.Size(273, 20);
+            this.txtLayerRasterIcon.TabIndex = 10;
+            this.txtLayerRasterIcon.TextChanged += new System.EventHandler(this.txtLayerRasterIcon_TextChanged);
+            // 
+            // txtLayerDwfIcon
+            // 
+            this.txtLayerDwfIcon.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtLayerDwfIcon.Location = new System.Drawing.Point(138, 131);
+            this.txtLayerDwfIcon.Name = "txtLayerDwfIcon";
+            this.txtLayerDwfIcon.Size = new System.Drawing.Size(273, 20);
+            this.txtLayerDwfIcon.TabIndex = 11;
+            this.txtLayerDwfIcon.TextChanged += new System.EventHandler(this.txtLayerDwfIcon_TextChanged);
+            // 
+            // txtLayerThemeIcon
+            // 
+            this.txtLayerThemeIcon.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtLayerThemeIcon.Location = new System.Drawing.Point(138, 157);
+            this.txtLayerThemeIcon.Name = "txtLayerThemeIcon";
+            this.txtLayerThemeIcon.Size = new System.Drawing.Size(273, 20);
+            this.txtLayerThemeIcon.TabIndex = 12;
+            this.txtLayerThemeIcon.TextChanged += new System.EventHandler(this.txtLayerThemeIcon_TextChanged);
+            // 
+            // txtDisabledLayerIcon
+            // 
+            this.txtDisabledLayerIcon.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtDisabledLayerIcon.Location = new System.Drawing.Point(138, 184);
+            this.txtDisabledLayerIcon.Name = "txtDisabledLayerIcon";
+            this.txtDisabledLayerIcon.Size = new System.Drawing.Size(273, 20);
+            this.txtDisabledLayerIcon.TabIndex = 13;
+            this.txtDisabledLayerIcon.TextChanged += new System.EventHandler(this.txtDisabledLayerIcon_TextChanged);
+            // 
+            // txtLayerInfoIcon
+            // 
+            this.txtLayerInfoIcon.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtLayerInfoIcon.Location = new System.Drawing.Point(138, 209);
+            this.txtLayerInfoIcon.Name = "txtLayerInfoIcon";
+            this.txtLayerInfoIcon.Size = new System.Drawing.Size(273, 20);
+            this.txtLayerInfoIcon.TabIndex = 14;
+            this.txtLayerInfoIcon.TextChanged += new System.EventHandler(this.txtLayerInfoIcon_TextChanged);
+            // 
+            // txtGroupInfoIcon
+            // 
+            this.txtGroupInfoIcon.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtGroupInfoIcon.Location = new System.Drawing.Point(138, 236);
+            this.txtGroupInfoIcon.Name = "txtGroupInfoIcon";
+            this.txtGroupInfoIcon.Size = new System.Drawing.Size(273, 20);
+            this.txtGroupInfoIcon.TabIndex = 15;
+            this.txtGroupInfoIcon.TextChanged += new System.EventHandler(this.txtGroupInfoIcon_TextChanged);
+            // 
+            // txtRootFolderIcon
+            // 
+            this.txtRootFolderIcon.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtRootFolderIcon.Location = new System.Drawing.Point(138, 263);
+            this.txtRootFolderIcon.Name = "txtRootFolderIcon";
+            this.txtRootFolderIcon.Size = new System.Drawing.Size(273, 20);
+            this.txtRootFolderIcon.TabIndex = 16;
+            this.txtRootFolderIcon.TextChanged += new System.EventHandler(this.txtRootFolderIcon_TextChanged);
+            // 
+            // LegendWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "LegendWidgetCtrl";
+            this.Size = new System.Drawing.Size(445, 421);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.CheckBox chkShowMapFolder;
+        private System.Windows.Forms.CheckBox chkShowRootFolder;
+        private System.Windows.Forms.CheckBox chkHideInvisibleLayers;
+        private System.Windows.Forms.TextBox txtRootFolderIcon;
+        private System.Windows.Forms.TextBox txtGroupInfoIcon;
+        private System.Windows.Forms.TextBox txtLayerInfoIcon;
+        private System.Windows.Forms.TextBox txtDisabledLayerIcon;
+        private System.Windows.Forms.TextBox txtLayerThemeIcon;
+        private System.Windows.Forms.TextBox txtLayerDwfIcon;
+        private System.Windows.Forms.TextBox txtLayerRasterIcon;
+        private System.Windows.Forms.Label label7;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,113 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class LegendWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public LegendWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            baseEditor.Setup(_widget, edsvc);
+
+            chkHideInvisibleLayers.Checked = Convert.ToBoolean(_widget.GetValue("HideInvisibleLayers"));
+            chkShowMapFolder.Checked = Convert.ToBoolean(_widget.GetValue("ShowMapFolder"));
+            chkShowRootFolder.Checked = Convert.ToBoolean(_widget.GetValue("ShowRootFolder"));
+
+            txtDisabledLayerIcon.Text = _widget.GetValue("DisabledLayerIcon");
+            txtGroupInfoIcon.Text = _widget.GetValue("GroupInfoIcon");
+            txtLayerDwfIcon.Text = _widget.GetValue("LayerDWFIcon");
+            txtLayerInfoIcon.Text = _widget.GetValue("LayerInfoIcon");
+            txtLayerRasterIcon.Text = _widget.GetValue("LayerRasterIcon");
+            txtLayerThemeIcon.Text = _widget.GetValue("LayerThemeIcon");
+            txtRootFolderIcon.Text = _widget.GetValue("RootFolderIcon");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void chkHideInvisibleLayers_CheckedChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("HideInvisibleLayers", chkHideInvisibleLayers.Checked.ToString());
+        }
+
+        private void chkShowRootFolder_CheckedChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("ShowRootFolder", chkShowRootFolder.Checked.ToString());
+        }
+
+        private void chkShowMapFolder_CheckedChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("ShowMapFolder", chkShowMapFolder.Checked.ToString());
+        }
+
+        private void txtLayerRasterIcon_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("LayerRasterIcon", txtLayerRasterIcon.Text);
+        }
+
+        private void txtLayerDwfIcon_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("LayerDWFIcon", txtLayerDwfIcon.Text);
+        }
+
+        private void txtLayerThemeIcon_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("LayerThemeIcon", txtLayerThemeIcon.Text);
+        }
+
+        private void txtDisabledLayerIcon_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("DisabledLayerIcon", txtDisabledLayerIcon.Text);
+        }
+
+        private void txtLayerInfoIcon_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("LayerInfoIcon", txtLayerInfoIcon.Text);
+        }
+
+        private void txtGroupInfoIcon_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("GroupInfoIcon", txtGroupInfoIcon.Text);
+        }
+
+        private void txtRootFolderIcon_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("RootFolderIcon", txtRootFolderIcon.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LegendWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LinkToViewWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LinkToViewWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LinkToViewWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class LinkToViewWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+        }
+
+        #endregion
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LinkToViewWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LinkToViewWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/LinkToViewWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class LinkToViewWidgetCtrl : WidgetEditorBase
+    {
+        public LinkToViewWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,110 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class MapMenuWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.btnBrowseFolder = new System.Windows.Forms.Button();
+            this.txtFolder = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(431, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.btnBrowseFolder);
+            this.groupBox1.Controls.Add(this.txtFolder);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(4, 119);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(424, 88);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Map Menu";
+            // 
+            // btnBrowseFolder
+            // 
+            this.btnBrowseFolder.Location = new System.Drawing.Point(378, 26);
+            this.btnBrowseFolder.Name = "btnBrowseFolder";
+            this.btnBrowseFolder.Size = new System.Drawing.Size(28, 23);
+            this.btnBrowseFolder.TabIndex = 2;
+            this.btnBrowseFolder.Text = "...";
+            this.btnBrowseFolder.UseVisualStyleBackColor = true;
+            this.btnBrowseFolder.Click += new System.EventHandler(this.btnBrowseFolder_Click);
+            // 
+            // txtFolder
+            // 
+            this.txtFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtFolder.Location = new System.Drawing.Point(89, 28);
+            this.txtFolder.Name = "txtFolder";
+            this.txtFolder.Size = new System.Drawing.Size(283, 20);
+            this.txtFolder.TabIndex = 1;
+            this.txtFolder.TextChanged += new System.EventHandler(this.txtFolder_TextChanged);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(19, 31);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(36, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Folder";
+            // 
+            // MapMenuWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.baseEditor);
+            this.Name = "MapMenuWidgetCtrl";
+            this.Size = new System.Drawing.Size(431, 210);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Button btnBrowseFolder;
+        private System.Windows.Forms.TextBox txtFolder;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,71 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using Maestro.Editors.Generic;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class MapMenuWidgetCtrl : UserControl, IWidgetEditor
+    {
+        public MapMenuWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IWidget _widget;
+        private IEditorService _edsvc;
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            _widget = widget;
+            _edsvc = edsvc;
+            baseEditor.Setup(_widget, _edsvc);
+            txtFolder.Text = _widget.GetValue("Folder");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void btnBrowseFolder_Click(object sender, EventArgs e)
+        {
+            using (var picker = new ResourcePicker(_edsvc.ResourceService, ResourcePickerMode.OpenFolder))
+            {
+                if (picker.ShowDialog() == DialogResult.OK)
+                {
+                    txtFolder.Text = picker.ResourceID;
+                }
+            }
+        }
+
+        private void txtFolder_TextChanged(object sender, EventArgs e)
+        {
+            _widget.SetValue("Folder", txtFolder.Text);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapMenuWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,57 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class MapTipWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(421, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // MapTipWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.baseEditor);
+            this.Name = "MapTipWidgetCtrl";
+            this.Size = new System.Drawing.Size(421, 247);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class MapTipWidgetCtrl : UserControl
+    {
+        public MapTipWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MapTipWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,57 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class MeasureWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.baseEditor = new Maestro.Editors.Fusion.WidgetEditors.WidgetEditorBase();
+            this.SuspendLayout();
+            // 
+            // baseEditor
+            // 
+            this.baseEditor.Dock = System.Windows.Forms.DockStyle.Top;
+            this.baseEditor.Location = new System.Drawing.Point(0, 0);
+            this.baseEditor.Name = "baseEditor";
+            this.baseEditor.Size = new System.Drawing.Size(409, 112);
+            this.baseEditor.TabIndex = 0;
+            // 
+            // MeasureWidgetCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.baseEditor);
+            this.Name = "MeasureWidgetCtrl";
+            this.Size = new System.Drawing.Size(409, 245);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private WidgetEditorBase baseEditor;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class MeasureWidgetCtrl : UserControl
+    {
+        public MeasureWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/MeasureWidgetCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/NavigatorWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/NavigatorWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/NavigatorWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class NavigatorWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+        }
+
+        #endregion
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/NavigatorWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/NavigatorWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/NavigatorWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class NavigatorWidgetCtrl : WidgetEditorBase
+    {
+        public NavigatorWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/PanWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/PanWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/PanWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class PanWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+        }
+
+        #endregion
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/PanWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/PanWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/PanWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class PanWidgetCtrl : WidgetEditorBase
+    {
+        public PanWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/RefreshMapWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/RefreshMapWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/RefreshMapWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class RefreshMapWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+        }
+
+        #endregion
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/RefreshMapWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/RefreshMapWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/RefreshMapWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class RefreshMapWidgetCtrl : WidgetEditorBase
+    {
+        public RefreshMapWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/SelectionPanelWidgetCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/SelectionPanelWidgetCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/SelectionPanelWidgetCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class SelectionPanelWidgetCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+        }
+
+        #endregion
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/SelectionPanelWidgetCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/SelectionPanelWidgetCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/SelectionPanelWidgetCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class SelectionPanelWidgetCtrl : WidgetEditorBase
+    {
+        public SelectionPanelWidgetCtrl()
+        {
+            InitializeComponent();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,138 @@
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    partial class WidgetEditorBase
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.txtName = new System.Windows.Forms.TextBox();
+            this.txtType = new System.Windows.Forms.TextBox();
+            this.txtLocation = new System.Windows.Forms.TextBox();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(16, 22);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(35, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Name";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(16, 48);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(31, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Type";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(16, 74);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(48, 13);
+            this.label3.TabIndex = 2;
+            this.label3.Text = "Location";
+            // 
+            // txtName
+            // 
+            this.txtName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtName.Location = new System.Drawing.Point(89, 19);
+            this.txtName.Name = "txtName";
+            this.txtName.Size = new System.Drawing.Size(290, 20);
+            this.txtName.TabIndex = 3;
+            // 
+            // txtType
+            // 
+            this.txtType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtType.Location = new System.Drawing.Point(89, 45);
+            this.txtType.Name = "txtType";
+            this.txtType.ReadOnly = true;
+            this.txtType.Size = new System.Drawing.Size(290, 20);
+            this.txtType.TabIndex = 4;
+            // 
+            // txtLocation
+            // 
+            this.txtLocation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtLocation.Location = new System.Drawing.Point(89, 71);
+            this.txtLocation.Name = "txtLocation";
+            this.txtLocation.ReadOnly = true;
+            this.txtLocation.Size = new System.Drawing.Size(290, 20);
+            this.txtLocation.TabIndex = 5;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtName);
+            this.groupBox1.Controls.Add(this.txtLocation);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Controls.Add(this.txtType);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Location = new System.Drawing.Point(3, 3);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(396, 106);
+            this.groupBox1.TabIndex = 6;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "General";
+            // 
+            // WidgetEditorBase
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Name = "WidgetEditorBase";
+            this.Size = new System.Drawing.Size(402, 112);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.TextBox txtName;
+        private System.Windows.Forms.TextBox txtType;
+        private System.Windows.Forms.TextBox txtLocation;
+        private System.Windows.Forms.GroupBox groupBox1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,51 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using Maestro.Shared.UI;
+
+namespace Maestro.Editors.Fusion.WidgetEditors
+{
+    public partial class WidgetEditorBase : UserControl, IWidgetEditor
+    {
+        public WidgetEditorBase()
+        {
+            InitializeComponent();
+        }
+
+        public void Setup(IWidget widget, IEditorService edsvc)
+        {
+            TextBoxBinder.BindText(txtName, widget, "Name");
+            TextBoxBinder.BindText(txtType, widget, "Type");
+            TextBoxBinder.BindText(txtLocation, widget, "Location");
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetEditors/WidgetEditorBase.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,200 @@
+namespace Maestro.Editors.Fusion
+{
+    partial class WidgetSettingsCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.trvWidgets = new System.Windows.Forms.TreeView();
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.btnAddWidget = new System.Windows.Forms.ToolStripDropDownButton();
+            this.propertiesPanel = new System.Windows.Forms.Panel();
+            this.btnAddContainer = new System.Windows.Forms.ToolStripButton();
+            this.btnRemoveWidget = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnMoveUp = new System.Windows.Forms.ToolStripButton();
+            this.btnMoveDown = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnConfigureWidgets = new System.Windows.Forms.ToolStripButton();
+            this.contentPanel.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.toolStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // contentPanel
+            // 
+            this.contentPanel.Controls.Add(this.propertiesPanel);
+            this.contentPanel.Controls.Add(this.groupBox1);
+            this.contentPanel.Size = new System.Drawing.Size(648, 292);
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)));
+            this.groupBox1.Controls.Add(this.trvWidgets);
+            this.groupBox1.Controls.Add(this.toolStrip1);
+            this.groupBox1.Location = new System.Drawing.Point(3, 6);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(200, 283);
+            this.groupBox1.TabIndex = 0;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Widgets";
+            // 
+            // trvWidgets
+            // 
+            this.trvWidgets.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.trvWidgets.Location = new System.Drawing.Point(3, 41);
+            this.trvWidgets.Name = "trvWidgets";
+            this.trvWidgets.Size = new System.Drawing.Size(194, 239);
+            this.trvWidgets.TabIndex = 1;
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnAddWidget,
+            this.btnAddContainer,
+            this.btnRemoveWidget,
+            this.toolStripSeparator1,
+            this.btnMoveUp,
+            this.btnMoveDown,
+            this.toolStripSeparator2,
+            this.btnConfigureWidgets});
+            this.toolStrip1.Location = new System.Drawing.Point(3, 16);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(194, 25);
+            this.toolStrip1.TabIndex = 0;
+            this.toolStrip1.Text = "toolStrip1";
+            // 
+            // btnAddWidget
+            // 
+            this.btnAddWidget.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnAddWidget.Image = global::Maestro.Editors.Properties.Resources.gear__plus;
+            this.btnAddWidget.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnAddWidget.Name = "btnAddWidget";
+            this.btnAddWidget.Size = new System.Drawing.Size(29, 22);
+            this.btnAddWidget.Text = "toolStripDropDownButton1";
+            // 
+            // propertiesPanel
+            // 
+            this.propertiesPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.propertiesPanel.Location = new System.Drawing.Point(209, 6);
+            this.propertiesPanel.Name = "propertiesPanel";
+            this.propertiesPanel.Size = new System.Drawing.Size(436, 280);
+            this.propertiesPanel.TabIndex = 1;
+            // 
+            // btnAddContainer
+            // 
+            this.btnAddContainer.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnAddContainer.Image = global::Maestro.Editors.Properties.Resources.application__plus;
+            this.btnAddContainer.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnAddContainer.Name = "btnAddContainer";
+            this.btnAddContainer.Size = new System.Drawing.Size(23, 22);
+            this.btnAddContainer.Text = "toolStripButton1";
+            // 
+            // btnRemoveWidget
+            // 
+            this.btnRemoveWidget.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnRemoveWidget.Enabled = false;
+            this.btnRemoveWidget.Image = global::Maestro.Editors.Properties.Resources.gear__minus;
+            this.btnRemoveWidget.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnRemoveWidget.Name = "btnRemoveWidget";
+            this.btnRemoveWidget.Size = new System.Drawing.Size(23, 22);
+            this.btnRemoveWidget.Text = "toolStripButton2";
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+            // 
+            // btnMoveUp
+            // 
+            this.btnMoveUp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnMoveUp.Enabled = false;
+            this.btnMoveUp.Image = global::Maestro.Editors.Properties.Resources.arrow_090;
+            this.btnMoveUp.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnMoveUp.Name = "btnMoveUp";
+            this.btnMoveUp.Size = new System.Drawing.Size(23, 22);
+            this.btnMoveUp.Text = "toolStripButton3";
+            // 
+            // btnMoveDown
+            // 
+            this.btnMoveDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnMoveDown.Enabled = false;
+            this.btnMoveDown.Image = global::Maestro.Editors.Properties.Resources.arrow_270;
+            this.btnMoveDown.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnMoveDown.Name = "btnMoveDown";
+            this.btnMoveDown.Size = new System.Drawing.Size(23, 22);
+            this.btnMoveDown.Text = "toolStripButton4";
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+            // 
+            // btnConfigureWidgets
+            // 
+            this.btnConfigureWidgets.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnConfigureWidgets.Image = global::Maestro.Editors.Properties.Resources.gear;
+            this.btnConfigureWidgets.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnConfigureWidgets.Name = "btnConfigureWidgets";
+            this.btnConfigureWidgets.Size = new System.Drawing.Size(23, 22);
+            this.btnConfigureWidgets.Text = "Configure";
+            // 
+            // WidgetSettingsCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.HeaderText = "Widgets";
+            this.Name = "WidgetSettingsCtrl";
+            this.Size = new System.Drawing.Size(648, 319);
+            this.contentPanel.ResumeLayout(false);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Panel propertiesPanel;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TreeView trvWidgets;
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.ToolStripDropDownButton btnAddWidget;
+        private System.Windows.Forms.ToolStripButton btnAddContainer;
+        private System.Windows.Forms.ToolStripButton btnRemoveWidget;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+        private System.Windows.Forms.ToolStripButton btnMoveUp;
+        private System.Windows.Forms.ToolStripButton btnMoveDown;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+        private System.Windows.Forms.ToolStripButton btnConfigureWidgets;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,63 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using Maestro.Editors.Common;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using OSGeo.MapGuide.MaestroAPI.Services;
+
+namespace Maestro.Editors.Fusion
+{
+    public partial class WidgetSettingsCtrl : EditorBindableCollapsiblePanel
+    {
+        public WidgetSettingsCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IFusionService _fsvc;
+        private IApplicationDefinition _flexLayout;
+        private string _baseUrl;
+
+        public override void Bind(IEditorService service)
+        {
+            try
+            {
+                _fsvc = (IFusionService)service.GetService((int)ServiceType.Fusion);
+                _baseUrl = service.GetCustomProperty("BaseUrl").ToString();
+
+                if (!_baseUrl.EndsWith("/"))
+                    _baseUrl += "/";
+            }
+            catch
+            {
+                throw new NotSupportedException(Properties.Resources.IncompatibleConnection);
+            }
+            service.RegisterCustomNotifier(this);
+            _flexLayout = (IApplicationDefinition)service.GetEditedResource();
+            
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Fusion/WidgetSettingsCtrl.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -220,5 +220,24 @@
         /// </summary>
         /// <param name="resourceId"></param>
         void OpenResource(string resourceId);
+
+        /// <summary>
+        /// Gets the supported services
+        /// </summary>
+        int[] SupportedServiceTypes { get; }
+
+        /// <summary>
+        /// Gets the service of the specified type
+        /// </summary>
+        /// <param name="serviceType"></param>
+        /// <returns></returns>
+        IService GetService(int serviceType);
+
+        /// <summary>
+        /// Gets the value of a custom connection property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        object GetCustomProperty(string name);
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2010-11-08 14:40:03 UTC (rev 5376)
@@ -256,6 +256,182 @@
     <Compile Include="FeatureSource\Providers\Shp\ShpFileCtrl.Designer.cs">
       <DependentUpon>ShpFileCtrl.cs</DependentUpon>
     </Compile>
+    <Compile Include="Fusion\FlexibleLayoutEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\FlexibleLayoutEditor.Designer.cs">
+      <DependentUpon>FlexibleLayoutEditor.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\FlexLayoutSettingsCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\FlexLayoutSettingsCtrl.Designer.cs">
+      <DependentUpon>FlexLayoutSettingsCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\MapSettingsCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\MapSettingsCtrl.Designer.cs">
+      <DependentUpon>MapSettingsCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditorFactory.cs" />
+    <Compile Include="Fusion\WidgetEditors\AboutWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\AboutWidgetCtrl.Designer.cs">
+      <DependentUpon>AboutWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\ActivityIndicatorWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\ActivityIndicatorWidgetCtrl.Designer.cs">
+      <DependentUpon>ActivityIndicatorWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\BufferPanelWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\BufferPanelWidgetCtrl.Designer.cs">
+      <DependentUpon>BufferPanelWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\BufferWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\BufferWidgetCtrl.Designer.cs">
+      <DependentUpon>BufferWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\CenterSelectionWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\CenterSelectionWidgetCtrl.Designer.cs">
+      <DependentUpon>CenterSelectionWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\ClearSelectionCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\ClearSelectionCtrl.Designer.cs">
+      <DependentUpon>ClearSelectionCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\ColorPickerWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\ColorPickerWidgetCtrl.Designer.cs">
+      <DependentUpon>ColorPickerWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\CursorPositionWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\CursorPositionWidgetCtrl.Designer.cs">
+      <DependentUpon>CursorPositionWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\EditableScaleWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\EditableScaleWidgetCtrl.Designer.cs">
+      <DependentUpon>EditableScaleWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\ExtentHistoryWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\ExtentHistoryWidgetCtrl.Designer.cs">
+      <DependentUpon>ExtentHistoryWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\FeatureInfoWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\FeatureInfoWidgetCtrl.Designer.cs">
+      <DependentUpon>FeatureInfoWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\GenericWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\GenericWidgetCtrl.Designer.cs">
+      <DependentUpon>GenericWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\HelpWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\HelpWidgetCtrl.Designer.cs">
+      <DependentUpon>HelpWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\InitialMapViewWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\InitialMapViewWidgetCtrl.Designer.cs">
+      <DependentUpon>InitialMapViewWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\InvokeScriptWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\InvokeScriptWidgetCtrl.Designer.cs">
+      <DependentUpon>InvokeScriptWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\IWidgetEditor.cs" />
+    <Compile Include="Fusion\WidgetEditors\LegendWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\LegendWidgetCtrl.Designer.cs">
+      <DependentUpon>LegendWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\LinkToViewWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\LinkToViewWidgetCtrl.Designer.cs">
+      <DependentUpon>LinkToViewWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\MapMenuWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\MapMenuWidgetCtrl.Designer.cs">
+      <DependentUpon>MapMenuWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\MapTipWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\MapTipWidgetCtrl.Designer.cs">
+      <DependentUpon>MapTipWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\MeasureWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\MeasureWidgetCtrl.Designer.cs">
+      <DependentUpon>MeasureWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\NavigatorWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\NavigatorWidgetCtrl.Designer.cs">
+      <DependentUpon>NavigatorWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\PanWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\PanWidgetCtrl.Designer.cs">
+      <DependentUpon>PanWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\RefreshMapWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\RefreshMapWidgetCtrl.Designer.cs">
+      <DependentUpon>RefreshMapWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\SelectionPanelWidgetCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\SelectionPanelWidgetCtrl.Designer.cs">
+      <DependentUpon>SelectionPanelWidgetCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\WidgetEditorBase.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetEditors\WidgetEditorBase.Designer.cs">
+      <DependentUpon>WidgetEditorBase.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Fusion\WidgetSettingsCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Fusion\WidgetSettingsCtrl.Designer.cs">
+      <DependentUpon>WidgetSettingsCtrl.cs</DependentUpon>
+    </Compile>
     <Compile Include="Generic\ResourceDataPanel.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -726,6 +902,72 @@
       <DependentUpon>ShpFileCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\FlexibleLayoutEditor.resx">
+      <DependentUpon>FlexibleLayoutEditor.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\FlexLayoutSettingsCtrl.resx">
+      <DependentUpon>FlexLayoutSettingsCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\MapSettingsCtrl.resx">
+      <DependentUpon>MapSettingsCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\AboutWidgetCtrl.resx">
+      <DependentUpon>AboutWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\ActivityIndicatorWidgetCtrl.resx">
+      <DependentUpon>ActivityIndicatorWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\BufferPanelWidgetCtrl.resx">
+      <DependentUpon>BufferPanelWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\BufferWidgetCtrl.resx">
+      <DependentUpon>BufferWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\ColorPickerWidgetCtrl.resx">
+      <DependentUpon>ColorPickerWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\CursorPositionWidgetCtrl.resx">
+      <DependentUpon>CursorPositionWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\EditableScaleWidgetCtrl.resx">
+      <DependentUpon>EditableScaleWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\ExtentHistoryWidgetCtrl.resx">
+      <DependentUpon>ExtentHistoryWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\FeatureInfoWidgetCtrl.resx">
+      <DependentUpon>FeatureInfoWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\GenericWidgetCtrl.resx">
+      <DependentUpon>GenericWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\HelpWidgetCtrl.resx">
+      <DependentUpon>HelpWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\InitialMapViewWidgetCtrl.resx">
+      <DependentUpon>InitialMapViewWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\InvokeScriptWidgetCtrl.resx">
+      <DependentUpon>InvokeScriptWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\LegendWidgetCtrl.resx">
+      <DependentUpon>LegendWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\MapMenuWidgetCtrl.resx">
+      <DependentUpon>MapMenuWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\MapTipWidgetCtrl.resx">
+      <DependentUpon>MapTipWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\MeasureWidgetCtrl.resx">
+      <DependentUpon>MeasureWidgetCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetEditors\WidgetEditorBase.resx">
+      <DependentUpon>WidgetEditorBase.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Fusion\WidgetSettingsCtrl.resx">
+      <DependentUpon>WidgetSettingsCtrl.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Generic\ResourceDataPanel.resx">
       <DependentUpon>ResourceDataPanel.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -1412,6 +1654,15 @@
     <Content Include="FsEditorMap.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <None Include="Resources\gear--plus.png" />
+    <None Include="Resources\gear--pencil.png" />
+    <None Include="Resources\gear--minus.png" />
+    <None Include="Resources\gear--exclamation.png" />
+    <None Include="Resources\gear--arrow.png" />
+    <None Include="Resources\gear.png" />
+    <None Include="Resources\map--plus.png" />
+    <None Include="Resources\map--minus.png" />
+    <None Include="Resources\question-frame.png" />
     <None Include="Resources\map--arrow.png" />
   </ItemGroup>
   <ItemGroup>

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -703,6 +703,48 @@
             }
         }
         
+        internal static System.Drawing.Bitmap gear {
+            get {
+                object obj = ResourceManager.GetObject("gear", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap gear__arrow {
+            get {
+                object obj = ResourceManager.GetObject("gear--arrow", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap gear__exclamation {
+            get {
+                object obj = ResourceManager.GetObject("gear--exclamation", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap gear__minus {
+            get {
+                object obj = ResourceManager.GetObject("gear--minus", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap gear__pencil {
+            get {
+                object obj = ResourceManager.GetObject("gear--pencil", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap gear__plus {
+            get {
+                object obj = ResourceManager.GetObject("gear--plus", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to An error occured: {0}.
         /// </summary>
@@ -1321,6 +1363,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to This connection is not compatible.
+        /// </summary>
+        internal static string IncompatibleConnection {
+            get {
+                return ResourceManager.GetString("IncompatibleConnection", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to infinite.
         /// </summary>
         internal static string InfiniteValue {
@@ -1513,6 +1564,20 @@
             }
         }
         
+        internal static System.Drawing.Bitmap map__minus {
+            get {
+                object obj = ResourceManager.GetObject("map--minus", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap map__plus {
+            get {
+                object obj = ResourceManager.GetObject("map--plus", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap MgCooker {
             get {
                 object obj = ResourceManager.GetObject("MgCooker", resourceCulture);
@@ -1665,6 +1730,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to The specified editor does not implement the required IWidgetEditor interface.
+        /// </summary>
+        internal static string NoWidgetEditorIface {
+            get {
+                return ResourceManager.GetString("NoWidgetEditorIface", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Operation Cancelled.
         /// </summary>
         internal static string OperationCancelled {
@@ -2207,6 +2281,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Widget updated.
+        /// </summary>
+        internal static string WidgetUpdated {
+            get {
+                return ResourceManager.GetString("WidgetUpdated", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Document is valid.
         /// </summary>
         internal static string XmlDocIsValid {

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-11-08 14:40:03 UTC (rev 5376)
@@ -128,8 +128,8 @@
   <data name="minus-circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\minus-circle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_tasks" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_tasks.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="map--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\map--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="layer--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\layer--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -154,11 +154,14 @@
   <data name="tick-circle-frame" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\tick-circle-frame.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="icon_printablepage_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_printablepage_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="application--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\application--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_printablepage_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_printablepage_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="NotAFolder" xml:space="preserve">
+    <value>Not a folder: {0}</value>
   </data>
   <data name="icon_refreshmap_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_refreshmap_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -166,12 +169,18 @@
   <data name="block" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\block.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_print" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_print.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="InvalidResourceIdFolder" xml:space="preserve">
+    <value>Must be valid resource id. Cannot be a folder</value>
   </data>
+  <data name="icon_tasks" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_tasks.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="icon_forward_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_forward_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="ui_splitter_horizontal" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\ui-splitter-horizontal.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="SaveResourceFirst" xml:space="preserve">
     <value>Please save this resource first</value>
   </data>
@@ -181,24 +190,25 @@
   <data name="control" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\control.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="sql" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sql.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="icon_zoomout_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_zoomout_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="PackageReadError" xml:space="preserve">
-    <value>Failed to read package. Error message was: {0}</value>
-    <comment>A message displayed when the package could not be read</comment>
-  </data>
   <data name="sql-join-left" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\sql-join-left.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="document--pencil" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\document--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FiletypeZip" xml:space="preserve">
+    <value>Zip files ({0})</value>
+    <comment>The text displayed when browsing for zip files</comment>
   </data>
   <data name="magnifier" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\magnifier.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_zoomin_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_zoomin_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="NewFolder" xml:space="preserve">
+    <value>New folder</value>
+    <comment>The default name of a new folder</comment>
   </data>
   <data name="grid" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\grid.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -212,9 +222,6 @@
   <data name="cross-circle-frame" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\cross-circle-frame.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="AggregateQuery" xml:space="preserve">
-    <value>Aggregate Query</value>
-  </data>
   <data name="server" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -225,26 +232,26 @@
     <value>infinite</value>
     <comment>A value that is displayed when the value assigned is infinite</comment>
   </data>
+  <data name="RequiredServiceNotSupported" xml:space="preserve">
+    <value>This connection does not support required service: </value>
+  </data>
   <data name="OperationCompleted" xml:space="preserve">
     <value>Operation Completed</value>
   </data>
-  <data name="arrow-return-180" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-return-180.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="LastUpdated" xml:space="preserve">
+    <value>Last Updated: </value>
   </data>
   <data name="InvalidResourceId" xml:space="preserve">
     <value>Not a valid resource identifier</value>
   </data>
-  <data name="layers-stack-arrange" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\layers-stack-arrange.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="document--pencil" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\document--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_selectwithin_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_selectwithin_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="layer--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\layer--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="question" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\question.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="AggregateQuery" xml:space="preserve">
+    <value>Aggregate Query</value>
   </data>
   <data name="icon_zoomin" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_zoomin.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -264,8 +271,8 @@
   <data name="icon_popupscrolldown_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_popupscrolldown_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="InvokeScriptCmdDescription" xml:space="preserve">
-    <value>Invoke Script Command</value>
+  <data name="SpecifySecondaryFeatureSource" xml:space="preserve">
+    <value>Please specify the secondary feature source</value>
   </data>
   <data name="globe--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\globe--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -286,6 +293,9 @@
   <data name="icon_selectwithin" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_selectwithin.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="DeleteCommand" xml:space="preserve">
+    <value>Delete Command</value>
+  </data>
   <data name="sql-join-right" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\sql-join-right.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -295,10 +305,8 @@
   <data name="OperationCancelled" xml:space="preserve">
     <value>Operation Cancelled</value>
   </data>
-  <data name="TooMuchDataWarning" xml:space="preserve">
-    <value>The selected column contains more than {0} different values.
-The calculated averages only accounts for the first {0} distinct values.</value>
-    <comment>A warning message that is displayed if the dataset is too large</comment>
+  <data name="icon_plotdwf" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_plotdwf.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="TooManyRulesWarning" xml:space="preserve">
     <value>You are creating a large number of rules, this will likely result in Maestro becoming unresponsive.
@@ -314,6 +322,9 @@
   <data name="document-copy" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\document-copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="FilterSqlite" xml:space="preserve">
+    <value>SQLite files|*.sqlite;*.db;*.sdx;*.slt</value>
+  </data>
   <data name="InvalidRestorePathError" xml:space="preserve">
     <value>An error occured while validating the restore path: {0}\nIt should have the format: \"Libray://folder/folder/\".</value>
     <comment>A message that is displayed when the restore path does not validate</comment>
@@ -332,9 +343,13 @@
   <data name="icon_fitwindow" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_fitwindow.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="SaveResource" xml:space="preserve">
-    <value>Save Resource</value>
+  <data name="InvalidValueError" xml:space="preserve">
+    <value>Invalid value</value>
+    <comment>An error message that is displayed when the entered value is invalid</comment>
   </data>
+  <data name="UnitsKb" xml:space="preserve">
+    <value>KB</value>
+  </data>
   <data name="icon_popupscrollup" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_popupscrollup.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -351,15 +366,18 @@
   <data name="TestConnectionNoErrors" xml:space="preserve">
     <value>Provider reported no errors</value>
   </data>
-  <data name="icon_zoomrect" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_zoomrect.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="icon_selectpolygon" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_selectpolygon.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="StandardQuery" xml:space="preserve">
+    <value>Standard Query</value>
+  </data>
   <data name="FileDownloaded" xml:space="preserve">
     <value>File Downloaded</value>
   </data>
+  <data name="map--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\map--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="NoTypesSelected" xml:space="preserve">
     <value>You must select at least one type</value>
     <comment>A message that is displayed when the user has not selected any resource types</comment>
@@ -373,13 +391,13 @@
   <data name="globe--pencil" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\globe--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_plotdwf" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_plotdwf.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="UnknownResourceTypes" xml:space="preserve">
     <value>Unknown types</value>
     <comment>The list entry that represents unknown resource types</comment>
   </data>
+  <data name="icon_zoomin_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_zoomin_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="icon_panright" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_panright.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -393,6 +411,9 @@
   <data name="icon_restorecenter_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_restorecenter_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="map--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\map--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="icon_tasks_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_tasks_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -424,12 +445,21 @@
   <data name="application-import" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\application-import.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="NewLayerGroup" xml:space="preserve">
+    <value>New Layer Group</value>
+  </data>
   <data name="MoreColorsName" xml:space="preserve">
     <value>More colors...</value>
   </data>
   <data name="globe--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\globe--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="arrow-circle-135" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-circle-135.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="FindNothing" xml:space="preserve">
+    <value>Could not find specified string or end of document reached</value>
+  </data>
   <data name="OutputFileMissing" xml:space="preserve">
     <value>You must enter a full path to the output file</value>
     <comment>A message that is displayed when the user has not entered an output file</comment>
@@ -442,12 +472,19 @@
     <value>Expression...</value>
     <comment>A value displayed in the combobox to activate the expression builder</comment>
   </data>
+  <data name="UnitsMs" xml:space="preserve">
+    <value>ms</value>
+  </data>
   <data name="databases-relation" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\databases-relation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_zoomnext" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_zoomnext.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="ValidateOutputfileError" xml:space="preserve">
+    <value>An error occured while validating the output file path: {0}</value>
+    <comment>A message that is displayed to the user when the output path is invalid</comment>
   </data>
+  <data name="arrow-return-180" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-return-180.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="arrow-curve-180-left" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\arrow-curve-180-left.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -465,10 +502,6 @@
     <value>You have entered a non-numeric value in the Reference Y field. Due to a bug in MapGuide, this will likely give an error when saving.</value>
     <comment>An error message that is displayed if the user attempts to use an expression as the InsertionPointY value (caused by an xsd bug in MapGuide)</comment>
   </data>
-  <data name="NewFolder" xml:space="preserve">
-    <value>New folder</value>
-    <comment>The default name of a new folder</comment>
-  </data>
   <data name="icon_copy_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_copy_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -476,15 +509,20 @@
     <value>The selected column had no non-null values and cannot be used.</value>
     <comment>An error message that is displayed if the user selects a column with no valid data</comment>
   </data>
-  <data name="FiletypeZip" xml:space="preserve">
-    <value>Zip files ({0})</value>
-    <comment>The text displayed when browsing for zip files</comment>
+  <data name="SaveResource" xml:space="preserve">
+    <value>Save Resource</value>
   </data>
+  <data name="icon_zoom_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_zoom_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="PropertyTooltip" xml:space="preserve">
     <value>Property: {0}
 Type: {1}</value>
     <comment>The tooltip displayed in the text editor when the cursor is over a property</comment>
   </data>
+  <data name="UnitsSeconds" xml:space="preserve">
+    <value>s</value>
+  </data>
   <data name="icon_help" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_help.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -495,8 +533,8 @@
     <value>An error occured while copying file: {0}</value>
     <comment>A message displayed when a file copy fails</comment>
   </data>
-  <data name="icon_measure" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_measure.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="layers-stack-arrange" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\layers-stack-arrange.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="RepositoryWipeWarning" xml:space="preserve">
     <value>You have selected to restore the package at the root.
@@ -523,8 +561,10 @@
   <data name="FindReplaceNothing" xml:space="preserve">
     <value>Nothing to replace</value>
   </data>
-  <data name="icon_buffer" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_buffer.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="TooMuchDataWarning" xml:space="preserve">
+    <value>The selected column contains more than {0} different values.
+The calculated averages only accounts for the first {0} distinct values.</value>
+    <comment>A warning message that is displayed if the dataset is too large</comment>
   </data>
   <data name="control-stop-square" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\control-stop-square.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -580,6 +620,12 @@
     <value>Missing column "{0}"</value>
     <comment>An error message that is displayed if the file is missing a required column</comment>
   </data>
+  <data name="UnknownQueryMode" xml:space="preserve">
+    <value>Unknown query mode</value>
+  </data>
+  <data name="OverwriteDisplayScales" xml:space="preserve">
+    <value>Overwrite the current display scales?</value>
+  </data>
   <data name="PackageBuildError" xml:space="preserve">
     <value>An error occured while building package: {0}</value>
     <comment>A message displayed when the package creation fails</comment>
@@ -604,6 +650,12 @@
   <data name="NoActiveDataFile" xml:space="preserve">
     <value>No active resource data file selected</value>
   </data>
+  <data name="SelectFeatureClass" xml:space="preserve">
+    <value>Select Feature Class</value>
+  </data>
+  <data name="icon_zoomnext" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_zoomnext.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="icon_zoomprev_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_zoomprev_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -620,8 +672,8 @@
   <data name="globe--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\globe--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="DeleteCommand" xml:space="preserve">
-    <value>Delete Command</value>
+  <data name="icon_selectwithin_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_selectwithin_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="icon_selectradius" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_selectradius.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -641,8 +693,8 @@
   <data name="FilterAll" xml:space="preserve">
     <value>All File Types (*.*)|*.*</value>
   </data>
-  <data name="ui_splitter_horizontal" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\ui-splitter-horizontal.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="Confirm" xml:space="preserve">
+    <value>Confirm</value>
   </data>
   <data name="folder_horizontal" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\folder-horizontal.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -650,12 +702,9 @@
   <data name="icon_ctxarrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_ctxarrow.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="InvalidResourceIdFolder" xml:space="preserve">
-    <value>Must be valid resource id. Cannot be a folder</value>
+  <data name="icon_measure" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_measure.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="ColorBrewer" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\ColorBrewer.csv;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
-  </data>
   <data name="FilenameValidationError" xml:space="preserve">
     <value>Failed to validate the filenames: {0}</value>
     <comment>A message displayed when the user enters an invalid filename</comment>
@@ -663,18 +712,17 @@
   <data name="table" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\table.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="exclamation" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\exclamation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="question" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\question.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="FindNothing" xml:space="preserve">
-    <value>Could not find specified string or end of document reached</value>
+  <data name="icon_zoomrect" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_zoomrect.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="icon_panup" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_panup.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="TooManyValuesError" xml:space="preserve">
-    <value>The selected column contains more than {0} different values, and thus cannot be used for theming</value>
-    <comment>An error message that is displayed if the selected column has too many distinct values</comment>
+  <data name="BaseLayerGroup" xml:space="preserve">
+    <value>Base Layer Group</value>
   </data>
   <data name="icon_print_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_print_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -718,12 +766,16 @@
     <value>Invalid column name</value>
     <comment>An error message that is displayed when the column selected does not exist</comment>
   </data>
-  <data name="SearchCmdDescription" xml:space="preserve">
-    <value>Search Command</value>
+  <data name="icon_print" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_print.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="FilterShp" xml:space="preserve">
     <value>ESRI Shape File (*.shp)|*.*</value>
   </data>
+  <data name="QuestionAddItemToFlyout" xml:space="preserve">
+    <value>Add this item to the flyout? Clicking "No" will add it before the flyout</value>
+    <comment>A question to confirm whether dropping a menu item on a flyout will add it to the flyout or before the flyout</comment>
+  </data>
   <data name="XmlEditorCursorTemplate" xml:space="preserve">
     <value>Line {0}, Column {1}</value>
   </data>
@@ -739,16 +791,17 @@
   <data name="FsPostgreSql" xml:space="preserve">
     <value>PostgreSQL/PostGIS Feature Source</value>
   </data>
+  <data name="NewLayer" xml:space="preserve">
+    <value>New Layer</value>
+  </data>
+  <data name="TooManyValuesError" xml:space="preserve">
+    <value>The selected column contains more than {0} different values, and thus cannot be used for theming</value>
+    <comment>An error message that is displayed if the selected column has too many distinct values</comment>
+  </data>
   <data name="DivergingName" xml:space="preserve">
     <value>Diverging</value>
     <comment>A display name for the Diverging data type</comment>
   </data>
-  <data name="arrow-circle-135" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-circle-135.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-  <data name="icon_zoom_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_zoom_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="icon_invokeurl" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_invokeurl.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -765,14 +818,22 @@
     <value>Invalid field count in line {0}</value>
     <comment>An error message that is displayed if the file has an invalid field count</comment>
   </data>
-  <data name="LessThanLabel" xml:space="preserve">
-    <value>Less than {0}</value>
-    <comment>The label used for the lowest value in the graduated theme set</comment>
+  <data name="icon_buffer" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_buffer.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="arrow-090" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-090.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="AllResourceTypes" xml:space="preserve">
     <value>All types</value>
     <comment>The list entry that represents all resource types</comment>
   </data>
+  <data name="SelectSymbolLibraryFirst" xml:space="preserve">
+    <value>Please specify the symbol library first</value>
+  </data>
+  <data name="NoSiteService" xml:space="preserve">
+    <value>No site service available</value>
+  </data>
   <data name="icon_forward" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_forward.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -794,18 +855,28 @@
   <data name="icon_zoomnext_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_zoomnext_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="LessThanLabel" xml:space="preserve">
+    <value>Less than {0}</value>
+    <comment>The label used for the lowest value in the graduated theme set</comment>
+  </data>
   <data name="icon_null" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_null.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="icon_panleft_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_panleft_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="SelectLayer" xml:space="preserve">
+    <value>Select Layer</value>
+  </data>
   <data name="function" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\function.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="icon_zoom" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_zoom.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="exclamation" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\exclamation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="OverwriteResource" xml:space="preserve">
     <value>This resource already exists, continue with save?</value>
     <comment>Question similar to the standard response of saving to an exisiting file using the regular save file dialog</comment>
@@ -816,8 +887,8 @@
   <data name="LoadProcedureVersionExecutionNotSupported" xml:space="preserve">
     <value>This connection does not support executing this type of Load Procedure</value>
   </data>
-  <data name="StandardQuery" xml:space="preserve">
-    <value>Standard Query</value>
+  <data name="IncompatibleConnection" xml:space="preserve">
+    <value>This connection is not compatible</value>
   </data>
   <data name="InvalidColorComponent" xml:space="preserve">
     <value>Invalid {0} color component {1} in line {2}</value>
@@ -833,26 +904,34 @@
   <data name="tick" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\tick.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="FilterDwf" xml:space="preserve">
+    <value>Autodesk DWF (*.dwf)|*.dwf</value>
+  </data>
+  <data name="SearchCmdDescription" xml:space="preserve">
+    <value>Search Command</value>
+  </data>
+  <data name="SpecifyMapForWebLayout" xml:space="preserve">
+    <value>Specify a map for this web layout</value>
+  </data>
   <data name="icon_invokescript_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_invokescript_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="sql-join-inner" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\sql-join-inner.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="InvalidValueError" xml:space="preserve">
-    <value>Invalid value</value>
-    <comment>An error message that is displayed when the entered value is invalid</comment>
+  <data name="PackageReadError" xml:space="preserve">
+    <value>Failed to read package. Error message was: {0}</value>
+    <comment>A message displayed when the package could not be read</comment>
   </data>
-  <data name="sql" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\sql.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="ColorBrewer" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\ColorBrewer.csv;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
   </data>
-  <data name="ValidateOutputfileError" xml:space="preserve">
-    <value>An error occured while validating the output file path: {0}</value>
-    <comment>A message that is displayed to the user when the output path is invalid</comment>
-  </data>
   <data name="FsSqlServerSpatial" xml:space="preserve">
     <value>SQL Server Spatial Feature Source</value>
   </data>
+  <data name="NewFlyout" xml:space="preserve">
+    <value>New Flyout</value>
+  </data>
   <data name="layers-stack-arrange-back" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\layers-stack-arrange-back.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -901,8 +980,8 @@
   <data name="database--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\database--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="arrow-090" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-090.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="InvokeScriptCmdDescription" xml:space="preserve">
+    <value>Invoke Script Command</value>
   </data>
   <data name="cross" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\cross.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -925,74 +1004,28 @@
   <data name="icon_copy" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_copy.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="map--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\map--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="gear" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\gear.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="NewLayerGroup" xml:space="preserve">
-    <value>New Layer Group</value>
+  <data name="gear--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\gear--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="NewLayer" xml:space="preserve">
-    <value>New Layer</value>
+  <data name="gear--exclamation" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\gear--exclamation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="Confirm" xml:space="preserve">
-    <value>Confirm</value>
+  <data name="gear--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\gear--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="OverwriteDisplayScales" xml:space="preserve">
-    <value>Overwrite the current display scales?</value>
+  <data name="gear--pencil" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\gear--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="BaseLayerGroup" xml:space="preserve">
-    <value>Base Layer Group</value>
+  <data name="gear--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\gear--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="SelectSymbolLibraryFirst" xml:space="preserve">
-    <value>Please specify the symbol library first</value>
+  <data name="NoWidgetEditorIface" xml:space="preserve">
+    <value>The specified editor does not implement the required IWidgetEditor interface</value>
   </data>
-  <data name="FilterDwf" xml:space="preserve">
-    <value>Autodesk DWF (*.dwf)|*.dwf</value>
+  <data name="WidgetUpdated" xml:space="preserve">
+    <value>Widget updated</value>
   </data>
-  <data name="FilterSqlite" xml:space="preserve">
-    <value>SQLite files|*.sqlite;*.db;*.sdx;*.slt</value>
-  </data>
-  <data name="NewFlyout" xml:space="preserve">
-    <value>New Flyout</value>
-  </data>
-  <data name="QuestionAddItemToFlyout" xml:space="preserve">
-    <value>Add this item to the flyout? Clicking "No" will add it before the flyout</value>
-    <comment>A question to confirm whether dropping a menu item on a flyout will add it to the flyout or before the flyout</comment>
-  </data>
-  <data name="SpecifyMapForWebLayout" xml:space="preserve">
-    <value>Specify a map for this web layout</value>
-  </data>
-  <data name="SelectLayer" xml:space="preserve">
-    <value>Select Layer</value>
-  </data>
-  <data name="SelectFeatureClass" xml:space="preserve">
-    <value>Select Feature Class</value>
-  </data>
-  <data name="SpecifySecondaryFeatureSource" xml:space="preserve">
-    <value>Please specify the secondary feature source</value>
-  </data>
-  <data name="LastUpdated" xml:space="preserve">
-    <value>Last Updated: </value>
-  </data>
-  <data name="UnitsKb" xml:space="preserve">
-    <value>KB</value>
-  </data>
-  <data name="UnitsMs" xml:space="preserve">
-    <value>ms</value>
-  </data>
-  <data name="UnitsSeconds" xml:space="preserve">
-    <value>s</value>
-  </data>
-  <data name="NoSiteService" xml:space="preserve">
-    <value>No site service available</value>
-  </data>
-  <data name="NotAFolder" xml:space="preserve">
-    <value>Not a folder: {0}</value>
-  </data>
-  <data name="RequiredServiceNotSupported" xml:space="preserve">
-    <value>This connection does not support required service: </value>
-  </data>
-  <data name="UnknownQueryMode" xml:space="preserve">
-    <value>Unknown query mode</value>
-  </data>
 </root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--arrow.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--arrow.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--exclamation.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--exclamation.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--minus.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--minus.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--pencil.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--pencil.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--plus.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/gear--plus.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/gear.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/gear.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/map--minus.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/map--minus.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/map--plus.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/map--plus.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/question-frame.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/question-frame.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/MaestroAPITests/App.config
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/App.config	                        (rev 0)
+++ sandbox/maestro-3.0/MaestroAPITests/App.config	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <system.net>
+        <defaultProxy>
+            <proxy bypassonlocal="false" usesystemdefault="true" />
+        </defaultProxy>
+    </system.net>
+</configuration>
\ No newline at end of file

Modified: sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj	2010-11-08 14:40:03 UTC (rev 5376)
@@ -90,6 +90,7 @@
     <None Include="Resources\SelectFeatureSample.xml" />
   </ItemGroup>
   <ItemGroup>
+    <None Include="App.config" />
     <None Include="Resources\SelectSqlSample.xml" />
     <None Include="TestData\DrawingService\CorruptedDwf.dwf">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>

Modified: sandbox/maestro-3.0/MaestroAPITests/ResourceTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/ResourceTests.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/MaestroAPITests/ResourceTests.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -52,7 +52,7 @@
             _mocks = new Mockery();
             var conn = _mocks.NewMock<IServerConnection>();
 
-            var app = new ApplicationDefinitionType();
+            var app = ObjectFactory.CreateFlexibleLayout(conn);
             var app2 = app.Clone();
             Assert.AreNotSame(app, app2);
 

Modified: sandbox/maestro-3.0/MaestroAPITests/RuntimeMapTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/RuntimeMapTests.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/MaestroAPITests/RuntimeMapTests.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -165,23 +165,23 @@
             var mapSvc = _conn.GetService((int)ServiceType.Mapping) as IMappingService;
             Assert.NotNull(mapSvc);
 
-            var map = mapSvc.CreateMap("Session:" + _conn.SessionID + "//TestCreate1.Map", mdf);
-            var map2 = mapSvc.CreateMap("Session:" + _conn.SessionID + "//TestCreate2.Map", "Library://UnitTests/Maps/Sheboygan.MapDefinition");
-            var map3 = mapSvc.CreateMap("Library://UnitTests/Maps/Sheboygan.MapDefinition");
+            var map = mapSvc.CreateMap("Session:" + _conn.SessionID + "//TestCreate1.Map", mdf, 1.0);
+            var map2 = mapSvc.CreateMap("Session:" + _conn.SessionID + "//TestCreate2.Map", "Library://UnitTests/Maps/Sheboygan.MapDefinition", 1.0);
+            //var map3 = mapSvc.CreateMap("Library://UnitTests/Maps/Sheboygan.MapDefinition", 1.0);
 
             Assert.NotNull(map);
             Assert.NotNull(map2);
-            Assert.NotNull(map3);
+            //Assert.NotNull(map3);
 
             //Check resource ids
-            Assert.IsTrue(!string.IsNullOrEmpty(map3.ResourceID));
+            //Assert.IsTrue(!string.IsNullOrEmpty(map3.ResourceID));
             Assert.AreEqual("Session:" + _conn.SessionID + "//TestCreate1.Map", map.ResourceID);
             Assert.AreEqual("Session:" + _conn.SessionID + "//TestCreate2.Map", map2.ResourceID);
 
             //Check layer/group structure
             Assert.IsTrue(Matches(map, mdf));
             Assert.IsTrue(Matches(map2, mdf));
-            Assert.IsTrue(Matches(map3, mdf));
+            //Assert.IsTrue(Matches(map3, mdf));
         }
 
         private bool Matches(RuntimeMap map, IMapDefinition mdf)
@@ -232,7 +232,7 @@
             Assert.NotNull(mdf);
 
             var mid = "Session:" + _conn.SessionID + "//TestSave.Map";
-            var map = mapSvc.CreateMap(mid, mdf);
+            var map = mapSvc.CreateMap(mid, mdf, 1.0);
             //Doesn't exist yet because save isn't called
             Assert.IsTrue(!resSvc.ResourceExists(mid));
             
@@ -295,9 +295,20 @@
             var mdf = resSvc.GetResource("Library://UnitTests/Maps/Sheboygan.MapDefinition") as IMapDefinition;
             Assert.NotNull(mdf);
 
+            //FIXME: We have a problem. Can we calculate this value without MgCoordinateSystem and just using the WKT?
+            //The answer to this will answer whether we can actually support the Rendering Service API over http 
+            //using pure client-side runtime maps 
+            //
+            //The hard-coded value here was the output of MgCoordinateSystem.ConvertCoordinateSystemUnitsToMeters(1.0)
+            //for this particular map.
+            double metersPerUnit = 111319.490793274;
+
             var mid = "Session:" + _conn.SessionID + "//TestRender75k.Map";
-            var map = mapSvc.CreateMap(mid, mdf);
+            var map = mapSvc.CreateMap(mid, mdf, metersPerUnit);
             map.ViewScale = 75000;
+            map.DisplayWidth = 1024;
+            map.DisplayHeight = 1024;
+            map.DisplayDpi = 96;
 
             //Doesn't exist yet because save isn't called
             Assert.IsTrue(!resSvc.ResourceExists(mid));
@@ -355,11 +366,11 @@
                 }
             }
 
-            //Turn parcels back on
+            //Turn Rail back on
             rail = null;
             rail = map.GetLayerByName("Rail");
             Assert.NotNull(rail);
-            rail.Visible = false;
+            rail.Visible = true;
             map.Save();
 
             //Render again
@@ -399,9 +410,20 @@
             var mdf = resSvc.GetResource("Library://UnitTests/Maps/Sheboygan.MapDefinition") as IMapDefinition;
             Assert.NotNull(mdf);
 
+            //FIXME: We have a problem. Can we calculate this value without MgCoordinateSystem and just using the WKT?
+            //The answer to this will answer whether we can actually support the Rendering Service API over http 
+            //using pure client-side runtime maps 
+            //
+            //The hard-coded value here was the output of MgCoordinateSystem.ConvertCoordinateSystemUnitsToMeters(1.0)
+            //for this particular map.
+            double metersPerUnit = 111319.490793274;
+
             var mid = "Session:" + _conn.SessionID + "//TestRender12k.Map";
-            var map = mapSvc.CreateMap(mid, mdf);
+            var map = mapSvc.CreateMap(mid, mdf, metersPerUnit);
             map.ViewScale = 12000;
+            map.DisplayWidth = 1024;
+            map.DisplayHeight = 1024;
+            map.DisplayDpi = 96;
 
             //Doesn't exist yet because save isn't called
             Assert.IsTrue(!resSvc.ResourceExists(mid));
@@ -463,7 +485,7 @@
             parcels = null;
             parcels = map.GetLayerByName("Parcels");
             Assert.NotNull(parcels);
-            parcels.Visible = false;
+            parcels.Visible = true;
             map.Save();
 
             //Render again
@@ -497,7 +519,7 @@
         protected override IServerConnection CreateTestConnection()
         {
             return ConnectionProviderRegistry.CreateConnection("Maestro.Http",
-                "Url", "http://localhost/mapguide/mapagent/mapagent.fcgi",
+                "Url", "http://" + Environment.MachineName + "/mapguide/mapagent/mapagent.fcgi",
                 "Username", "Administrator",
                 "Password", "admin");
         }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -58,6 +58,10 @@
     }
 
     /// <summary>
+    /// The entry point of the Maestro API. The <see cref="ConnectionProviderRegistry"/> is used to create <see cref="IServerConnection"/>
+    /// objects. <see cref="IServerConnection"/> is the root object of the Maestro API, and is where most of the functionality provided
+    /// by this API is accessed from.
+    /// 
     /// The <see cref="ConnectionProviderRegistry"/> supports dynamic creation of <see cref="IServerConnection"/> objects given a provider name
     /// and a connection string, which specifies the initialization parameters of the connection. The connection providers are defined in an XML
     /// file called ConnectionProviders.xml which contains all the registered providers. Each provider has the following properties:
@@ -70,6 +74,25 @@
     /// a <see cref="System.Collections.Specialized.NameValueCollection"/> containing the initialization parameters parsed from the given connection
     /// string.
     /// </summary>
+    /// <example>
+    /// This example shows how to create a http-based MapGuide Server connection to the server's mapagent interface.
+    /// <code>
+    /// IServerConnection conn = ConnectionProviderRegistry.CreateConnection("Maestro.Http",
+    ///     "Url", "http://localhost/mapguide/mapagent/mapagent.fcgi",
+    ///     "Username", "Administrator",
+    ///     "Password", "admin");
+    /// 
+    /// </code>
+    /// </example>
+    /// <example>
+    /// This example shows how to create a TCP/IP connection that wraps the official MapGuide API
+    /// <code>
+    /// IServerConnection conn = ConnectionProviderRegistry.CreateConnection("Maestro.LocalNative",
+    ///     "ConfigFile", "webconfig.ini",
+    ///     "Username", "Administrator",
+    ///     "Password", "admin");
+    /// </code>
+    /// </example>
     public sealed class ConnectionProviderRegistry
     {
         const string PROVIDER_CONFIG = "ConnectionProviders.xml";

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionFeatureReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionFeatureReader.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionFeatureReader.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -76,7 +76,7 @@
         }
 
         /// <summary>
-        /// Closes the internal.
+        /// Closes the reader and its internal reader.
         /// </summary>
         protected override void CloseInternal()
         {
@@ -133,7 +133,8 @@
         }
 
         /// <summary>
-        /// Evaluates the specified expression returning a strongly-typed value
+        /// Evaluates the specified expression returning a strongly-typed value. The specified expression
+        /// must evaluate to the type parameter specified (or inferred) in the call.
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="expression"></param>

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -28,7 +28,20 @@
 namespace OSGeo.MapGuide.MaestroAPI
 {
     /// <summary>
-    /// MapGuide Platform connection interface
+    /// MapGuide Platform connection interface. This is the root object of the Maestro API which typically 
+    /// represents a session with a MapGuide Server. Connections are created through the 
+    /// <see cref="OSGeo.MapGuide.MaestroAPI.ConnectionProviderRegistry"/> class.
+    /// 
+    /// All implementations supports the base services of the MapGuide Geospatial API:
+    ///  - Resource Service (<see cref="OSGeo.MapGuide.MaestroAPI.Services.IResourceService"/>) for manipulation of repositories and resources
+    ///  - Feature Service (<see cref="OSGeo.MapGuide.MaestroAPI.Services.IFeatureService"/>) an abstraction layer for querying feature data in 
+    ///  technology-independent manner.
+    ///  - Coordinate System Catalog (<see cref="OSGeo.MapGuide.MaestroAPI.CoordinateSystem.ICoordinateSystemCatalog"/> for querying coordinate 
+    ///  systems and for translating WKT, cs code and EPSG codes to other forms
+    ///  
+    /// Additional services are supported at various levels depending on the implementation. 
+    /// The <see cref="OSGeo.MapGuide.MaestroAPI.IServerConnection.Capabilities"/> property provides information about 
+    /// what features, services and resource types are not supported.
     /// </summary>
     public interface IServerConnection
     {
@@ -89,7 +102,7 @@
         bool AutoRestartSession { get; set; }
 
         /// <summary>
-        /// Creates the service based on the given type
+        /// Gets the service based on the given type
         /// </summary>
         /// <param name="serviceType"></param>
         /// <returns></returns>

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMap.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMap.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMap.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -31,9 +31,75 @@
 
 namespace OSGeo.MapGuide.MaestroAPI.Mapping
 {
+    //TODO: Verify the code examples here :)
+
     /// <summary>
     /// Represents a runtime instance of a Map Definition
     /// </summary>
+    /// <remarks>
+    /// If you want to use this instance with the Rendering Service APIs, it is important to set the correct
+    /// meters per unit value before calling the <see cref="OSGeo.MapGuide.MaestroAPI.Mapping.RuntimeMap.Save"/> method, as an incorrect meters
+    /// per unit value will produce incorrect images. 
+    /// </remarks>
+    /// <example>
+    /// How to create a <see cref="RuntimeMap"/> with the correct meters per unit value using the MgCoordinateSystem API
+    /// <code>
+    /// 
+    ///     IServerConnection conn = ConnectionProviderRegistry.CreateConnection("Maestro.Http", 
+    ///         "Username", "Administrator",
+    ///         "Password", "admin",
+    ///         "Url", "http://localhost/mapguide/mapagent/mapagent.fcgi");
+    ///         
+    ///     //Create the Mapping Service. Some implementations of IServerConnection may not support this service, so
+    ///     //its best to inspect the capability object of this connection to determine if this service type is supported
+    ///     IMappingService mapSvc = (IMappingService)conn.GetService((int)ServiceType.Mapping);
+    /// 
+    ///     //Get our map definition
+    ///     ResourceIdentifier resId = new ResourceIdentifier("Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition");
+    ///     IMapDefinition mdf = (IMapDefinition)conn.ResourceService.GetResource(resId.ToString());
+    ///     
+    ///     //Calculate the meters per unit value, this requires the official MapGuide API. Otherwise, you need
+    ///     //to know this value up-front in order to render images with this instance
+    ///     double metersPerUnit = 1.0;
+    ///     if (!string.IsNullOrEmpty(mdf.CoordinateSystem))
+    ///     {
+    ///         MgCoordinateSystemFactory factory = new MgCoordinateSystemFactory();
+    ///         MgCoordinateSystem cs = factory.Create(mdf.CoordinateSystem);
+    ///         metersPerUnit = cs.ConvertCoordinateSystemUnitsToMeters(1.0);
+    ///     }
+    ///     
+    ///     //Generate our runtime map resource id. This must be session-based
+    ///     ResourceIdentifier rtMapId = new ResourceIdentifier(resId.Name, ResourceTypes.RuntimeMap, conn.SessionID);
+    ///     
+    ///     //Create the runtime map using our meters per unit value
+    ///     RuntimeMap map = mapSvc.CreateRuntimeMap(rtMapId, mdf, metersPerUnit);
+    ///     
+    ///     //Set some display parameters for this map
+    ///     map.DisplayWidth = 1024;
+    ///     map.DisplayHeight = 1024;
+    ///     map.DisplayDpi = 96;
+    /// 
+    ///     //We have to save it first before we can render from it or use any other API that requires this 
+    ///     //current map state. Remember to call Save() everytime you change the state of the map
+    ///     map.Save();
+    ///     
+    ///     //Now we can render a map
+    ///     using(Stream stream = mapSvc.RenderDynamicOverlay(map, null, "PNG"))
+    ///     {
+    ///         //Write this stream out to a file
+    ///         using (var fs = new FileStream("RenderMap.png", FileMode.OpenOrCreate))
+    ///         {
+    ///             int read = 0;
+    ///             do
+	/// 		    {
+    /// 			    read = source.Read(buf, 0, buf.Length);
+    /// 			    target.Write(buf, 0, read);
+    /// 		    } while (read > 0);
+    ///         }
+    ///     }
+    /// 
+    /// </code>
+    /// </example>
     public class RuntimeMap : MapObservable
     {
         internal IFeatureService FeatureService { get; set; }
@@ -60,7 +126,7 @@
         internal RuntimeMap(IServerConnection conn)
         {
             _disableChangeTracking = true;
-
+            
             this.SiteVersion = conn.SiteVersion;
             this.SessionId = conn.SessionID;
             this.ObjectId = Guid.NewGuid().ToString();
@@ -78,9 +144,11 @@
         /// Initializes a new instance of the <see cref="RuntimeMap"/> class.
         /// </summary>
         /// <param name="mdf">The map definition to create this map from.</param>
-        internal RuntimeMap(IMapDefinition mdf)
+        internal RuntimeMap(IMapDefinition mdf, double metersPerUnit)
             : this(mdf.CurrentConnection)
         {
+            this.MetersPerUnit = metersPerUnit;
+
             this.MapDefinition = mdf.ResourceID;
             this.MapExtent = mdf.Extents.Clone();
             this.DataExtent = mdf.Extents.Clone();
@@ -137,10 +205,10 @@
             }
 
             this.LayerRefreshMode = 1;
-            this.ViewScale = 500; //TODO: Calc from extents and other parameters
+            this.ViewScale = 1.0; //TODO: Calc from extents and other parameters
             this.DisplayDpi = 96;
-            this.DisplayWidth = 1024;
-            this.DisplayHeight = 768;
+            this.DisplayWidth = 0;
+            this.DisplayHeight = 0;
             this.ViewCenter = this.DataExtent.Center();
 
             _disableChangeTracking = false;
@@ -395,13 +463,13 @@
         }
 
         /// <summary>
-        /// Gets the meters per unit.
+        /// Gets the meters per unit value.
         /// </summary>
         /// <value>The meters per unit.</value>
         public double MetersPerUnit
         {
             get;
-            private set;
+            internal set;
         }
 
         /// <summary>
@@ -1001,10 +1069,13 @@
                 return;
 
             ChangeList changes = null;
-            if (m_changeList.ContainsKey(objectId))
-                changes = m_changeList[objectId];
-            else
+            if (!m_changeList.ContainsKey(objectId))
+            {
                 changes = new ChangeList(objectId, isLayer);
+                m_changeList.Add(objectId, changes);
+                
+            }
+            changes = m_changeList[objectId];
 
             var change = new Change(type, param);
             changes.Changes.Add(change);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMapGroup.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMapGroup.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMapGroup.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -33,6 +33,8 @@
 
         internal RuntimeMapGroup() 
         {
+            _disableChangeTracking = true;
+
             this.Type = kNormal;
             this.ObjectId = Guid.NewGuid().ToString();
         }
@@ -42,28 +44,38 @@
         {
             this.Parent = map;
             this.Name = name;
+
+            _disableChangeTracking = false;
         }
 
         internal RuntimeMapGroup(RuntimeMap map, IMapLayerGroup group)
             : this(map, group.Name)
         {
+            _disableChangeTracking = true;
+
             this.ExpandInLegend = group.ExpandInLegend;
             this.LegendLabel = group.LegendLabel;
             this.ShowInLegend = group.ShowInLegend;
             this.Visible = group.Visible;
 
             this.Type = kNormal;
+
+            _disableChangeTracking = false;
         }
 
         internal RuntimeMapGroup(RuntimeMap map, IBaseMapGroup group)
             : this(map, group.Name)
         {
+            _disableChangeTracking = true;
+
             this.ExpandInLegend = group.ExpandInLegend;
             this.LegendLabel = group.LegendLabel;
             this.ShowInLegend = group.ShowInLegend;
             this.Visible = group.Visible;
 
             this.Type = kBaseMap;
+
+            _disableChangeTracking = false;
         }
 
         private bool _visible;

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMapLayer.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMapLayer.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Mapping/RuntimeMapLayer.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -89,13 +89,19 @@
             this.Selectable = true;
             this.ShowInLegend = true;
             this.Visible = true;
+
+            _disableChangeTracking = false;
         }
 
         internal RuntimeMapLayer(RuntimeMap parent, IMapLayer source, ILayerDefinition ldf)
             : this(parent, (IBaseMapLayer)source, ldf)
         {
+            _disableChangeTracking = true;
+
             this.Group = source.Group;
             this.Visible = source.Visible;
+
+            _disableChangeTracking = false;
         }
 
         internal RuntimeMapLayer(RuntimeMap parent, IBaseMapLayer source, ILayerDefinition ldf) 
@@ -105,6 +111,8 @@
             Check.NotNull(ldf, "ldf");
             Check.Precondition(source.ResourceId == ldf.ResourceID, "source.ResourceId == ldf.ResourceID");
 
+            _disableChangeTracking = true;
+
             this.LayerDefinitionID = source.ResourceId;
             this.ExpandInLegend = source.ExpandInLegend;
             this.Name = source.Name;
@@ -166,6 +174,8 @@
                     }
                     break;
             }
+
+            _disableChangeTracking = false;
         }
 
         private bool _visible;

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/MgServerConnectionBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/MgServerConnectionBase.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/MgServerConnectionBase.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -255,7 +255,10 @@
         /// <returns></returns>
         public abstract System.IO.Stream RenderRuntimeMap(string resourceId, double x1, double y1, double x2, double y2, int width, int height, int dpi, string format, bool clip);
 
-        public abstract System.IO.Stream RenderDynamicOverlay(RuntimeMap map, MapSelection selection, string format);
+        public System.IO.Stream RenderDynamicOverlay(RuntimeMap map, MapSelection selection, string format)
+        {
+            return RenderDynamicOverlay(map, selection, format, true);
+        }
 
         public abstract System.IO.Stream RenderDynamicOverlay(RuntimeMap map, MapSelection selection, string format, bool keepSelection);
 

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-11-08 14:40:03 UTC (rev 5376)
@@ -204,6 +204,8 @@
     <Compile Include="Mapping\RuntimeMapLayer.cs" />
     <Compile Include="MgServerConnectionBase.cs" />
     <Compile Include="ObjectModels\ApplicationDefinition.cs" />
+    <Compile Include="ObjectModels\ApplicationDefinitionInfo.cs" />
+    <Compile Include="ObjectModels\ApplicationDefinitionInterfaces.cs" />
     <Compile Include="ObjectModels\DrawingSource.cs" />
     <Compile Include="ObjectModels\DrawingSourceInterfaces.cs" />
     <Compile Include="ObjectModels\FeatureSourceInterfaces.cs" />

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinition.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinition.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -20,84 +20,39 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
-using OSGeo.MapGuide.MaestroAPI.Resource;
+using System.Xml;
 using System.Xml.Serialization;
 using OSGeo.MapGuide.MaestroAPI;
-using System.Xml;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
 
 #pragma warning disable 1591, 0114, 0108
 
-namespace OSGeo.MapGuide.ObjectModels.ApplicationDefinition
+namespace OSGeo.MapGuide.ObjectModels.ApplicationDefinition_1_0_0
 {
-    partial class CustomContentType
+    partial class CustomContentType : IExtension
     {
-        public XmlElement GetElement(string name)
+        XmlElement[] IExtension.Content
         {
-            if (this.anyField == null)
-                return null;
-
-            foreach(XmlElement el in this.anyField)
+            get
             {
-                if (el.Name == name)
-                    return el;
+                return this.Any;
             }
-
-            return null;
+            set
+            {
+                this.Any = value;
+            }
         }
     }
 
-    /// <summary>
-    /// Defines the stock fusion template names that come with a standard MapGuide installation
-    /// </summary>
-    public static class FusionTemplateNames
-    { 
-        /// <summary>
-        /// The preview template. Used for previewing other resources
-        /// </summary>
-        public const string Preview = "Preview";
-        /// <summary>
-        /// The Aqua template
-        /// </summary>
-        public const string Aqua = "Aqua";
-        /// <summary>
-        /// The Maroon template
-        /// </summary>
-        public const string Maroon = "Maroon";
-        /// <summary>
-        /// The Slate template
-        /// </summary>
-        public const string Slate = "Slate";
-        /// <summary>
-        /// The LimeGold template
-        /// </summary>
-        public const string LimeGold = "LimeGold";
-        /// <summary>
-        /// The TurquoiseYellow template
-        /// </summary>
-        public const string TurquoiseYellow = "TurquoiseYellow";
-    }
-
-    partial class ApplicationDefinitionType : IResource
+    partial class ApplicationDefinitionType : IApplicationDefinition, IMapSet
     {
         internal ApplicationDefinitionType() { }
 
         private static readonly Version RES_VERSION = new Version(1, 0, 0);
 
-        private XmlDocument _doc;
-
-        internal XmlDocument Doc
+        public IMapGroup AddMapGroup(string id, bool singleTile, string mapDefinitionId)
         {
-            get
-            {
-                if (_doc == null)
-                    _doc = new XmlDocument();
-
-                return _doc;
-            }
-        }
-
-        public MapGroupType AddMapGroup(string id, bool singleTile, string mapDefinitionId)
-        {
             var map = new MapGroupType()
             {
                 id = id,
@@ -114,7 +69,7 @@
                     }
                 },
             };
-            map.Map[0].Extension.Any[0] = Doc.CreateElement("ResourceId");
+            map.Map[0].Extension.Any[0] = AppDefDocument.Instance.CreateElement("ResourceId");
             map.Map[0].Extension.Any[0].InnerText = mapDefinitionId;
 
             this.MapSet.Add(map);
@@ -122,7 +77,7 @@
             return map;
         }
 
-        public MapGroupType AddMapGroup(string id, bool singleTile, string mapDefinitionId, double centerX, double centerY, double scale)
+        public IMapGroup AddMapGroup(string id, bool singleTile, string mapDefinitionId, double centerX, double centerY, double scale)
         {
             var map = AddMapGroup(id, singleTile, mapDefinitionId);
             map.InitialView = new MapViewType() { CenterX = centerX, CenterY = centerY, Scale = scale };
@@ -195,5 +150,469 @@
         {
             get { return true; }
         }
+
+        IWidget IApplicationDefinition.CreateWidget(string name, IWidgetInfo widgetInfo)
+        {
+            var wparams = widgetInfo.Parameters;
+
+            WidgetType widget = null;
+
+            if (widgetInfo.StandardUi)
+            {
+                widget = new UiWidgetType()
+                {
+                    Extension = new CustomContentType(),
+                    ImageClass = widgetInfo.ImageClass,
+                    ImageUrl = widgetInfo.ImageUrl,
+                    Label = widgetInfo.Label,
+                    Location = widgetInfo.Location,
+                    Name = name,
+                    StatusText = widgetInfo.StatusText,
+                    Tooltip = widgetInfo.Tooltip,
+                    Type = widgetInfo.Type
+                };
+            }
+            else
+            {
+                widget = new WidgetType()
+                {
+                    Extension = new CustomContentType(),
+                    Location = widgetInfo.Location,
+                    Name = name,
+                    Type = widgetInfo.Type,
+                };
+            }
+
+            widget.Extension.Any = new XmlElement[wparams.Length];
+
+            /*
+            for (int i = 0; i < wparams.Length; i++)
+            {
+                var el = CreateExtensionElement(wparams[i]);
+                widget.Extension.InsertElementAt(i, el);
+            }*/
+
+            return widget;
+        }
+
+        private XmlElement CreateExtensionElement(IWidgetParameter wparam)
+        {
+            var el = AppDefDocument.Instance.CreateElement(wparam.Name);
+            el.InnerText = wparam.DefaultValue;
+            return el;
+        }
+
+        IWidgetContainer IApplicationDefinition.CreateContainer(string name, IApplicationDefinitionContainerInfo containerInfo)
+        {
+            return null;
+        }
+
+        IMapSet IApplicationDefinition.MapSet
+        {
+            get { return this; }
+        }
+
+        IExtension IExtensibleElement.Extension
+        {
+            get
+            {
+                return this.Extension;
+            }
+        }
+
+        IEnumerable<IMapGroup> IMapSet.MapGroups
+        {
+            get 
+            {
+                foreach (var grp in this.MapSet)
+                {
+                    yield return grp;
+                }
+            }
+        }
+
+        int IMapSet.MapGroupCount
+        {
+            get { return this.MapSet.Count; }
+        }
+
+        void IMapSet.AddGroup(IMapGroup group)
+        {
+            var grp = group as MapGroupType;
+            if (grp != null)
+            {
+                this.MapSet.Add(grp);
+                OnPropertyChanged("MapSet");
+            }
+        }
+
+        void IMapSet.RemoveGroup(IMapGroup group)
+        {
+            var grp = group as MapGroupType;
+            if (grp != null)
+            {
+                this.MapSet.Remove(grp);
+                OnPropertyChanged("MapSet");
+            }
+        }
+
+        public IEnumerable<IWidgetSet> WidgetSets
+        {
+            get 
+            {
+                foreach (var wset in this.WidgetSet)
+                {
+                    yield return wset;
+                }
+            }
+        }
+
+        public void AddWidgetSet(IWidgetSet set)
+        {
+            var wset = set as WidgetSetType;
+            if (wset != null)
+            {
+                this.WidgetSet.Add(wset);
+                OnPropertyChanged("WidgetSet");
+            }
+        }
+
+        public void RemoveWidgetSet(IWidgetSet set)
+        {
+            var wset = set as WidgetSetType;
+            if (wset != null)
+            {
+                this.WidgetSet.Remove(wset);
+                OnPropertyChanged("WidgetSet");
+            }
+        }
     }
+
+    partial class UiItemContainerType : IUIItemContainer
+    {
+        public int ItemCount
+        {
+            get { return this.Item.Count; }
+        }
+
+        public IEnumerable<IUIItem> Items
+        {
+            get
+            {
+                foreach (var it in this.Item)
+                {
+                    yield return it;
+                }
+            }
+        }
+
+        public bool MoveUp(IUIItem item)
+        {
+            var idx = GetIndex(item);
+            if (idx > 0)
+            {
+                RemoveItem(item);
+                Insert(item, idx - 1);
+                return true;
+            }
+            return false;
+        }
+
+        public bool MoveDown(IUIItem item)
+        {
+            var idx = GetIndex(item);
+            if (idx < this.Item.Count - 1)
+            {
+                RemoveItem(item);
+                Insert(item, idx + 1);
+                return true;
+            }
+            return false;
+        }
+
+        public int GetIndex(IUIItem item)
+        {
+            var it = item as UiItemType;
+            if (it != null)
+            {
+                return this.Item.IndexOf(it);
+            }
+            return -1;
+        }
+
+        public void Insert(IUIItem item, int index)
+        {
+            var it = item as UiItemType;
+            if (it != null)
+            {
+                this.Item.Insert(index, it);
+                OnPropertyChanged("Item");
+            }
+        }
+
+        public void AddItem(IUIItem item)
+        {
+            var it = item as UiItemType;
+            if (it != null)
+            {
+                this.Item.Add(it);
+                OnPropertyChanged("Item");
+            }
+        }
+
+        public void RemoveItem(IUIItem item)
+        {
+            var it = item as UiItemType;
+            if (it != null)
+            {
+                this.Item.Remove(it);
+                OnPropertyChanged("Item");
+            }
+        }
+    }
+
+    partial class FlyoutItemType : IFlyoutItem
+    {
+        public int ItemCount
+        {
+            get { return this.Item.Count; }
+        }
+
+        public IEnumerable<IUIItem> Items
+        {
+            get 
+            {
+                foreach (var it in this.Item)
+                {
+                    yield return it;
+                }
+            }
+        }
+
+        public bool MoveUp(IUIItem item)
+        {
+            var idx = GetIndex(item);
+            if (idx > 0)
+            {
+                RemoveItem(item);
+                Insert(item, idx - 1);
+                return true;
+            }
+            return false;
+        }
+
+        public bool MoveDown(IUIItem item)
+        {
+            var idx = GetIndex(item);
+            if (idx < this.Item.Count - 1)
+            {
+                RemoveItem(item);
+                Insert(item, idx + 1);
+                return true;
+            }
+            return false;
+        }
+
+        public int GetIndex(IUIItem item)
+        {
+            var it = item as UiItemType;
+            if (it != null)
+            {
+                return this.Item.IndexOf(it);
+            }
+            return -1;
+        }
+
+        public void Insert(IUIItem item, int index)
+        {
+            var it = item as UiItemType;
+            if (it != null)
+            {
+                this.Item.Insert(index, it);
+                OnPropertyChanged("Item");
+            }
+        }
+
+        public void AddItem(IUIItem item)
+        {
+            var it = item as UiItemType;
+            if (it != null)
+            {
+                this.Item.Add(it);
+                OnPropertyChanged("Item");
+            }
+        }
+
+        public void RemoveItem(IUIItem item)
+        {
+            var it = item as UiItemType;
+            if (it != null)
+            {
+                this.Item.Remove(it);
+                OnPropertyChanged("Item");
+            }
+        }
+    }
+
+    partial class UiItemType : IUIItem { }
+
+    partial class WidgetItemType : IWidgetItem { }
+
+    partial class SeparatorItemType : ISeparator { }
+
+    partial class WidgetSetType : IWidgetSet
+    {
+        public IEnumerable<IWidgetContainer> Containers
+        {
+            get 
+            {
+                foreach (var cnt in this.Container)
+                {
+                    yield return cnt;
+                }
+            }
+        }
+
+        public int ContainerCount
+        {
+            get { return this.Container.Count; }
+        }
+
+        public void AddContainer(IWidgetContainer container)
+        {
+            var cnt = container as ContainerType;
+            if (cnt != null)
+            {
+                this.Container.Add(cnt);
+                OnPropertyChanged("Container");
+            }
+        }
+
+        public void RemoveContainer(IWidgetContainer container)
+        {
+            var cnt = container as ContainerType;
+            if (cnt != null)
+            {
+                this.Container.Remove(cnt);
+                OnPropertyChanged("Container");
+            }
+        }
+
+        IMapWidget IWidgetSet.MapWidget
+        {
+            get 
+            {
+                return this.MapWidget;  
+            }
+        }
+    }
+
+    partial class ContainerType : IWidgetContainer
+    {
+        IExtension IExtensibleElement.Extension
+        {
+            get { return this.Extension; }
+        }
+    }
+
+    partial class WidgetType : IWidget 
+    {
+        IExtension IExtensibleElement.Extension
+        {
+            get
+            {
+                return this.Extension;
+            }
+        }
+
+        string IWidget.ToXml()
+        {
+            return this.Serialize();
+        }
+    }
+
+    partial class MapWidgetType : IMapWidget { }
+
+    partial class MapViewType : IMapView { }
+
+    partial class MapGroupType : IMapGroup
+    {
+        IMapView IMapGroup.InitialView
+        {
+            get
+            {
+                return this.InitialView;
+            }
+            set
+            {
+                this.InitialView = (MapViewType)value;
+            }
+        }
+
+        IEnumerable<IMap> IMapGroup.Map
+        {
+            get 
+            {
+                foreach (var map in this.Map)
+                {
+                    yield return map;
+                }
+            }
+        }
+
+        public void AddMap(IMap map)
+        {
+            var m = map as MapType;
+            if (m != null)
+            {
+                this.Map.Add(m);
+                OnPropertyChanged("Map");
+            }
+        }
+
+        public void RemoveMap(IMap map)
+        {
+            var m = map as MapType;
+            if (m != null)
+            {
+                this.Map.Remove(m);
+                OnPropertyChanged("Map");
+            }
+        }
+
+        IExtension IExtensibleElement.Extension
+        {
+            get
+            {
+                return this.Extension;
+            }
+        }
+    }
+
+    partial class MapType : IMap
+    {
+        IExtension IExtensibleElement.Extension
+        {
+            get
+            {
+                return this.Extension;
+            }
+        }
+
+        bool IMap.SingleTile
+        {
+            get
+            {
+                bool result;
+                if (bool.TryParse(this.SingleTile, out result))
+                    return result;
+
+                return default(bool);
+            }
+            set
+            {
+                this.SingleTile = value.ToString();
+            }
+        }
+    }
 }

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinitionInfo.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinitionInfo.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinitionInfo.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,138 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+
+#pragma warning disable 1591, 0114, 0108
+
+namespace OSGeo.MapGuide.ObjectModels.ApplicationDefinition_1_0_0
+{
+    using OSGeo.MapGuide.MaestroAPI;
+
+    partial class ApplicationDefinitionWidgetInfoSet : IApplicationDefinitionWidgetInfoSet
+    {
+        IEnumerable<IWidgetInfo> IApplicationDefinitionWidgetInfoSet.WidgetInfo
+        {
+            get 
+            {
+                foreach (var w in this.WidgetInfo)
+                {
+                    yield return w;
+                }
+            }
+        }
+    }
+
+    partial class ApplicationDefinitionContainerInfoSet : IApplicationDefinitionContainerInfoSet
+    {
+        IEnumerable<IApplicationDefinitionContainerInfo> IApplicationDefinitionContainerInfoSet.ContainerInfo
+        {
+            get 
+            {
+                foreach (var c in this.ContainerInfo)
+                {
+                    yield return c;
+                }
+            }
+        }
+    }
+
+    partial class ApplicationDefinitionTemplateInfoSet : IApplicationDefinitionTemplateInfoSet
+    {
+        IEnumerable<IApplicationDefinitionTemplateInfo> IApplicationDefinitionTemplateInfoSet.TemplateInfo
+        {
+            get 
+            {
+                foreach (var t in this.TemplateInfo)
+                {
+                    yield return t;
+                }
+            }
+        }
+    }
+
+    partial class AllowedValueType : IAllowedValue
+    {
+
+    }
+
+    partial class ApplicationDefinitionTemplateInfoType : IApplicationDefinitionTemplateInfo
+    {
+        IEnumerable<IApplicationDefinitionPanel> IApplicationDefinitionTemplateInfo.Panels
+        {
+            get 
+            {
+                foreach (var p in this.Panel)
+                {
+                    yield return p;
+                }
+            }
+        }
+    }
+
+    partial class ApplicationDefinitionContainerInfoType : IApplicationDefinitionContainerInfo
+    {
+
+    }
+
+    partial class ApplicationDefinitionPanelType : IApplicationDefinitionPanel
+    {
+
+    }
+
+    partial class ApplicationDefinitionWidgetInfoType : IWidgetInfo
+    {
+        string[] IWidgetInfo.ContainableBy
+        {
+            get { return this.ContainableBy.ToArray(); }
+        }
+
+        public IWidgetParameter[] Parameters
+        {
+            get 
+            {
+                List<IWidgetParameter> param = new List<IWidgetParameter>();
+                foreach (var p in this.Parameter)
+                {
+                    param.Add(p);
+                }
+                return param.ToArray();
+            }
+        }
+    }
+
+    partial class ApplicationDefinitionWidgetParameterType : IWidgetParameter
+    {
+        IAllowedValue[] IWidgetParameter.AllowedValue
+        {
+            get 
+            {
+                List<IAllowedValue> values = new List<IAllowedValue>();
+                foreach (var v in this.AllowedValue)
+                {
+                    values.Add(v);
+                }
+                return values.ToArray();
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinitionInterfaces.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinitionInterfaces.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinitionInterfaces.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -0,0 +1,811 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.ComponentModel;
+using System.Xml;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+using OSGeo.MapGuide.MaestroAPI;
+
+namespace OSGeo.MapGuide.ObjectModels.ApplicationDefinition
+{
+    /// <summary>
+    /// Describes all available widgets
+    /// </summary>
+    public interface IApplicationDefinitionWidgetInfoSet
+    {
+        IEnumerable<IWidgetInfo> WidgetInfo { get; }
+    }
+
+    /// <summary>
+    /// Describes all available containers
+    /// </summary>
+    public interface IApplicationDefinitionContainerInfoSet
+    {
+        IEnumerable<IApplicationDefinitionContainerInfo> ContainerInfo { get; }
+    }
+
+    /// <summary>
+    /// Describes all available templates
+    /// </summary>
+    public interface IApplicationDefinitionTemplateInfoSet
+    {
+        IEnumerable<IApplicationDefinitionTemplateInfo> TemplateInfo { get; }
+    }
+
+    /// <summary>
+    /// Describes a fusion widget
+    /// </summary>
+    public interface IWidgetInfo
+    {
+        string Type { get; }
+
+        string LocalizedType { get; }
+
+        string Description { get; }
+
+        string Location { get; }
+
+        string Label { get; }
+
+        string Tooltip { get; }
+
+        string StatusText { get; }
+
+        string ImageUrl { get; }
+
+        string ImageClass { get; }
+
+        bool StandardUi { get; }
+
+        string[] ContainableBy { get; }
+
+        IWidgetParameter[] Parameters { get; }
+    }
+
+    /// <summary>
+    /// Describes a parameter of a fusion widget
+    /// </summary>
+    public interface IWidgetParameter
+    {
+        string Name { get; }
+
+        string Description { get; }
+
+        string Type { get; }
+
+        string Label { get; }
+
+        string Min { get; }
+
+        string Max { get; }
+
+        IAllowedValue[] AllowedValue { get; }
+
+        string DefaultValue { get; }
+
+        bool IsMandatory { get; }
+    }
+
+    /// <summary>
+    /// Describes an allowed widget parameter value
+    /// </summary>
+    public interface IAllowedValue
+    {
+        string Name { get; }
+
+        string Label { get; }
+    }
+
+    /// <summary>
+    /// Describes a fusion container
+    /// </summary>
+    public interface IApplicationDefinitionContainerInfo
+    {
+        string Type { get; }
+
+        string LocalizedType { get; }
+
+        string Description { get; }
+
+        string PreviewImageUrl { get; }
+    }
+
+    /// <summary>
+    /// Describes a fusion template
+    /// </summary>
+    public interface IApplicationDefinitionTemplateInfo
+    {
+        string Name { get; }
+
+        string LocationUrl { get; }
+
+        string Description { get; }
+
+        string PreviewImageUrl { get; }
+
+        IEnumerable<IApplicationDefinitionPanel> Panels { get; }
+    }
+
+    /// <summary>
+    /// Describes a fusion template panel
+    /// </summary>
+    public interface IApplicationDefinitionPanel
+    {
+        string Name { get; }
+
+        string Label { get; }
+
+        string Description { get; }
+    }
+
+    /// <summary>
+    /// Factory method signature for creating fusion widgets
+    /// </summary>
+    /// <param name="info"></param>
+    /// <returns></returns>
+    public delegate IWidget WidgetFactoryMethod(IWidgetInfo info);
+    /// <summary>
+    /// Factory method signature for creating fusion widget containers
+    /// </summary>
+    /// <param name="container"></param>
+    /// <returns></returns>
+    public delegate IWidgetContainer ContainerFactoryMethod(IApplicationDefinitionContainerInfo container);
+
+    /// <summary>
+    /// Defines the stock fusion template names that come with a standard MapGuide installation
+    /// </summary>
+    public static class FusionTemplateNames
+    {
+        /// <summary>
+        /// The preview template. Used for previewing other resources
+        /// </summary>
+        public const string Preview = "Preview";
+        /// <summary>
+        /// The Aqua template
+        /// </summary>
+        public const string Aqua = "Aqua";
+        /// <summary>
+        /// The Maroon template
+        /// </summary>
+        public const string Maroon = "Maroon";
+        /// <summary>
+        /// The Slate template
+        /// </summary>
+        public const string Slate = "Slate";
+        /// <summary>
+        /// The LimeGold template
+        /// </summary>
+        public const string LimeGold = "LimeGold";
+        /// <summary>
+        /// The TurquoiseYellow template
+        /// </summary>
+        public const string TurquoiseYellow = "TurquoiseYellow";
+    }
+
+    /// <summary>
+    /// Represents a fusion flexible layout (aka. An Application Definition document)
+    /// </summary>
+    public interface IApplicationDefinition : IResource, IExtensibleElement
+    {
+        /// <summary>
+        /// Gets or sets the title
+        /// </summary>
+        string Title { get; set; }
+
+        /// <summary>
+        /// Gets or sets the template url
+        /// </summary>
+        string TemplateUrl { get; set; }
+
+        /// <summary>
+        /// Gets the map set
+        /// </summary>
+        IMapSet MapSet { get; }
+
+        /// <summary>
+        /// Gets the widget sets
+        /// </summary>
+        IEnumerable<IWidgetSet> WidgetSets { get; }
+
+        void AddWidgetSet(IWidgetSet set);
+
+        void RemoveWidgetSet(IWidgetSet set);
+
+        /// <summary>
+        /// Adds the new map group to the current map set
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="singleTile"></param>
+        /// <param name="mapDefinitionId"></param>
+        /// <returns></returns>
+        IMapGroup AddMapGroup(string id, bool singleTile, string mapDefinitionId);
+
+        /// <summary>
+        /// Adds a new map group to the specified map set
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="singleTile"></param>
+        /// <param name="mapDefinitionId"></param>
+        /// <param name="centerX"></param>
+        /// <param name="centerY"></param>
+        /// <param name="scale"></param>
+        /// <returns></returns>
+        IMapGroup AddMapGroup(string id, bool singleTile, string mapDefinitionId, double centerX, double centerY, double scale);
+
+        IWidget CreateWidget(string name, IWidgetInfo widgetInfo);
+
+        IWidgetContainer CreateContainer(string name, IApplicationDefinitionContainerInfo containerInfo);
+    }
+
+    public interface IExtensibleElement
+    {
+        IExtension Extension { get; }
+    }
+
+    /// <summary>
+    /// Represents a region of arbitrary XML content
+    /// </summary>
+    public interface IExtension
+    {
+        /// <summary>
+        /// Gets or sets the XML content. It is best to use the extension methods to get and set the appropriate values
+        /// rather than accessing this array directly
+        /// </summary>
+        XmlElement[] Content { get; set; }
+    }
+
+    /// <summary>
+    /// A reusable <see cref="XmlDocument"/> providing <see cref="XmlElement"/> creation functionality
+    /// for those that require it
+    /// </summary>
+    internal static class AppDefDocument
+    {
+        private static XmlDocument _doc;
+
+        internal static XmlDocument Instance
+        {
+            get
+            {
+                if (_doc == null)
+                    _doc = new XmlDocument();
+
+                return _doc;
+            }
+        }
+    }
+
+    /// <summary>
+    /// Extension method class
+    /// </summary>
+    public static class ExtensionMethods
+    {
+        /// <summary>
+        /// Gets the specified map group by its id
+        /// </summary>
+        /// <param name="set"></param>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public static IMapGroup GetGroupById(this IMapSet set, string id)
+        {
+            Check.NotNull(set, "set");
+            foreach (var group in set.MapGroups)
+            {
+                if (group.id.Equals(id))
+                    return group;
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// Gets the names of all properties of this extensible element
+        /// </summary>
+        /// <param name="ext"></param>
+        /// <returns></returns>
+        public static string[] GetNames(this IExtensibleElement ext)
+        {
+            Check.NotNull(ext, "ext");
+
+            List<string> names = new List<string>();
+
+            foreach (var el in ext.Extension.Content)
+            {
+                names.Add(el.Name);
+            }
+            
+            return names.ToArray();
+        }
+
+        /// <summary>
+        /// Sets the value of a property in this extensible element.
+        /// </summary>
+        /// <param name="ext"></param>
+        /// <param name="name"></param>
+        /// <param name="value"></param>
+        public static void SetValue(this IExtensibleElement ext, string name, string value)
+        {
+            Check.NotNull(ext, "ext");
+            Check.NotEmpty(name, "name");
+
+            var el = ext.Extension.Content.FindElementByName(name);
+            if (el != null)
+            {
+                el.InnerText = value;
+            }
+            else
+            {
+                var values = new List<XmlElement>(ext.Extension.Content);
+                var rid = AppDefDocument.Instance.CreateElement(name);
+                rid.InnerText = value;
+                values.Add(rid);
+                ext.Extension.Content = values.ToArray();
+            }
+        }
+
+        /// <summary>
+        /// Gets the value of a property in this extensible element. If none exists, an empty string is returned
+        /// </summary>
+        /// <param name="ext"></param>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        public static string GetValue(this IExtensibleElement ext, string name)
+        {
+            Check.NotNull(ext, "ext");
+            Check.NotEmpty(name, "name");
+
+            var el = ext.Extension.Content.FindElementByName(name);
+            if (el != null)
+            {
+                return el.InnerText;
+            }
+            return string.Empty;
+        }
+
+        /// <summary>
+        /// Returns a <see cref="XmlElement"/> whose name matches the specified name
+        /// </summary>
+        /// <param name="elements"></param>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        public static XmlElement FindElementByName(this XmlElement[] elements, string name)
+        {
+            Check.NotNull(elements, "elements");
+            foreach (var el in elements)
+            {
+                if (el.Name == name)
+                    return el;
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// Set the map definition id
+        /// </summary>
+        /// <param name="map"></param>
+        /// <returns></returns>
+        public static string GetMapDefinition(this IMap map)
+        {
+            Check.NotNull(map, "map");
+            return map.GetValue("ResourceId");
+        }
+
+        /// <summary>
+        /// Gets the map definition id
+        /// </summary>
+        /// <param name="map"></param>
+        /// <param name="mapDefId"></param>
+        public static void SetMapDefinition(this IMap map, string mapDefId)
+        {
+            Check.NotNull(map, "map");
+            map.SetValue("ResourceId", mapDefId);
+        }
+    }
+
+        /*
+    public abstract class WidgetValue
+    {
+        protected WidgetValue(string name, bool required)
+        {
+            this.Name = name;
+            this.Nullable = !required;
+        }
+
+        public bool Nullable { get; protected set; }
+
+        public string Name { get; set; }
+
+        public abstract object Value { get; set; }
+
+        protected virtual string ValueToString()
+        {
+            if (this.Value == null)
+                return string.Empty;
+            else
+                return this.Value.ToString();
+        }
+
+        public virtual string ToXml()
+        {
+            if (this.Nullable && this.Value == null)
+                return string.Empty;
+
+            return "<" + this.Name + ">" + ValueToString() + "</" + this.Name + ">";
+        }
+    }
+
+    public class RangedWidgetValue : WidgetValue
+    {
+        public RangedWidgetValue(string name, bool required, IComparable minValue, IComparable maxValue) : base(name, required) 
+        {
+            Check.NotNull(minValue, "minValue");
+            Check.NotNull(maxValue, "maxValue");
+
+            if (minValue.CompareTo(maxValue) <= 0)
+            {
+                this.MinValue = minValue;
+                this.MaxValue = maxValue;
+            }
+            else
+            {
+                this.MinValue = maxValue;
+                this.MaxValue = MinValue;
+            }
+        }
+
+        public IComparable MinValue { get; private set; }
+
+        public IComparable MaxValue { get; private set; }
+
+        private object _value;
+
+        public override object Value
+        {
+            get
+            {
+                return _value;
+            }
+            set
+            {
+                if (value == null)
+                {
+                    if (!this.Nullable)
+                        throw new InvalidOperationException("Null values not accepted"); //LOCALIZEME
+
+                    _value = value;
+                }
+                else
+                {
+                    var cmp = value as IComparable;
+                    if (cmp == null)
+                        throw new InvalidOperationException("Assigned value is not comparable"); //LOCALIZEME
+
+                    if (cmp.CompareTo(this.MinValue) >= 0 && cmp.CompareTo(this.MaxValue) <= 0)
+                        _value = value;
+                    else
+                        throw new InvalidOperationException("Value falls outside the range of " + this.MinValue + " and " + this.MaxValue); //LOCALIZEME
+                }
+            }
+        }
+    }
+
+    public class RestrictedWidgetValue : WidgetValue
+    {
+        public RestrictedWidgetValue(string name, bool required) : base(name, required) { }
+
+        private object _value;
+
+        public override object Value
+        {
+            get
+            {
+                return _value;
+            }
+            set
+            {
+                if (value == null)
+                {
+                    if (!this.Nullable)
+                        throw new InvalidOperationException("Null values not accepted"); //LOCALIZEME
+
+                    _value = value;
+                }
+                else
+                {
+                    _value = value;
+                }
+            }
+        }
+    }
+
+    public class ArbitraryWidgetValue : WidgetValue
+    {
+        public ArbitraryWidgetValue(string name, bool required) : base(name, required) { }
+
+        private object _value;
+
+        public override object Value
+        {
+            get
+            {
+                return _value;
+            }
+            set
+            {
+                if (value == null)
+                {
+                    if (!this.Nullable)
+                        throw new InvalidOperationException("Null values not accepted"); //LOCALIZEME
+
+                    _value = value;
+                }
+                else
+                {
+                    _value = value;
+                }
+            }
+        }
+    }
+        */
+
+    public interface IMapSet
+    {
+        IEnumerable<IMapGroup> MapGroups { get; }
+
+        int MapGroupCount { get; }
+
+        void AddGroup(IMapGroup group);
+
+        void RemoveGroup(IMapGroup group);
+    }
+
+    public interface IMapGroup : IExtensibleElement, INotifyPropertyChanged
+    {
+        string id { get; set; }
+
+        IMapView InitialView { get; set; }
+
+        IEnumerable<IMap> Map { get; }
+
+        void AddMap(IMap map);
+
+        void RemoveMap(IMap map);
+    }
+
+    public interface IMap : INotifyPropertyChanged, IExtensibleElement
+    {
+        string Type { get; set; }
+
+        bool SingleTile { get; set; }
+    }
+
+    /// <summary>
+    /// Represents a flexible layout's widget set. This is analogous to a Command Set in a Web Layout
+    /// </summary>
+    public interface IWidgetSet
+    {
+        IEnumerable<IWidgetContainer> Containers { get; }
+
+        int ContainerCount { get; }
+
+        void AddContainer(IWidgetContainer container);
+
+        void RemoveContainer(IWidgetContainer container);
+
+        IMapWidget MapWidget { get; }
+    }
+
+    /// <summary>
+    /// Represents a container component in a flexible layout
+    /// </summary>
+    public interface IWidgetContainer : INotifyPropertyChanged, IExtensibleElement
+    {
+        string Name { get; set; }
+
+        string Type { get; set; }
+
+        string Position { get; set; }
+    }
+
+    /// <summary>
+    /// Represents a UI item container component
+    /// </summary>
+    public interface IUIItemContainer : IWidgetContainer, IMenu
+    {
+        
+    }
+
+    /// <summary>
+    /// A interface for widgets and components with menu-like characteristics
+    /// </summary>
+    public interface IMenu
+    {
+        /// <summary>
+        /// Gets the item count.
+        /// </summary>
+        /// <value>The item count.</value>
+        int ItemCount { get; }
+
+        /// <summary>
+        /// Gets the items.
+        /// </summary>
+        /// <value>The items.</value>
+        IEnumerable<IUIItem> Items { get; }
+
+        /// <summary>
+        /// Moves the specified item up.
+        /// </summary>
+        /// <param name="item">The item.</param>
+        /// <returns></returns>
+        bool MoveUp(IUIItem item);
+
+        /// <summary>
+        /// Moves the specified item down.
+        /// </summary>
+        /// <param name="item">The item.</param>
+        /// <returns></returns>
+        bool MoveDown(IUIItem item);
+
+        /// <summary>
+        /// Gets the index of the specified item.
+        /// </summary>
+        /// <param name="item">The item.</param>
+        /// <returns></returns>
+        int GetIndex(IUIItem item);
+
+        /// <summary>
+        /// Inserts the specified item at the specified index.
+        /// </summary>
+        /// <param name="item">The item.</param>
+        /// <param name="index">The index.</param>
+        void Insert(IUIItem item, int index);
+
+        /// <summary>
+        /// Adds the item.
+        /// </summary>
+        /// <param name="item">The item.</param>
+        void AddItem(IUIItem item);
+
+        /// <summary>
+        /// Removes the item.
+        /// </summary>
+        /// <param name="item">The item.</param>
+        void RemoveItem(IUIItem item);
+    }
+
+    /// <summary>
+    /// Defines the type of UI items
+    /// </summary>
+    [System.SerializableAttribute()]
+    public enum UiItemFunctionType
+    {
+        /// <remarks/>
+        Separator,
+
+        /// <remarks/>
+        Widget,
+
+        /// <remarks/>
+        Flyout,
+    }
+
+    public interface IUIItem
+    {
+        UiItemFunctionType Function { get; }
+    }
+
+    public interface IFlyoutItem : IUIItem, IMenu, INotifyPropertyChanged
+    {
+        string Label { get; set; }
+
+        string Tooltip { get; set; }
+
+        string ImageUrl { get; set; }
+
+        string ImageClass { get; set; }
+    }
+
+    public interface ISeparator : IUIItem
+    {
+        
+    }
+
+    /// <summary>
+    /// Represents a widget reference. This is analogous to a <see cref="ICommandItem"/> in Web Layouts
+    /// </summary>
+    public interface IWidgetItem : IUIItem
+    {
+        string Widget { get; set; }
+    }
+
+    /// <summary>
+    /// Represents a fusion application widget
+    /// </summary>
+    public interface IWidget : INotifyPropertyChanged, IExtensibleElement
+    {
+        /// <summary>
+        /// Gets or sets the name of the widget
+        /// </summary>
+        string Name { get; set; }
+
+        /// <summary>
+        /// Gets or sets the type of the widget
+        /// </summary>
+        string Type { get; set; }
+
+        /// <summary>
+        /// Gets or sets the location
+        /// </summary>
+        string Location { get; set; }
+
+        /// <summary>
+        /// Gets the raw XML content of this widget
+        /// </summary>
+        /// <returns></returns>
+        string ToXml();
+    }
+
+    /// <summary>
+    /// Represents a map widget
+    /// </summary>
+    public interface IMapWidget : IWidget
+    {
+        string MapId { get; set; }
+    }
+
+    public interface IUIWidget : IWidget
+    {
+        string ImageUrl { get; set; }
+
+        string ImageClass { get; set; }
+
+        string Label { get; set; }
+
+        string Tooltip { get; set; }
+
+        string StatusText { get; set; }
+
+        string Disabled { get; set; }
+    }
+
+    /// <summary>
+    /// The initial view of the map
+    /// </summary>
+    public interface IMapView : INotifyPropertyChanged
+    {
+        /// <summary>
+        /// Gets or sets the center X.
+        /// </summary>
+        /// <value>The center X.</value>
+        double CenterX { get; set; }
+
+        /// <summary>
+        /// Gets or sets the center Y.
+        /// </summary>
+        /// <value>The center Y.</value>
+        double CenterY { get; set; }
+
+        /// <summary>
+        /// Gets or sets the scale.
+        /// </summary>
+        /// <value>The scale.</value>
+        double Scale { get; set; }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -35,6 +35,7 @@
 using OSGeo.MapGuide.ObjectModels.SymbolDefinition;
 using OSGeo.MapGuide.ObjectModels.SymbolLibrary;
 using OSGeo.MapGuide.ObjectModels.WebLayout;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition_1_0_0;
 
 namespace OSGeo.MapGuide.ObjectModels
 {
@@ -71,7 +72,7 @@
         private static Dictionary<Version, LayerCreatorFunc> _layerFactories;
         private static Dictionary<LoadType, LoadProcCreatorFunc> _loadProcFactories;
         private static Dictionary<Version, WebLayoutCreatorFunc> _wlFactories;
-
+        
         static ObjectFactory()
         {
             _layerFactories = new Dictionary<Version,LayerCreatorFunc>();
@@ -310,7 +311,7 @@
         /// </summary>
         /// <param name="owner">The owner.</param>
         /// <returns></returns>
-        public static ApplicationDefinitionType CreateFlexibleLayout(IServerConnection owner)
+        public static IApplicationDefinition CreateFlexibleLayout(IServerConnection owner)
         {
             Check.NotNull(owner, "owner");
 
@@ -318,27 +319,17 @@
             {
                 CurrentConnection = owner,
                 MapSet = new System.ComponentModel.BindingList<MapGroupType>(),
-                WidgetSet = CreateStandardWidgetSet()
+                WidgetSet = new System.ComponentModel.BindingList<WidgetSetType>()
             };
         }
 
-        private static System.ComponentModel.BindingList<WidgetSetType> CreateStandardWidgetSet()
-        {
-            return new System.ComponentModel.BindingList<WidgetSetType>();
-        }
-
-        private static System.ComponentModel.BindingList<WidgetSetType> CreatePreviewWidgetSet()
-        {
-            return new System.ComponentModel.BindingList<WidgetSetType>();
-        }
-
         /// <summary>
         /// Creates the flexible layout.
         /// </summary>
         /// <param name="owner">The owner.</param>
         /// <param name="title">The title.</param>
         /// <returns></returns>
-        public static ApplicationDefinitionType CreateFlexibleLayout(IServerConnection owner, string title)
+        public static IApplicationDefinition CreateFlexibleLayout(IServerConnection owner, string title)
         {
             Check.NotNull(owner, "owner");
 
@@ -352,7 +343,7 @@
         /// </summary>
         /// <param name="owner">The owner.</param>
         /// <returns></returns>
-        public static ApplicationDefinitionType CreatePreviewFlexLayout(IServerConnection owner)
+        public static IApplicationDefinition CreatePreviewFlexLayout(IServerConnection owner)
         {
             Check.NotNull(owner, "owner");
             var appDef = new ApplicationDefinitionType()
@@ -360,7 +351,7 @@
                 CurrentConnection = owner,
                 Title = "Preview",
                 MapSet = new System.ComponentModel.BindingList<MapGroupType>(),
-                WidgetSet = CreatePreviewWidgetSet()
+                WidgetSet = new System.ComponentModel.BindingList<WidgetSetType>()
             };
             appDef.TemplateUrl = "fusion/templates/mapguide/preview/index.html";
             return appDef;
@@ -373,7 +364,7 @@
         /// <param name="title"></param>
         /// <param name="templateName">The name of the template. Consult <see cref="FusionTemplateNames"/> for a list of stock templates</param>
         /// <returns></returns>
-        public static ApplicationDefinitionType CreateFlexibleLayout(IServerConnection owner, string title, string templateName)
+        public static IApplicationDefinition CreateFlexibleLayout(IServerConnection owner, string title, string templateName)
         {
             Check.NotNull(owner, "owner");
 

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/PlatformConnectionBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/PlatformConnectionBase.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/PlatformConnectionBase.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -1617,24 +1617,16 @@
         #endregion
 
         #region runtime map
-        public virtual RuntimeMap CreateMap(string mapDefinitionResourceId)
+        
+        public virtual RuntimeMap CreateMap(string runtimeMapResourceId, string baseMapDefinitionId, double metersPerUnit)
         {
-            ResourceIdentifier.Validate(mapDefinitionResourceId);
-            ResourceIdentifier ri = new ResourceIdentifier(mapDefinitionResourceId);
-            ri.Path = ri.Name;
-            ri.Extension = EnumHelper.ResourceName(ResourceTypes.RuntimeMap);
-            return CreateMap(ri, mapDefinitionResourceId);
-        }
-
-        public virtual RuntimeMap CreateMap(string runtimeMapResourceId, string baseMapDefinitionId)
-        {
             var mdf = (IMapDefinition)GetResource(baseMapDefinitionId);
-            return CreateMap(runtimeMapResourceId, mdf);
+            return CreateMap(runtimeMapResourceId, mdf, metersPerUnit);
         }
 
-        public virtual RuntimeMap CreateMap(string runtimeMapResourceId, IMapDefinition mdf)
+        public virtual RuntimeMap CreateMap(string runtimeMapResourceId, IMapDefinition mdf, double metersPerUnit)
         {
-            var map = new RuntimeMap(mdf);
+            var map = new RuntimeMap(mdf, metersPerUnit);
             map.ResourceID = runtimeMapResourceId;
             return map;
         }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ApplicationDefinitionValidator.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ApplicationDefinitionValidator.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ApplicationDefinitionValidator.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -48,26 +48,26 @@
 
             List<ValidationIssue> issues = new List<ValidationIssue>();
 
-            ApplicationDefinitionType fusionApp = resource as ApplicationDefinitionType;
-            if (fusionApp.MapSet == null || fusionApp.MapSet.Count == 0)
+            IApplicationDefinition fusionApp = resource as IApplicationDefinition;
+            if (fusionApp.MapSet == null || fusionApp.MapSet.MapGroupCount == 0)
                 issues.Add(new ValidationIssue(fusionApp, ValidationStatus.Error, string.Format(Properties.Resources.ADF_MapMissingError)));
             else
             {
                 if (recurse)
                 {
-                    foreach (MapGroupType mapGroup in fusionApp.MapSet)
-                        foreach (OSGeo.MapGuide.ObjectModels.ApplicationDefinition.MapType map in mapGroup.Map)
+                    foreach (IMapGroup mapGroup in fusionApp.MapSet.MapGroups)
+                    {
+                        foreach (IMap map in mapGroup.Map)
                         {
                             try
                             {
-
-                                if (map.Extension == null || map.Extension.GetElement("ResourceId") == null)
+                                if (map.Extension == null || string.IsNullOrEmpty(map.GetMapDefinition()))
                                 {
                                     issues.Add(new ValidationIssue(fusionApp, ValidationStatus.Error, string.Format(Properties.Resources.ADF_MapInvalidError, mapGroup.id)));
                                 }
                                 else
                                 {
-                                    IMapDefinition mdef = (IMapDefinition)fusionApp.CurrentConnection.ResourceService.GetResource(map.Extension.GetElement("ResourceId").InnerText);
+                                    IMapDefinition mdef = (IMapDefinition)fusionApp.CurrentConnection.ResourceService.GetResource(map.GetMapDefinition());
 
                                     issues.AddRange(ResourceValidatorSet.Validate(mdef, true));
 
@@ -79,8 +79,6 @@
                                             issues.Add(new ValidationIssue(mdef, ValidationStatus.Warning, string.Format(Properties.Resources.ADF_ViewOutsideMapExtents)));
                                     }
                                 }
-
-
                             }
                             catch (Exception ex)
                             {
@@ -88,6 +86,7 @@
                                 issues.Add(new ValidationIssue(fusionApp, ValidationStatus.Error, string.Format(Properties.Resources.ADF_MapValidationError, mapGroup.id, msg)));
                             }
                         }
+                    }
                 }
             }
 

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -86,7 +86,7 @@
                 new ResourceSerializer()
                 {
                     Serialize = (res) => { return res.SerializeToStream(); },
-                    Deserialize = (xml) => { return ApplicationDefinitionType.Deserialize(xml); }
+                    Deserialize = (xml) => { return OSGeo.MapGuide.ObjectModels.ApplicationDefinition_1_0_0.ApplicationDefinitionType.Deserialize(xml); }
                 });
 
             //DrawingSource 1.0.0

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFusionService.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFusionService.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFusionService.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -33,18 +33,18 @@
         /// Gets the application templates.
         /// </summary>
         /// <returns></returns>
-        ApplicationDefinitionTemplateInfoSet GetApplicationTemplates();
+        IApplicationDefinitionTemplateInfoSet GetApplicationTemplates();
 
         /// <summary>
         /// Returns the avalible application widgets on the server
         /// </summary>
         /// <returns>The avalible application widgets on the server</returns>
-        ApplicationDefinitionWidgetInfoSet GetApplicationWidgets();
+        IApplicationDefinitionWidgetInfoSet GetApplicationWidgets();
 
         /// <summary>
         /// Returns the avalible widget containers on the server
         /// </summary>
         /// <returns>The avalible widget containers on the server</returns>
-        ApplicationDefinitionContainerInfoSet GetApplicationContainers();
+        IApplicationDefinitionContainerInfoSet GetApplicationContainers();
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IMappingService.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IMappingService.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IMappingService.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -31,28 +31,22 @@
     public interface IMappingService : IService
     {
         /// <summary>
-        /// Creates a new runtime map instance from an existing map definition, the resource
-        /// id of the runtime map is derived from the specified resource id
-        /// </summary>
-        /// <param name="mapDefinitionResourceId"></param>
-        /// <returns></returns>
-        RuntimeMap CreateMap(string mapDefinitionResourceId);
-
-        /// <summary>
         /// Creates a new runtime map instance from an existing map definition
         /// </summary>
         /// <param name="runtimeMapResourceId"></param>
         /// <param name="baseMapDefinitionId"></param>
+        /// <param name="metersPerUnit"></param>
         /// <returns></returns>
-        RuntimeMap CreateMap(string runtimeMapResourceId, string baseMapDefinitionId);
+        RuntimeMap CreateMap(string runtimeMapResourceId, string baseMapDefinitionId, double metersPerUnit);
 
         /// <summary>
         /// Creates a new runtime map instance from an existing map definition
         /// </summary>
         /// <param name="runtimeMapResourceId"></param>
         /// <param name="mdf"></param>
+        /// <param name="metersPerUnit"></param>
         /// <returns></returns>
-        RuntimeMap CreateMap(string runtimeMapResourceId, IMapDefinition mdf);
+        RuntimeMap CreateMap(string runtimeMapResourceId, IMapDefinition mdf, double metersPerUnit);
 
         /// <summary>
         /// Opens an existing runtime map instance

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -38,6 +38,7 @@
 using OSGeo.MapGuide.ObjectModels.Capabilities;
 using System.Text;
 using System.Collections.Generic;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition_1_0_0;
 
 namespace OSGeo.MapGuide.MaestroAPI
 {
@@ -794,11 +795,6 @@
 			//Do nothing... there is no return value
 		}
 
-        public override System.IO.Stream RenderDynamicOverlay(RuntimeMap map, MapSelection selection, string format)
-        {
-            return RenderDynamicOverlay(map, selection, format, false);
-        }
-
         public override System.IO.Stream RenderDynamicOverlay(RuntimeMap map, MapSelection selection, string format, bool keepSelection)
         {
             System.IO.MemoryStream ms = new System.IO.MemoryStream();
@@ -880,30 +876,30 @@
 		/// Returns the avalible application templates on the server
 		/// </summary>
 		/// <returns>The avalible application templates on the server</returns>
-		public ApplicationDefinitionTemplateInfoSet GetApplicationTemplates()
+		public IApplicationDefinitionTemplateInfoSet GetApplicationTemplates()
 		{
 			//TODO: Caching these should be safe
-			return (ApplicationDefinitionTemplateInfoSet)base.DeserializeObject(typeof(ApplicationDefinitionTemplateInfoSet), this.OpenRead(m_reqBuilder.EnumerateApplicationTemplates()));
+            return (IApplicationDefinitionTemplateInfoSet)base.DeserializeObject(typeof(ApplicationDefinitionTemplateInfoSet), this.OpenRead(m_reqBuilder.EnumerateApplicationTemplates()));
 		}
 
 		/// <summary>
 		/// Returns the avalible application widgets on the server
 		/// </summary>
 		/// <returns>The avalible application widgets on the server</returns>
-		public ApplicationDefinitionWidgetInfoSet GetApplicationWidgets()
+		public IApplicationDefinitionWidgetInfoSet GetApplicationWidgets()
 		{
 			//TODO: Caching these should be safe
-			return (ApplicationDefinitionWidgetInfoSet)base.DeserializeObject(typeof(ApplicationDefinitionWidgetInfoSet), this.OpenRead(m_reqBuilder.EnumerateApplicationWidgets()));
+            return (IApplicationDefinitionWidgetInfoSet)base.DeserializeObject(typeof(ApplicationDefinitionWidgetInfoSet), this.OpenRead(m_reqBuilder.EnumerateApplicationWidgets()));
 		}
 
 		/// <summary>
 		/// Returns the avalible widget containers on the server
 		/// </summary>
 		/// <returns>The avalible widget containers on the server</returns>
-		public ApplicationDefinitionContainerInfoSet GetApplicationContainers()
+        public IApplicationDefinitionContainerInfoSet GetApplicationContainers()
 		{
 			//TODO: Caching these should be safe
-			return (ApplicationDefinitionContainerInfoSet)base.DeserializeObject(typeof(ApplicationDefinitionContainerInfoSet), this.OpenRead(m_reqBuilder.EnumerateApplicationContainers()));
+			return (IApplicationDefinitionContainerInfoSet)base.DeserializeObject(typeof(ApplicationDefinitionContainerInfoSet), this.OpenRead(m_reqBuilder.EnumerateApplicationContainers()));
 		}
 
 		/// <summary>
@@ -1513,26 +1509,6 @@
             }
         }
 
-        ApplicationDefinitionTemplateInfoSet IFusionService.GetApplicationTemplates()
-        {
-            string req = m_reqBuilder.EnumerateApplicationTemplates();
-            using (var s = this.OpenRead(req))
-            {
-                var list = this.DeserializeObject<OSGeo.MapGuide.ObjectModels.ApplicationDefinition.ApplicationDefinitionTemplateInfoSet>(s);
-                return list;
-            }
-        }
-
-        ApplicationDefinitionWidgetInfoSet IFusionService.GetApplicationWidgets()
-        {
-            throw new NotImplementedException();
-        }
-
-        ApplicationDefinitionContainerInfoSet IFusionService.GetApplicationContainers()
-        {
-            throw new NotImplementedException();
-        }
-
         public FdoProviderCapabilities GetProviderCapabilities(string provider)
         {
             if (m_cachedProviderCapabilities == null)

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs	2010-11-05 10:28:08 UTC (rev 5375)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs	2010-11-08 14:40:03 UTC (rev 5376)
@@ -1044,11 +1044,6 @@
             return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetSectionResource"), new object[] { new MgResourceIdentifier(resourceID), resourceName });
         }
 
-        public override Stream RenderDynamicOverlay(RuntimeMap map, MapSelection selection, string format)
-        {
-            throw new NotImplementedException();
-        }
-
         public override Stream RenderDynamicOverlay(RuntimeMap map, MapSelection selection, string format, bool keepSelection)
         {
             throw new NotImplementedException();



More information about the mapguide-commits mailing list