[mapguide-commits] r5289 - in sandbox/maestro-3.0: Maestro.Base Maestro.Base/Editor Maestro.Base/Properties Maestro.Base/Resources Maestro.Base/Services Maestro.Base/UI Maestro.Editors Maestro.Editors/MapDefinition Maestro.Editors/PrintLayout Maestro.Editors/Properties Maestro.Editors/Resources Maestro.ResourceValidation MaestroAPITests OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/ObjectModels OSGeo.MapGuide.MaestroAPI/Services

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Oct 18 03:16:47 EDT 2010


Author: jng
Date: 2010-10-18 00:16:47 -0700 (Mon, 18 Oct 2010)
New Revision: 5289

Added:
   sandbox/maestro-3.0/Maestro.Base/Resources/box--arrow.png
   sandbox/maestro-3.0/Maestro.Base/Resources/box--plus.png
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.resx
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapTreeModels.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ScaleListGenerator.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.resx
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.resx
   sandbox/maestro-3.0/Maestro.Editors/Resources/map--arrow.png
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayoutInterfaces.cs
Removed:
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/Logos/
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/Text/
Modified:
   sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs
   sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin
   sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj
   sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs
   sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx
   sandbox/maestro-3.0/Maestro.Base/Services/OpenResourceManager.cs
   sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs
   sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs
   sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/GroupPropertiesCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/GroupPropertiesCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/LayerPropertiesCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/LayerPropertiesCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomLogosSectionCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomLogosSectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomTextSectionCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomTextSectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintLayoutEditorCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintLayoutEditorCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintPagePropertiesSectionCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintPagePropertiesSectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
   sandbox/maestro-3.0/Maestro.ResourceValidation/ApplicationDefinitionValidator.cs
   sandbox/maestro-3.0/Maestro.ResourceValidation/WebLayoutValidator.cs
   sandbox/maestro-3.0/MaestroAPITests/ObjectTests.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Check.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/Envelope.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerInterfaceExtensions.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinitionInterfaces.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayout.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs
Log:
3.0 sandbox changes:
 - Add interfaces for Print Layout schema
 - Complete implementation of Print Layout Editor
 - More Map Definition interface cleanup.
 - Introduce an IEnvelope interface to establish a common ground between various generated classes with similar/indentical properties (Envelope/Box2DType)
 - Polish up the implementation of the Map Defintion Editor (v1.0.0 schema), targeting the abstract interfaces instead of concrete classes. Short of productive functionality like drag/drop support. This should be a fully functional editor
 - Add new OpenResource() API to IEditorService, allowing editors to open an editor for another resource
 - Clean up and iconify commands in the base addin file


Modified: sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -40,14 +40,16 @@
         private ISiteExplorer _siteExp;
 
         private IResource _editCopy;
+        private OpenResourceManager _orm;
 
-        public ResourceEditorService(string resourceID, IServerConnection conn, IUrlLauncherService launcher, ISiteExplorer siteExp)
+        public ResourceEditorService(string resourceID, IServerConnection conn, IUrlLauncherService launcher, ISiteExplorer siteExp, OpenResourceManager orm)
         {
             this.IsNew = ResourceIdentifier.IsSessionBased(resourceID);
             this.ResourceID = resourceID;
             _siteExp = siteExp;
             _conn = conn;
             _launcher = launcher;
+            _orm = orm;
         }
 
         public event EventHandler DirtyStateChanged;
@@ -303,5 +305,10 @@
         {
             get { return _conn.SiteVersion; }
         }
+
+        public void OpenResource(string resourceId)
+        {
+            _orm.Open(resourceId, _conn, false, _siteExp);
+        }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin	2010-10-18 07:16:47 UTC (rev 5289)
@@ -78,18 +78,24 @@
         <MenuItem id="Menu_Edit"
                   type="Menu"
                   label="${res:Menu_Edit}">
-            <MenuItem id="CopyItem"
-                      icon="document_copy"
-                      label="${res:Menu_Edit_Copy}"
-                      class="Maestro.Base.Commands.NotImplementedCommand" />
-            <MenuItem id="CutItem"
-                      label="${res:Menu_Edit_Cut}"
-                      icon="scissors_blue"
-                      class="Maestro.Base.Commands.NotImplementedCommand" />
-            <MenuItem id="PasteItem"
-                      label="${res:Menu_Edit_Paste}"
-                      icon="clipboard_paste"
-                      class="Maestro.Base.Commands.NotImplementedCommand" />
+            <Condition action="Disable" name="IsNotRoot">
+                <Condition action="Disable" name="CanCutOrCopy">
+                    <MenuItem id="CopyItem"
+                              icon="document_copy"
+                              label="${res:Menu_Edit_Copy}"
+                              class="Maestro.Base.Commands.CopyCommand" />
+                    <MenuItem id="CutItem"
+                              label="${res:Menu_Edit_Cut}"
+                              icon="scissors_blue"
+                              class="Maestro.Base.Commands.CutCommand" />
+                </Condition>
+            </Condition>
+            <Condition action="Disable" name="CanPaste">
+                <MenuItem id="PasteItem"
+                          label="${res:Menu_Edit_Paste}"
+                          icon="clipboard_paste"
+                          class="Maestro.Base.Commands.PasteCommand" />
+            </Condition>
         </MenuItem>
         <!-- For testing various APIs, disabled for releases -->
         <Condition action="Exclude" name="DebugMode">
@@ -138,9 +144,11 @@
                   type="Menu"
                   label="${res:Menu_Package}">
             <MenuItem id="CreatePackage"
+                      icon="box__plus"
                       label="${res:SiteExplorer_SelectedFolder_CreatePackage}"
                       class="Maestro.Base.Commands.CreatePackageCommand" />
             <MenuItem id="LoadPackage"
+                      icon="box__arrow"
                       label="${res:Menu_Package_LoadPackage}"
                       class="Maestro.Base.Commands.LoadPackageCommand" />
         </MenuItem>
@@ -302,31 +310,37 @@
                       class="Maestro.Base.Commands.SiteExplorer.RenameCommand" />
             <MenuItem type="Separator" />
             <MenuItem id="CreatePackage"
+                      icon="box__plus"
                       label="${res:SiteExplorer_SelectedFolder_CreatePackage}"
                       class="Maestro.Base.Commands.CreatePackageCommand" />
             <MenuItem type="Separator" />
             <Condition action="Disable" name="IsNotRoot">
                 <Condition action="Disable" name="CanCutOrCopy">
                     <MenuItem id="Copy"
+                              icon="document_copy"
                               label="${res:SiteExplorer_SelectedItem_Copy}"
                               class="Maestro.Base.Commands.CopyCommand" />
                     <MenuItem id="Cut"
+                              icon="scissors_blue"
                               label="${res:SiteExplorer_SelectedItem_Cut}"
                               class="Maestro.Base.Commands.CutCommand" />
                 </Condition>
             </Condition>
             <Condition action="Disable" name="CanPaste">
                 <MenuItem id="Paste"
+                          icon="clipboard_paste"
                           label="${res:SiteExplorer_SelectedFolder_Paste}"
                           class="Maestro.Base.Commands.PasteCommand" />
             </Condition>
             <MenuItem type="Separator" />
             <Condition action="Disable" name="IsNotRoot">
                 <MenuItem id="Delete"
+                          icon="cross_script"
                           label="${res:SiteExplorer_SelectedItem_Delete}"
                           class="Maestro.Base.Commands.SiteExplorer.DeleteSelectedItemsCommand" />
             </Condition>
             <MenuItem id="Validate"
+                      icon="tick"
                       label="${res:SiteExplorer_ValidateResources}"
                       class="Maestro.Base.Commands.SiteExplorer.ValidateCommand" />
         </Condition>
@@ -337,19 +351,23 @@
         <Condition action="Disable" name="MultipleSelected">
             <Condition action="Disable" name="CanCutOrCopy">
                 <MenuItem id="Copy"
+                          icon="document_copy"
                           label="${res:SiteExplorer_SelectedItem_Copy}"
                           class="Maestro.Base.Commands.CopyCommand" />
                 <MenuItem id="Cut"
+                          icon="scissors_blue"
                           label="${res:SiteExplorer_SelectedItem_Cut}"
                           class="Maestro.Base.Commands.CutCommand" />
             </Condition>
             <MenuItem id="Validate"
+                      icon="tick"
                       label="${res:SiteExplorer_ValidateResources}"
                       class="Maestro.Base.Commands.SiteExplorer.ValidateCommand" />
             <MenuItem type="Separator" />
             <MenuItem id="Delete"
-                     label="${res:SiteExplorer_SelectedItem_Delete}"
-                     class="Maestro.Base.Commands.SiteExplorer.DeleteSelectedItemsCommand" />
+                      icon="cross_script"
+                      label="${res:SiteExplorer_SelectedItem_Delete}"
+                      class="Maestro.Base.Commands.SiteExplorer.DeleteSelectedItemsCommand" />
         </Condition>
     </Path>
 
@@ -360,25 +378,30 @@
                       label="${res:SiteExplorer_SelectedItem_Open}"
                       class="Maestro.Base.Commands.SiteExplorer.OpenResourceCommand" />
             <MenuItem id="OpenXml"
+                      icon="document_code"
                       label="${res:SiteExplorer_SelectedItem_OpenWithXmlEditor}"
                       class="Maestro.Base.Commands.SiteExplorer.OpenWithXmlEditorCommand" />
             <MenuItem id="Rename"
                       label="${res:SiteExplorer_SelectedItem_Rename}"
                       class="Maestro.Base.Commands.SiteExplorer.RenameCommand" />
             <MenuItem id="Delete"
+                      icon="cross_script"
                       label="${res:SiteExplorer_SelectedItem_Delete}"
                       class="Maestro.Base.Commands.SiteExplorer.DeleteSelectedItemsCommand" />
             <MenuItem type="Separator" />
             <Condition action="Disable" name="CanCutOrCopy">
                 <MenuItem id="Copy"
+                          icon="document_copy"
                           label="${res:SiteExplorer_SelectedItem_Copy}"
                           class="Maestro.Base.Commands.CopyCommand" />
                 <MenuItem id="Cut"
+                          icon="scissors_blue"
                           label="${res:SiteExplorer_SelectedItem_Cut}"
                           class="Maestro.Base.Commands.CutCommand" />
             </Condition>
             <MenuItem type="Separator" />
             <MenuItem id="Validate"
+                      icon="tick"
                       label="${res:SiteExplorer_ValidateResources}"
                       class="Maestro.Base.Commands.SiteExplorer.ValidateCommand" />
             <MenuItem type="Separator" />
@@ -395,18 +418,22 @@
                       label="${res:SiteExplorer_SelectedItem_Open}"
                       class="Maestro.Base.Commands.SiteExplorer.OpenResourceCommand" />
             <MenuItem id="Delete"
+                      icon="cross_script"
                       label="${res:SiteExplorer_SelectedItem_Delete}"
                       class="Maestro.Base.Commands.SiteExplorer.DeleteSelectedItemsCommand" />
             <MenuItem type="Separator" />
             <Condition action="Disable" name="CanCutOrCopy">
                 <MenuItem id="Copy"
+                          icon="document_copy"
                           label="${res:SiteExplorer_SelectedItem_Copy}"
                           class="Maestro.Base.Commands.CopyCommand" />
                 <MenuItem id="Cut"
+                          icon="scissors_blue"
                           label="${res:SiteExplorer_SelectedItem_Cut}"
                           class="Maestro.Base.Commands.CutCommand" />
             </Condition>
             <MenuItem id="Validate"
+                      icon="tick"
                       label="${res:SiteExplorer_ValidateResources}"
                       class="Maestro.Base.Commands.SiteExplorer.ValidateCommand" />
         </Condition>
@@ -419,18 +446,22 @@
                       label="${res:SiteExplorer_SelectedItem_Open}"
                       class="Maestro.Base.Commands.SiteExplorer.OpenResourceCommand" />
             <MenuItem id="Delete"
+                      icon="cross_script"
                       label="${res:SiteExplorer_SelectedItem_Delete}"
                       class="Maestro.Base.Commands.SiteExplorer.DeleteSelectedItemsCommand" />
             <MenuItem type="Separator" />
             <Condition action="Disable" name="CanCutOrCopy">
                 <MenuItem id="Copy"
+                          icon="document_copy"
                           label="${res:SiteExplorer_SelectedItem_Copy}"
                           class="Maestro.Base.Commands.CopyCommand" />
                 <MenuItem id="Cut"
+                          icon="scissors_blue"
                           label="${res:SiteExplorer_SelectedItem_Cut}"
                           class="Maestro.Base.Commands.CutCommand" />
             </Condition>
             <MenuItem id="Validate"
+                      icon="tick"
                       label="${res:SiteExplorer_ValidateResources}"
                       class="Maestro.Base.Commands.SiteExplorer.ValidateCommand" />
         </Condition>

Modified: sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj	2010-10-18 07:16:47 UTC (rev 5289)
@@ -308,6 +308,8 @@
   </ItemGroup>
   <ItemGroup>
     <Content Include="Maestro.Base.addin" />
+    <None Include="Resources\box--plus.png" />
+    <None Include="Resources\box--arrow.png" />
     <None Include="Resources\folder--plus.png" />
     <None Include="Resources\cross.png" />
     <None Include="Resources\blueprints.png" />

Modified: sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -227,6 +227,20 @@
             }
         }
         
+        internal static System.Drawing.Bitmap box__arrow {
+            get {
+                object obj = ResourceManager.GetObject("box__arrow", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap box__plus {
+            get {
+                object obj = ResourceManager.GetObject("box__plus", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Done.
         /// </summary>

Modified: sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx	2010-10-18 07:16:47 UTC (rev 5289)
@@ -694,4 +694,10 @@
   <data name="TPL_RLDF_NAME" xml:space="preserve">
     <value>Raster Layer Definition</value>
   </data>
+  <data name="box__arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\box--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="box__plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\box--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
 </root>
\ No newline at end of file

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


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

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


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

Modified: sandbox/maestro-3.0/Maestro.Base/Services/OpenResourceManager.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Services/OpenResourceManager.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Base/Services/OpenResourceManager.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -96,7 +96,7 @@
                     ed = FindEditor(svc, res.GetResourceTypeDescriptor());
                 }
                 var launcher = ServiceRegistry.GetService<UrlLauncherService>();
-                var editorSvc = new ResourceEditorService(resourceId, conn, launcher, siteExp);
+                var editorSvc = new ResourceEditorService(resourceId, conn, launcher, siteExp, this);
                 ed.EditorService = editorSvc;
                 _openItems[resourceId] = ed;
                 ed.ViewContentClosing += (sender, e) =>

Modified: sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -865,7 +865,7 @@
                 IFeatureSource fs = (IFeatureSource)m_connection.ResourceService.GetResource(m_resourceId);
                 bool failures = false;
 
-                Envelope env = null;
+                IEnvelope env = null;
                 foreach (ClassDefinition scm in fs.Describe().Classes)
                 {
                     foreach (FeatureSetColumn col in scm.Columns)
@@ -874,7 +874,7 @@
                         {
                             try
                             {
-                                Envelope re = m_connection.FeatureService.GetSpatialExtent(fs.ResourceID, scm.Name, col.Name, true);
+                                IEnvelope re = m_connection.FeatureService.GetSpatialExtent(fs.ResourceID, scm.Name, col.Name, true);
                                 if (env == null)
                                     env = re;
                                 else

Modified: sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -200,11 +200,21 @@
         /// </summary>
         event EventHandler Saved;
 
+        /// <summary>
+        /// Synchronises changes in the in-memory resource back to the session repository. This is usually called
+        /// before validation of the edited resource begins.
+        /// </summary>
         void SyncSessionCopy();
 
         /// <summary>
         /// Gets the MapGuide Server version
         /// </summary>
         Version SiteVersion { get; }
+
+        /// <summary>
+        /// Opens the specified resource
+        /// </summary>
+        /// <param name="resourceId"></param>
+        void OpenResource(string resourceId);
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2010-10-18 07:16:47 UTC (rev 5289)
@@ -31,10 +31,6 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="Aga.Controls, Version=1.6.1.0, Culture=neutral, PublicKeyToken=fcc90fbf924463a3, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\Thirdparty\TreeViewAdv\Aga.Controls\obj\Debug\Aga.Controls.dll</HintPath>
-    </Reference>
     <Reference Include="ICSharpCode.SharpZipLib, Version=0.85.4.369, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\Thirdparty\SharpZipLib\ICSharpCode.SharpZipLib.dll</HintPath>
@@ -419,6 +415,12 @@
     <Compile Include="LoadProcedure\ShpTransformationCtrl.Designer.cs">
       <DependentUpon>ShpTransformationCtrl.cs</DependentUpon>
     </Compile>
+    <Compile Include="MapDefinition\FiniteScaleListCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MapDefinition\FiniteScaleListCtrl.Designer.cs">
+      <DependentUpon>FiniteScaleListCtrl.cs</DependentUpon>
+    </Compile>
     <Compile Include="MapDefinition\GroupPropertiesCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -431,6 +433,12 @@
     <Compile Include="MapDefinition\LayerPropertiesCtrl.Designer.cs">
       <DependentUpon>LayerPropertiesCtrl.cs</DependentUpon>
     </Compile>
+    <Compile Include="MapDefinition\ManualScaleEditor.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MapDefinition\ManualScaleEditor.Designer.cs">
+      <DependentUpon>ManualScaleEditor.cs</DependentUpon>
+    </Compile>
     <Compile Include="MapDefinition\MapDefinitionEditorCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -449,6 +457,14 @@
     <Compile Include="MapDefinition\MapSettingsSectionCtrl.Designer.cs">
       <DependentUpon>MapSettingsSectionCtrl.cs</DependentUpon>
     </Compile>
+    <Compile Include="MapDefinition\MapTreeModels.cs" />
+    <Compile Include="MapDefinition\ScaleListGenerator.cs" />
+    <Compile Include="PrintLayout\LogoDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="PrintLayout\LogoDialog.Designer.cs">
+      <DependentUpon>LogoDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="PrintLayout\PrintCustomLogosSectionCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -473,6 +489,12 @@
     <Compile Include="PrintLayout\PrintPagePropertiesSectionCtrl.Designer.cs">
       <DependentUpon>PrintPagePropertiesSectionCtrl.cs</DependentUpon>
     </Compile>
+    <Compile Include="PrintLayout\TextDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="PrintLayout\TextDialog.Designer.cs">
+      <DependentUpon>TextDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">
       <AutoGen>True</AutoGen>
@@ -768,6 +790,9 @@
       <DependentUpon>ShpTransformationCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="MapDefinition\FiniteScaleListCtrl.resx">
+      <DependentUpon>FiniteScaleListCtrl.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="MapDefinition\GroupPropertiesCtrl.resx">
       <DependentUpon>GroupPropertiesCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -776,6 +801,9 @@
       <DependentUpon>LayerPropertiesCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="MapDefinition\ManualScaleEditor.resx">
+      <DependentUpon>ManualScaleEditor.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="MapDefinition\MapDefinitionEditorCtrl.resx">
       <DependentUpon>MapDefinitionEditorCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -788,6 +816,9 @@
       <DependentUpon>MapSettingsSectionCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="PrintLayout\LogoDialog.resx">
+      <DependentUpon>LogoDialog.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="PrintLayout\PrintCustomLogosSectionCtrl.resx">
       <DependentUpon>PrintCustomLogosSectionCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -804,6 +835,9 @@
       <DependentUpon>PrintPagePropertiesSectionCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="PrintLayout\TextDialog.resx">
+      <DependentUpon>TextDialog.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Properties\Resources.resx">
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
@@ -859,6 +893,10 @@
       <Project>{80FA3158-8B5F-48D1-A393-0378AFE48A7E}</Project>
       <Name>OSGeo.MapGuide.MaestroAPI</Name>
     </ProjectReference>
+    <ProjectReference Include="..\Thirdparty\TreeViewAdv\Aga.Controls\Aga.Controls.csproj">
+      <Project>{E73BB233-D88B-44A7-A98F-D71EE158381D}</Project>
+      <Name>Aga.Controls</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
     <None Include="Resources\document--plus.png" />
@@ -1315,12 +1353,11 @@
     <Content Include="FsEditorMap.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <None Include="Resources\map--arrow.png" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="DrawingSource\Preview\" />
     <Folder Include="LayerDefinition\Raster\" />
-    <Folder Include="PrintLayout\Logos\" />
-    <Folder Include="PrintLayout\Text\" />
     <Folder Include="SymbolDefinition\" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Added: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,289 @@
+namespace Maestro.Editors.MapDefinition
+{
+    partial class FiniteScaleListCtrl
+    {
+        /// <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.btnGenerateScales = new System.Windows.Forms.Button();
+            this.numScales = new System.Windows.Forms.NumericUpDown();
+            this.label5 = new System.Windows.Forms.Label();
+            this.cmbRounding = new System.Windows.Forms.ComboBox();
+            this.cmbMethod = new System.Windows.Forms.ComboBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.numMaxScale = new System.Windows.Forms.NumericUpDown();
+            this.numMinScale = new System.Windows.Forms.NumericUpDown();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.lstDisplayScales = new System.Windows.Forms.ListBox();
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.btnEditScalesManually = new System.Windows.Forms.ToolStripButton();
+            this.btnRemoveScale = new System.Windows.Forms.ToolStripButton();
+            this.groupBox1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numScales)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numMaxScale)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numMinScale)).BeginInit();
+            this.groupBox2.SuspendLayout();
+            this.toolStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.btnGenerateScales);
+            this.groupBox1.Controls.Add(this.numScales);
+            this.groupBox1.Controls.Add(this.label5);
+            this.groupBox1.Controls.Add(this.cmbRounding);
+            this.groupBox1.Controls.Add(this.cmbMethod);
+            this.groupBox1.Controls.Add(this.label4);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.numMaxScale);
+            this.groupBox1.Controls.Add(this.numMinScale);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(4, 4);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(378, 120);
+            this.groupBox1.TabIndex = 0;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Generate Scales";
+            // 
+            // btnGenerateScales
+            // 
+            this.btnGenerateScales.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnGenerateScales.Location = new System.Drawing.Point(282, 88);
+            this.btnGenerateScales.Name = "btnGenerateScales";
+            this.btnGenerateScales.Size = new System.Drawing.Size(75, 23);
+            this.btnGenerateScales.TabIndex = 10;
+            this.btnGenerateScales.Text = "Generate";
+            this.btnGenerateScales.UseVisualStyleBackColor = true;
+            this.btnGenerateScales.Click += new System.EventHandler(this.btnGenerateScales_Click);
+            // 
+            // numScales
+            // 
+            this.numScales.Location = new System.Drawing.Point(117, 86);
+            this.numScales.Maximum = new decimal(new int[] {
+            2147483647,
+            0,
+            0,
+            0});
+            this.numScales.Name = "numScales";
+            this.numScales.Size = new System.Drawing.Size(47, 20);
+            this.numScales.TabIndex = 9;
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(15, 88);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(91, 13);
+            this.label5.TabIndex = 8;
+            this.label5.Text = "Number of Scales";
+            // 
+            // cmbRounding
+            // 
+            this.cmbRounding.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.cmbRounding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbRounding.FormattingEnabled = true;
+            this.cmbRounding.Location = new System.Drawing.Point(243, 57);
+            this.cmbRounding.Name = "cmbRounding";
+            this.cmbRounding.Size = new System.Drawing.Size(114, 21);
+            this.cmbRounding.TabIndex = 7;
+            // 
+            // cmbMethod
+            // 
+            this.cmbMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbMethod.FormattingEnabled = true;
+            this.cmbMethod.Location = new System.Drawing.Point(75, 57);
+            this.cmbMethod.Name = "cmbMethod";
+            this.cmbMethod.Size = new System.Drawing.Size(89, 21);
+            this.cmbMethod.TabIndex = 6;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(180, 60);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(53, 13);
+            this.label4.TabIndex = 5;
+            this.label4.Text = "Rounding";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(15, 60);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(43, 13);
+            this.label3.TabIndex = 4;
+            this.label3.Text = "Method";
+            // 
+            // numMaxScale
+            // 
+            this.numMaxScale.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.numMaxScale.Location = new System.Drawing.Point(243, 30);
+            this.numMaxScale.Maximum = new decimal(new int[] {
+            2147483647,
+            0,
+            0,
+            0});
+            this.numMaxScale.Name = "numMaxScale";
+            this.numMaxScale.Size = new System.Drawing.Size(114, 20);
+            this.numMaxScale.TabIndex = 3;
+            // 
+            // numMinScale
+            // 
+            this.numMinScale.Location = new System.Drawing.Point(75, 30);
+            this.numMinScale.Maximum = new decimal(new int[] {
+            2147483647,
+            0,
+            0,
+            0});
+            this.numMinScale.Name = "numMinScale";
+            this.numMinScale.Size = new System.Drawing.Size(89, 20);
+            this.numMinScale.TabIndex = 2;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(180, 32);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(57, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Max Scale";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(15, 32);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(54, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Min Scale";
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.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.groupBox2.Controls.Add(this.lstDisplayScales);
+            this.groupBox2.Controls.Add(this.toolStrip1);
+            this.groupBox2.Location = new System.Drawing.Point(4, 131);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(378, 137);
+            this.groupBox2.TabIndex = 1;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Display Scales";
+            // 
+            // lstDisplayScales
+            // 
+            this.lstDisplayScales.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lstDisplayScales.FormattingEnabled = true;
+            this.lstDisplayScales.Location = new System.Drawing.Point(3, 41);
+            this.lstDisplayScales.Name = "lstDisplayScales";
+            this.lstDisplayScales.Size = new System.Drawing.Size(372, 82);
+            this.lstDisplayScales.TabIndex = 1;
+            this.lstDisplayScales.SelectedIndexChanged += new System.EventHandler(this.lstDisplayScales_SelectedIndexChanged);
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnEditScalesManually,
+            this.btnRemoveScale});
+            this.toolStrip1.Location = new System.Drawing.Point(3, 16);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(372, 25);
+            this.toolStrip1.TabIndex = 0;
+            this.toolStrip1.Text = "toolStrip1";
+            // 
+            // btnEditScalesManually
+            // 
+            this.btnEditScalesManually.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnEditScalesManually.Image = global::Maestro.Editors.Properties.Resources.document__pencil;
+            this.btnEditScalesManually.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnEditScalesManually.Name = "btnEditScalesManually";
+            this.btnEditScalesManually.Size = new System.Drawing.Size(23, 22);
+            this.btnEditScalesManually.ToolTipText = "Manually edit scales";
+            this.btnEditScalesManually.Click += new System.EventHandler(this.btnEditScalesManually_Click);
+            // 
+            // btnRemoveScale
+            // 
+            this.btnRemoveScale.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnRemoveScale.Enabled = false;
+            this.btnRemoveScale.Image = global::Maestro.Editors.Properties.Resources.cross_script;
+            this.btnRemoveScale.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnRemoveScale.Name = "btnRemoveScale";
+            this.btnRemoveScale.Size = new System.Drawing.Size(23, 22);
+            this.btnRemoveScale.ToolTipText = "Remove selected scale";
+            this.btnRemoveScale.Click += new System.EventHandler(this.btnRemoveScale_Click);
+            // 
+            // FiniteScaleListCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.groupBox1);
+            this.Name = "FiniteScaleListCtrl";
+            this.Size = new System.Drawing.Size(385, 271);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numScales)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numMaxScale)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numMinScale)).EndInit();
+            this.groupBox2.ResumeLayout(false);
+            this.groupBox2.PerformLayout();
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.ComboBox cmbRounding;
+        private System.Windows.Forms.ComboBox cmbMethod;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.NumericUpDown numMaxScale;
+        private System.Windows.Forms.NumericUpDown numMinScale;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Button btnGenerateScales;
+        private System.Windows.Forms.NumericUpDown numScales;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.ListBox lstDisplayScales;
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.ToolStripButton btnEditScalesManually;
+        private System.Windows.Forms.ToolStripButton btnRemoveScale;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,166 @@
+#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.Shared.UI;
+using OSGeo.MapGuide.ObjectModels.MapDefinition;
+
+namespace Maestro.Editors.MapDefinition
+{
+    public partial class FiniteScaleListCtrl : UserControl
+    {
+        internal FiniteScaleListCtrl()
+        {
+            InitializeComponent();
+            cmbMethod.DataSource = Enum.GetValues(typeof(ScaleGenerationMethod));
+            cmbRounding.DataSource = Enum.GetValues(typeof(ScaleRoundingMethod));
+
+            cmbMethod.SelectedIndex = 0;
+            cmbRounding.SelectedIndex = 0;
+            _scales = new BindingList<double>();
+
+            lstDisplayScales.DataSource = _scales;
+        }
+
+        private BindingList<double> _scales;
+
+        private IMapDefinition _map;
+
+        public FiniteScaleListCtrl(IMapDefinition map)
+            : this()
+        {
+            _map = map;
+            //Init scale list
+            if (_map.BaseMap != null)
+            {
+                foreach (var scale in _map.BaseMap.FiniteDisplayScale)
+                {
+                    _scales.Add(scale);
+                }
+            }
+            //Now wire change events
+            _scales.ListChanged += new ListChangedEventHandler(OnScaleListChanged);
+        }
+
+        void OnScaleListChanged(object sender, ListChangedEventArgs e)
+        {
+            switch (e.ListChangedType)
+            {
+                case ListChangedType.ItemAdded:
+                    {
+                        AddScaleToMap(_scales[e.NewIndex]);
+                    }
+                    break;
+                case ListChangedType.ItemDeleted:
+                    {
+                        RemoveScaleFromMap(_scales[e.NewIndex]);
+                    }
+                    break;
+                case ListChangedType.Reset:
+                    {
+                        ClearScales();
+                    }
+                    break;
+            }
+        }
+
+        private void ClearScales()
+        {
+            _map.InitBaseMap();
+            _map.BaseMap.RemoveAllScales();
+        }
+
+        private void RemoveScaleFromMap(double scale)
+        {
+            _map.InitBaseMap();
+            _map.BaseMap.RemoveFiniteDisplayScale(scale);
+        }
+
+        private void AddScaleToMap(double scale)
+        {
+            _map.InitBaseMap();
+            _map.BaseMap.AddFiniteDisplayScale(scale);
+        }
+
+        private void btnGenerateScales_Click(object sender, EventArgs e)
+        {
+            if (lstDisplayScales.Items.Count > 0)
+            {
+                if (MessageBox.Show(this, Properties.Resources.OverwriteDisplayScales, Properties.Resources.Confirm, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
+                {
+                    return;
+                }
+            }
+
+            using (new WaitCursor(this))
+            {
+                var values = ScaleListGenerator.GenerateScales(
+                    (double)numMinScale.Value,
+                    (double)numMaxScale.Value,
+                    (ScaleGenerationMethod)cmbMethod.SelectedItem,
+                    (ScaleRoundingMethod)cmbRounding.SelectedItem,
+                    (int)numScales.Value);
+
+                _scales.Clear();
+                foreach (var s in values)
+                {
+                    _scales.Add(s);
+                }
+            }
+        }
+
+        private void btnRemoveScale_Click(object sender, EventArgs e)
+        {
+            if (lstDisplayScales.SelectedItem != null)
+            {
+                double scale = (double)lstDisplayScales.SelectedItem;
+                _scales.Remove(scale);
+            }
+        }
+
+        private void lstDisplayScales_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            btnRemoveScale.Enabled = (lstDisplayScales.SelectedItem != null);
+        }
+
+        private void btnEditScalesManually_Click(object sender, EventArgs e)
+        {
+            using (var dlg = new ManualScaleEditor(_scales))
+            {
+                if (dlg.ShowDialog() == DialogResult.OK)
+                {
+                    using (new WaitCursor(this))
+                    {
+                        _scales.Clear();
+                        foreach (double scale in dlg.Scales)
+                        {
+                            _scales.Add(scale);
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/FiniteScaleListCtrl.resx	2010-10-18 07:16:47 UTC (rev 5289)
@@ -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/MapDefinition/GroupPropertiesCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/GroupPropertiesCtrl.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/GroupPropertiesCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -29,7 +29,6 @@
         private void InitializeComponent()
         {
             this.groupBox1 = new System.Windows.Forms.GroupBox();
-            this.chkSelectable = new System.Windows.Forms.CheckBox();
             this.chkExpanded = new System.Windows.Forms.CheckBox();
             this.chkLegendVisible = new System.Windows.Forms.CheckBox();
             this.chkVisible = new System.Windows.Forms.CheckBox();
@@ -42,7 +41,6 @@
             // 
             // groupBox1
             // 
-            this.groupBox1.Controls.Add(this.chkSelectable);
             this.groupBox1.Controls.Add(this.chkExpanded);
             this.groupBox1.Controls.Add(this.chkLegendVisible);
             this.groupBox1.Controls.Add(this.chkVisible);
@@ -58,20 +56,10 @@
             this.groupBox1.TabStop = false;
             this.groupBox1.Text = "Layer Group Properties";
             // 
-            // chkSelectable
-            // 
-            this.chkSelectable.AutoSize = true;
-            this.chkSelectable.Location = new System.Drawing.Point(18, 103);
-            this.chkSelectable.Name = "chkSelectable";
-            this.chkSelectable.Size = new System.Drawing.Size(240, 17);
-            this.chkSelectable.TabIndex = 15;
-            this.chkSelectable.Text = "Features on the layer are selectable (if visible)";
-            this.chkSelectable.UseVisualStyleBackColor = true;
-            // 
             // chkExpanded
             // 
             this.chkExpanded.AutoSize = true;
-            this.chkExpanded.Location = new System.Drawing.Point(18, 150);
+            this.chkExpanded.Location = new System.Drawing.Point(18, 127);
             this.chkExpanded.Name = "chkExpanded";
             this.chkExpanded.Size = new System.Drawing.Size(228, 17);
             this.chkExpanded.TabIndex = 14;
@@ -81,7 +69,7 @@
             // chkLegendVisible
             // 
             this.chkLegendVisible.AutoSize = true;
-            this.chkLegendVisible.Location = new System.Drawing.Point(18, 126);
+            this.chkLegendVisible.Location = new System.Drawing.Point(18, 103);
             this.chkLegendVisible.Name = "chkLegendVisible";
             this.chkLegendVisible.Size = new System.Drawing.Size(183, 17);
             this.chkLegendVisible.TabIndex = 13;
@@ -150,7 +138,6 @@
         #endregion
 
         private System.Windows.Forms.GroupBox groupBox1;
-        private System.Windows.Forms.CheckBox chkSelectable;
         private System.Windows.Forms.CheckBox chkExpanded;
         private System.Windows.Forms.CheckBox chkLegendVisible;
         private System.Windows.Forms.CheckBox chkVisible;

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/GroupPropertiesCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/GroupPropertiesCtrl.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/GroupPropertiesCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -1,4 +1,23 @@
-using System;
+#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;
@@ -19,34 +38,38 @@
 
         public event EventHandler GroupChanged;
 
-        public GroupPropertiesCtrl(MapLayerGroupType group)
+        public GroupPropertiesCtrl(IMapLayerGroup group)
             : this()
         {
             group.PropertyChanged += new PropertyChangedEventHandler(OnGroupChanged);
 
-            //txtName.DataBindings.Add("Text", group, "Name");
-            //txtLegendLabel.DataBindings.Add("Text", group, "LegendLabel");
             TextBoxBinder.BindText(txtName, group, "Name");
             TextBoxBinder.BindText(txtLegendLabel, group, "LegendLabel");
 
-            //chkExpanded.DataBindings.Add("Checked", group, "ExpandInLegend");
-            //chkLegendVisible.DataBindings.Add("Checked", group, "ShowInLegend");
-            //chkVisible.DataBindings.Add("Checked", group, "Visible");
             CheckBoxBinder.BindChecked(chkExpanded, group, "ExpandInLegend");
             CheckBoxBinder.BindChecked(chkLegendVisible, group, "ShowInLegend");
             CheckBoxBinder.BindChecked(chkVisible, group, "Visible");
         }
 
+        public GroupPropertiesCtrl(IBaseMapGroup group)
+            : this()
+        {
+            group.PropertyChanged += new PropertyChangedEventHandler(OnGroupChanged);
+
+            TextBoxBinder.BindText(txtName, group, "Name");
+            TextBoxBinder.BindText(txtLegendLabel, group, "LegendLabel");
+
+            CheckBoxBinder.BindChecked(chkExpanded, group, "ExpandInLegend");
+            CheckBoxBinder.BindChecked(chkLegendVisible, group, "ShowInLegend");
+            //CheckBoxBinder.BindChecked(chkVisible, group, "Visible");
+            chkVisible.Visible = false;
+        }
+
         void OnGroupChanged(object sender, PropertyChangedEventArgs e)
         {
             var handler = this.GroupChanged;
             if (handler != null)
                 handler(this, EventArgs.Empty);
         }
-
-        //void ForceUpdate(object sender, EventArgs e)
-        //{
-        //    ((Control)sender).DataBindings[0].WriteValue();
-        //}
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/LayerPropertiesCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/LayerPropertiesCtrl.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/LayerPropertiesCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -29,6 +29,9 @@
         private void InitializeComponent()
         {
             this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.btnBrowse = new System.Windows.Forms.Button();
+            this.txtResourceId = new System.Windows.Forms.TextBox();
+            this.label3 = new System.Windows.Forms.Label();
             this.chkSelectable = new System.Windows.Forms.CheckBox();
             this.chkExpanded = new System.Windows.Forms.CheckBox();
             this.chkLegendVisible = new System.Windows.Forms.CheckBox();
@@ -42,6 +45,9 @@
             // 
             // groupBox1
             // 
+            this.groupBox1.Controls.Add(this.btnBrowse);
+            this.groupBox1.Controls.Add(this.txtResourceId);
+            this.groupBox1.Controls.Add(this.label3);
             this.groupBox1.Controls.Add(this.chkSelectable);
             this.groupBox1.Controls.Add(this.chkExpanded);
             this.groupBox1.Controls.Add(this.chkLegendVisible);
@@ -53,15 +59,45 @@
             this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
             this.groupBox1.Location = new System.Drawing.Point(0, 0);
             this.groupBox1.Name = "groupBox1";
-            this.groupBox1.Size = new System.Drawing.Size(417, 188);
+            this.groupBox1.Size = new System.Drawing.Size(417, 217);
             this.groupBox1.TabIndex = 0;
             this.groupBox1.TabStop = false;
             this.groupBox1.Text = "Layer Properties";
             // 
+            // 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(371, 17);
+            this.btnBrowse.Name = "btnBrowse";
+            this.btnBrowse.Size = new System.Drawing.Size(26, 23);
+            this.btnBrowse.TabIndex = 10;
+            this.btnBrowse.Text = "...";
+            this.btnBrowse.UseVisualStyleBackColor = true;
+            this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
+            // 
+            // txtResourceId
+            // 
+            this.txtResourceId.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtResourceId.Location = new System.Drawing.Point(112, 19);
+            this.txtResourceId.Name = "txtResourceId";
+            this.txtResourceId.ReadOnly = true;
+            this.txtResourceId.Size = new System.Drawing.Size(253, 20);
+            this.txtResourceId.TabIndex = 9;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(20, 22);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(80, 13);
+            this.label3.TabIndex = 8;
+            this.label3.Text = "Layer Definition";
+            // 
             // chkSelectable
             // 
             this.chkSelectable.AutoSize = true;
-            this.chkSelectable.Location = new System.Drawing.Point(21, 106);
+            this.chkSelectable.Location = new System.Drawing.Point(23, 129);
             this.chkSelectable.Name = "chkSelectable";
             this.chkSelectable.Size = new System.Drawing.Size(240, 17);
             this.chkSelectable.TabIndex = 7;
@@ -71,7 +107,7 @@
             // chkExpanded
             // 
             this.chkExpanded.AutoSize = true;
-            this.chkExpanded.Location = new System.Drawing.Point(21, 153);
+            this.chkExpanded.Location = new System.Drawing.Point(23, 176);
             this.chkExpanded.Name = "chkExpanded";
             this.chkExpanded.Size = new System.Drawing.Size(228, 17);
             this.chkExpanded.TabIndex = 6;
@@ -81,7 +117,7 @@
             // chkLegendVisible
             // 
             this.chkLegendVisible.AutoSize = true;
-            this.chkLegendVisible.Location = new System.Drawing.Point(21, 129);
+            this.chkLegendVisible.Location = new System.Drawing.Point(23, 152);
             this.chkLegendVisible.Name = "chkLegendVisible";
             this.chkLegendVisible.Size = new System.Drawing.Size(183, 17);
             this.chkLegendVisible.TabIndex = 5;
@@ -91,7 +127,7 @@
             // chkVisible
             // 
             this.chkVisible.AutoSize = true;
-            this.chkVisible.Location = new System.Drawing.Point(21, 83);
+            this.chkVisible.Location = new System.Drawing.Point(23, 106);
             this.chkVisible.Name = "chkVisible";
             this.chkVisible.Size = new System.Drawing.Size(141, 17);
             this.chkVisible.TabIndex = 4;
@@ -102,7 +138,7 @@
             // 
             this.txtLegendLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                         | System.Windows.Forms.AnchorStyles.Right)));
-            this.txtLegendLabel.Location = new System.Drawing.Point(110, 48);
+            this.txtLegendLabel.Location = new System.Drawing.Point(112, 71);
             this.txtLegendLabel.Name = "txtLegendLabel";
             this.txtLegendLabel.Size = new System.Drawing.Size(285, 20);
             this.txtLegendLabel.TabIndex = 3;
@@ -111,7 +147,7 @@
             // 
             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(110, 22);
+            this.txtName.Location = new System.Drawing.Point(112, 45);
             this.txtName.Name = "txtName";
             this.txtName.Size = new System.Drawing.Size(285, 20);
             this.txtName.TabIndex = 2;
@@ -119,7 +155,7 @@
             // label2
             // 
             this.label2.AutoSize = true;
-            this.label2.Location = new System.Drawing.Point(18, 51);
+            this.label2.Location = new System.Drawing.Point(20, 74);
             this.label2.Name = "label2";
             this.label2.Size = new System.Drawing.Size(72, 13);
             this.label2.TabIndex = 1;
@@ -128,7 +164,7 @@
             // label1
             // 
             this.label1.AutoSize = true;
-            this.label1.Location = new System.Drawing.Point(18, 25);
+            this.label1.Location = new System.Drawing.Point(20, 48);
             this.label1.Name = "label1";
             this.label1.Size = new System.Drawing.Size(35, 13);
             this.label1.TabIndex = 0;
@@ -140,7 +176,7 @@
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.Controls.Add(this.groupBox1);
             this.Name = "LayerPropertiesCtrl";
-            this.Size = new System.Drawing.Size(417, 188);
+            this.Size = new System.Drawing.Size(417, 217);
             this.groupBox1.ResumeLayout(false);
             this.groupBox1.PerformLayout();
             this.ResumeLayout(false);
@@ -158,5 +194,8 @@
         private System.Windows.Forms.Label label2;
         private System.Windows.Forms.Label label1;
         private System.Windows.Forms.CheckBox chkSelectable;
+        private System.Windows.Forms.Button btnBrowse;
+        private System.Windows.Forms.TextBox txtResourceId;
+        private System.Windows.Forms.Label label3;
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/LayerPropertiesCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/LayerPropertiesCtrl.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/LayerPropertiesCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -1,4 +1,23 @@
-using System;
+#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;
@@ -7,6 +26,9 @@
 using System.Windows.Forms;
 using OSGeo.MapGuide.ObjectModels.MapDefinition;
 using Maestro.Shared.UI;
+using Maestro.Editors.Generic;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.MaestroAPI;
 
 namespace Maestro.Editors.MapDefinition
 {
@@ -18,18 +40,14 @@
         }
 
         public event EventHandler LayerChanged;
+        private IResourceService _resSvc;
 
-        public LayerPropertiesCtrl(MapLayerType layer) : this()
+        public LayerPropertiesCtrl(IMapLayer layer, IResourceService resSvc) : this()
         {
-            layer.PropertyChanged += new PropertyChangedEventHandler(OnLayerChanged); 
-            //txtName.DataBindings.Add("Text", layer, "Name");
-            //txtLegendLabel.DataBindings.Add("Text", layer, "LegendLabel");
+            layer.PropertyChanged += new PropertyChangedEventHandler(OnLayerChanged);
+            _resSvc = resSvc;
 
-            //chkExpanded.DataBindings.Add("Checked", layer, "ExpandInLegend");
-            //chkLegendVisible.DataBindings.Add("Checked", layer, "ShowInLegend");
-            //chkVisible.DataBindings.Add("Checked", layer, "Visible");
-            //chkSelectable.DataBindings.Add("Checked", layer, "Selectable");
-
+            TextBoxBinder.BindText(txtResourceId, layer, "ResourceId");
             TextBoxBinder.BindText(txtName, layer, "Name");
             TextBoxBinder.BindText(txtLegendLabel, layer, "LegendLabel");
 
@@ -39,6 +57,23 @@
             CheckBoxBinder.BindChecked(chkSelectable, layer, "Selectable");
         }
 
+        public LayerPropertiesCtrl(IBaseMapLayer layer, IResourceService resSvc)
+            : this()
+        {
+            layer.PropertyChanged += new PropertyChangedEventHandler(OnLayerChanged);
+            _resSvc = resSvc;
+
+            TextBoxBinder.BindText(txtResourceId, layer, "ResourceId");
+            TextBoxBinder.BindText(txtName, layer, "Name");
+            TextBoxBinder.BindText(txtLegendLabel, layer, "LegendLabel");
+
+            CheckBoxBinder.BindChecked(chkExpanded, layer, "ExpandInLegend");
+            CheckBoxBinder.BindChecked(chkLegendVisible, layer, "ShowInLegend");
+            //CheckBoxBinder.BindChecked(chkVisible, layer, "Visible");
+            chkVisible.Visible = false;
+            CheckBoxBinder.BindChecked(chkSelectable, layer, "Selectable");
+        }
+
         void OnLayerChanged(object sender, PropertyChangedEventArgs e)
         {
             var handler = this.LayerChanged;
@@ -46,9 +81,15 @@
                 handler(this, EventArgs.Empty);
         }
 
-        //void ForceUpdate(object sender, EventArgs e)
-        //{
-        //    ((Control)sender).DataBindings[0].WriteValue();
-        //}
+        private void btnBrowse_Click(object sender, EventArgs e)
+        {
+            using (var picker = new ResourcePicker(_resSvc, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
+            {
+                if (picker.ShowDialog() == DialogResult.OK)
+                {
+                    txtResourceId.Text = picker.ResourceID;
+                }
+            }
+        }
     }
 }

Added: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,95 @@
+namespace Maestro.Editors.MapDefinition
+{
+    partial class ManualScaleEditor
+    {
+        /// <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 Windows Form 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.txtScales = new System.Windows.Forms.TextBox();
+            this.btnSave = new System.Windows.Forms.Button();
+            this.btnCancel = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // txtScales
+            // 
+            this.txtScales.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.txtScales.Location = new System.Drawing.Point(13, 13);
+            this.txtScales.Multiline = true;
+            this.txtScales.Name = "txtScales";
+            this.txtScales.Size = new System.Drawing.Size(267, 219);
+            this.txtScales.TabIndex = 0;
+            // 
+            // btnSave
+            // 
+            this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnSave.Location = new System.Drawing.Point(123, 238);
+            this.btnSave.Name = "btnSave";
+            this.btnSave.Size = new System.Drawing.Size(75, 23);
+            this.btnSave.TabIndex = 1;
+            this.btnSave.Text = "Save";
+            this.btnSave.UseVisualStyleBackColor = true;
+            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.btnCancel.Location = new System.Drawing.Point(205, 238);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(75, 23);
+            this.btnCancel.TabIndex = 2;
+            this.btnCancel.Text = "Cancel";
+            this.btnCancel.UseVisualStyleBackColor = true;
+            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+            // 
+            // ManualScaleEditor
+            // 
+            this.AcceptButton = this.btnSave;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this.btnCancel;
+            this.ClientSize = new System.Drawing.Size(292, 273);
+            this.ControlBox = false;
+            this.Controls.Add(this.btnCancel);
+            this.Controls.Add(this.btnSave);
+            this.Controls.Add(this.txtScales);
+            this.Name = "ManualScaleEditor";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Edit Scales Manually";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TextBox txtScales;
+        private System.Windows.Forms.Button btnSave;
+        private System.Windows.Forms.Button btnCancel;
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,72 @@
+#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.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.MapDefinition
+{
+    public partial class ManualScaleEditor : Form
+    {
+        private ManualScaleEditor()
+        {
+            InitializeComponent();
+        }
+
+        public ManualScaleEditor(IEnumerable<double> scales) 
+            : this()
+        {
+            List<string> values = new List<string>();
+            foreach (var d in scales)
+            {
+                values.Add(d.ToString(System.Threading.Thread.CurrentThread.CurrentUICulture));
+            }
+            txtScales.Text = string.Join(Environment.NewLine, values.ToArray());
+        }
+
+        public double[] Scales
+        {
+            get
+            {
+                List<double> scales = new List<double>();
+                string[] values = txtScales.Lines;
+                foreach (var str in values)
+                {
+                    scales.Add(double.Parse(str, System.Threading.Thread.CurrentThread.CurrentUICulture));
+                }
+                return scales.ToArray();
+            }
+        }
+
+        private void btnCancel_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.Cancel;
+        }
+
+        private void btnSave_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.OK;
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ManualScaleEditor.resx	2010-10-18 07:16:47 UTC (rev 5289)
@@ -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

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -28,41 +28,41 @@
         /// </summary>
         private void InitializeComponent()
         {
-            this.mapSettingsSectionCtrl1 = new Maestro.Editors.MapDefinition.MapSettingsSectionCtrl();
-            this.mapLayersSectionCtrl1 = new Maestro.Editors.MapDefinition.MapLayersSectionCtrl();
+            this.mapSettingsCtrl = new Maestro.Editors.MapDefinition.MapSettingsSectionCtrl();
+            this.mapLayersCtrl = new Maestro.Editors.MapDefinition.MapLayersSectionCtrl();
             this.SuspendLayout();
             // 
             // mapSettingsSectionCtrl1
             // 
-            this.mapSettingsSectionCtrl1.ContentBackgroundColor = System.Drawing.SystemColors.Control;
-            this.mapSettingsSectionCtrl1.Dock = System.Windows.Forms.DockStyle.Top;
-            this.mapSettingsSectionCtrl1.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.mapSettingsSectionCtrl1.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.mapSettingsSectionCtrl1.HeaderText = "Map Settings";
-            this.mapSettingsSectionCtrl1.Location = new System.Drawing.Point(0, 0);
-            this.mapSettingsSectionCtrl1.Name = "mapSettingsSectionCtrl1";
-            this.mapSettingsSectionCtrl1.Size = new System.Drawing.Size(604, 206);
-            this.mapSettingsSectionCtrl1.TabIndex = 0;
+            this.mapSettingsCtrl.ContentBackgroundColor = System.Drawing.SystemColors.Control;
+            this.mapSettingsCtrl.Dock = System.Windows.Forms.DockStyle.Top;
+            this.mapSettingsCtrl.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
+            this.mapSettingsCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.mapSettingsCtrl.HeaderText = "Map Settings";
+            this.mapSettingsCtrl.Location = new System.Drawing.Point(0, 0);
+            this.mapSettingsCtrl.Name = "mapSettingsSectionCtrl1";
+            this.mapSettingsCtrl.Size = new System.Drawing.Size(604, 206);
+            this.mapSettingsCtrl.TabIndex = 0;
             // 
             // mapLayersSectionCtrl1
             // 
-            this.mapLayersSectionCtrl1.ContentBackgroundColor = System.Drawing.SystemColors.Control;
-            this.mapLayersSectionCtrl1.Dock = System.Windows.Forms.DockStyle.Top;
-            this.mapLayersSectionCtrl1.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.mapLayersSectionCtrl1.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.mapLayersSectionCtrl1.HeaderText = "Layers";
-            this.mapLayersSectionCtrl1.Location = new System.Drawing.Point(0, 206);
-            this.mapLayersSectionCtrl1.Name = "mapLayersSectionCtrl1";
-            this.mapLayersSectionCtrl1.Size = new System.Drawing.Size(604, 319);
-            this.mapLayersSectionCtrl1.TabIndex = 1;
+            this.mapLayersCtrl.ContentBackgroundColor = System.Drawing.SystemColors.Control;
+            this.mapLayersCtrl.Dock = System.Windows.Forms.DockStyle.Top;
+            this.mapLayersCtrl.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
+            this.mapLayersCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.mapLayersCtrl.HeaderText = "Layers";
+            this.mapLayersCtrl.Location = new System.Drawing.Point(0, 206);
+            this.mapLayersCtrl.Name = "mapLayersSectionCtrl1";
+            this.mapLayersCtrl.Size = new System.Drawing.Size(604, 319);
+            this.mapLayersCtrl.TabIndex = 1;
             // 
             // MapDefinitionEditorCtrl
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.AutoScroll = true;
-            this.Controls.Add(this.mapLayersSectionCtrl1);
-            this.Controls.Add(this.mapSettingsSectionCtrl1);
+            this.Controls.Add(this.mapLayersCtrl);
+            this.Controls.Add(this.mapSettingsCtrl);
             this.Name = "MapDefinitionEditorCtrl";
             this.Size = new System.Drawing.Size(604, 500);
             this.ResumeLayout(false);
@@ -71,7 +71,7 @@
 
         #endregion
 
-        private MapSettingsSectionCtrl mapSettingsSectionCtrl1;
-        private MapLayersSectionCtrl mapLayersSectionCtrl1;
+        private MapSettingsSectionCtrl mapSettingsCtrl;
+        private MapLayersSectionCtrl mapLayersCtrl;
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -35,13 +35,22 @@
         }
 
         private OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition _map;
+        private IEditorService _edSvc;
 
         public override void Bind(IEditorService service)
         {
-            _map = service.GetEditedResource() as OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition;
+            _edSvc = service;
+            _map = _edSvc.GetEditedResource() as OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition;
 
-            mapSettingsSectionCtrl1.Bind(service);
-            mapLayersSectionCtrl1.Bind(service);
+            mapSettingsCtrl.Bind(service);
+            mapLayersCtrl.Bind(service);
+
+            mapLayersCtrl.RequestLayerOpen += new OpenLayerEventHandler(OnRequestLayerOpen);
         }
+
+        void OnRequestLayerOpen(object sender, string layerResourceId)
+        {
+            _edSvc.OpenResource(layerResourceId);
+        }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -28,39 +28,45 @@
         /// </summary>
         private void InitializeComponent()
         {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MapLayersSectionCtrl));
             this.tabControl1 = new System.Windows.Forms.TabControl();
             this.TAB_GROUP = new System.Windows.Forms.TabPage();
             this.trvLayersGroup = new Aga.Controls.Tree.TreeViewAdv();
             this.NODE_GROUP_ICON = new Aga.Controls.Tree.NodeControls.NodeIcon();
             this.NODE_GROUP_TEXT = new Aga.Controls.Tree.NodeControls.NodeTextBox();
             this.toolStrip1 = new System.Windows.Forms.ToolStrip();
-            this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
-            this.toolStripButton2 = new System.Windows.Forms.ToolStripButton();
+            this.btnAddGroup = new System.Windows.Forms.ToolStripButton();
+            this.btnRemoveGroup = new System.Windows.Forms.ToolStripButton();
             this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
-            this.toolStripButton3 = new System.Windows.Forms.ToolStripButton();
-            this.toolStripButton4 = new System.Windows.Forms.ToolStripButton();
-            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
-            this.toolStripButton5 = new System.Windows.Forms.ToolStripButton();
-            this.toolStripButton6 = new System.Windows.Forms.ToolStripButton();
+            this.btnGRPAddLayer = new System.Windows.Forms.ToolStripButton();
+            this.btnGRPRemoveLayer = new System.Windows.Forms.ToolStripButton();
             this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
-            this.toolStripButton7 = new System.Windows.Forms.ToolStripButton();
-            this.toolStripButton8 = new System.Windows.Forms.ToolStripButton();
-            this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
-            this.toolStripButton21 = new System.Windows.Forms.ToolStripButton();
+            this.btnConvertLayerGroupToBaseGroup = new System.Windows.Forms.ToolStripButton();
             this.TAB_DRAWING_ORDER = new System.Windows.Forms.TabPage();
             this.trvLayerDrawingOrder = new Aga.Controls.Tree.TreeViewAdv();
             this.NODE_DRAW_ICON = new Aga.Controls.Tree.NodeControls.NodeIcon();
             this.NODE_DRAW_TEXT = new Aga.Controls.Tree.NodeControls.NodeTextBox();
             this.toolStrip2 = new System.Windows.Forms.ToolStrip();
-            this.toolStripButton9 = new System.Windows.Forms.ToolStripButton();
-            this.toolStripButton10 = new System.Windows.Forms.ToolStripButton();
+            this.btnDLAddLayer = new System.Windows.Forms.ToolStripButton();
+            this.btnDLRemoveLayer = new System.Windows.Forms.ToolStripButton();
             this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
-            this.toolStripButton11 = new System.Windows.Forms.ToolStripButton();
-            this.toolStripButton12 = new System.Windows.Forms.ToolStripButton();
+            this.btnDLMoveLayerUp = new System.Windows.Forms.ToolStripButton();
+            this.btnDLMoveLayerDown = new System.Windows.Forms.ToolStripButton();
             this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
-            this.toolStripButton13 = new System.Windows.Forms.ToolStripButton();
-            this.toolStripButton14 = new System.Windows.Forms.ToolStripButton();
+            this.btnDLMoveLayerTop = new System.Windows.Forms.ToolStripButton();
+            this.btnDLMoveLayerBottom = new System.Windows.Forms.ToolStripButton();
+            this.TAB_BASE_LAYERS = new System.Windows.Forms.TabPage();
+            this.trvBaseLayers = new Aga.Controls.Tree.TreeViewAdv();
+            this.nodeIcon1 = new Aga.Controls.Tree.NodeControls.NodeIcon();
+            this.nodeTextBox1 = new Aga.Controls.Tree.NodeControls.NodeTextBox();
+            this.toolStrip3 = new System.Windows.Forms.ToolStrip();
+            this.btnNewBaseLayerGroup = new System.Windows.Forms.ToolStripButton();
+            this.btnRemoveBaseLayerGroup = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnAddBaseLayer = new System.Windows.Forms.ToolStripButton();
+            this.btnRemoveBaseLayer = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnMoveBaseLayerUp = new System.Windows.Forms.ToolStripButton();
+            this.btnMoveBaseLayerDown = new System.Windows.Forms.ToolStripButton();
             this.splitter1 = new System.Windows.Forms.Splitter();
             this.propertiesPanel = new System.Windows.Forms.Panel();
             this.contentPanel.SuspendLayout();
@@ -69,6 +75,8 @@
             this.toolStrip1.SuspendLayout();
             this.TAB_DRAWING_ORDER.SuspendLayout();
             this.toolStrip2.SuspendLayout();
+            this.TAB_BASE_LAYERS.SuspendLayout();
+            this.toolStrip3.SuspendLayout();
             this.SuspendLayout();
             // 
             // contentPanel
@@ -82,6 +90,7 @@
             // 
             this.tabControl1.Controls.Add(this.TAB_GROUP);
             this.tabControl1.Controls.Add(this.TAB_DRAWING_ORDER);
+            this.tabControl1.Controls.Add(this.TAB_BASE_LAYERS);
             this.tabControl1.Dock = System.Windows.Forms.DockStyle.Left;
             this.tabControl1.Location = new System.Drawing.Point(0, 0);
             this.tabControl1.Name = "tabControl1";
@@ -138,126 +147,79 @@
             // toolStrip1
             // 
             this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.toolStripButton1,
-            this.toolStripButton2,
+            this.btnAddGroup,
+            this.btnRemoveGroup,
             this.toolStripSeparator1,
-            this.toolStripButton3,
-            this.toolStripButton4,
-            this.toolStripSeparator2,
-            this.toolStripButton5,
-            this.toolStripButton6,
+            this.btnGRPAddLayer,
+            this.btnGRPRemoveLayer,
             this.toolStripSeparator3,
-            this.toolStripButton7,
-            this.toolStripButton8,
-            this.toolStripSeparator4,
-            this.toolStripButton21});
+            this.btnConvertLayerGroupToBaseGroup});
             this.toolStrip1.Location = new System.Drawing.Point(3, 3);
             this.toolStrip1.Name = "toolStrip1";
             this.toolStrip1.Size = new System.Drawing.Size(312, 25);
             this.toolStrip1.TabIndex = 0;
             this.toolStrip1.Text = "toolStrip1";
             // 
-            // toolStripButton1
+            // btnAddGroup
             // 
-            this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton1.Image = global::Maestro.Editors.Properties.Resources.folder__plus;
-            this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton1.Name = "toolStripButton1";
-            this.toolStripButton1.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton1.Text = "toolStripButton1";
+            this.btnAddGroup.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnAddGroup.Image = global::Maestro.Editors.Properties.Resources.folder__plus;
+            this.btnAddGroup.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnAddGroup.Name = "btnAddGroup";
+            this.btnAddGroup.Size = new System.Drawing.Size(23, 22);
+            this.btnAddGroup.ToolTipText = "Add a new group";
+            this.btnAddGroup.Click += new System.EventHandler(this.btnAddGroup_Click);
             // 
-            // toolStripButton2
+            // btnRemoveGroup
             // 
-            this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton2.Image = global::Maestro.Editors.Properties.Resources.folder__minus;
-            this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton2.Name = "toolStripButton2";
-            this.toolStripButton2.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton2.Text = "toolStripButton2";
+            this.btnRemoveGroup.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnRemoveGroup.Image = global::Maestro.Editors.Properties.Resources.folder__minus;
+            this.btnRemoveGroup.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnRemoveGroup.Name = "btnRemoveGroup";
+            this.btnRemoveGroup.Size = new System.Drawing.Size(23, 22);
+            this.btnRemoveGroup.ToolTipText = "Remove selected group";
+            this.btnRemoveGroup.Click += new System.EventHandler(this.btnRemoveGroup_Click);
             // 
             // toolStripSeparator1
             // 
             this.toolStripSeparator1.Name = "toolStripSeparator1";
             this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
             // 
-            // toolStripButton3
+            // btnGRPAddLayer
             // 
-            this.toolStripButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton3.Image = global::Maestro.Editors.Properties.Resources.layer__plus;
-            this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton3.Name = "toolStripButton3";
-            this.toolStripButton3.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton3.Text = "toolStripButton3";
+            this.btnGRPAddLayer.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnGRPAddLayer.Image = global::Maestro.Editors.Properties.Resources.layer__plus;
+            this.btnGRPAddLayer.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnGRPAddLayer.Name = "btnGRPAddLayer";
+            this.btnGRPAddLayer.Size = new System.Drawing.Size(23, 22);
+            this.btnGRPAddLayer.ToolTipText = "Add a new layer";
+            this.btnGRPAddLayer.Click += new System.EventHandler(this.btnGRPAddLayer_Click);
             // 
-            // toolStripButton4
+            // btnGRPRemoveLayer
             // 
-            this.toolStripButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton4.Image = global::Maestro.Editors.Properties.Resources.layer__minus;
-            this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton4.Name = "toolStripButton4";
-            this.toolStripButton4.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton4.Text = "toolStripButton4";
+            this.btnGRPRemoveLayer.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnGRPRemoveLayer.Image = global::Maestro.Editors.Properties.Resources.layer__minus;
+            this.btnGRPRemoveLayer.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnGRPRemoveLayer.Name = "btnGRPRemoveLayer";
+            this.btnGRPRemoveLayer.Size = new System.Drawing.Size(23, 22);
+            this.btnGRPRemoveLayer.ToolTipText = "Remove selected layer";
+            this.btnGRPRemoveLayer.Click += new System.EventHandler(this.btnGRPRemoveLayer_Click);
             // 
-            // toolStripSeparator2
-            // 
-            this.toolStripSeparator2.Name = "toolStripSeparator2";
-            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
-            // 
-            // toolStripButton5
-            // 
-            this.toolStripButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton5.Image = global::Maestro.Editors.Properties.Resources.arrow_090;
-            this.toolStripButton5.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton5.Name = "toolStripButton5";
-            this.toolStripButton5.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton5.Text = "toolStripButton5";
-            // 
-            // toolStripButton6
-            // 
-            this.toolStripButton6.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton6.Image = global::Maestro.Editors.Properties.Resources.arrow_270;
-            this.toolStripButton6.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton6.Name = "toolStripButton6";
-            this.toolStripButton6.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton6.Text = "toolStripButton6";
-            // 
             // toolStripSeparator3
             // 
             this.toolStripSeparator3.Name = "toolStripSeparator3";
             this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25);
             // 
-            // toolStripButton7
+            // btnConvertLayerGroupToBaseGroup
             // 
-            this.toolStripButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton7.Image = global::Maestro.Editors.Properties.Resources.layers_stack_arrange;
-            this.toolStripButton7.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton7.Name = "toolStripButton7";
-            this.toolStripButton7.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton7.Text = "toolStripButton7";
+            this.btnConvertLayerGroupToBaseGroup.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnConvertLayerGroupToBaseGroup.Image = global::Maestro.Editors.Properties.Resources.map__arrow;
+            this.btnConvertLayerGroupToBaseGroup.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnConvertLayerGroupToBaseGroup.Name = "btnConvertLayerGroupToBaseGroup";
+            this.btnConvertLayerGroupToBaseGroup.Size = new System.Drawing.Size(23, 22);
+            this.btnConvertLayerGroupToBaseGroup.ToolTipText = "Convert selected group to a base layer group";
+            this.btnConvertLayerGroupToBaseGroup.Click += new System.EventHandler(this.btnConvertLayerGroupToBaseGroup_Click);
             // 
-            // toolStripButton8
-            // 
-            this.toolStripButton8.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton8.Image = global::Maestro.Editors.Properties.Resources.layers_stack_arrange_back;
-            this.toolStripButton8.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton8.Name = "toolStripButton8";
-            this.toolStripButton8.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton8.Text = "toolStripButton8";
-            // 
-            // toolStripSeparator4
-            // 
-            this.toolStripSeparator4.Name = "toolStripSeparator4";
-            this.toolStripSeparator4.Size = new System.Drawing.Size(6, 25);
-            // 
-            // toolStripButton21
-            // 
-            this.toolStripButton21.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton21.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton21.Image")));
-            this.toolStripButton21.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton21.Name = "toolStripButton21";
-            this.toolStripButton21.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton21.Text = "toolStripButton21";
-            // 
             // TAB_DRAWING_ORDER
             // 
             this.TAB_DRAWING_ORDER.Controls.Add(this.trvLayerDrawingOrder);
@@ -307,84 +269,223 @@
             // toolStrip2
             // 
             this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.toolStripButton9,
-            this.toolStripButton10,
+            this.btnDLAddLayer,
+            this.btnDLRemoveLayer,
             this.toolStripSeparator5,
-            this.toolStripButton11,
-            this.toolStripButton12,
+            this.btnDLMoveLayerUp,
+            this.btnDLMoveLayerDown,
             this.toolStripSeparator6,
-            this.toolStripButton13,
-            this.toolStripButton14});
+            this.btnDLMoveLayerTop,
+            this.btnDLMoveLayerBottom});
             this.toolStrip2.Location = new System.Drawing.Point(3, 3);
             this.toolStrip2.Name = "toolStrip2";
             this.toolStrip2.Size = new System.Drawing.Size(312, 25);
             this.toolStrip2.TabIndex = 0;
             this.toolStrip2.Text = "toolStrip2";
             // 
-            // toolStripButton9
+            // btnDLAddLayer
             // 
-            this.toolStripButton9.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton9.Image = global::Maestro.Editors.Properties.Resources.layer__plus;
-            this.toolStripButton9.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton9.Name = "toolStripButton9";
-            this.toolStripButton9.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton9.Text = "toolStripButton3";
+            this.btnDLAddLayer.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnDLAddLayer.Image = global::Maestro.Editors.Properties.Resources.layer__plus;
+            this.btnDLAddLayer.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnDLAddLayer.Name = "btnDLAddLayer";
+            this.btnDLAddLayer.Size = new System.Drawing.Size(23, 22);
+            this.btnDLAddLayer.ToolTipText = "Add new layer";
+            this.btnDLAddLayer.Click += new System.EventHandler(this.btnDLAddLayer_Click);
             // 
-            // toolStripButton10
+            // btnDLRemoveLayer
             // 
-            this.toolStripButton10.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton10.Image = global::Maestro.Editors.Properties.Resources.layer__minus;
-            this.toolStripButton10.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton10.Name = "toolStripButton10";
-            this.toolStripButton10.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton10.Text = "toolStripButton4";
+            this.btnDLRemoveLayer.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnDLRemoveLayer.Image = global::Maestro.Editors.Properties.Resources.layer__minus;
+            this.btnDLRemoveLayer.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnDLRemoveLayer.Name = "btnDLRemoveLayer";
+            this.btnDLRemoveLayer.Size = new System.Drawing.Size(23, 22);
+            this.btnDLRemoveLayer.ToolTipText = "Remove selected layer";
+            this.btnDLRemoveLayer.Click += new System.EventHandler(this.btnDLRemoveLayer_Click);
             // 
             // toolStripSeparator5
             // 
             this.toolStripSeparator5.Name = "toolStripSeparator5";
             this.toolStripSeparator5.Size = new System.Drawing.Size(6, 25);
             // 
-            // toolStripButton11
+            // btnDLMoveLayerUp
             // 
-            this.toolStripButton11.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton11.Image = global::Maestro.Editors.Properties.Resources.arrow_090;
-            this.toolStripButton11.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton11.Name = "toolStripButton11";
-            this.toolStripButton11.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton11.Text = "toolStripButton5";
+            this.btnDLMoveLayerUp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnDLMoveLayerUp.Image = global::Maestro.Editors.Properties.Resources.arrow_090;
+            this.btnDLMoveLayerUp.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnDLMoveLayerUp.Name = "btnDLMoveLayerUp";
+            this.btnDLMoveLayerUp.Size = new System.Drawing.Size(23, 22);
+            this.btnDLMoveLayerUp.ToolTipText = "Move selected layer up";
+            this.btnDLMoveLayerUp.Click += new System.EventHandler(this.btnDLMoveLayerUp_Click);
             // 
-            // toolStripButton12
+            // btnDLMoveLayerDown
             // 
-            this.toolStripButton12.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton12.Image = global::Maestro.Editors.Properties.Resources.arrow_270;
-            this.toolStripButton12.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton12.Name = "toolStripButton12";
-            this.toolStripButton12.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton12.Text = "toolStripButton6";
+            this.btnDLMoveLayerDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnDLMoveLayerDown.Image = global::Maestro.Editors.Properties.Resources.arrow_270;
+            this.btnDLMoveLayerDown.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnDLMoveLayerDown.Name = "btnDLMoveLayerDown";
+            this.btnDLMoveLayerDown.Size = new System.Drawing.Size(23, 22);
+            this.btnDLMoveLayerDown.ToolTipText = "Move selected layer down";
+            this.btnDLMoveLayerDown.Click += new System.EventHandler(this.btnDLMoveLayerDown_Click);
             // 
             // toolStripSeparator6
             // 
             this.toolStripSeparator6.Name = "toolStripSeparator6";
             this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25);
             // 
-            // toolStripButton13
+            // btnDLMoveLayerTop
             // 
-            this.toolStripButton13.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton13.Image = global::Maestro.Editors.Properties.Resources.layers_stack_arrange;
-            this.toolStripButton13.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton13.Name = "toolStripButton13";
-            this.toolStripButton13.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton13.Text = "toolStripButton7";
+            this.btnDLMoveLayerTop.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnDLMoveLayerTop.Image = global::Maestro.Editors.Properties.Resources.layers_stack_arrange;
+            this.btnDLMoveLayerTop.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnDLMoveLayerTop.Name = "btnDLMoveLayerTop";
+            this.btnDLMoveLayerTop.Size = new System.Drawing.Size(23, 22);
+            this.btnDLMoveLayerTop.ToolTipText = "Move selected layer to top";
+            this.btnDLMoveLayerTop.Click += new System.EventHandler(this.btnDLMoveLayerTop_Click);
             // 
-            // toolStripButton14
+            // btnDLMoveLayerBottom
             // 
-            this.toolStripButton14.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
-            this.toolStripButton14.Image = global::Maestro.Editors.Properties.Resources.layers_stack_arrange_back;
-            this.toolStripButton14.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.toolStripButton14.Name = "toolStripButton14";
-            this.toolStripButton14.Size = new System.Drawing.Size(23, 22);
-            this.toolStripButton14.Text = "toolStripButton8";
+            this.btnDLMoveLayerBottom.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnDLMoveLayerBottom.Image = global::Maestro.Editors.Properties.Resources.layers_stack_arrange_back;
+            this.btnDLMoveLayerBottom.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnDLMoveLayerBottom.Name = "btnDLMoveLayerBottom";
+            this.btnDLMoveLayerBottom.Size = new System.Drawing.Size(23, 22);
+            this.btnDLMoveLayerBottom.ToolTipText = "Move selected layer to bottom";
+            this.btnDLMoveLayerBottom.Click += new System.EventHandler(this.btnDLMoveLayerBottom_Click);
             // 
+            // TAB_BASE_LAYERS
+            // 
+            this.TAB_BASE_LAYERS.Controls.Add(this.trvBaseLayers);
+            this.TAB_BASE_LAYERS.Controls.Add(this.toolStrip3);
+            this.TAB_BASE_LAYERS.Location = new System.Drawing.Point(4, 22);
+            this.TAB_BASE_LAYERS.Name = "TAB_BASE_LAYERS";
+            this.TAB_BASE_LAYERS.Padding = new System.Windows.Forms.Padding(3);
+            this.TAB_BASE_LAYERS.Size = new System.Drawing.Size(318, 266);
+            this.TAB_BASE_LAYERS.TabIndex = 2;
+            this.TAB_BASE_LAYERS.Text = "Base Layer Grops";
+            this.TAB_BASE_LAYERS.UseVisualStyleBackColor = true;
+            // 
+            // trvBaseLayers
+            // 
+            this.trvBaseLayers.BackColor = System.Drawing.SystemColors.Window;
+            this.trvBaseLayers.BorderStyle = System.Windows.Forms.BorderStyle.None;
+            this.trvBaseLayers.DefaultToolTipProvider = null;
+            this.trvBaseLayers.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.trvBaseLayers.DragDropMarkColor = System.Drawing.Color.Black;
+            this.trvBaseLayers.LineColor = System.Drawing.SystemColors.ControlDark;
+            this.trvBaseLayers.Location = new System.Drawing.Point(3, 28);
+            this.trvBaseLayers.Model = null;
+            this.trvBaseLayers.Name = "trvBaseLayers";
+            this.trvBaseLayers.NodeControls.Add(this.nodeIcon1);
+            this.trvBaseLayers.NodeControls.Add(this.nodeTextBox1);
+            this.trvBaseLayers.SelectedNode = null;
+            this.trvBaseLayers.Size = new System.Drawing.Size(312, 235);
+            this.trvBaseLayers.TabIndex = 1;
+            this.trvBaseLayers.Text = "treeViewAdv1";
+            this.trvBaseLayers.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.trvBaseLayers_MouseDoubleClick);
+            this.trvBaseLayers.MouseClick += new System.Windows.Forms.MouseEventHandler(this.trvBaseLayers_MouseClick);
+            // 
+            // nodeIcon1
+            // 
+            this.nodeIcon1.DataPropertyName = "Icon";
+            this.nodeIcon1.LeftMargin = 1;
+            this.nodeIcon1.ParentColumn = null;
+            this.nodeIcon1.ScaleMode = Aga.Controls.Tree.ImageScaleMode.Clip;
+            // 
+            // nodeTextBox1
+            // 
+            this.nodeTextBox1.DataPropertyName = "Text";
+            this.nodeTextBox1.IncrementalSearchEnabled = true;
+            this.nodeTextBox1.LeftMargin = 3;
+            this.nodeTextBox1.ParentColumn = null;
+            // 
+            // toolStrip3
+            // 
+            this.toolStrip3.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnNewBaseLayerGroup,
+            this.btnRemoveBaseLayerGroup,
+            this.toolStripSeparator2,
+            this.btnAddBaseLayer,
+            this.btnRemoveBaseLayer,
+            this.toolStripSeparator4,
+            this.btnMoveBaseLayerUp,
+            this.btnMoveBaseLayerDown});
+            this.toolStrip3.Location = new System.Drawing.Point(3, 3);
+            this.toolStrip3.Name = "toolStrip3";
+            this.toolStrip3.Size = new System.Drawing.Size(312, 25);
+            this.toolStrip3.TabIndex = 0;
+            this.toolStrip3.Text = "toolStrip3";
+            // 
+            // btnNewBaseLayerGroup
+            // 
+            this.btnNewBaseLayerGroup.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnNewBaseLayerGroup.Image = global::Maestro.Editors.Properties.Resources.folder__plus;
+            this.btnNewBaseLayerGroup.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnNewBaseLayerGroup.Name = "btnNewBaseLayerGroup";
+            this.btnNewBaseLayerGroup.Size = new System.Drawing.Size(23, 22);
+            this.btnNewBaseLayerGroup.ToolTipText = "Add a new group";
+            this.btnNewBaseLayerGroup.Click += new System.EventHandler(this.btnNewBaseLayerGroup_Click);
+            // 
+            // btnRemoveBaseLayerGroup
+            // 
+            this.btnRemoveBaseLayerGroup.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnRemoveBaseLayerGroup.Image = global::Maestro.Editors.Properties.Resources.folder__minus;
+            this.btnRemoveBaseLayerGroup.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnRemoveBaseLayerGroup.Name = "btnRemoveBaseLayerGroup";
+            this.btnRemoveBaseLayerGroup.Size = new System.Drawing.Size(23, 22);
+            this.btnRemoveBaseLayerGroup.ToolTipText = "Remove selected group";
+            this.btnRemoveBaseLayerGroup.Click += new System.EventHandler(this.btnRemoveBaseLayerGroup_Click);
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+            // 
+            // btnAddBaseLayer
+            // 
+            this.btnAddBaseLayer.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnAddBaseLayer.Image = global::Maestro.Editors.Properties.Resources.layer__plus;
+            this.btnAddBaseLayer.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnAddBaseLayer.Name = "btnAddBaseLayer";
+            this.btnAddBaseLayer.Size = new System.Drawing.Size(23, 22);
+            this.btnAddBaseLayer.ToolTipText = "Add a new layer";
+            this.btnAddBaseLayer.Click += new System.EventHandler(this.btnAddBaseLayer_Click);
+            // 
+            // btnRemoveBaseLayer
+            // 
+            this.btnRemoveBaseLayer.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnRemoveBaseLayer.Image = global::Maestro.Editors.Properties.Resources.layer__minus;
+            this.btnRemoveBaseLayer.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnRemoveBaseLayer.Name = "btnRemoveBaseLayer";
+            this.btnRemoveBaseLayer.Size = new System.Drawing.Size(23, 22);
+            this.btnRemoveBaseLayer.ToolTipText = "Remove selected layer";
+            this.btnRemoveBaseLayer.Click += new System.EventHandler(this.btnRemoveBaseLayer_Click);
+            // 
+            // toolStripSeparator4
+            // 
+            this.toolStripSeparator4.Name = "toolStripSeparator4";
+            this.toolStripSeparator4.Size = new System.Drawing.Size(6, 25);
+            // 
+            // btnMoveBaseLayerUp
+            // 
+            this.btnMoveBaseLayerUp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnMoveBaseLayerUp.Image = global::Maestro.Editors.Properties.Resources.arrow_090;
+            this.btnMoveBaseLayerUp.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnMoveBaseLayerUp.Name = "btnMoveBaseLayerUp";
+            this.btnMoveBaseLayerUp.Size = new System.Drawing.Size(23, 22);
+            this.btnMoveBaseLayerUp.ToolTipText = "Move selected layer up";
+            this.btnMoveBaseLayerUp.Click += new System.EventHandler(this.btnMoveBaseLayerUp_Click);
+            // 
+            // btnMoveBaseLayerDown
+            // 
+            this.btnMoveBaseLayerDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnMoveBaseLayerDown.Image = global::Maestro.Editors.Properties.Resources.arrow_270;
+            this.btnMoveBaseLayerDown.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnMoveBaseLayerDown.Name = "btnMoveBaseLayerDown";
+            this.btnMoveBaseLayerDown.Size = new System.Drawing.Size(23, 22);
+            this.btnMoveBaseLayerDown.ToolTipText = "Move selected layer down";
+            this.btnMoveBaseLayerDown.Click += new System.EventHandler(this.btnMoveBaseLayerDown_Click);
+            // 
             // splitter1
             // 
             this.splitter1.Location = new System.Drawing.Point(326, 0);
@@ -418,6 +519,10 @@
             this.TAB_DRAWING_ORDER.PerformLayout();
             this.toolStrip2.ResumeLayout(false);
             this.toolStrip2.PerformLayout();
+            this.TAB_BASE_LAYERS.ResumeLayout(false);
+            this.TAB_BASE_LAYERS.PerformLayout();
+            this.toolStrip3.ResumeLayout(false);
+            this.toolStrip3.PerformLayout();
             this.ResumeLayout(false);
 
         }
@@ -433,30 +538,37 @@
         private Aga.Controls.Tree.TreeViewAdv trvLayersGroup;
         private Aga.Controls.Tree.TreeViewAdv trvLayerDrawingOrder;
         private System.Windows.Forms.ToolStrip toolStrip2;
-        private System.Windows.Forms.ToolStripButton toolStripButton1;
-        private System.Windows.Forms.ToolStripButton toolStripButton2;
+        private System.Windows.Forms.ToolStripButton btnAddGroup;
+        private System.Windows.Forms.ToolStripButton btnRemoveGroup;
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
-        private System.Windows.Forms.ToolStripButton toolStripButton3;
-        private System.Windows.Forms.ToolStripButton toolStripButton4;
-        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
-        private System.Windows.Forms.ToolStripButton toolStripButton5;
-        private System.Windows.Forms.ToolStripButton toolStripButton6;
+        private System.Windows.Forms.ToolStripButton btnGRPAddLayer;
+        private System.Windows.Forms.ToolStripButton btnGRPRemoveLayer;
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
-        private System.Windows.Forms.ToolStripButton toolStripButton7;
-        private System.Windows.Forms.ToolStripButton toolStripButton8;
-        private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
-        private System.Windows.Forms.ToolStripButton toolStripButton21;
-        private System.Windows.Forms.ToolStripButton toolStripButton9;
-        private System.Windows.Forms.ToolStripButton toolStripButton10;
+        private System.Windows.Forms.ToolStripButton btnConvertLayerGroupToBaseGroup;
+        private System.Windows.Forms.ToolStripButton btnDLAddLayer;
+        private System.Windows.Forms.ToolStripButton btnDLRemoveLayer;
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
-        private System.Windows.Forms.ToolStripButton toolStripButton11;
-        private System.Windows.Forms.ToolStripButton toolStripButton12;
+        private System.Windows.Forms.ToolStripButton btnDLMoveLayerUp;
+        private System.Windows.Forms.ToolStripButton btnDLMoveLayerDown;
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
-        private System.Windows.Forms.ToolStripButton toolStripButton13;
-        private System.Windows.Forms.ToolStripButton toolStripButton14;
+        private System.Windows.Forms.ToolStripButton btnDLMoveLayerTop;
+        private System.Windows.Forms.ToolStripButton btnDLMoveLayerBottom;
         private Aga.Controls.Tree.NodeControls.NodeIcon NODE_GROUP_ICON;
         private Aga.Controls.Tree.NodeControls.NodeTextBox NODE_GROUP_TEXT;
         private Aga.Controls.Tree.NodeControls.NodeIcon NODE_DRAW_ICON;
         private Aga.Controls.Tree.NodeControls.NodeTextBox NODE_DRAW_TEXT;
+        private System.Windows.Forms.TabPage TAB_BASE_LAYERS;
+        private System.Windows.Forms.ToolStrip toolStrip3;
+        private System.Windows.Forms.ToolStripButton btnNewBaseLayerGroup;
+        private System.Windows.Forms.ToolStripButton btnRemoveBaseLayerGroup;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+        private System.Windows.Forms.ToolStripButton btnAddBaseLayer;
+        private System.Windows.Forms.ToolStripButton btnRemoveBaseLayer;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
+        private System.Windows.Forms.ToolStripButton btnMoveBaseLayerUp;
+        private System.Windows.Forms.ToolStripButton btnMoveBaseLayerDown;
+        private Aga.Controls.Tree.TreeViewAdv trvBaseLayers;
+        private Aga.Controls.Tree.NodeControls.NodeIcon nodeIcon1;
+        private Aga.Controls.Tree.NodeControls.NodeTextBox nodeTextBox1;
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -28,6 +28,9 @@
 using Aga.Controls.Tree;
 using OSGeo.MapGuide.ObjectModels.MapDefinition;
 using Maestro.Editors.Common;
+using Maestro.Editors.Generic;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Resource;
 
 namespace Maestro.Editors.MapDefinition
 {
@@ -36,260 +39,417 @@
     [ToolboxItem(true)]
     internal partial class MapLayersSectionCtrl : EditorBindableCollapsiblePanel
     {
-        abstract class TreeItem<T>
+        public MapLayersSectionCtrl()
         {
-            public TreeItem(string text, Image icon, T item)
-            {
-                this.Text = text;
-                this.Icon = icon;
-                this.Tag = item;
-            }
+            InitializeComponent();
+        }
 
-            public Image Icon { get; set; }
+        private IMapDefinition _map;
 
-            public string Text { get; set; }
+        private DrawOrderLayerModel _doLayerModel;
+        private GroupedLayerModel _grpLayerModel;
+        private TiledLayerModel _tiledLayerModel;
+        private IEditorService _edSvc;
 
-            public T Tag { get; set; }
+        public override void Bind(IEditorService service)
+        {
+            _edSvc = service;
+            _edSvc.RegisterCustomNotifier(this);
+            _map = (IMapDefinition)service.GetEditedResource();
+
+            trvLayerDrawingOrder.Model = _doLayerModel = new DrawOrderLayerModel(_map);
+            trvLayersGroup.Model = _grpLayerModel = new GroupedLayerModel(_map);
+            trvBaseLayers.Model = _tiledLayerModel = new TiledLayerModel(_map);
         }
 
-        class ScaleItem : TreeItem<IList<double>>
+        private void RefreshModels()
         {
-            public ScaleItem(string name, IList<double> range)
-                : base(name, Properties.Resources.magnifier, range)
+            _doLayerModel.Invalidate();
+            _grpLayerModel.Invalidate();
+        }
+
+        public event OpenLayerEventHandler RequestLayerOpen;
+
+        private void trvLayersGroup_MouseDoubleClick(object sender, MouseEventArgs e)
+        {
+            TreeNodeAdv node = trvLayersGroup.GetNodeAt(new Point(e.X, e.Y));
+            if (node != null)
             {
+                var layer = node.Tag as LayerItem;
+                if (layer != null)
+                {
+                    var handler = this.RequestLayerOpen;
+                    if (handler != null)
+                        handler(this, layer.Tag.ResourceId);
+                }
             }
         }
 
-        class LayerItem : TreeItem<MapLayerType>
+        private void trvLayerDrawingOrder_MouseDoubleClick(object sender, MouseEventArgs e)
         {
-            public LayerItem(MapLayerType layer)
-                : base(layer.Name, Properties.Resources.layer, layer)
+            TreeNodeAdv node = trvLayerDrawingOrder.GetNodeAt(new Point(e.X, e.Y));
+            if (node != null)
             {
+                var layer = node.Tag as LayerItem;
+                if (layer != null)
+                {
+                    var handler = this.RequestLayerOpen;
+                    if (handler != null)
+                        handler(this, layer.Tag.ResourceId);
+                }
             }
         }
 
-        class GroupItem : TreeItem<MapLayerGroupType>
+        private void trvLayersGroup_MouseClick(object sender, MouseEventArgs e)
         {
-            public GroupItem(MapLayerGroupType grp)
-                : base(grp.Name, Properties.Resources.folder_horizontal, grp)
+            TreeNodeAdv node = trvLayersGroup.GetNodeAt(new Point(e.X, e.Y));
+            if (node != null)
             {
+                var layer = node.Tag as LayerItem;
+                var group = node.Tag as GroupItem;
+                if (layer != null)
+                {
+                    propertiesPanel.Controls.Clear();
+                    var item = new LayerPropertiesCtrl(layer.Tag, _edSvc.ResourceService);
+                    item.LayerChanged += (s, evt) => { OnResourceChanged(); };
+                    item.Dock = DockStyle.Fill;
+                    propertiesPanel.Controls.Add(item);
+                }
+                else if (group != null)
+                {
+                    propertiesPanel.Controls.Clear();
+                    var item = new GroupPropertiesCtrl(group.Tag);
+                    item.GroupChanged += (s, evt) => { OnResourceChanged(); };
+                    item.Dock = DockStyle.Fill;
+                    propertiesPanel.Controls.Add(item);
+                }
             }
         }
 
-        class BaseLayerItem : TreeItem<BaseMapLayerType>
+        private void trvLayerDrawingOrder_MouseClick(object sender, MouseEventArgs e)
         {
-            public BaseLayerItem(BaseMapLayerType layer)
-                : base(layer.Name, Properties.Resources.layer, layer)
+            TreeNodeAdv node = trvLayerDrawingOrder.GetNodeAt(new Point(e.X, e.Y));
+            if (node != null)
             {
+                var layer = node.Tag as LayerItem;
+                if (layer != null)
+                {
+                    propertiesPanel.Controls.Clear();
+                    var item = new LayerPropertiesCtrl(layer.Tag, _edSvc.ResourceService);
+                    item.LayerChanged += (s, evt) => { OnResourceChanged(); };
+                    item.Dock = DockStyle.Fill;
+                    propertiesPanel.Controls.Add(item);
+                }
             }
         }
 
-        class BaseLayerGroupItem : TreeItem<BaseMapLayerGroupCommonType>
+        private void btnAddGroup_Click(object sender, EventArgs e)
         {
-            public BaseLayerGroupItem(BaseMapLayerGroupCommonType group)
-                : base(group.Name, Properties.Resources.folder_horizontal, group)
+            var selGroup = GetSelectedLayerGroupItem() as IMapLayerGroup;
+            CreateNewGroup(selGroup);
+
+            _grpLayerModel.Invalidate();
+        }
+
+        private void btnRemoveGroup_Click(object sender, EventArgs e)
+        {
+            var group = GetSelectedLayerGroupItem() as GroupItem;
+            _map.RemoveGroup(group.Tag);
+            _grpLayerModel.Invalidate();
+        }
+
+        private void btnGRPAddLayer_Click(object sender, EventArgs e)
+        {
+            using (var picker = new ResourcePicker(_edSvc.ResourceService, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
             {
+                if (picker.ShowDialog() == DialogResult.OK)
+                {
+                    string layerId = picker.ResourceID;
+                    var selGroup = GetSelectedLayerGroupItem() as GroupItem;
+                    CreateLayer(layerId, selGroup == null ? null : selGroup.Tag);
+
+                    this.RefreshModels();
+                }
             }
         }
 
-        abstract class TreeModelBase : ITreeModel
+        private void btnGRPRemoveLayer_Click(object sender, EventArgs e)
         {
-            public abstract System.Collections.IEnumerable GetChildren(TreePath treePath);
+            var layer = GetSelectedLayerGroupItem() as LayerItem;
+            if (layer != null)
+            {
+                _map.RemoveLayer(layer.Tag);
+                this.RefreshModels();
+            }
+        }
 
-            public abstract bool IsLeaf(TreePath treePath);
+        private void btnConvertLayerGroupToBaseGroup_Click(object sender, EventArgs e)
+        {
+            var group = GetSelectedLayerGroupItem() as GroupItem;
+            if (group != null)
+            {
+                //...
+                throw new NotImplementedException();
 
-            public event EventHandler<TreeModelEventArgs> NodesChanged;
+                this.RefreshModels();
+            }
+        }
 
-            protected void OnNodesInserted(TreeModelEventArgs e)
+        private void btnDLAddLayer_Click(object sender, EventArgs e)
+        {
+            using (var picker = new ResourcePicker(_edSvc.ResourceService, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
             {
-                var handler = this.NodesInserted;
-                if (handler != null)
-                    handler(this, e);
+                if (picker.ShowDialog() == DialogResult.OK)
+                {
+                    string layerId = picker.ResourceID;
+                    var selGroup = GetSelectedDrawOrderItem() as GroupItem;
+                    CreateLayer(layerId, selGroup != null ? selGroup.Tag : null);
+                    this.RefreshModels();
+                }
             }
+        }
 
-            public event EventHandler<TreeModelEventArgs> NodesInserted;
+        private void btnDLRemoveLayer_Click(object sender, EventArgs e)
+        {
+            var layer = GetSelectedDrawOrderItem() as LayerItem;
+            if (layer != null)
+            {
+                _map.RemoveLayer(layer.Tag);
+                this.RefreshModels();
+            }
+        }
 
-            protected void OnNodesRemoved(TreeModelEventArgs e)
+        private void btnDLMoveLayerUp_Click(object sender, EventArgs e)
+        {
+            var layer = GetSelectedDrawOrderItem() as LayerItem;
+            if (layer != null)
             {
-                var handler = this.NodesRemoved;
-                if (handler != null)
-                    handler(this, e);
+                _map.MoveUp(layer.Tag);
+                _doLayerModel.Invalidate();
             }
+        }
 
-            public event EventHandler<TreeModelEventArgs> NodesRemoved;
+        private void btnDLMoveLayerDown_Click(object sender, EventArgs e)
+        {
+            var layer = GetSelectedDrawOrderItem() as LayerItem;
+            if (layer != null)
+            {
+                _map.MoveDown(layer.Tag);
+                _doLayerModel.Invalidate();
+            }
+        }
 
-            protected void OnStructureChanged(TreePathEventArgs e)
+        private void btnDLMoveLayerTop_Click(object sender, EventArgs e)
+        {
+            var layer = GetSelectedDrawOrderItem() as LayerItem;
+            if (layer != null)
             {
-                var handler = this.StructureChanged;
-                if (handler != null)
-                    handler(this, e);
+                _map.SetTopDrawOrder(layer.Tag);
+                _doLayerModel.Invalidate();
             }
+        }
 
-            public event EventHandler<TreePathEventArgs> StructureChanged;
+        private void btnDLMoveLayerBottom_Click(object sender, EventArgs e)
+        {
+            var layer = GetSelectedDrawOrderItem() as LayerItem;
+            if (layer != null)
+            {
+                _map.SetBottomDrawOrder(layer.Tag);
+                _doLayerModel.Invalidate();
+            }
         }
 
-        class DrawOrderLayerModel : TreeModelBase
+        private void CreateNewGroup(IMapLayerGroup parentGroup)
         {
-            private OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition _map;
+            int counter = 0;
+            string prefix = Properties.Resources.NewLayerGroup;
+            var group = _map.GetGroupByName(prefix);
+            while (group != null)
+            {
+                counter++;
+                prefix = Properties.Resources.NewLayerGroup + counter;
+                group = _map.GetGroupByName(prefix);
+            }
 
-            public DrawOrderLayerModel(OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition map)
+            group = _map.AddGroup(prefix);
+            if (parentGroup != null)
+                group.Group = parentGroup.Name;
+        }
+
+        private void CreateLayer(string layerId, IMapLayerGroup parentGroup)
+        {
+            int counter = 0;
+            string prefix = ResourceIdentifier.GetName(layerId);
+            string name = prefix;
+            var layer = _map.GetLayerByName(name);
+            while (layer != null)
             {
-                _map = map;
+                counter++;
+                name = prefix + counter;
+                layer = _map.GetLayerByName(name);
             }
 
-            public override System.Collections.IEnumerable GetChildren(TreePath treePath)
+            if (parentGroup != null)
+                layer = _map.AddLayer(parentGroup.Name, name, layerId);
+            else
+                layer = _map.AddLayer(null, name, layerId);
+        }
+
+        private object GetSelectedDrawOrderItem()
+        {
+            if (trvLayerDrawingOrder.SelectedNode != null)
             {
-                if (treePath.IsEmpty())
-                {
-                    foreach (var layer in _map.MapLayer)
-                    {
-                        yield return new LayerItem(layer);
-                    }
-                }
-                else
-                {
-                    yield break;
-                }
+                return trvLayerDrawingOrder.SelectedNode.Tag;
             }
+            return null;
+        }
 
-            public override bool IsLeaf(TreePath treePath)
+        private object GetSelectedLayerGroupItem()
+        {
+            if (trvLayersGroup.SelectedNode != null)
             {
-                return !treePath.IsEmpty();
+                return trvLayersGroup.SelectedNode.Tag;
             }
+            return null;
         }
 
-        class GroupedLayerModel : TreeModelBase
+        private void btnNewBaseLayerGroup_Click(object sender, EventArgs e)
         {
-            private OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition _map;
+            _map.InitBaseMap();
+            var grp = _map.BaseMap.AddBaseLayerGroup(GenerateBaseGroupName(_map));
+            _tiledLayerModel.Invalidate();
+        }
 
-            private Dictionary<string, List<MapLayerType>> _layersByGroup;
+        private object GetSelectedTiledLayerItem()
+        {
+            if (trvBaseLayers.SelectedNode != null)
+                return trvBaseLayers.SelectedNode.Tag;
+            else
+                return null;
+        }
 
-            public GroupedLayerModel(OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition map)
+        private void btnRemoveBaseLayerGroup_Click(object sender, EventArgs e)
+        {
+            var group = GetSelectedTiledLayerItem() as BaseLayerGroupItem;
+            if (group != null)
             {
-                _map = map;
-                _layersByGroup = new Dictionary<string, List<MapLayerType>>();
-                foreach (var layer in _map.MapLayer)
-                {
-                    if (!string.IsNullOrEmpty(layer.Group))
-                    {
-                        if (!_layersByGroup.ContainsKey(layer.Group))
-                            _layersByGroup[layer.Group] = new List<MapLayerType>();
-
-                        _layersByGroup[layer.Group].Add(layer);
-                    }
-                }
+                _map.BaseMap.RemoveBaseLayerGroup(group.Tag);
+                _tiledLayerModel.Invalidate();
             }
+        }
 
-            public override System.Collections.IEnumerable GetChildren(TreePath treePath)
+        private void btnAddBaseLayer_Click(object sender, EventArgs e)
+        {
+            using (var picker = new ResourcePicker(_edSvc.ResourceService, ResourceTypes.LayerDefinition, ResourcePickerMode.OpenResource))
             {
-                if (treePath.IsEmpty())
+                if (picker.ShowDialog() == DialogResult.OK)
                 {
-                    foreach (var group in _map.MapLayerGroup)
+                    _map.InitBaseMap();
+                    string layerId = picker.ResourceID;
+                    IBaseMapGroup grp = null;
+                    var group = GetSelectedTiledLayerItem() as BaseLayerGroupItem;
+                    if (group != null)
                     {
-                        yield return new GroupItem(group);
+                        grp = group.Tag;
                     }
-                }
-                else 
-                {
-                    var gitem = treePath.LastNode as GroupItem;
-                    if (gitem != null)
+                    else
                     {
-                        var group = gitem.Tag;
-                        foreach (var g in _map.MapLayerGroup)
+                        grp = _map.BaseMap.GetFirstGroup();
+                        if (grp == null)
                         {
-                            if (g.Group == group.Name)
-                                yield return new GroupItem(g);
+                            grp = _map.BaseMap.AddBaseLayerGroup(GenerateBaseGroupName(_map));
                         }
-
-                        if (_layersByGroup.ContainsKey(group.Name))
-                        {
-                            foreach (var layer in _layersByGroup[group.Name])
-                            {
-                                yield return new LayerItem(layer);
-                            }
-                        }
                     }
-                    else
-                    {
-                        yield break;
-                    }
+                    grp.AddLayer(GenerateBaseLayerName(layerId, _map.BaseMap), layerId);
+                    _tiledLayerModel.Invalidate();
                 }
             }
+        }
 
-            public override bool IsLeaf(TreePath treePath)
+        private static string GenerateBaseGroupName(IMapDefinition map)
+        {
+            map.InitBaseMap();
+            int counter = 0;
+            string name = Properties.Resources.BaseLayerGroup;
+            if (map.BaseMap.GroupExists(name))
             {
-                var layer = treePath.LastNode as LayerItem;
-                var group = treePath.LastNode as GroupItem;
+                counter++;
+                name = Properties.Resources.BaseLayerGroup + counter;
+            }
+            while (map.BaseMap.GroupExists(name))
+            {
+                counter++;
+                name = Properties.Resources.BaseLayerGroup + counter;
+            }
+            return name;
+        }
 
-                if (layer != null)
-                    return true;
-                else if (group != null)
-                    return !_layersByGroup.ContainsKey(group.Tag.Name);
+        private static string GenerateBaseLayerName(string layerId, IBaseMapDefinition baseMapDef)
+        {
+            Check.NotNull(baseMapDef, "baseMapDef");
+            Check.NotEmpty(layerId, "layerId");
 
-                throw new ApplicationException();
+            int counter = 0;
+            string prefix = ResourceIdentifier.GetName(layerId);
+            string name = prefix;
+            if (baseMapDef.LayerExists(name))
+            {
+                name = prefix + counter;
             }
-        }
+            while (baseMapDef.LayerExists(name))
+            {
+                counter++;
+                name = prefix + counter;
+            }
 
-
-        public MapLayersSectionCtrl()
-        {
-            InitializeComponent();
+            return name;
         }
 
-        private OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition _map;
-
-        public override void Bind(IEditorService service)
+        private void btnRemoveBaseLayer_Click(object sender, EventArgs e)
         {
-            service.RegisterCustomNotifier(this);
-            _map = (OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition)service.GetEditedResource();
-
-            trvLayerDrawingOrder.Model = new DrawOrderLayerModel(_map);
-            trvLayersGroup.Model = new GroupedLayerModel(_map);
+            var layer = GetSelectedTiledLayerItem() as BaseLayerItem;
+            if (layer != null)
+            {
+                var grp = layer.Parent;
+                grp.RemoveBaseMapLayer(layer.Tag);
+                _tiledLayerModel.Invalidate();
+            }
         }
 
-        public event OpenLayerEventHandler RequestLayerOpen;
-
-        private void trvLayersGroup_MouseDoubleClick(object sender, MouseEventArgs e)
+        private void btnMoveBaseLayerUp_Click(object sender, EventArgs e)
         {
-            TreeNodeAdv node = trvLayersGroup.GetNodeAt(new Point(e.X, e.Y));
-            if (node != null)
+            var layer = GetSelectedTiledLayerItem() as BaseLayerItem;
+            if (layer != null)
             {
-                var layer = node.Tag as LayerItem;
-                if (layer != null)
-                {
-                    var handler = this.RequestLayerOpen;
-                    if (handler != null)
-                        handler(this, layer.Tag.ResourceId);
-                }
+                var grp = layer.Parent;
+                grp.MoveUp(layer.Tag);
+                _tiledLayerModel.Invalidate();
             }
         }
 
-        private void trvLayerDrawingOrder_MouseDoubleClick(object sender, MouseEventArgs e)
+        private void btnMoveBaseLayerDown_Click(object sender, EventArgs e)
         {
-            TreeNodeAdv node = trvLayerDrawingOrder.GetNodeAt(new Point(e.X, e.Y));
-            if (node != null)
+            var layer = GetSelectedTiledLayerItem() as BaseLayerItem;
+            if (layer != null)
             {
-                var layer = node.Tag as LayerItem;
-                if (layer != null)
-                {
-                    var handler = this.RequestLayerOpen;
-                    if (handler != null)
-                        handler(this, layer.Tag.ResourceId);
-                }
+                var grp = layer.Parent;
+                grp.MoveDown(layer.Tag);
+                _tiledLayerModel.Invalidate();
             }
         }
 
-        private void trvLayersGroup_MouseClick(object sender, MouseEventArgs e)
+        private void trvBaseLayers_MouseClick(object sender, MouseEventArgs e)
         {
-            TreeNodeAdv node = trvLayersGroup.GetNodeAt(new Point(e.X, e.Y));
+            TreeNodeAdv node = trvBaseLayers.GetNodeAt(new Point(e.X, e.Y));
             if (node != null)
             {
-                var layer = node.Tag as LayerItem;
-                var group = node.Tag as GroupItem;
+                var layer = node.Tag as BaseLayerItem;
+                var group = node.Tag as BaseLayerGroupItem;
+                var scale = node.Tag as ScaleItem;
                 if (layer != null)
                 {
                     propertiesPanel.Controls.Clear();
-                    var item = new LayerPropertiesCtrl(layer.Tag);
+                    var item = new LayerPropertiesCtrl(layer.Tag, _edSvc.ResourceService);
                     item.LayerChanged += (s, evt) => { OnResourceChanged(); };
                     item.Dock = DockStyle.Fill;
                     propertiesPanel.Controls.Add(item);
@@ -302,22 +462,28 @@
                     item.Dock = DockStyle.Fill;
                     propertiesPanel.Controls.Add(item);
                 }
+                else if (scale != null)
+                {
+                    propertiesPanel.Controls.Clear();
+                    var item = new FiniteScaleListCtrl(_map);
+                    
+                    item.Dock = DockStyle.Fill;
+                    propertiesPanel.Controls.Add(item);
+                }
             }
         }
 
-        private void trvLayerDrawingOrder_MouseClick(object sender, MouseEventArgs e)
+        private void trvBaseLayers_MouseDoubleClick(object sender, MouseEventArgs e)
         {
-            TreeNodeAdv node = trvLayerDrawingOrder.GetNodeAt(new Point(e.X, e.Y));
+            TreeNodeAdv node = trvBaseLayers.GetNodeAt(new Point(e.X, e.Y));
             if (node != null)
             {
-                var layer = node.Tag as LayerItem;
+                var layer = node.Tag as BaseLayerItem;
                 if (layer != null)
                 {
-                    propertiesPanel.Controls.Clear();
-                    var item = new LayerPropertiesCtrl(layer.Tag);
-                    item.LayerChanged += (s, evt) => { OnResourceChanged(); };
-                    item.Dock = DockStyle.Fill;
-                    propertiesPanel.Controls.Add(item);
+                    var handler = this.RequestLayerOpen;
+                    if (handler != null)
+                        handler(this, layer.Tag.ResourceId);
                 }
             }
         }

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.resx	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.resx	2010-10-18 07:16:47 UTC (rev 5289)
@@ -123,23 +123,13 @@
   <metadata name="toolStrip2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>116, 17</value>
   </metadata>
+  <metadata name="toolStrip3.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>221, 17</value>
+  </metadata>
   <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="toolStripButton21.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
-        U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
-        VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
-        QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
-        /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
-        cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
-        3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
-        dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
-        NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
-        s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
-</value>
-  </data>
+  <metadata name="toolStrip3.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>221, 17</value>
+  </metadata>
 </root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -121,7 +121,7 @@
             this.btnSetZoom.Name = "btnSetZoom";
             this.btnSetZoom.Size = new System.Drawing.Size(104, 48);
             this.btnSetZoom.TabIndex = 10;
-            this.btnSetZoom.Text = "Set view to current layers extent";
+            this.btnSetZoom.Text = "Set view to combined extent of current layers";
             this.btnSetZoom.Click += new System.EventHandler(this.btnSetZoom_Click);
             // 
             // txtUpperY

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -26,6 +26,10 @@
 using System.Windows.Forms;
 using Maestro.Shared.UI;
 using Maestro.Editors.Common;
+using OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.ObjectModels.MapDefinition;
 
 namespace Maestro.Editors.MapDefinition
 {
@@ -37,7 +41,7 @@
             InitializeComponent();
         }
 
-        private OSGeo.MapGuide.ObjectModels.MapDefinition.MapDefinition _map;
+        private IMapDefinition _map;
 
         const string META_START = "<MapDescription>";
         const string META_END = "</MapDescription>";
@@ -85,12 +89,16 @@
                 {
                     cmbBackgroundColor.CurrentColor = _map.BackgroundColor;
                 }
+                else if (e.PropertyName == "MapLayer")
+                {
+                    btnSetZoom.Enabled = _map.GetLayerCount() > 0;
+                }
             };
 
-            txtLowerX.DataBindings.Add("Text", _map.Extents, "MinX");
-            txtLowerY.DataBindings.Add("Text", _map.Extents, "MinY");
-            txtUpperX.DataBindings.Add("Text", _map.Extents, "MaxX");
-            txtUpperY.DataBindings.Add("Text", _map.Extents, "MaxY");
+            TextBoxBinder.BindText(txtLowerX, _map.Extents, "MinX");
+            TextBoxBinder.BindText(txtLowerY, _map.Extents, "MinY");
+            TextBoxBinder.BindText(txtUpperX, _map.Extents, "MaxX");
+            TextBoxBinder.BindText(txtUpperY, _map.Extents, "MaxY");
 
             _map.Extents.PropertyChanged += (sender, e) => { OnResourceChanged(); };
         }
@@ -106,7 +114,46 @@
 
         private void btnSetZoom_Click(object sender, EventArgs e)
         {
+            using (new WaitCursor(this))
+            {
+                List<ILayerDefinition> layers = new List<ILayerDefinition>();
+                foreach (var lyr in _map.MapLayer)
+                {
+                    layers.Add((ILayerDefinition)_service.ResourceService.GetResource(lyr.ResourceId));
+                }
+                var env = Util.GetCombinedExtents(layers);
 
+                _map.SetExtents(env.MinX, env.MinY, env.MaxX, env.MaxY);
+            }
         }
+
+        internal class Util
+        {
+            public static IEnvelope GetCombinedExtents(IEnumerable<ILayerDefinition> layers)
+            {
+                Check.NotNull(layers, "layers");
+                IEnvelope env = null;
+                foreach (var layer in layers)
+                {
+                    var e1 = layer.GetSpatialExtent(true);
+                    if (env == null)
+                    {
+                        env = e1;
+                    }
+                    else
+                    {
+                        if (e1.MinX < env.MinX)
+                            env.MinX = e1.MinX;
+                        if (e1.MinY < env.MinY)
+                            env.MinY = e1.MinY;
+                        if (e1.MaxX > env.MaxX)
+                            env.MaxX = e1.MaxX;
+                        if (e1.MaxY > env.MaxY)
+                            env.MaxY = e1.MaxY;
+                    }
+                }
+                return env;
+            }
+        }
     }
 }

Added: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapTreeModels.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapTreeModels.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapTreeModels.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,314 @@
+#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 Aga.Controls.Tree;
+using System.Drawing;
+using OSGeo.MapGuide.ObjectModels.MapDefinition;
+using System.ComponentModel;
+
+namespace Maestro.Editors.MapDefinition
+{
+    internal abstract class TreeItem<T>
+    {
+        public TreeItem(string text, Image icon, T item)
+        {
+            this.Text = text;
+            this.Icon = icon;
+            this.Tag = item;
+        }
+
+        public Image Icon { get; set; }
+
+        public string Text { get; set; }
+
+        public T Tag { get; set; }
+    }
+
+    internal class ScaleItem : TreeItem<IList<double>>
+    {
+        public ScaleItem(string name, IList<double> range)
+            : base(name, Properties.Resources.magnifier, range)
+        {
+        }
+    }
+
+    internal class LayerItem : TreeItem<IMapLayer>
+    {
+        public LayerItem(IMapLayer layer)
+            : base(layer.Name, Properties.Resources.layer, layer)
+        {
+            layer.PropertyChanged += OnPropertyChanged;
+        }
+
+        void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == "LegendLabel")
+            {
+                this.Text = this.Tag.LegendLabel;
+            }
+        }
+    }
+
+    internal class GroupItem : TreeItem<IMapLayerGroup>
+    {
+        public GroupItem(IMapLayerGroup grp)
+            : base(grp.Name, Properties.Resources.folder_horizontal, grp)
+        {
+            grp.PropertyChanged += OnPropertyChanged;
+        }
+
+        void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == "LegendLabel")
+            {
+                this.Text = this.Tag.LegendLabel;
+            }
+        }
+    }
+
+    internal class BaseLayerItem : TreeItem<IBaseMapLayer>
+    {
+        public BaseLayerItem(IBaseMapLayer layer, IBaseMapGroup parent)
+            : base(layer.Name, Properties.Resources.layer, layer)
+        {
+            layer.PropertyChanged += OnPropertyChanged;
+            this.Parent = parent;
+        }
+
+        public IBaseMapGroup Parent
+        {
+            get;
+            set;
+        }
+
+        void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == "LegendLabel")
+            {
+                this.Text = this.Tag.LegendLabel;
+            }
+        }
+    }
+
+    internal class BaseLayerGroupItem : TreeItem<IBaseMapGroup>
+    {
+        public BaseLayerGroupItem(IBaseMapGroup group)
+            : base(group.Name, Properties.Resources.folder_horizontal, group)
+        {
+            group.PropertyChanged += OnPropertyChanged;
+        }
+
+        void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == "LegendLabel")
+            {
+                this.Text = this.Tag.LegendLabel;
+            }
+        }
+    }
+
+    internal abstract class TreeModelBase : ITreeModel
+    {
+        public abstract System.Collections.IEnumerable GetChildren(TreePath treePath);
+
+        public abstract bool IsLeaf(TreePath treePath);
+
+        public event EventHandler<TreeModelEventArgs> NodesChanged;
+
+        protected void OnNodesInserted(TreeModelEventArgs e)
+        {
+            var handler = this.NodesInserted;
+            if (handler != null)
+                handler(this, e);
+        }
+
+        public event EventHandler<TreeModelEventArgs> NodesInserted;
+
+        protected void OnNodesRemoved(TreeModelEventArgs e)
+        {
+            var handler = this.NodesRemoved;
+            if (handler != null)
+                handler(this, e);
+        }
+
+        public event EventHandler<TreeModelEventArgs> NodesRemoved;
+
+        protected void OnStructureChanged(TreePathEventArgs e)
+        {
+            var handler = this.StructureChanged;
+            if (handler != null)
+                handler(this, e);
+        }
+
+        public event EventHandler<TreePathEventArgs> StructureChanged;
+
+        internal void Invalidate()
+        {
+            OnStructureChanged(new TreePathEventArgs(TreePath.Empty));
+        }
+
+        internal void Invalidate(TreePath path)
+        {
+            OnStructureChanged(new TreePathEventArgs(path));
+        }
+    }
+
+    internal class DrawOrderLayerModel : TreeModelBase
+    {
+        private IMapDefinition _map;
+
+        public DrawOrderLayerModel(IMapDefinition map)
+        {
+            _map = map;
+        }
+
+        public override System.Collections.IEnumerable GetChildren(TreePath treePath)
+        {
+            if (treePath.IsEmpty())
+            {
+                foreach (var layer in _map.MapLayer)
+                {
+                    yield return new LayerItem(layer);
+                }
+            }
+            else
+            {
+                yield break;
+            }
+        }
+
+        public override bool IsLeaf(TreePath treePath)
+        {
+            return !treePath.IsEmpty();
+        }
+    }
+
+    internal class GroupedLayerModel : TreeModelBase
+    {
+        private IMapDefinition _map;
+
+        public GroupedLayerModel(IMapDefinition map)
+        {
+            _map = map;
+        }
+
+        public override System.Collections.IEnumerable GetChildren(TreePath treePath)
+        {
+            if (treePath.IsEmpty())
+            {
+                foreach (var group in _map.MapLayerGroup)
+                {
+                    yield return new GroupItem(group);
+                }
+
+                foreach (var layer in _map.GetLayersWithoutGroups())
+                {
+                    yield return new LayerItem(layer);
+                }
+            }
+            else
+            {
+                var gitem = treePath.LastNode as GroupItem;
+                if (gitem != null)
+                {
+                    var group = gitem.Tag;
+                    foreach (var g in _map.MapLayerGroup)
+                    {
+                        if (g.Group == group.Name)
+                            yield return new GroupItem(g);
+                    }
+
+                    foreach (var l in _map.GetLayersForGroup(gitem.Tag.Name))
+                    {
+                        yield return new LayerItem(l);
+                    }
+                }
+                else
+                {
+                    yield break;
+                }
+            }
+        }
+
+        public override bool IsLeaf(TreePath treePath)
+        {
+            var layer = treePath.LastNode as LayerItem;
+            var group = treePath.LastNode as GroupItem;
+
+            if (layer != null)
+                return true;
+            else if (group != null)
+                return false;
+
+            throw new ApplicationException();
+        }
+    }
+
+    internal class TiledLayerModel : TreeModelBase
+    {
+        private IMapDefinition _map;
+
+        public TiledLayerModel(IMapDefinition map)
+        {
+            _map = map;
+        }
+
+        public override System.Collections.IEnumerable GetChildren(TreePath treePath)
+        {
+            if (treePath.IsEmpty())
+            {
+                if (_map.BaseMap != null)
+                {
+                    yield return new ScaleItem(Properties.Resources.FiniteDisplayScales, new List<double>(_map.BaseMap.FiniteDisplayScale));
+                    foreach (var grp in _map.BaseMap.BaseMapLayerGroup)
+                    {
+                        yield return new BaseLayerGroupItem(grp);
+                    }
+                }
+                else
+                {
+                    yield return new ScaleItem(Properties.Resources.FiniteDisplayScales, new List<double>());
+                }
+            }
+            else
+            {
+                var grp = treePath.LastNode as BaseLayerGroupItem;
+                if (grp != null)
+                {
+                    if (_map.BaseMap != null)
+                    {
+                        foreach (var layer in _map.BaseMap.GetLayersForGroup(grp.Tag.Name))
+                        {
+                            yield return new BaseLayerItem(layer, grp.Tag);
+                        }
+                    }
+                }
+            }
+        }
+
+        public override bool IsLeaf(TreePath treePath)
+        {
+            var grp = treePath.LastNode as BaseLayerGroupItem;
+            return grp == null;
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ScaleListGenerator.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ScaleListGenerator.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/ScaleListGenerator.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,114 @@
+#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.MaestroAPI;
+
+namespace Maestro.Editors.MapDefinition
+{
+    internal enum ScaleGenerationMethod
+    {
+        Linear,
+        Exponential
+    }
+
+    internal enum ScaleRoundingMethod
+    {
+        None,
+        Regular,
+        Pretty
+    }
+
+    internal static class ScaleListGenerator
+    {
+        public static double[] GenerateScales(double minScale, double maxScale, ScaleGenerationMethod method, ScaleRoundingMethod rounding, int scaleCount)
+        {
+            Check.Precondition(minScale < maxScale, "minScale < maxScale");
+            Check.Precondition(scaleCount > 0, "scaleCount > 0");
+
+            List<double> vals = new List<double>();
+
+            if (method == ScaleGenerationMethod.Linear)
+            {
+                double inc = (double)(maxScale - minScale) / (double)scaleCount;
+                double cur = (double)minScale;
+                for (int i = 0; i < scaleCount; i++)
+                {
+                    vals.Add(cur);
+                    cur += inc;
+                }
+
+                //In case the rounding sucks
+                vals[(int)(scaleCount - 1)] = (double)maxScale;
+            }
+            else if (method == ScaleGenerationMethod.Exponential)
+            {
+                double b = Math.Pow((double)(maxScale - minScale), 1 / (double)(scaleCount));
+                double cur = (double)minScale;
+                for (int i = 0; i < scaleCount; i++)
+                {
+                    vals.Add(cur);
+                    cur = ((double)maxScale) / Math.Pow(b, (int)scaleCount - i - 1) + (double)minScale;
+                }
+            }
+            else
+            {
+                vals.Clear();
+                double span = (double)maxScale - (double)minScale;
+                double b = Math.Log10((double)maxScale / (double)(scaleCount - 1));
+
+                for (int i = 0; i < scaleCount; i++)
+                {
+                    vals.Add(Math.Pow(i, b) + (double)minScale);
+                }
+            }
+
+            if (rounding == ScaleRoundingMethod.Regular || rounding == ScaleRoundingMethod.Pretty)
+            {
+                for (int i = 0; i < vals.Count; i++)
+                {
+                    vals[i] = Math.Round(vals[i]);
+                }
+            }
+
+            if (rounding == ScaleRoundingMethod.Pretty)
+            {
+                for (int i = 0; i < vals.Count; i++)
+                {
+                    int group = (int)Math.Floor(Math.Log10(vals[i]));
+                    group--;
+
+                    vals[i] = Math.Round(Math.Round((vals[i] / Math.Pow(10, group))) * Math.Pow(10, group));
+                }
+            }
+
+            //Sort and weed out dupes
+            var sorted = new SortedList<double, double>();
+            foreach (var d in vals)
+            {
+                if (!sorted.ContainsKey(d))
+                    sorted.Add(d, d);
+            }
+
+            return new List<double>(sorted.Keys).ToArray();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,367 @@
+namespace Maestro.Editors.PrintLayout
+{
+    partial class LogoDialog
+    {
+        /// <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 Windows Form 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.btnCancel = new System.Windows.Forms.Button();
+            this.btnOK = new System.Windows.Forms.Button();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label9 = new System.Windows.Forms.Label();
+            this.numRotation = new System.Windows.Forms.NumericUpDown();
+            this.label5 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.cmbPositionUnits = new System.Windows.Forms.ComboBox();
+            this.numPosBottom = new System.Windows.Forms.NumericUpDown();
+            this.numPosLeft = new System.Windows.Forms.NumericUpDown();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.numSizeWidth = new System.Windows.Forms.NumericUpDown();
+            this.label7 = new System.Windows.Forms.Label();
+            this.numSizeHeight = new System.Windows.Forms.NumericUpDown();
+            this.label8 = new System.Windows.Forms.Label();
+            this.cmbSizeUnits = new System.Windows.Forms.ComboBox();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.btnBrowseSymbolName = new System.Windows.Forms.Button();
+            this.txtSymbolName = new System.Windows.Forms.TextBox();
+            this.btnBrowseSymbolLibrary = new System.Windows.Forms.Button();
+            this.txtSymbolLibraryId = new System.Windows.Forms.TextBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numRotation)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numPosBottom)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numPosLeft)).BeginInit();
+            this.groupBox2.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numSizeWidth)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numSizeHeight)).BeginInit();
+            this.groupBox3.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnCancel.Location = new System.Drawing.Point(344, 242);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(75, 23);
+            this.btnCancel.TabIndex = 0;
+            this.btnCancel.Text = "Cancel";
+            this.btnCancel.UseVisualStyleBackColor = true;
+            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+            // 
+            // btnOK
+            // 
+            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnOK.Location = new System.Drawing.Point(263, 242);
+            this.btnOK.Name = "btnOK";
+            this.btnOK.Size = new System.Drawing.Size(75, 23);
+            this.btnOK.TabIndex = 1;
+            this.btnOK.Text = "OK";
+            this.btnOK.UseVisualStyleBackColor = true;
+            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.label9);
+            this.groupBox1.Controls.Add(this.numRotation);
+            this.groupBox1.Controls.Add(this.label5);
+            this.groupBox1.Controls.Add(this.label4);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.cmbPositionUnits);
+            this.groupBox1.Controls.Add(this.numPosBottom);
+            this.groupBox1.Controls.Add(this.numPosLeft);
+            this.groupBox1.Location = new System.Drawing.Point(12, 102);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(200, 133);
+            this.groupBox1.TabIndex = 2;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Position";
+            // 
+            // label9
+            // 
+            this.label9.AutoSize = true;
+            this.label9.Location = new System.Drawing.Point(22, 102);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(47, 13);
+            this.label9.TabIndex = 7;
+            this.label9.Text = "Rotation";
+            // 
+            // numRotation
+            // 
+            this.numRotation.DecimalPlaces = 2;
+            this.numRotation.Location = new System.Drawing.Point(74, 100);
+            this.numRotation.Name = "numRotation";
+            this.numRotation.Size = new System.Drawing.Size(120, 20);
+            this.numRotation.TabIndex = 6;
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(22, 76);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(31, 13);
+            this.label5.TabIndex = 5;
+            this.label5.Text = "Units";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(22, 49);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(40, 13);
+            this.label4.TabIndex = 4;
+            this.label4.Text = "Bottom";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(22, 21);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(25, 13);
+            this.label3.TabIndex = 3;
+            this.label3.Text = "Left";
+            // 
+            // cmbPositionUnits
+            // 
+            this.cmbPositionUnits.FormattingEnabled = true;
+            this.cmbPositionUnits.Location = new System.Drawing.Point(74, 73);
+            this.cmbPositionUnits.Name = "cmbPositionUnits";
+            this.cmbPositionUnits.Size = new System.Drawing.Size(120, 21);
+            this.cmbPositionUnits.TabIndex = 2;
+            // 
+            // numPosBottom
+            // 
+            this.numPosBottom.DecimalPlaces = 2;
+            this.numPosBottom.Location = new System.Drawing.Point(74, 47);
+            this.numPosBottom.Name = "numPosBottom";
+            this.numPosBottom.Size = new System.Drawing.Size(120, 20);
+            this.numPosBottom.TabIndex = 1;
+            // 
+            // numPosLeft
+            // 
+            this.numPosLeft.DecimalPlaces = 2;
+            this.numPosLeft.Location = new System.Drawing.Point(74, 19);
+            this.numPosLeft.Name = "numPosLeft";
+            this.numPosLeft.Size = new System.Drawing.Size(120, 20);
+            this.numPosLeft.TabIndex = 0;
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Controls.Add(this.label6);
+            this.groupBox2.Controls.Add(this.numSizeWidth);
+            this.groupBox2.Controls.Add(this.label7);
+            this.groupBox2.Controls.Add(this.numSizeHeight);
+            this.groupBox2.Controls.Add(this.label8);
+            this.groupBox2.Controls.Add(this.cmbSizeUnits);
+            this.groupBox2.Location = new System.Drawing.Point(219, 102);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(200, 133);
+            this.groupBox2.TabIndex = 3;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Size";
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(13, 76);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(31, 13);
+            this.label6.TabIndex = 11;
+            this.label6.Text = "Units";
+            // 
+            // numSizeWidth
+            // 
+            this.numSizeWidth.DecimalPlaces = 2;
+            this.numSizeWidth.Location = new System.Drawing.Point(65, 19);
+            this.numSizeWidth.Name = "numSizeWidth";
+            this.numSizeWidth.Size = new System.Drawing.Size(120, 20);
+            this.numSizeWidth.TabIndex = 6;
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Location = new System.Drawing.Point(13, 48);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(38, 13);
+            this.label7.TabIndex = 10;
+            this.label7.Text = "Height";
+            // 
+            // numSizeHeight
+            // 
+            this.numSizeHeight.DecimalPlaces = 2;
+            this.numSizeHeight.Location = new System.Drawing.Point(65, 46);
+            this.numSizeHeight.Name = "numSizeHeight";
+            this.numSizeHeight.Size = new System.Drawing.Size(120, 20);
+            this.numSizeHeight.TabIndex = 7;
+            // 
+            // label8
+            // 
+            this.label8.AutoSize = true;
+            this.label8.Location = new System.Drawing.Point(13, 21);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(35, 13);
+            this.label8.TabIndex = 9;
+            this.label8.Text = "Width";
+            // 
+            // cmbSizeUnits
+            // 
+            this.cmbSizeUnits.FormattingEnabled = true;
+            this.cmbSizeUnits.Location = new System.Drawing.Point(65, 73);
+            this.cmbSizeUnits.Name = "cmbSizeUnits";
+            this.cmbSizeUnits.Size = new System.Drawing.Size(120, 21);
+            this.cmbSizeUnits.TabIndex = 8;
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Controls.Add(this.btnBrowseSymbolName);
+            this.groupBox3.Controls.Add(this.txtSymbolName);
+            this.groupBox3.Controls.Add(this.btnBrowseSymbolLibrary);
+            this.groupBox3.Controls.Add(this.txtSymbolLibraryId);
+            this.groupBox3.Controls.Add(this.label2);
+            this.groupBox3.Controls.Add(this.label1);
+            this.groupBox3.Location = new System.Drawing.Point(13, 13);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(406, 83);
+            this.groupBox3.TabIndex = 4;
+            this.groupBox3.TabStop = false;
+            this.groupBox3.Text = "Symbol Reference";
+            // 
+            // btnBrowseSymbolName
+            // 
+            this.btnBrowseSymbolName.Location = new System.Drawing.Point(362, 50);
+            this.btnBrowseSymbolName.Name = "btnBrowseSymbolName";
+            this.btnBrowseSymbolName.Size = new System.Drawing.Size(29, 23);
+            this.btnBrowseSymbolName.TabIndex = 5;
+            this.btnBrowseSymbolName.Text = "...";
+            this.btnBrowseSymbolName.UseVisualStyleBackColor = true;
+            this.btnBrowseSymbolName.Click += new System.EventHandler(this.btnBrowseSymbolName_Click);
+            // 
+            // txtSymbolName
+            // 
+            this.txtSymbolName.Location = new System.Drawing.Point(129, 52);
+            this.txtSymbolName.Name = "txtSymbolName";
+            this.txtSymbolName.ReadOnly = true;
+            this.txtSymbolName.Size = new System.Drawing.Size(227, 20);
+            this.txtSymbolName.TabIndex = 4;
+            // 
+            // btnBrowseSymbolLibrary
+            // 
+            this.btnBrowseSymbolLibrary.Location = new System.Drawing.Point(362, 23);
+            this.btnBrowseSymbolLibrary.Name = "btnBrowseSymbolLibrary";
+            this.btnBrowseSymbolLibrary.Size = new System.Drawing.Size(29, 23);
+            this.btnBrowseSymbolLibrary.TabIndex = 3;
+            this.btnBrowseSymbolLibrary.Text = "...";
+            this.btnBrowseSymbolLibrary.UseVisualStyleBackColor = true;
+            this.btnBrowseSymbolLibrary.Click += new System.EventHandler(this.btnBrowseSymbolLibrary_Click);
+            // 
+            // txtSymbolLibraryId
+            // 
+            this.txtSymbolLibraryId.Location = new System.Drawing.Point(129, 25);
+            this.txtSymbolLibraryId.Name = "txtSymbolLibraryId";
+            this.txtSymbolLibraryId.ReadOnly = true;
+            this.txtSymbolLibraryId.Size = new System.Drawing.Size(227, 20);
+            this.txtSymbolLibraryId.TabIndex = 2;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(21, 55);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(35, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Name";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(21, 28);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(89, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Symbol Library ID";
+            // 
+            // LogoDialog
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(431, 277);
+            this.Controls.Add(this.groupBox3);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.btnOK);
+            this.Controls.Add(this.btnCancel);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "LogoDialog";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Logo Element";
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numRotation)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numPosBottom)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numPosLeft)).EndInit();
+            this.groupBox2.ResumeLayout(false);
+            this.groupBox2.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numSizeWidth)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numSizeHeight)).EndInit();
+            this.groupBox3.ResumeLayout(false);
+            this.groupBox3.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button btnCancel;
+        private System.Windows.Forms.Button btnOK;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.Button btnBrowseSymbolLibrary;
+        private System.Windows.Forms.TextBox txtSymbolLibraryId;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Button btnBrowseSymbolName;
+        private System.Windows.Forms.TextBox txtSymbolName;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.ComboBox cmbPositionUnits;
+        private System.Windows.Forms.NumericUpDown numPosBottom;
+        private System.Windows.Forms.NumericUpDown numPosLeft;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.NumericUpDown numSizeWidth;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.NumericUpDown numSizeHeight;
+        private System.Windows.Forms.Label label8;
+        private System.Windows.Forms.ComboBox cmbSizeUnits;
+        private System.Windows.Forms.Label label9;
+        private System.Windows.Forms.NumericUpDown numRotation;
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,147 @@
+#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.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using Maestro.Editors.Generic;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Editors.Common;
+
+namespace Maestro.Editors.PrintLayout
+{
+    public partial class LogoDialog : Form
+    {
+        private LogoDialog()
+        {
+            InitializeComponent();
+        }
+
+        private IServerConnection _conn;
+
+        public LogoDialog(IServerConnection conn)
+            : this()
+        {
+            //TOOD: Maybe be more graceful? Like allow text entry, but disable browsing buttons?
+            if (Array.IndexOf(conn.Capabilities.SupportedServices, (int)ServiceType.Drawing) < 0)
+            {
+                throw new InvalidOperationException("Required service not supported on this connection: " + ServiceType.Drawing.ToString()); //LOCALIZEME
+            }
+            _conn = conn;
+        }
+
+        public string SymbolLibraryID
+        {
+            get { return txtSymbolLibraryId.Text; }
+            set { txtSymbolLibraryId.Text = value; }
+        }
+
+        public string SymbolName
+        {
+            get { return txtSymbolName.Text; }
+            set { txtSymbolName.Text = value; }
+        }
+
+        public float PositionLeft
+        {
+            get { return Convert.ToSingle(numPosLeft.Value); }
+            set { numPosLeft.Value = Convert.ToDecimal(value); }
+        }
+
+        public float PositionBottom
+        {
+            get { return Convert.ToSingle(numPosBottom.Value); }
+            set { numPosBottom.Value = Convert.ToDecimal(value); }
+        }
+
+        public string PositionUnits
+        {
+            get { return cmbPositionUnits.Text; }
+            set { cmbPositionUnits.Text = value; }
+        }
+
+        public float SizeWidth
+        {
+            get { return Convert.ToSingle(numSizeWidth.Value); }
+            set { numSizeWidth.Value = Convert.ToDecimal(value); }
+        }
+
+        public float SizeHeight
+        {
+            get { return Convert.ToSingle(numSizeHeight.Value); }
+            set { numSizeHeight.Value = Convert.ToDecimal(value); }
+        }
+
+        public float Rotation
+        {
+            get { return Convert.ToSingle(numRotation.Value); }
+            set { numRotation.Value = Convert.ToDecimal(value); }
+        }
+
+        public string SizeUnits
+        {
+            get { return cmbSizeUnits.Text; }
+            set { cmbSizeUnits.Text = value; }
+        }
+
+        private void btnOK_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.OK;
+        }
+
+        private void btnCancel_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.Cancel;
+        }
+
+        private void btnBrowseSymbolLibrary_Click(object sender, EventArgs e)
+        {
+            using (var picker = new ResourcePicker(_conn.ResourceService, ResourceTypes.SymbolLibrary, ResourcePickerMode.OpenResource))
+            {
+                if (picker.ShowDialog() == DialogResult.OK)
+                {
+                    this.SymbolLibraryID = picker.ResourceID;
+                    this.SymbolName = string.Empty;
+                }
+            }
+        }
+
+        private void btnBrowseSymbolName_Click(object sender, EventArgs e)
+        {
+            if (string.IsNullOrEmpty(this.SymbolLibraryID))
+            {
+                MessageBox.Show(Properties.Resources.SelectSymbolLibraryFirst);
+                return;
+            }
+
+            using (var picker = new SymbolPicker(this.SymbolLibraryID, _conn))
+            {
+                if (picker.ShowDialog() == DialogResult.OK)
+                {
+                    this.SymbolName = picker.SymbolName;
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/LogoDialog.resx	2010-10-18 07:16:47 UTC (rev 5289)
@@ -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

Modified: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomLogosSectionCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomLogosSectionCtrl.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomLogosSectionCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -59,24 +59,29 @@
             this.btnAdd.Image = global::Maestro.Editors.Properties.Resources.plus_circle;
             this.btnAdd.ImageTransparentColor = System.Drawing.Color.Magenta;
             this.btnAdd.Name = "btnAdd";
-            this.btnAdd.Size = new System.Drawing.Size(46, 22);
+            this.btnAdd.Size = new System.Drawing.Size(49, 22);
             this.btnAdd.Text = "Add";
+            this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
             // 
             // btnEdit
             // 
+            this.btnEdit.Enabled = false;
             this.btnEdit.Image = global::Maestro.Editors.Properties.Resources.document__pencil;
             this.btnEdit.ImageTransparentColor = System.Drawing.Color.Magenta;
             this.btnEdit.Name = "btnEdit";
-            this.btnEdit.Size = new System.Drawing.Size(45, 22);
+            this.btnEdit.Size = new System.Drawing.Size(47, 22);
             this.btnEdit.Text = "Edit";
+            this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);
             // 
             // btnDelete
             // 
+            this.btnDelete.Enabled = false;
             this.btnDelete.Image = global::Maestro.Editors.Properties.Resources.cross_script;
             this.btnDelete.ImageTransparentColor = System.Drawing.Color.Magenta;
             this.btnDelete.Name = "btnDelete";
-            this.btnDelete.Size = new System.Drawing.Size(58, 22);
+            this.btnDelete.Size = new System.Drawing.Size(60, 22);
             this.btnDelete.Text = "Delete";
+            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
             // 
             // lstCustomLogos
             // 
@@ -86,6 +91,8 @@
             this.lstCustomLogos.Size = new System.Drawing.Size(449, 267);
             this.lstCustomLogos.TabIndex = 2;
             this.lstCustomLogos.UseCompatibleStateImageBehavior = false;
+            this.lstCustomLogos.View = System.Windows.Forms.View.Tile;
+            this.lstCustomLogos.SelectedIndexChanged += new System.EventHandler(this.lstCustomLogos_SelectedIndexChanged);
             // 
             // PrintCustomLogosSectionCtrl
             // 

Modified: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomLogosSectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomLogosSectionCtrl.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomLogosSectionCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -25,15 +25,155 @@
 using System.Text;
 using System.Windows.Forms;
 using Maestro.Shared.UI;
+using Maestro.Editors.Common;
+using OSGeo.MapGuide.ObjectModels.PrintLayout;
+using OSGeo.MapGuide.MaestroAPI;
 
 namespace Maestro.Editors.PrintLayout
 {
     [ToolboxItem(true)]
-    internal partial class PrintCustomLogosSectionCtrl : CollapsiblePanel
+    internal partial class PrintCustomLogosSectionCtrl : EditorBindableCollapsiblePanel
     {
         public PrintCustomLogosSectionCtrl()
         {
             InitializeComponent();
+            _logos = new BindingList<ILogo>();
         }
+
+        private BindingList<ILogo> _logos;
+
+        private IPrintLayout _layout;
+        private IServerConnection _conn;
+
+        public override void Bind(IEditorService service)
+        {
+            service.RegisterCustomNotifier(this);
+            _layout = (IPrintLayout)service.GetEditedResource();
+            _conn = _layout.CurrentConnection;
+
+            foreach (var logo in _layout.CustomLogos)
+            {
+                _logos.Add(logo);
+                AddLogoToListView(logo);
+            }
+            _logos.ListChanged += new ListChangedEventHandler(OnLogoListChanged);
+        }
+
+        void OnLogoListChanged(object sender, ListChangedEventArgs e)
+        {
+            switch (e.ListChangedType)
+            {
+                case ListChangedType.ItemAdded:
+                    {
+                        _layout.AddLogo(_logos[e.NewIndex]);
+                        AddLogoToListView(_logos[e.NewIndex]);
+                    }
+                    break;
+            }
+            OnResourceChanged();
+        }
+
+        private void AddLogoToListView(ILogo logo)
+        {
+            var item = new ListViewItem(logo.Name);
+            item.Tag = logo;
+
+            //TODO: It would be really nice to show the actual
+            //symbol here
+
+            lstCustomLogos.Items.Add(item);
+        }
+
+        private void RemoveLogoFromListView(ILogo logo)
+        {
+            ListViewItem remove = null;
+            foreach (ListViewItem item in lstCustomLogos.Items)
+            {
+                if (item.Tag == logo)
+                {
+                    remove = item;
+                    break;
+                }
+            }
+            lstCustomLogos.Items.Remove(remove);
+        }
+
+        private void btnAdd_Click(object sender, EventArgs e)
+        {
+            using (var dlg = new LogoDialog(_conn))
+            {
+                if (dlg.ShowDialog() == DialogResult.OK)
+                {
+                    var pos = _layout.CreateLogoPosition(dlg.PositionLeft, dlg.PositionBottom, dlg.PositionUnits);
+                    var size = _layout.CreateLogoSize(dlg.SizeWidth, dlg.SizeHeight, dlg.SizeUnits);
+                    var logo = _layout.CreateLogo(dlg.SymbolLibraryID, dlg.SymbolName, size, pos);
+                    logo.Rotation = dlg.Rotation;
+
+                    _logos.Add(logo);
+                }
+            }
+        }
+
+        private void btnEdit_Click(object sender, EventArgs e)
+        {
+            if (lstCustomLogos.SelectedItems.Count > 0)
+            {
+                var item = lstCustomLogos.SelectedItems[0];
+                var logo = item.Tag as ILogo;
+                if (logo != null)
+                {
+                    using (var dlg = new LogoDialog(_conn))
+                    {
+                        dlg.SymbolLibraryID = logo.ResourceId;
+                        dlg.SymbolName = logo.Name;
+                        dlg.PositionBottom = logo.Position.Bottom;
+                        dlg.PositionLeft = logo.Position.Left;
+                        dlg.PositionUnits = logo.Position.Units;
+                        dlg.SizeHeight = logo.Size.Height;
+                        dlg.SizeUnits = logo.Size.Units;
+                        dlg.SizeWidth = logo.Size.Width;
+                        dlg.Rotation = logo.Rotation.HasValue ? logo.Rotation.Value : 0.0f;
+
+                        if (dlg.ShowDialog() == DialogResult.OK)
+                        {
+                            logo.ResourceId = dlg.SymbolLibraryID;
+                            logo.Name = dlg.SymbolName;
+                            logo.Position.Bottom = dlg.PositionBottom;
+                            logo.Position.Left = dlg.PositionLeft;
+                            logo.Position.Units = dlg.PositionUnits;
+                            logo.Size.Height = dlg.SizeHeight;
+                            logo.Size.Units = dlg.SizeUnits;
+                            logo.Size.Width = dlg.SizeWidth;
+                            logo.Rotation = dlg.Rotation;
+
+                            item.Text = logo.Name;
+                            OnResourceChanged();
+                        }
+                    }
+                }
+            }
+        }
+
+        private void btnDelete_Click(object sender, EventArgs e)
+        {
+            if (lstCustomLogos.SelectedItems.Count > 0)
+            {
+                var item = lstCustomLogos.SelectedItems[0];
+                var logo = item.Tag as ILogo;
+                if (logo != null)
+                {
+                    _logos.Remove(logo);
+                    //Have to remove manually due to brain-dead API design
+                    //of BindingList<T>
+                    _layout.RemoveLogo(logo);
+                    RemoveLogoFromListView(logo);
+                }
+            }
+        }
+
+        private void lstCustomLogos_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            btnEdit.Enabled = btnDelete.Enabled = (lstCustomLogos.SelectedItems.Count > 0);
+        }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomTextSectionCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomTextSectionCtrl.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomTextSectionCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -32,7 +32,7 @@
             this.btnAdd = new System.Windows.Forms.ToolStripButton();
             this.btnEdit = new System.Windows.Forms.ToolStripButton();
             this.btnDelete = new System.Windows.Forms.ToolStripButton();
-            this.lstCustomText = new System.Windows.Forms.ListView();
+            this.lstCustomText = new System.Windows.Forms.ListBox();
             this.contentPanel.SuspendLayout();
             this.toolStrip1.SuspendLayout();
             this.SuspendLayout();
@@ -59,33 +59,39 @@
             this.btnAdd.Image = global::Maestro.Editors.Properties.Resources.plus_circle;
             this.btnAdd.ImageTransparentColor = System.Drawing.Color.Magenta;
             this.btnAdd.Name = "btnAdd";
-            this.btnAdd.Size = new System.Drawing.Size(46, 22);
+            this.btnAdd.Size = new System.Drawing.Size(49, 22);
             this.btnAdd.Text = "Add";
+            this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
             // 
             // btnEdit
             // 
+            this.btnEdit.Enabled = false;
             this.btnEdit.Image = global::Maestro.Editors.Properties.Resources.document__pencil;
             this.btnEdit.ImageTransparentColor = System.Drawing.Color.Magenta;
             this.btnEdit.Name = "btnEdit";
-            this.btnEdit.Size = new System.Drawing.Size(45, 22);
+            this.btnEdit.Size = new System.Drawing.Size(47, 22);
             this.btnEdit.Text = "Edit";
+            this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);
             // 
             // btnDelete
             // 
+            this.btnDelete.Enabled = false;
             this.btnDelete.Image = global::Maestro.Editors.Properties.Resources.cross_script;
             this.btnDelete.ImageTransparentColor = System.Drawing.Color.Magenta;
             this.btnDelete.Name = "btnDelete";
-            this.btnDelete.Size = new System.Drawing.Size(58, 22);
+            this.btnDelete.Size = new System.Drawing.Size(60, 22);
             this.btnDelete.Text = "Delete";
+            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
             // 
             // lstCustomText
             // 
             this.lstCustomText.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lstCustomText.FormattingEnabled = true;
             this.lstCustomText.Location = new System.Drawing.Point(0, 25);
             this.lstCustomText.Name = "lstCustomText";
-            this.lstCustomText.Size = new System.Drawing.Size(449, 267);
+            this.lstCustomText.Size = new System.Drawing.Size(449, 264);
             this.lstCustomText.TabIndex = 1;
-            this.lstCustomText.UseCompatibleStateImageBehavior = false;
+            this.lstCustomText.SelectedIndexChanged += new System.EventHandler(this.lstCustomText_SelectedIndexChanged);
             // 
             // PrintCustomTextSectionCtrl
             // 
@@ -107,6 +113,6 @@
         private System.Windows.Forms.ToolStripButton btnAdd;
         private System.Windows.Forms.ToolStripButton btnEdit;
         private System.Windows.Forms.ToolStripButton btnDelete;
-        private System.Windows.Forms.ListView lstCustomText;
+        private System.Windows.Forms.ListBox lstCustomText;
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomTextSectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomTextSectionCtrl.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintCustomTextSectionCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -25,15 +25,113 @@
 using System.Text;
 using System.Windows.Forms;
 using Maestro.Shared.UI;
+using Maestro.Editors.Common;
+using OSGeo.MapGuide.ObjectModels.PrintLayout;
 
 namespace Maestro.Editors.PrintLayout
 {
     [ToolboxItem(true)]
-    internal partial class PrintCustomTextSectionCtrl : CollapsiblePanel
+    internal partial class PrintCustomTextSectionCtrl : EditorBindableCollapsiblePanel
     {
         public PrintCustomTextSectionCtrl()
         {
             InitializeComponent();
+            _texts = new BindingList<IText>();
+            lstCustomText.DisplayMember = "Value";
+            lstCustomText.DataSource = _texts;
         }
+
+        private IPrintLayout _layout;
+
+        private BindingList<IText> _texts;
+
+        public override void Bind(IEditorService service)
+        {
+            service.RegisterCustomNotifier(this);
+            _layout = (IPrintLayout)service.GetEditedResource();
+            //Init current defined text
+            foreach (var txt in _layout.CustomText)
+            {
+                if (txt.Value == null && txt.Font == null && txt.Position == null)
+                    continue;
+
+                _texts.Add(txt);
+            }
+            //Now wire change listeners
+            _texts.ListChanged += new ListChangedEventHandler(OnTextListChanged);
+        }
+
+        void OnTextListChanged(object sender, ListChangedEventArgs e)
+        {
+            switch (e.ListChangedType)
+            {
+                case ListChangedType.ItemAdded:
+                    {
+                        _layout.AddText(_texts[e.NewIndex]);
+                    }
+                    break;
+            }
+            OnResourceChanged();
+        }
+
+        private void btnAdd_Click(object sender, EventArgs e)
+        {
+            using (var dlg = new TextDialog())
+            {
+                if (dlg.ShowDialog() == DialogResult.OK)
+                {
+                    var pos = _layout.CreateTextPosition(dlg.PositionLeft, dlg.PositionBottom, dlg.PositionUnits);
+                    var fnt = _layout.CreateFont(dlg.FontName, dlg.FontHeight, dlg.FontUnits);
+                    var txt = _layout.CreateText(dlg.TextString, fnt, pos);
+                    _texts.Add(txt);
+                }
+            }
+        }
+
+        private void btnEdit_Click(object sender, EventArgs e)
+        {
+            var txt = lstCustomText.SelectedItem as IText;
+            if (txt != null)
+            {
+                using (var dlg = new TextDialog())
+                {
+                    dlg.TextString = txt.Value;
+                    dlg.FontUnits = txt.Font.Units;
+                    dlg.FontName = txt.Font.Name;
+                    dlg.FontHeight = txt.Font.Height;
+                    dlg.PositionBottom = txt.Position.Bottom;
+                    dlg.PositionLeft = txt.Position.Left;
+                    dlg.PositionUnits = txt.Position.Units;
+                    if (dlg.ShowDialog() == DialogResult.OK)
+                    {
+                        txt.Value = dlg.TextString;
+                        txt.Font.Units = dlg.FontUnits;
+                        txt.Font.Name = dlg.FontName;
+                        txt.Font.Height = dlg.FontHeight;
+                        txt.Position.Bottom = dlg.PositionBottom;
+                        txt.Position.Left = dlg.PositionLeft;
+                        txt.Position.Units = dlg.PositionUnits;
+                        OnResourceChanged();
+                    }
+                }
+            }
+        }
+
+        private void btnDelete_Click(object sender, EventArgs e)
+        {
+            var txt = lstCustomText.SelectedItem as IText;
+            if (txt != null)
+            {
+                _texts.Remove(txt);
+                //Have to remove manually due to brain-dead API design
+                //of BindingList<T>
+                _layout.RemoveText(txt);
+            }
+        }
+
+        private void lstCustomText_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            btnEdit.Enabled = btnDelete.Enabled = (lstCustomText.SelectedItem != null);
+        }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintLayoutEditorCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintLayoutEditorCtrl.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintLayoutEditorCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -28,65 +28,66 @@
         /// </summary>
         private void InitializeComponent()
         {
-            this.printPagePropertiesSectionCtrl1 = new Maestro.Editors.PrintLayout.PrintPagePropertiesSectionCtrl();
-            this.printCustomTextSectionCtrl1 = new Maestro.Editors.PrintLayout.PrintCustomTextSectionCtrl();
-            this.printCustomLogosSectionCtrl1 = new Maestro.Editors.PrintLayout.PrintCustomLogosSectionCtrl();
+            this.printSettingsCtrl = new Maestro.Editors.PrintLayout.PrintPagePropertiesSectionCtrl();
+            this.printLogosCtrl = new Maestro.Editors.PrintLayout.PrintCustomLogosSectionCtrl();
+            this.printTextCtrl = new Maestro.Editors.PrintLayout.PrintCustomTextSectionCtrl();
             this.SuspendLayout();
             // 
-            // printPagePropertiesSectionCtrl1
+            // printSettingsCtrl
             // 
-            this.printPagePropertiesSectionCtrl1.ContentBackgroundColor = System.Drawing.SystemColors.Control;
-            this.printPagePropertiesSectionCtrl1.Dock = System.Windows.Forms.DockStyle.Top;
-            this.printPagePropertiesSectionCtrl1.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.printPagePropertiesSectionCtrl1.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.printPagePropertiesSectionCtrl1.HeaderText = "Page and Layout Properties";
-            this.printPagePropertiesSectionCtrl1.Location = new System.Drawing.Point(0, 0);
-            this.printPagePropertiesSectionCtrl1.Name = "printPagePropertiesSectionCtrl1";
-            this.printPagePropertiesSectionCtrl1.Size = new System.Drawing.Size(536, 217);
-            this.printPagePropertiesSectionCtrl1.TabIndex = 0;
+            this.printSettingsCtrl.ContentBackgroundColor = System.Drawing.SystemColors.Control;
+            this.printSettingsCtrl.Dock = System.Windows.Forms.DockStyle.Top;
+            this.printSettingsCtrl.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
+            this.printSettingsCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.printSettingsCtrl.HeaderText = "Page and Layout Properties";
+            this.printSettingsCtrl.Location = new System.Drawing.Point(0, 0);
+            this.printSettingsCtrl.Name = "printSettingsCtrl";
+            this.printSettingsCtrl.Size = new System.Drawing.Size(502, 217);
+            this.printSettingsCtrl.TabIndex = 0;
             // 
-            // printCustomTextSectionCtrl1
+            // printLogosCtrl
             // 
-            this.printCustomTextSectionCtrl1.ContentBackgroundColor = System.Drawing.SystemColors.Control;
-            this.printCustomTextSectionCtrl1.Dock = System.Windows.Forms.DockStyle.Top;
-            this.printCustomTextSectionCtrl1.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.printCustomTextSectionCtrl1.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.printCustomTextSectionCtrl1.HeaderText = "Custom Text";
-            this.printCustomTextSectionCtrl1.Location = new System.Drawing.Point(0, 217);
-            this.printCustomTextSectionCtrl1.Name = "printCustomTextSectionCtrl1";
-            this.printCustomTextSectionCtrl1.Size = new System.Drawing.Size(536, 185);
-            this.printCustomTextSectionCtrl1.TabIndex = 1;
+            this.printLogosCtrl.ContentBackgroundColor = System.Drawing.SystemColors.Control;
+            this.printLogosCtrl.Dock = System.Windows.Forms.DockStyle.Top;
+            this.printLogosCtrl.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
+            this.printLogosCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.printLogosCtrl.HeaderText = "Custom Logos";
+            this.printLogosCtrl.Location = new System.Drawing.Point(0, 217);
+            this.printLogosCtrl.Name = "printLogosCtrl";
+            this.printLogosCtrl.Size = new System.Drawing.Size(502, 319);
+            this.printLogosCtrl.TabIndex = 2;
             // 
-            // printCustomLogosSectionCtrl1
+            // printTextCtrl
             // 
-            this.printCustomLogosSectionCtrl1.ContentBackgroundColor = System.Drawing.SystemColors.Control;
-            this.printCustomLogosSectionCtrl1.Dock = System.Windows.Forms.DockStyle.Top;
-            this.printCustomLogosSectionCtrl1.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.printCustomLogosSectionCtrl1.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.printCustomLogosSectionCtrl1.HeaderText = "Custom Logos";
-            this.printCustomLogosSectionCtrl1.Location = new System.Drawing.Point(0, 402);
-            this.printCustomLogosSectionCtrl1.Name = "printCustomLogosSectionCtrl1";
-            this.printCustomLogosSectionCtrl1.Size = new System.Drawing.Size(536, 188);
-            this.printCustomLogosSectionCtrl1.TabIndex = 2;
+            this.printTextCtrl.ContentBackgroundColor = System.Drawing.SystemColors.Control;
+            this.printTextCtrl.Dock = System.Windows.Forms.DockStyle.Top;
+            this.printTextCtrl.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
+            this.printTextCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.printTextCtrl.HeaderText = "Custom Text";
+            this.printTextCtrl.Location = new System.Drawing.Point(0, 536);
+            this.printTextCtrl.Name = "printTextCtrl";
+            this.printTextCtrl.Size = new System.Drawing.Size(502, 319);
+            this.printTextCtrl.TabIndex = 3;
             // 
             // PrintLayoutEditorCtrl
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.AutoScroll = true;
-            this.Controls.Add(this.printCustomLogosSectionCtrl1);
-            this.Controls.Add(this.printCustomTextSectionCtrl1);
-            this.Controls.Add(this.printPagePropertiesSectionCtrl1);
+            this.Controls.Add(this.printTextCtrl);
+            this.Controls.Add(this.printLogosCtrl);
+            this.Controls.Add(this.printSettingsCtrl);
             this.Name = "PrintLayoutEditorCtrl";
-            this.Size = new System.Drawing.Size(536, 435);
+            this.Size = new System.Drawing.Size(502, 435);
             this.ResumeLayout(false);
 
         }
 
         #endregion
 
-        private PrintPagePropertiesSectionCtrl printPagePropertiesSectionCtrl1;
-        private PrintCustomTextSectionCtrl printCustomTextSectionCtrl1;
-        private PrintCustomLogosSectionCtrl printCustomLogosSectionCtrl1;
+        private PrintPagePropertiesSectionCtrl printSettingsCtrl;
+        private PrintCustomLogosSectionCtrl printLogosCtrl;
+        private PrintCustomTextSectionCtrl printTextCtrl;
+
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintLayoutEditorCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintLayoutEditorCtrl.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintLayoutEditorCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -36,7 +36,9 @@
 
         public override void Bind(IEditorService service)
         {
-            
+            printSettingsCtrl.Bind(service);
+            printLogosCtrl.Bind(service);
+            printTextCtrl.Bind(service);
         }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintPagePropertiesSectionCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintPagePropertiesSectionCtrl.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintPagePropertiesSectionCtrl.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -30,26 +30,24 @@
         {
             this.label1 = new System.Windows.Forms.Label();
             this.bgColorPicker = new System.Windows.Forms.ColorDialog();
-            this.txtBgColor = new System.Windows.Forms.TextBox();
-            this.btnPickColor = new System.Windows.Forms.Button();
             this.grpLayout = new System.Windows.Forms.GroupBox();
-            this.chkTitle = new System.Windows.Forms.CheckBox();
-            this.chkURL = new System.Windows.Forms.CheckBox();
-            this.chkLegend = new System.Windows.Forms.CheckBox();
-            this.chkDateTime = new System.Windows.Forms.CheckBox();
-            this.chkScaleBar = new System.Windows.Forms.CheckBox();
-            this.chkCustomLogos = new System.Windows.Forms.CheckBox();
-            this.chkNorthArrow = new System.Windows.Forms.CheckBox();
             this.chkCustomText = new System.Windows.Forms.CheckBox();
+            this.chkNorthArrow = new System.Windows.Forms.CheckBox();
+            this.chkCustomLogos = new System.Windows.Forms.CheckBox();
+            this.chkScaleBar = new System.Windows.Forms.CheckBox();
+            this.chkDateTime = new System.Windows.Forms.CheckBox();
+            this.chkLegend = new System.Windows.Forms.CheckBox();
+            this.chkURL = new System.Windows.Forms.CheckBox();
+            this.chkTitle = new System.Windows.Forms.CheckBox();
+            this.cmbBgColor = new Maestro.Editors.Common.ColorComboBox();
             this.contentPanel.SuspendLayout();
             this.grpLayout.SuspendLayout();
             this.SuspendLayout();
             // 
             // contentPanel
             // 
+            this.contentPanel.Controls.Add(this.cmbBgColor);
             this.contentPanel.Controls.Add(this.grpLayout);
-            this.contentPanel.Controls.Add(this.btnPickColor);
-            this.contentPanel.Controls.Add(this.txtBgColor);
             this.contentPanel.Controls.Add(this.label1);
             this.contentPanel.Size = new System.Drawing.Size(449, 190);
             // 
@@ -62,23 +60,6 @@
             this.label1.TabIndex = 0;
             this.label1.Text = "Background Color";
             // 
-            // txtBgColor
-            // 
-            this.txtBgColor.Location = new System.Drawing.Point(114, 15);
-            this.txtBgColor.Name = "txtBgColor";
-            this.txtBgColor.ReadOnly = true;
-            this.txtBgColor.Size = new System.Drawing.Size(123, 20);
-            this.txtBgColor.TabIndex = 1;
-            // 
-            // btnPickColor
-            // 
-            this.btnPickColor.Location = new System.Drawing.Point(243, 13);
-            this.btnPickColor.Name = "btnPickColor";
-            this.btnPickColor.Size = new System.Drawing.Size(26, 23);
-            this.btnPickColor.TabIndex = 2;
-            this.btnPickColor.Text = "...";
-            this.btnPickColor.UseVisualStyleBackColor = true;
-            // 
             // grpLayout
             // 
             this.grpLayout.Controls.Add(this.chkCustomText);
@@ -96,36 +77,46 @@
             this.grpLayout.TabStop = false;
             this.grpLayout.Text = "Layout Visibility";
             // 
-            // chkTitle
+            // chkCustomText
             // 
-            this.chkTitle.AutoSize = true;
-            this.chkTitle.Location = new System.Drawing.Point(19, 19);
-            this.chkTitle.Name = "chkTitle";
-            this.chkTitle.Size = new System.Drawing.Size(46, 17);
-            this.chkTitle.TabIndex = 0;
-            this.chkTitle.Text = "Title";
-            this.chkTitle.UseVisualStyleBackColor = true;
+            this.chkCustomText.AutoSize = true;
+            this.chkCustomText.Location = new System.Drawing.Point(184, 90);
+            this.chkCustomText.Name = "chkCustomText";
+            this.chkCustomText.Size = new System.Drawing.Size(85, 17);
+            this.chkCustomText.TabIndex = 7;
+            this.chkCustomText.Text = "Custom Text";
+            this.chkCustomText.UseVisualStyleBackColor = true;
             // 
-            // chkURL
+            // chkNorthArrow
             // 
-            this.chkURL.AutoSize = true;
-            this.chkURL.Location = new System.Drawing.Point(184, 19);
-            this.chkURL.Name = "chkURL";
-            this.chkURL.Size = new System.Drawing.Size(48, 17);
-            this.chkURL.TabIndex = 1;
-            this.chkURL.Text = "URL";
-            this.chkURL.UseVisualStyleBackColor = true;
+            this.chkNorthArrow.AutoSize = true;
+            this.chkNorthArrow.Location = new System.Drawing.Point(19, 91);
+            this.chkNorthArrow.Name = "chkNorthArrow";
+            this.chkNorthArrow.Size = new System.Drawing.Size(82, 17);
+            this.chkNorthArrow.TabIndex = 6;
+            this.chkNorthArrow.Text = "North Arrow";
+            this.chkNorthArrow.UseVisualStyleBackColor = true;
             // 
-            // chkLegend
+            // chkCustomLogos
             // 
-            this.chkLegend.AutoSize = true;
-            this.chkLegend.Location = new System.Drawing.Point(19, 43);
-            this.chkLegend.Name = "chkLegend";
-            this.chkLegend.Size = new System.Drawing.Size(62, 17);
-            this.chkLegend.TabIndex = 2;
-            this.chkLegend.Text = "Legend";
-            this.chkLegend.UseVisualStyleBackColor = true;
+            this.chkCustomLogos.AutoSize = true;
+            this.chkCustomLogos.Location = new System.Drawing.Point(184, 66);
+            this.chkCustomLogos.Name = "chkCustomLogos";
+            this.chkCustomLogos.Size = new System.Drawing.Size(93, 17);
+            this.chkCustomLogos.TabIndex = 5;
+            this.chkCustomLogos.Text = "Custom Logos";
+            this.chkCustomLogos.UseVisualStyleBackColor = true;
             // 
+            // chkScaleBar
+            // 
+            this.chkScaleBar.AutoSize = true;
+            this.chkScaleBar.Location = new System.Drawing.Point(19, 67);
+            this.chkScaleBar.Name = "chkScaleBar";
+            this.chkScaleBar.Size = new System.Drawing.Size(72, 17);
+            this.chkScaleBar.TabIndex = 4;
+            this.chkScaleBar.Text = "Scale Bar";
+            this.chkScaleBar.UseVisualStyleBackColor = true;
+            // 
             // chkDateTime
             // 
             this.chkDateTime.AutoSize = true;
@@ -136,45 +127,43 @@
             this.chkDateTime.Text = "Date/Time";
             this.chkDateTime.UseVisualStyleBackColor = true;
             // 
-            // chkScaleBar
+            // chkLegend
             // 
-            this.chkScaleBar.AutoSize = true;
-            this.chkScaleBar.Location = new System.Drawing.Point(19, 67);
-            this.chkScaleBar.Name = "chkScaleBar";
-            this.chkScaleBar.Size = new System.Drawing.Size(72, 17);
-            this.chkScaleBar.TabIndex = 4;
-            this.chkScaleBar.Text = "Scale Bar";
-            this.chkScaleBar.UseVisualStyleBackColor = true;
+            this.chkLegend.AutoSize = true;
+            this.chkLegend.Location = new System.Drawing.Point(19, 43);
+            this.chkLegend.Name = "chkLegend";
+            this.chkLegend.Size = new System.Drawing.Size(62, 17);
+            this.chkLegend.TabIndex = 2;
+            this.chkLegend.Text = "Legend";
+            this.chkLegend.UseVisualStyleBackColor = true;
             // 
-            // chkCustomLogos
+            // chkURL
             // 
-            this.chkCustomLogos.AutoSize = true;
-            this.chkCustomLogos.Location = new System.Drawing.Point(184, 66);
-            this.chkCustomLogos.Name = "chkCustomLogos";
-            this.chkCustomLogos.Size = new System.Drawing.Size(93, 17);
-            this.chkCustomLogos.TabIndex = 5;
-            this.chkCustomLogos.Text = "Custom Logos";
-            this.chkCustomLogos.UseVisualStyleBackColor = true;
+            this.chkURL.AutoSize = true;
+            this.chkURL.Location = new System.Drawing.Point(184, 19);
+            this.chkURL.Name = "chkURL";
+            this.chkURL.Size = new System.Drawing.Size(48, 17);
+            this.chkURL.TabIndex = 1;
+            this.chkURL.Text = "URL";
+            this.chkURL.UseVisualStyleBackColor = true;
             // 
-            // chkNorthArrow
+            // chkTitle
             // 
-            this.chkNorthArrow.AutoSize = true;
-            this.chkNorthArrow.Location = new System.Drawing.Point(19, 91);
-            this.chkNorthArrow.Name = "chkNorthArrow";
-            this.chkNorthArrow.Size = new System.Drawing.Size(82, 17);
-            this.chkNorthArrow.TabIndex = 6;
-            this.chkNorthArrow.Text = "North Arrow";
-            this.chkNorthArrow.UseVisualStyleBackColor = true;
+            this.chkTitle.AutoSize = true;
+            this.chkTitle.Location = new System.Drawing.Point(19, 19);
+            this.chkTitle.Name = "chkTitle";
+            this.chkTitle.Size = new System.Drawing.Size(46, 17);
+            this.chkTitle.TabIndex = 0;
+            this.chkTitle.Text = "Title";
+            this.chkTitle.UseVisualStyleBackColor = true;
             // 
-            // chkCustomText
+            // cmbBgColor
             // 
-            this.chkCustomText.AutoSize = true;
-            this.chkCustomText.Location = new System.Drawing.Point(184, 90);
-            this.chkCustomText.Name = "chkCustomText";
-            this.chkCustomText.Size = new System.Drawing.Size(85, 17);
-            this.chkCustomText.TabIndex = 7;
-            this.chkCustomText.Text = "Custom Text";
-            this.chkCustomText.UseVisualStyleBackColor = true;
+            this.cmbBgColor.FormattingEnabled = true;
+            this.cmbBgColor.Location = new System.Drawing.Point(130, 15);
+            this.cmbBgColor.Name = "cmbBgColor";
+            this.cmbBgColor.Size = new System.Drawing.Size(121, 21);
+            this.cmbBgColor.TabIndex = 4;
             // 
             // PrintPagePropertiesSectionCtrl
             // 
@@ -204,7 +193,6 @@
         private System.Windows.Forms.CheckBox chkLegend;
         private System.Windows.Forms.CheckBox chkURL;
         private System.Windows.Forms.CheckBox chkTitle;
-        private System.Windows.Forms.Button btnPickColor;
-        private System.Windows.Forms.TextBox txtBgColor;
+        private Maestro.Editors.Common.ColorComboBox cmbBgColor;
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintPagePropertiesSectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintPagePropertiesSectionCtrl.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/PrintPagePropertiesSectionCtrl.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -25,15 +25,47 @@
 using System.Text;
 using System.Windows.Forms;
 using Maestro.Shared.UI;
+using Maestro.Editors.Common;
+using OSGeo.MapGuide.ObjectModels.PrintLayout;
 
 namespace Maestro.Editors.PrintLayout
 {
     [ToolboxItem(true)]
-    internal partial class PrintPagePropertiesSectionCtrl : CollapsiblePanel
+    internal partial class PrintPagePropertiesSectionCtrl : EditorBindableCollapsiblePanel
     {
         public PrintPagePropertiesSectionCtrl()
         {
             InitializeComponent();
         }
+
+        private IPrintLayout _layout;
+
+        public override void Bind(IEditorService service)
+        {
+            cmbBgColor.ResetColors();
+            service.RegisterCustomNotifier(this);
+            _layout = (IPrintLayout)service.GetEditedResource();
+
+            //ColorComboBox requires custom databinding
+            cmbBgColor.CurrentColor = _layout.PageProperties.BackgroundColor;
+            cmbBgColor.SelectedIndexChanged += (sender, e) =>
+            {
+                _layout.PageProperties.BackgroundColor = cmbBgColor.CurrentColor;
+            };
+            _layout.LayoutProperties.PropertyChanged += (sender, e) =>
+            {
+                OnResourceChanged();
+            };
+
+            CheckBoxBinder.BindChecked(chkCustomLogos, _layout.LayoutProperties, "ShowCustomLogos");
+            CheckBoxBinder.BindChecked(chkCustomText, _layout.LayoutProperties, "ShowCustomText");
+            CheckBoxBinder.BindChecked(chkDateTime, _layout.LayoutProperties, "ShowDateTime");
+            CheckBoxBinder.BindChecked(chkLegend, _layout.LayoutProperties, "ShowLegend");
+            CheckBoxBinder.BindChecked(chkNorthArrow, _layout.LayoutProperties, "ShowNorthArrow");
+            CheckBoxBinder.BindChecked(chkScaleBar, _layout.LayoutProperties, "ShowScaleBar");
+            CheckBoxBinder.BindChecked(chkTitle, _layout.LayoutProperties, "ShowTitle");
+            CheckBoxBinder.BindChecked(chkURL, _layout.LayoutProperties, "ShowURL");
+
+        }
     }
 }

Added: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,303 @@
+namespace Maestro.Editors.PrintLayout
+{
+    partial class TextDialog
+    {
+        /// <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 Windows Form 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.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.btnBrowseFontName = new System.Windows.Forms.Button();
+            this.txtFontName = new System.Windows.Forms.TextBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.label7 = new System.Windows.Forms.Label();
+            this.numFontHeight = new System.Windows.Forms.NumericUpDown();
+            this.label8 = new System.Windows.Forms.Label();
+            this.cmbFontUnits = new System.Windows.Forms.ComboBox();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label5 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.cmbPositionUnits = new System.Windows.Forms.ComboBox();
+            this.numPosBottom = new System.Windows.Forms.NumericUpDown();
+            this.numPosLeft = new System.Windows.Forms.NumericUpDown();
+            this.btnOK = new System.Windows.Forms.Button();
+            this.btnCancel = new System.Windows.Forms.Button();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.txtContent = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox2.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numFontHeight)).BeginInit();
+            this.groupBox1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numPosBottom)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numPosLeft)).BeginInit();
+            this.groupBox3.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Controls.Add(this.btnBrowseFontName);
+            this.groupBox2.Controls.Add(this.txtFontName);
+            this.groupBox2.Controls.Add(this.label6);
+            this.groupBox2.Controls.Add(this.label7);
+            this.groupBox2.Controls.Add(this.numFontHeight);
+            this.groupBox2.Controls.Add(this.label8);
+            this.groupBox2.Controls.Add(this.cmbFontUnits);
+            this.groupBox2.Location = new System.Drawing.Point(219, 109);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(200, 110);
+            this.groupBox2.TabIndex = 5;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Font";
+            // 
+            // btnBrowseFontName
+            // 
+            this.btnBrowseFontName.Location = new System.Drawing.Point(159, 16);
+            this.btnBrowseFontName.Name = "btnBrowseFontName";
+            this.btnBrowseFontName.Size = new System.Drawing.Size(26, 23);
+            this.btnBrowseFontName.TabIndex = 2;
+            this.btnBrowseFontName.Text = "...";
+            this.btnBrowseFontName.UseVisualStyleBackColor = true;
+            this.btnBrowseFontName.Click += new System.EventHandler(this.btnBrowseFontName_Click);
+            // 
+            // txtFontName
+            // 
+            this.txtFontName.Location = new System.Drawing.Point(65, 18);
+            this.txtFontName.Name = "txtFontName";
+            this.txtFontName.Size = new System.Drawing.Size(88, 20);
+            this.txtFontName.TabIndex = 12;
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(13, 76);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(31, 13);
+            this.label6.TabIndex = 11;
+            this.label6.Text = "Units";
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Location = new System.Drawing.Point(13, 48);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(38, 13);
+            this.label7.TabIndex = 10;
+            this.label7.Text = "Height";
+            // 
+            // numFontHeight
+            // 
+            this.numFontHeight.DecimalPlaces = 2;
+            this.numFontHeight.Location = new System.Drawing.Point(65, 46);
+            this.numFontHeight.Name = "numFontHeight";
+            this.numFontHeight.Size = new System.Drawing.Size(120, 20);
+            this.numFontHeight.TabIndex = 7;
+            // 
+            // label8
+            // 
+            this.label8.AutoSize = true;
+            this.label8.Location = new System.Drawing.Point(13, 21);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(35, 13);
+            this.label8.TabIndex = 9;
+            this.label8.Text = "Name";
+            // 
+            // cmbFontUnits
+            // 
+            this.cmbFontUnits.FormattingEnabled = true;
+            this.cmbFontUnits.Location = new System.Drawing.Point(65, 73);
+            this.cmbFontUnits.Name = "cmbFontUnits";
+            this.cmbFontUnits.Size = new System.Drawing.Size(120, 21);
+            this.cmbFontUnits.TabIndex = 8;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.label5);
+            this.groupBox1.Controls.Add(this.label4);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.cmbPositionUnits);
+            this.groupBox1.Controls.Add(this.numPosBottom);
+            this.groupBox1.Controls.Add(this.numPosLeft);
+            this.groupBox1.Location = new System.Drawing.Point(13, 109);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(200, 110);
+            this.groupBox1.TabIndex = 4;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Position";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(22, 76);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(31, 13);
+            this.label5.TabIndex = 5;
+            this.label5.Text = "Units";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(22, 48);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(40, 13);
+            this.label4.TabIndex = 4;
+            this.label4.Text = "Bottom";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(22, 21);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(25, 13);
+            this.label3.TabIndex = 3;
+            this.label3.Text = "Left";
+            // 
+            // cmbPositionUnits
+            // 
+            this.cmbPositionUnits.FormattingEnabled = true;
+            this.cmbPositionUnits.Location = new System.Drawing.Point(74, 73);
+            this.cmbPositionUnits.Name = "cmbPositionUnits";
+            this.cmbPositionUnits.Size = new System.Drawing.Size(120, 21);
+            this.cmbPositionUnits.TabIndex = 2;
+            // 
+            // numPosBottom
+            // 
+            this.numPosBottom.DecimalPlaces = 2;
+            this.numPosBottom.Location = new System.Drawing.Point(74, 46);
+            this.numPosBottom.Name = "numPosBottom";
+            this.numPosBottom.Size = new System.Drawing.Size(120, 20);
+            this.numPosBottom.TabIndex = 1;
+            // 
+            // numPosLeft
+            // 
+            this.numPosLeft.DecimalPlaces = 2;
+            this.numPosLeft.Location = new System.Drawing.Point(74, 19);
+            this.numPosLeft.Name = "numPosLeft";
+            this.numPosLeft.Size = new System.Drawing.Size(120, 20);
+            this.numPosLeft.TabIndex = 0;
+            // 
+            // btnOK
+            // 
+            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnOK.Location = new System.Drawing.Point(262, 228);
+            this.btnOK.Name = "btnOK";
+            this.btnOK.Size = new System.Drawing.Size(75, 23);
+            this.btnOK.TabIndex = 13;
+            this.btnOK.Text = "OK";
+            this.btnOK.UseVisualStyleBackColor = true;
+            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnCancel.Location = new System.Drawing.Point(343, 228);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(75, 23);
+            this.btnCancel.TabIndex = 12;
+            this.btnCancel.Text = "Cancel";
+            this.btnCancel.UseVisualStyleBackColor = true;
+            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Controls.Add(this.txtContent);
+            this.groupBox3.Controls.Add(this.label1);
+            this.groupBox3.Location = new System.Drawing.Point(13, 13);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(405, 90);
+            this.groupBox3.TabIndex = 14;
+            this.groupBox3.TabStop = false;
+            this.groupBox3.Text = "Text";
+            // 
+            // txtContent
+            // 
+            this.txtContent.Location = new System.Drawing.Point(73, 24);
+            this.txtContent.Multiline = true;
+            this.txtContent.Name = "txtContent";
+            this.txtContent.Size = new System.Drawing.Size(317, 49);
+            this.txtContent.TabIndex = 1;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(21, 27);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(44, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Content";
+            // 
+            // TextDialog
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(430, 263);
+            this.Controls.Add(this.groupBox3);
+            this.Controls.Add(this.btnOK);
+            this.Controls.Add(this.btnCancel);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.groupBox1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "TextDialog";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Text Element";
+            this.groupBox2.ResumeLayout(false);
+            this.groupBox2.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numFontHeight)).EndInit();
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numPosBottom)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numPosLeft)).EndInit();
+            this.groupBox3.ResumeLayout(false);
+            this.groupBox3.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.NumericUpDown numFontHeight;
+        private System.Windows.Forms.Label label8;
+        private System.Windows.Forms.ComboBox cmbFontUnits;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.ComboBox cmbPositionUnits;
+        private System.Windows.Forms.NumericUpDown numPosBottom;
+        private System.Windows.Forms.NumericUpDown numPosLeft;
+        private System.Windows.Forms.Button btnOK;
+        private System.Windows.Forms.Button btnCancel;
+        private System.Windows.Forms.Button btnBrowseFontName;
+        private System.Windows.Forms.TextBox txtFontName;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.TextBox txtContent;
+        private System.Windows.Forms.Label label1;
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,102 @@
+#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.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.PrintLayout
+{
+    public partial class TextDialog : Form
+    {
+        public TextDialog()
+        {
+            InitializeComponent();
+        }
+
+        public string TextString
+        {
+            get { return txtContent.Text; }
+            set { txtContent.Text = value; }
+        }
+
+        public float PositionLeft
+        {
+            get { return Convert.ToSingle(numPosLeft.Value); }
+            set { numPosLeft.Value = Convert.ToDecimal(value); }
+        }
+
+        public float PositionBottom
+        {
+            get { return Convert.ToSingle(numPosBottom.Value); }
+            set { numPosBottom.Value = Convert.ToDecimal(value); }
+        }
+
+        public string PositionUnits
+        {
+            get { return cmbPositionUnits.Text; }
+            set { cmbPositionUnits.Text = value; }
+        }
+
+        public string FontName
+        {
+            get { return txtFontName.Text; }
+            set { txtFontName.Text = value; }
+        }
+
+        public float FontHeight
+        {
+            get { return Convert.ToSingle(numFontHeight.Value); }
+            set { numFontHeight.Value = Convert.ToDecimal(value); }
+        }
+
+        public string FontUnits
+        {
+            get { return cmbFontUnits.Text; }
+            set { cmbFontUnits.Text = value; }
+        }
+
+        private void btnBrowseFontName_Click(object sender, EventArgs e)
+        {
+            using (var dlg = new FontDialog())
+            {
+                if (dlg.ShowDialog() == DialogResult.OK)
+                {
+                    this.FontName = dlg.Font.Name;
+                    this.FontHeight = dlg.Font.Height;
+                    this.FontUnits = "points";
+                }
+            }
+        }
+
+        private void btnCancel_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.Cancel;
+        }
+
+        private void btnOK_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.OK;
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/PrintLayout/TextDialog.resx	2010-10-18 07:16:47 UTC (rev 5289)
@@ -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

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -172,6 +172,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Base Layer Group.
+        /// </summary>
+        internal static string BaseLayerGroup {
+            get {
+                return ResourceManager.GetString("BaseLayerGroup", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Between {0} and {1}.
         /// </summary>
         internal static string BetweenLabel {
@@ -274,6 +283,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Confirm.
+        /// </summary>
+        internal static string Confirm {
+            get {
+                return ResourceManager.GetString("Confirm", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to The content file does not exist.
         /// </summary>
         internal static string ContentFileMissing {
@@ -1461,6 +1479,13 @@
             }
         }
         
+        internal static System.Drawing.Bitmap map__arrow {
+            get {
+                object obj = ResourceManager.GetObject("map--arrow", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap MgCooker {
             get {
                 object obj = ResourceManager.GetObject("MgCooker", resourceCulture);
@@ -1521,6 +1546,24 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to New Layer.
+        /// </summary>
+        internal static string NewLayer {
+            get {
+                return ResourceManager.GetString("NewLayer", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to New Layer Group.
+        /// </summary>
+        internal static string NewLayerGroup {
+            get {
+                return ResourceManager.GetString("NewLayerGroup", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to No active resource data file selected.
         /// </summary>
         internal static string NoActiveDataFile {
@@ -1595,6 +1638,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Overwrite the current display scales?.
+        /// </summary>
+        internal static string OverwriteDisplayScales {
+            get {
+                return ResourceManager.GetString("OverwriteDisplayScales", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to This resource already exists, continue with save?.
         /// </summary>
         internal static string OverwriteResource {
@@ -1785,6 +1837,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Please specify the symbol library first.
+        /// </summary>
+        internal static string SelectSymbolLibraryFirst {
+            get {
+                return ResourceManager.GetString("SelectSymbolLibraryFirst", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Sequential.
         /// </summary>
         internal static string SequentialName {

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-10-18 07:16:47 UTC (rev 5289)
@@ -118,811 +118,832 @@
     <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="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="scissors-blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\scissors-blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="plus-circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\plus-circle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="ColorCountError" xml:space="preserve">
+    <value>Failed to read {0} color(s) in line {1}</value>
+    <comment>An error message that is displayed if the expected color count does not match the actual count</comment>
   </data>
-  <data name="application-search-result" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\application-search-result.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="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="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="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>
+  </data>
   <data name="application--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\application--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="XmlDocIsValid" xml:space="preserve">
-    <value>Document is valid</value>
+  <data name="DataReadError" xml:space="preserve">
+    <value>Unable to read data from the selected column: {0}</value>
+    <comment>An error message that is displayed when the column read fails</comment>
   </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 name="icon_invokeurl_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_invokeurl_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <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 name="MoreThanLabel" xml:space="preserve">
+    <value>More than {0}</value>
+    <comment>The label used for the highest value in the graduated theme set</comment>
   </data>
-  <data name="InfiniteValue" xml:space="preserve">
-    <value>infinite</value>
-    <comment>A value that is displayed when the value assigned is infinite</comment>
+  <data name="icon_selectpolygon_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_selectpolygon_disabled.gif;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 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="FindEmptyString" xml:space="preserve">
-    <value>Cannot Find an Empty String</value>
+  <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="property" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\property.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="edit-indent" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\edit-indent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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>
   </data>
-  <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 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="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 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="application-export" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\application-export.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="arrow-270" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-270.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="SaveResourceFirst" xml:space="preserve">
+    <value>Please save this resource first</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 name="layer" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\layer.png;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 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="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="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="XmlEditorCursorTemplate" xml:space="preserve">
-    <value>Line {0}, Column {1}</value>
+  <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-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 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="clipboard-paste" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\clipboard-paste.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="sql-join" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\sql-join.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="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 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="NoColumnValuesError" xml:space="preserve">
-    <value>No values found in selected column</value>
-    <comment>A message displayed when the column has no values</comment>
+  <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>
   </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>
-  <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>
-  </data>
   <data name="document--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\document--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="arrow-curve" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-curve.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="table--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\table--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="FunctionTooltip" xml:space="preserve">
-    <value>Function: {1}({2})
-Description: {3}
-Returns: {0}</value>
-    <comment>The tooltip displayed in the text editor when the cursor is over a function name</comment>
+  <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="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 name="AggregateQuery" xml:space="preserve">
+    <value>Aggregate Query</value>
   </data>
-  <data name="scissors-blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\scissors-blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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>
-  <data name="TitleError" xml:space="preserve">
-    <value>Error</value>
+  <data name="icon_printablepage" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_printablepage.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="TransparentName" xml:space="preserve">
-    <value>Transparent</value>
+  <data name="InfiniteValue" xml:space="preserve">
+    <value>infinite</value>
+    <comment>A value that is displayed when the value assigned is infinite</comment>
   </data>
-  <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 name="OperationCompleted" xml:space="preserve">
+    <value>Operation Completed</value>
   </data>
-  <data name="FindReplaceNothing" xml:space="preserve">
-    <value>Nothing to replace</value>
+  <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="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 name="InvalidResourceId" xml:space="preserve">
+    <value>Not a valid resource identifier</value>
   </data>
-  <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 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="application--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\application--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</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="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 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="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 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="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 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>
   </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>
+  <data name="ui_menu" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\ui-menu.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="MgCooker" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHrSURBVDhPhZLtS1NhGMb9T/rQx6ACyUVDyQjDaKAGQYOB
-        Ew2K9ilifrA+LDAMablFb1IM03DbMXMwj4O15VZ5iPly2Go0yzCzF0iwr4OdX3seOxK1owcunofzPPfv
-        vq77nLo6i2d44j0Xb8elgk90rO7VfN80dB13coLmyUFalCMcHjvJ+fBnHkdLu4Psty5wKhZgz9022tUw
-        9oiHpuQy+1IG7umNnQGdfkV2bA4fq3ZtpCP+EI9u4NAM6mMJDkaDuPoj1pCGgUt/LDfiSYV4sFzGm6/g
-        zBkcGOtj/4gTm/+cNeBqvIBttIeexDDqlwqhjxX6ixVcc1/lHITawn5rwBVlVRa0x4ZoVc7i1V5JBx3p
-        nIwk4wU6rQG+e3m8ehlnMrodxaGOc+K1gS21waHRMzh6B3cepHDRrf2UHe3jp2mZXaf+hcHeRBnxeXf9
-        H4L3Z3HfnOJoyMVxtUSD+ovW55t03SnguzZNOp2xhiws6GjaPJPPXnLDn8Hnn6NvIMvl3qcEApHq2Rsp
-        SxcCUHj7QUrsTaAo0vUSi0vv5JklxCwUl0Wxuf4NE3vLGCuf1rdtii7Z7JZlASoWV1G6uslEpsjlFmvH
-        WFv7wcxM6j8JZ9++bzL/aISV/Ja7mnNYqmY07YouQubg/l1NwG/XLb2y/7oFegAAAABJRU5ErkJggg==
-</value>
+  <data name="icon_clearselect" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_clearselect.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="TestConnectionNoErrors" xml:space="preserve">
-    <value>Provider reported no errors</value>
+  <data name="icon_help_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_help_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </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 name="icon_panleft" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_panleft.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="sort-number" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\sort-number.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="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="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>
   </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 name="drive-download" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\drive-download.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <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 name="QualitativeName" xml:space="preserve">
+    <value>Qualitative</value>
+    <comment>A display name for the Qualitative data type</comment>
   </data>
-  <data name="FileDownloaded" xml:space="preserve">
-    <value>File Downloaded</value>
+  <data name="funnel" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\funnel.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</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 name="sort-number" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sort-number.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="folder--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\folder--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="sum" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\sum.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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>
-  <data name="MoreColorsName" xml:space="preserve">
-    <value>More colors...</value>
+  <data name="icon_popupscrollup_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_popupscrollup_disabled.gif;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="OperationCancelled" xml:space="preserve">
+    <value>Operation Cancelled</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>
+  <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="drive-upload" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\drive-upload.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="TooManyRulesWarning" xml:space="preserve">
+    <value>You are creating a large number of rules, this will likely result in Maestro becoming unresponsive.
+Do you want to continue?</value>
+    <comment>A warning message that is displayed if the user has selected options that will generate a very large number of rules</comment>
   </data>
-  <data name="cross-script" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\cross-script.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FiniteDisplayScales" xml:space="preserve">
+    <value>Finite Display Scales</value>
   </data>
-  <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 name="ruler" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\ruler.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="layer" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\layer.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="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 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>
   </data>
-  <data name="ColumnValueError" xml:space="preserve">
-    <value>An error occured while reading column values: {0}</value>
-    <comment>An error message that is displayed when the column values could not be read</comment>
+  <data name="NoFolderSelected" xml:space="preserve">
+    <value>You have not selected a starting folder, do you want to back up the entire site?</value>
+    <comment>A message that is displayed when the user has not selected a folder to create  a folder from</comment>
   </data>
-  <data name="drive-download" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\drive-download.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="icon_measure_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_measure_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </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 name="DeleteConfirmation" xml:space="preserve">
+    <value>Do you want to remove the selected item?</value>
+    <comment>A confirmation message displayed when deleting a resource</comment>
   </data>
-  <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 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="script--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\script--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="SaveResource" xml:space="preserve">
+    <value>Save Resource</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>
+  <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>
-  <data name="FindNothing" xml:space="preserve">
-    <value>Could not find specified string or end of document reached</value>
+  <data name="icon_panright_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_panright_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="document--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\document--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="RdbmsFeatureSource" xml:space="preserve">
+    <value>RDBMS Feature Source</value>
   </data>
-  <data name="table--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\table--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="EmptyText" xml:space="preserve">
+    <value>None</value>
+    <comment>The text used for rendering examples with no text data</comment>
   </data>
-  <data name="folder--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\folder--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="TestConnectionNoErrors" xml:space="preserve">
+    <value>Provider reported no errors</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 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="funnel" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\funnel.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="FiniteDisplayScales" xml:space="preserve">
-    <value>Finite Display Scales</value>
+  <data name="FileDownloaded" xml:space="preserve">
+    <value>File Downloaded</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 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>
   </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 name="application-search-result" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\application-search-result.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </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>
-  </data>
-  <data name="ruler" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\ruler.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-  <data name="ExtendedClassTooltip" xml:space="preserve">
-    <value>Extended class based on: {0}</value>
-  </data>
-  <data name="CommandTypesDataset" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\CommandTypesDataset.xml;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
-  </data>
   <data name="GeometryStyleComboDataset" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\GeometryStyleComboDataset.xml;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
   </data>
-  <data name="ExpressionItem" xml:space="preserve">
-    <value>Expression...</value>
-    <comment>A value displayed in the combobox to activate the expression builder</comment>
+  <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="EmptyText" xml:space="preserve">
-    <value>None</value>
-    <comment>The text used for rendering examples with no text data</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="ColorCountError" xml:space="preserve">
-    <value>Failed to read {0} color(s) in line {1}</value>
-    <comment>An error message that is displayed if the expected color count does not match the actual count</comment>
+  <data name="UnknownResourceTypes" xml:space="preserve">
+    <value>Unknown types</value>
+    <comment>The list entry that represents unknown resource types</comment>
   </data>
-  <data name="DivergingName" xml:space="preserve">
-    <value>Diverging</value>
-    <comment>A display name for the Diverging data type</comment>
+  <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>
-  <data name="InvalidColorComponent" xml:space="preserve">
-    <value>Invalid {0} color component {1} in line {2}</value>
-    <comment>An error message that is displayed if a color component is outside the [0-255] range.
-{0} is the color component, eg. R, G or B
-{1} is the value read
-{2} is the line where the error was encountered</comment>
+  <data name="PackageCreationFailedError" xml:space="preserve">
+    <value>Failed to create package, error message: {0}</value>
+    <comment>A message displayed when the package creation fails</comment>
   </data>
-  <data name="InvalidFieldCountError" xml:space="preserve">
-    <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 name="icon_home" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_home.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="InvalidRecordCountError" xml:space="preserve">
-    <value>Invalid record count in line {0}</value>
-    <comment>An error message that is displayed if the file has an invalid error count</comment>
+  <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="MissingColumnError" xml:space="preserve">
-    <value>Missing column "{0}"</value>
-    <comment>An error message that is displayed if the file is missing a required column</comment>
+  <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>
-  <data name="QualitativeName" xml:space="preserve">
-    <value>Qualitative</value>
-    <comment>A display name for the Qualitative data type</comment>
+  <data name="icon_zoomout" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_zoomout.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="SequentialName" xml:space="preserve">
-    <value>Sequential</value>
-    <comment>A display name for the Sequential data type</comment>
+  <data name="ExtendedClassTooltip" xml:space="preserve">
+    <value>Extended class based on: {0}</value>
   </data>
-  <data name="BetweenLabel" xml:space="preserve">
-    <value>Between {0} and {1}</value>
-    <comment>The label used for all "between" values in the graduated theme set</comment>
-  </data>
-  <data name="ColumnHasNoValidDataError" xml:space="preserve">
-    <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="DataReadError" xml:space="preserve">
-    <value>Unable to read data from the selected column: {0}</value>
-    <comment>An error message that is displayed when the column read fails</comment>
-  </data>
   <data name="GenericError" xml:space="preserve">
     <value>An error occured: {0}</value>
     <comment>An error message that is displayed when an unexpected error occurs</comment>
   </data>
-  <data name="InvalidColumnNameError" xml:space="preserve">
-    <value>Invalid column name</value>
-    <comment>An error message that is displayed when the column selected does not exist</comment>
+  <data name="icon_pan" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_pan.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 name="icon_viewoptions" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_viewoptions.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="MoreThanLabel" xml:space="preserve">
-    <value>More than {0}</value>
-    <comment>The label used for the highest value in the graduated theme set</comment>
+  <data name="icon_zoomselect" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_zoomselect.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="SelectColumnPlaceholder" xml:space="preserve">
-    <value>&lt;Select column&gt;</value>
-    <comment>A placeholder message displayed when the user has not yet selected a column</comment>
+  <data name="FailEnumDataStores" xml:space="preserve">
+    <value>Failed to enumerate data stores. Reason: {0}</value>
   </data>
-  <data name="TooManyIndiviualValuesError" xml:space="preserve">
-    <value>The selected column contains more than {0} different values, and thus cannot be used for theming with individual values</value>
-    <comment>An error message that is displayed if the selected column has too many distinct values</comment>
+  <data name="drive-upload" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\drive-upload.png;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.
-Do you want to continue?</value>
-    <comment>A warning message that is displayed if the user has selected options that will generate a very large number of rules</comment>
+  <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="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="MoreColorsName" xml:space="preserve">
+    <value>More colors...</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="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="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>
+  </data>
   <data name="FontPreviewError" xml:space="preserve">
     <value>Cannot Preview Font "{0}"</value>
     <comment>An error message that is displayed when the rendering fails, using the specified font</comment>
   </data>
-  <data name="InsertionPointYError" xml:space="preserve">
-    <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 name="ExpressionItem" xml:space="preserve">
+    <value>Expression...</value>
+    <comment>A value displayed in the combobox to activate the expression builder</comment>
   </data>
-  <data name="SymbolTypeNotSupported" xml:space="preserve">
-    <value>Only symbols of type "Mark" and "Font" are currently supported</value>
-    <comment>A message that is displayed when the user attempts to modify an item with an unsupported type</comment>
+  <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="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 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="InvokeScriptCmdDescription" xml:space="preserve">
-    <value>Invoke Script Command</value>
+  <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>
-  <data name="InvokeUrlCmdDescription" xml:space="preserve">
-    <value>Invoke URL command</value>
+  <data name="icon_refreshmap" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_refreshmap.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="SearchCmdDescription" xml:space="preserve">
-    <value>Search Command</value>
+  <data name="SequentialName" xml:space="preserve">
+    <value>Sequential</value>
+    <comment>A display name for the Sequential data type</comment>
   </data>
-  <data name="DeleteCommand" xml:space="preserve">
-    <value>Delete Command</value>
-  </data>
   <data name="PromptDeleteCommand" xml:space="preserve">
     <value>This command is referenced in the following menus: {0}. Do you want to delete this command and all menu items referencing it?</value>
   </data>
-  <data name="ui_menu" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\ui-menu.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="InsertionPointYError" xml:space="preserve">
+    <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="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="NewFolder" xml:space="preserve">
+    <value>New folder</value>
+    <comment>The default name of a new folder</comment>
   </data>
-  <data name="icon_back" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_back.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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>
+  <data name="ColumnHasNoValidDataError" xml:space="preserve">
+    <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>
+  <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="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>
   <data name="icon_back_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_back_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</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="FileCopyError" xml:space="preserve">
+    <value>An error occured while copying file: {0}</value>
+    <comment>A message displayed when a file copy fails</comment>
   </data>
-  <data name="icon_buffer_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_buffer_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</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="icon_clearselect" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_clearselect.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="RepositoryWipeWarning" xml:space="preserve">
+    <value>You have selected to restore the package at the root.
+You have also selected to delete the target before restoring.
+This will result in the entire repository being deleted and replaced with this package.
+Are you absolutely sure that is what you want?</value>
+    <comment>A confirmation message displayed to the user, when creating a package that will completely wipe a repository</comment>
   </data>
-  <data name="icon_clearselect_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_clearselect_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="icon_panup_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_panup_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <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 name="icon_pan_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_pan_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </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 name="folder--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\folder--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <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 name="arrow-curve" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-curve.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <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 name="folder--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\folder--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_fitwindow_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_fitwindow_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FindReplaceNothing" xml:space="preserve">
+    <value>Nothing to replace</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 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="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 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>
   </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 name="ColumnValueError" xml:space="preserve">
+    <value>An error occured while reading column values: {0}</value>
+    <comment>An error message that is displayed when the column values could not be read</comment>
   </data>
-  <data name="icon_help_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_help_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="icon_viewoptions_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_viewoptions_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_home" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_home.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-  <data name="icon_home_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_home_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="icon_invokescript" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon_invokescript.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</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 name="icon_buffer_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_buffer_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 name="icon_pandown_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_pandown_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_invokeurl_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_invokeurl_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="TransparentName" xml:space="preserve">
+    <value>Transparent</value>
   </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="NoColumnValuesError" xml:space="preserve">
+    <value>No values found in selected column</value>
+    <comment>A message displayed when the column has no values</comment>
   </data>
-  <data name="icon_measure_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_measure_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="InvalidRecordCountError" xml:space="preserve">
+    <value>Invalid record count in line {0}</value>
+    <comment>An error message that is displayed if the file has an invalid error count</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 name="NoRestorePathWarning" xml:space="preserve">
+    <value>You have selected to restore the package at another location, but not entered one.
+This will cause the package to be restored a the root of the resource tree.
+Are you sure this is what you want?</value>
+    <comment>A message displayed when the user has not entered a restore path</comment>
   </data>
-  <data name="icon_pan" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_pan.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="cross-script" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\cross-script.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_pandown" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_pandown.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FiletypeMGP" xml:space="preserve">
+    <value>MapGuide Packages ({0})</value>
+    <comment>The text displayed when browsing for MGP files</comment>
   </data>
-  <data name="icon_pandown_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_pandown_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="SymbolTypeNotSupported" xml:space="preserve">
+    <value>Only symbols of type "Mark" and "Font" are currently supported</value>
+    <comment>A message that is displayed when the user attempts to modify an item with an unsupported type</comment>
   </data>
-  <data name="icon_panleft" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_panleft.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="clipboard-paste" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\clipboard-paste.png;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 name="MissingColumnError" xml:space="preserve">
+    <value>Missing column "{0}"</value>
+    <comment>An error message that is displayed if the file is missing a required column</comment>
   </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 name="PackageBuildError" xml:space="preserve">
+    <value>An error occured while building package: {0}</value>
+    <comment>A message displayed when the package creation fails</comment>
   </data>
-  <data name="icon_panright_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_panright_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="BetweenLabel" xml:space="preserve">
+    <value>Between {0} and {1}</value>
+    <comment>The label used for all "between" values in the graduated theme set</comment>
   </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 name="script--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\script--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_panup_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_panup_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="sql-join" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sql-join.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_pan_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_pan_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="icon_zoomrect_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_zoomrect_disabled.gif;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 name="FiletypeAll" xml:space="preserve">
+    <value>All files ({0})</value>
+    <comment>The text displayed when browsing for all file types</comment>
   </data>
-  <data name="icon_plotdwf_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_plotdwf_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="NoActiveDataFile" xml:space="preserve">
+    <value>No active resource data file selected</value>
   </data>
-  <data name="icon_popupscrolldown" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_popupscrolldown.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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>
-  <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 name="icon_home_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_home_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</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 name="arrow-270" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-270.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_popupscrollup_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_popupscrollup_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="AlternateNameMissing" xml:space="preserve">
+    <value>You must enter a alternate name, or remove the checkmark</value>
+    <comment>A message displayed when the user has not entered an alternate name for a resource</comment>
   </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="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="icon_printablepage" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_printablepage.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="DeleteCommand" xml:space="preserve">
+    <value>Delete Command</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="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>
   </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>
+  <data name="application-export" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\application-export.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_refreshmap" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_refreshmap.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="icon_select_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_select_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</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>
+  <data name="TitleError" xml:space="preserve">
+    <value>Error</value>
   </data>
-  <data name="icon_restorecenter" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_restorecenter.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="icon_plotdwf_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_plotdwf_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <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 name="FilterAll" xml:space="preserve">
+    <value>All File Types (*.*)|*.*</value>
   </data>
-  <data name="icon_search" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_search.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="icon_search_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_search_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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>
   </data>
-  <data name="icon_select" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_select.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="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 name="InvalidResourceIdFolder" xml:space="preserve">
+    <value>Must be valid resource id. Cannot be a folder</value>
   </data>
-  <data name="icon_selectpolygon_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_selectpolygon_disabled.gif;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="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>
+  <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>
   </data>
-  <data name="icon_selectradius_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_selectradius_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="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 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="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 name="FindNothing" xml:space="preserve">
+    <value>Could not find specified string or end of document reached</value>
   </data>
-  <data name="icon_select_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_select_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <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="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="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="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 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>
   </data>
-  <data name="icon_viewoptions" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_viewoptions.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="HeaderFileMissing" xml:space="preserve">
+    <value>The header file does not exist</value>
+    <comment>A message displayed when the user selects a non-existing file</comment>
   </data>
-  <data name="icon_viewoptions_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_viewoptions_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="icon_search" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_search.gif;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>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="MgCooker" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHrSURBVDhPhZLtS1NhGMb9T/rQx6ACyUVDyQjDaKAGQYOB
+        Ew2K9ilifrA+LDAMablFb1IM03DbMXMwj4O15VZ5iPly2Go0yzCzF0iwr4OdX3seOxK1owcunofzPPfv
+        vq77nLo6i2d44j0Xb8elgk90rO7VfN80dB13coLmyUFalCMcHjvJ+fBnHkdLu4Psty5wKhZgz9022tUw
+        9oiHpuQy+1IG7umNnQGdfkV2bA4fq3ZtpCP+EI9u4NAM6mMJDkaDuPoj1pCGgUt/LDfiSYV4sFzGm6/g
+        zBkcGOtj/4gTm/+cNeBqvIBttIeexDDqlwqhjxX6ixVcc1/lHITawn5rwBVlVRa0x4ZoVc7i1V5JBx3p
+        nIwk4wU6rQG+e3m8ehlnMrodxaGOc+K1gS21waHRMzh6B3cepHDRrf2UHe3jp2mZXaf+hcHeRBnxeXf9
+        H4L3Z3HfnOJoyMVxtUSD+ovW55t03SnguzZNOp2xhiws6GjaPJPPXnLDn8Hnn6NvIMvl3qcEApHq2Rsp
+        SxcCUHj7QUrsTaAo0vUSi0vv5JklxCwUl0Wxuf4NE3vLGCuf1rdtii7Z7JZlASoWV1G6uslEpsjlFmvH
+        WFv7wcxM6j8JZ9++bzL/aISV/Ja7mnNYqmY07YouQubg/l1NwG/XLb2y/7oFegAAAABJRU5ErkJggg==
+</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>
+  <data name="icon_restorecenter" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_restorecenter.gif;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="SelectPackageFile" xml:space="preserve">
+    <value>Select the package file to edit</value>
+    <comment>The title of the dialog that the is used to pick the package file to edit</comment>
   </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="icon_zoomprev" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_zoomprev.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <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 name="icon_fitwindow_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_fitwindow_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_zoomout" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_zoomout.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="InvalidColumnNameError" xml:space="preserve">
+    <value>Invalid column name</value>
+    <comment>An error message that is displayed when the column selected does not exist</comment>
   </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 name="SearchCmdDescription" xml:space="preserve">
+    <value>Search Command</value>
   </data>
-  <data name="icon_zoomprev" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_zoomprev.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FilterShp" xml:space="preserve">
+    <value>ESRI Shape File (*.shp)|*.*</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 name="XmlEditorCursorTemplate" xml:space="preserve">
+    <value>Line {0}, Column {1}</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 name="FilterSdf" xml:space="preserve">
+    <value>Autodesk SDF (*.sdf)|*.*</value>
   </data>
-  <data name="icon_zoomrect_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_zoomrect_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="SelectFolder" xml:space="preserve">
+    <value>Select Folder</value>
   </data>
-  <data name="icon_zoomselect" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_zoomselect.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="application--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\application--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="icon_zoomselect_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\icon_zoomselect_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FsPostgreSql" xml:space="preserve">
+    <value>PostgreSQL/PostGIS Feature Source</value>
   </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="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="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>
-  <data name="LoadProcedureVersionExecutionNotSupported" xml:space="preserve">
-    <value>This connection does not support executing this type of Load Procedure</value>
+  <data name="FunctionTooltip" xml:space="preserve">
+    <value>Function: {1}({2})
+Description: {3}
+Returns: {0}</value>
+    <comment>The tooltip displayed in the text editor when the cursor is over a function name</comment>
   </data>
-  <data name="OperationCancelled" xml:space="preserve">
-    <value>Operation Cancelled</value>
+  <data name="SQLQuery" xml:space="preserve">
+    <value>SQL Query</value>
   </data>
-  <data name="OperationCompleted" xml:space="preserve">
-    <value>Operation Completed</value>
+  <data name="InvalidFieldCountError" xml:space="preserve">
+    <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="FilterAll" xml:space="preserve">
-    <value>All File Types (*.*)|*.*</value>
+  <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="FilterSdf" xml:space="preserve">
-    <value>Autodesk SDF (*.sdf)|*.*</value>
-  </data>
-  <data name="FilterShp" xml:space="preserve">
-    <value>ESRI Shape File (*.shp)|*.*</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="AlternateNameMissing" xml:space="preserve">
-    <value>You must enter a alternate name, or remove the checkmark</value>
-    <comment>A message displayed when the user has not entered an alternate name for a resource</comment>
+  <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>
-  <data name="ContentFileMissing" xml:space="preserve">
-    <value>The content file does not exist</value>
-    <comment>A message displayed when the user selects a non-existing file</comment>
+  <data name="InvokeUrlCmdDescription" xml:space="preserve">
+    <value>Invoke URL command</value>
   </data>
-  <data name="DeleteConfirmation" xml:space="preserve">
-    <value>Do you want to remove the selected item?</value>
-    <comment>A confirmation message displayed when deleting a resource</comment>
+  <data name="icon_pandown" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_pandown.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="FileCopyError" xml:space="preserve">
-    <value>An error occured while copying file: {0}</value>
-    <comment>A message displayed when a file copy fails</comment>
+  <data name="PropEnumNoValues" xml:space="preserve">
+    <value>Could not find possible values for enumerable property</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>
+  <data name="ModeNotAllowed" xml:space="preserve">
+    <value>Mode not allowed: {0}</value>
   </data>
-  <data name="FiletypeAll" xml:space="preserve">
-    <value>All files ({0})</value>
-    <comment>The text displayed when browsing for all file types</comment>
+  <data name="icon_zoomselect_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_zoomselect_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="FiletypeMGP" xml:space="preserve">
-    <value>MapGuide Packages ({0})</value>
-    <comment>The text displayed when browsing for MGP files</comment>
+  <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="FiletypeZip" xml:space="preserve">
-    <value>Zip files ({0})</value>
-    <comment>The text displayed when browsing for zip files</comment>
+  <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="FolderMissingPrefix" xml:space="preserve">
-    <value>The folder must start with \"Library://\", do you want the starting folder to become:\n {0} ?</value>
-    <comment>A message that is displayed when the user has not entered a folder starting with Library://</comment>
+  <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="HeaderFileMissing" xml:space="preserve">
-    <value>The header file does not exist</value>
-    <comment>A message displayed when the user selects a non-existing file</comment>
+  <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="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>
+  <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="NewFolder" xml:space="preserve">
-    <value>New folder</value>
-    <comment>The default name of a new folder</comment>
+  <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>
   </data>
-  <data name="NoFolderSelected" xml:space="preserve">
-    <value>You have not selected a starting folder, do you want to back up the entire site?</value>
-    <comment>A message that is displayed when the user has not selected a folder to create  a folder from</comment>
+  <data name="icon_clearselect_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_clearselect_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="NoRestorePathWarning" xml:space="preserve">
-    <value>You have selected to restore the package at another location, but not entered one.
-This will cause the package to be restored a the root of the resource tree.
-Are you sure this is what you want?</value>
-    <comment>A message displayed when the user has not entered a restore path</comment>
+  <data name="LoadProcedureVersionExecutionNotSupported" xml:space="preserve">
+    <value>This connection does not support executing this type of Load Procedure</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>
+  <data name="StandardQuery" xml:space="preserve">
+    <value>Standard Query</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>
+  <data name="InvalidColorComponent" xml:space="preserve">
+    <value>Invalid {0} color component {1} in line {2}</value>
+    <comment>An error message that is displayed if a color component is outside the [0-255] range.
+{0} is the color component, eg. R, G or B
+{1} is the value read
+{2} is the line where the error was encountered</comment>
   </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>
+  <data name="TooManyIndiviualValuesError" xml:space="preserve">
+    <value>The selected column contains more than {0} different values, and thus cannot be used for theming with individual values</value>
+    <comment>An error message that is displayed if the selected column has too many distinct values</comment>
   </data>
-  <data name="PackageCreationFailedError" xml:space="preserve">
-    <value>Failed to create package, error message: {0}</value>
-    <comment>A message displayed when the package creation fails</comment>
+  <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="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 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="RepositoryWipeWarning" xml:space="preserve">
-    <value>You have selected to restore the package at the root.
-You have also selected to delete the target before restoring.
-This will result in the entire repository being deleted and replaced with this package.
-Are you absolutely sure that is what you want?</value>
-    <comment>A confirmation message displayed to the user, when creating a package that will completely wipe a repository</comment>
+  <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="SelectPackageFile" xml:space="preserve">
-    <value>Select the package file to edit</value>
-    <comment>The title of the dialog that the is used to pick the package file to edit</comment>
+  <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="UnknownResourceTypes" xml:space="preserve">
-    <value>Unknown types</value>
-    <comment>The list entry that represents unknown resource types</comment>
+  <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="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="SaveResourceFirst" xml:space="preserve">
-    <value>Please save this resource first</value>
+  <data name="FsSqlServerSpatial" xml:space="preserve">
+    <value>SQL Server Spatial Feature Source</value>
   </data>
-  <data name="PropEnumNoValues" xml:space="preserve">
-    <value>Could not find possible values for enumerable property</value>
+  <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>
-  <data name="NoActiveDataFile" xml:space="preserve">
-    <value>No active resource data file selected</value>
+  <data name="document--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\document--plus.png;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="plus-circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\plus-circle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="SelectFolder" xml:space="preserve">
-    <value>Select Folder</value>
+  <data name="icon_popupscrolldown" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_popupscrolldown.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="ModeNotAllowed" xml:space="preserve">
-    <value>Mode not allowed: {0}</value>
+  <data name="FolderMissingPrefix" xml:space="preserve">
+    <value>The folder must start with \"Library://\", do you want the starting folder to become:\n {0} ?</value>
+    <comment>A message that is displayed when the user has not entered a folder starting with Library://</comment>
   </data>
-  <data name="InvalidResourceId" xml:space="preserve">
-    <value>Not a valid resource identifier</value>
+  <data name="property" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\property.png;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="ContentFileMissing" xml:space="preserve">
+    <value>The content file does not exist</value>
+    <comment>A message displayed when the user selects a non-existing file</comment>
   </data>
+  <data name="icon_search_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_search_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="sum" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sum.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="SelectColumnPlaceholder" xml:space="preserve">
+    <value>&lt;Select column&gt;</value>
+    <comment>A placeholder message displayed when the user has not yet selected a column</comment>
+  </data>
+  <data name="XmlDocIsValid" xml:space="preserve">
+    <value>Document is valid</value>
+  </data>
   <data name="InvalidResourceIdNotSpecifiedType" xml:space="preserve">
     <value>Invalid Resource Identifier. Not the specified type</value>
   </data>
-  <data name="FailEnumDataStores" xml:space="preserve">
-    <value>Failed to enumerate data stores. Reason: {0}</value>
+  <data name="icon_select" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_select.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="RdbmsFeatureSource" xml:space="preserve">
-    <value>RDBMS Feature Source</value>
+  <data name="icon_back" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_back.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <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>
+  <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>
+  </data>
+  <data name="CommandTypesDataset" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\CommandTypesDataset.xml;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+  <data name="icon_selectradius_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\icon_selectradius_disabled.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="edit-indent" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\edit-indent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="FindEmptyString" xml:space="preserve">
+    <value>Cannot Find an Empty String</value>
+  </data>
   <data name="FsMySql" xml:space="preserve">
     <value>MySQL Feature Source</value>
   </data>
-  <data name="FsPostgreSql" xml:space="preserve">
-    <value>PostgreSQL/PostGIS Feature Source</value>
+  <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="FsSqlServerSpatial" xml:space="preserve">
-    <value>SQL Server Spatial Feature Source</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="AggregateQuery" xml:space="preserve">
-    <value>Aggregate Query</value>
+  <data name="NewLayerGroup" xml:space="preserve">
+    <value>New Layer Group</value>
   </data>
-  <data name="SQLQuery" xml:space="preserve">
-    <value>SQL Query</value>
+  <data name="NewLayer" xml:space="preserve">
+    <value>New Layer</value>
   </data>
-  <data name="StandardQuery" xml:space="preserve">
-    <value>Standard Query</value>
+  <data name="Confirm" xml:space="preserve">
+    <value>Confirm</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>
+  <data name="OverwriteDisplayScales" xml:space="preserve">
+    <value>Overwrite the current display scales?</value>
   </data>
+  <data name="BaseLayerGroup" xml:space="preserve">
+    <value>Base Layer Group</value>
+  </data>
+  <data name="SelectSymbolLibraryFirst" xml:space="preserve">
+    <value>Please specify the symbol library first</value>
+  </data>
 </root>
\ No newline at end of file

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


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

Modified: sandbox/maestro-3.0/Maestro.ResourceValidation/ApplicationDefinitionValidator.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.ResourceValidation/ApplicationDefinitionValidator.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.ResourceValidation/ApplicationDefinitionValidator.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -61,7 +61,7 @@
 
                                     issues.AddRange(ResourceValidatorSet.Validate(mdef, true));
 
-                                    Envelope mapEnv = ObjectFactory.CreateEnvelope(mdef.Extents.MinX, mdef.Extents.MaxX, mdef.Extents.MinY, mdef.Extents.MaxY);
+                                    IEnvelope mapEnv = ObjectFactory.CreateEnvelope(mdef.Extents.MinX, mdef.Extents.MaxX, mdef.Extents.MinY, mdef.Extents.MaxY);
 
                                     if (mapGroup.InitialView != null)
                                     {

Modified: sandbox/maestro-3.0/Maestro.ResourceValidation/WebLayoutValidator.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.ResourceValidation/WebLayoutValidator.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/Maestro.ResourceValidation/WebLayoutValidator.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -22,6 +22,7 @@
 using System.Text;
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using OSGeo.MapGuide.ObjectModels.WebLayout;
+using OSGeo.MapGuide.ObjectModels.Common;
 using OSGeo.MapGuide.ObjectModels.MapDefinition;
 using OSGeo.MapGuide.MaestroAPI.ObjectModels;
 using OSGeo.MapGuide.MaestroAPI.Exceptions;

Modified: sandbox/maestro-3.0/MaestroAPITests/ObjectTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/ObjectTests.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/MaestroAPITests/ObjectTests.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -36,8 +36,6 @@
         public void TestEnvelope()
         {
             var env = ObjectFactory.CreateEnvelope(-.1, -.1, .1, .1);
-            Assert.IsNotNull(env.LowerLeftCoordinate);
-            Assert.IsNotNull(env.UpperRightCoordinate);
             Assert.AreEqual(env.MinX, -.1);
             Assert.AreEqual(env.MinY, -.1);
             Assert.AreEqual(env.MaxX, .1);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Check.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Check.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Check.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -77,5 +77,16 @@
             if (string.IsNullOrEmpty(value))
                 throw new PreconditionException("string is empty: " + arg); //LOCALIZEME
         }
+
+        /// <summary>
+        /// Check that the specified condition is true
+        /// </summary>
+        /// <param name="condition"></param>
+        /// <param name="msg"></param>
+        public static void Precondition(bool condition, string msg)
+        {
+            if (!condition)
+                throw new PreconditionException("Precondition failure: " + msg); //LOCALIZEME
+        }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-10-18 07:16:47 UTC (rev 5289)
@@ -198,6 +198,7 @@
     <Compile Include="ObjectModels\FeatureSource.cs" />
     <Compile Include="ObjectModels\LayerFactory.cs" />
     <Compile Include="ObjectModels\MapDefinitionInterfaces.cs" />
+    <Compile Include="ObjectModels\PrintLayoutInterfaces.cs" />
     <Compile Include="ObjectModels\SymbolInterfaces.cs" />
     <Compile Include="ObjectModels\VectorLayerDefinitionImpl.cs" />
     <Compile Include="ObjectModels\LayerInterfaceExtensions.cs" />

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/Envelope.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/Envelope.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/Envelope.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -20,93 +20,130 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.ComponentModel;
 
 namespace OSGeo.MapGuide.ObjectModels.Common
 {
-    partial class Envelope
+    public interface IEnvelope : INotifyPropertyChanged
     {
-        internal Envelope() { }
+        double MinX { get; set; }
 
+        double MinY { get; set; }
+
+        double MaxX { get; set; }
+
+        double MaxY { get; set; }
+    }
+
+    public static class EnvelopeExtensions
+    {
         /// <summary>
-        /// Gets or sets the lower X value
+        /// Expands this envelope to accomodate the given envelope
         /// </summary>
-        public double MinX
+        /// <param name="env"></param>
+        public static void ExpandToInclude(this IEnvelope env, IEnvelope e1)
         {
-            get { return this.lowerLeftCoordinateField.X; }
-            set { this.lowerLeftCoordinateField.X = value; }
+            if (e1.MinX < env.MinX)
+                env.MinX = e1.MinX;
+
+            if (e1.MinY < env.MinY)
+                env.MinY = e1.MinY;
+
+            if (e1.MaxX > env.MaxX)
+                env.MaxX = e1.MaxX;
+
+            if (e1.MaxY > env.MaxY)
+                env.MaxY = e1.MaxY;
         }
 
         /// <summary>
-        /// Gets or set the lower Y value
+        /// Indicates whether the specified coordinates are within this instance
         /// </summary>
-        public double MinY
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        public static bool Contains(this IEnvelope env, double x, double y)
         {
-            get { return this.lowerLeftCoordinateField.Y; }
-            set { this.lowerLeftCoordinateField.Y = value; }
+            return env.MinX <= x &&
+                   env.MaxX >= x &&
+                   env.MinY <= y &&
+                   env.MaxY >= y;
         }
 
         /// <summary>
-        /// Gets or sets the upper X value
+        /// Indicates whether the specified envelope intersects this instance
         /// </summary>
-        public double MaxX
+        /// <param name="other"></param>
+        /// <returns></returns>
+        public static bool Intersects(this IEnvelope env, IEnvelope other)
         {
-            get { return this.upperRightCoordinateField.X; }
-            set { this.upperRightCoordinateField.X = value; }
+            if (other == null)
+                return false;
+
+            return !(other.MinX > env.MaxX || other.MaxX < env.MinX || other.MinY > env.MaxY || other.MaxY < env.MinY);
         }
+    }
 
+    partial class Envelope : IEnvelope
+    {
+        internal Envelope() { }
+
+        public Envelope(double minx, double miny, double maxx, double maxy)
+        {
+            this.lowerLeftCoordinateField = new EnvelopeLowerLeftCoordinate() { X = minx, Y = miny };
+            this.upperRightCoordinateField = new EnvelopeUpperRightCoordinate() { X = maxx, Y = maxy };
+        }
+
         /// <summary>
-        /// Gets or sets the upper Y value
+        /// Gets or sets the lower X value
         /// </summary>
-        public double MaxY
+        public double MinX
         {
-            get { return this.upperRightCoordinateField.Y; }
-            set { this.upperRightCoordinateField.Y = value; }
+            get { return this.lowerLeftCoordinateField.X; }
+            set 
+            { 
+                this.lowerLeftCoordinateField.X = value;
+                OnPropertyChanged("MinX");
+            }
         }
 
         /// <summary>
-        /// Expands this envelope to accomodate the given envelope
+        /// Gets or set the lower Y value
         /// </summary>
-        /// <param name="env"></param>
-        public void ExpandToInclude(Envelope env)
+        public double MinY
         {
-            if (env.MinX < this.MinX)
-                this.MinX = env.MinX;
-
-            if (env.MinY < this.MinY)
-                this.MinY = env.MinY;
-
-            if (env.MaxX > this.MaxX)
-                this.MaxX = env.MaxX;
-
-            if (env.MaxY > this.MaxY)
-                this.MaxY = env.MaxY;
+            get { return this.lowerLeftCoordinateField.Y; }
+            set 
+            { 
+                this.lowerLeftCoordinateField.Y = value;
+                OnPropertyChanged("MinY");
+            }
         }
 
         /// <summary>
-        /// Indicates whether the specified coordinates are within this instance
+        /// Gets or sets the upper X value
         /// </summary>
-        /// <param name="x"></param>
-        /// <param name="y"></param>
-        /// <returns></returns>
-        public bool Contains(double x, double y)
+        public double MaxX
         {
-            return this.MinX <= x &&
-                   this.MaxX >= x &&
-                   this.MinY <= y &&
-                   this.MaxY >= y;
+            get { return this.upperRightCoordinateField.X; }
+            set 
+            { 
+                this.upperRightCoordinateField.X = value;
+                OnPropertyChanged("MaxX");
+            }
         }
 
         /// <summary>
-        /// Indicates whether the specified envelope intersects this instance
+        /// Gets or sets the upper Y value
         /// </summary>
-        /// <param name="other"></param>
-        /// <returns></returns>
-        public bool Intersects(Envelope other)
+        public double MaxY
         {
-            if (other == null)
-                return false;
-
-            return !(other.MinX > this.MaxX || other.MaxX < this.MinX || other.MinY > this.MaxY || other.MaxY < this.MinY);
+            get { return this.upperRightCoordinateField.Y; }
+            set 
+            { 
+                this.upperRightCoordinateField.Y = value;
+                OnPropertyChanged("MaxY");
+            }
         }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -229,7 +229,7 @@
         /// <param name="className"></param>
         /// <param name="geomProperty"></param>
         /// <returns></returns>
-        public static Envelope GetSpatialExtent(this IFeatureSource fs, string className, string geomProperty)
+        public static IEnvelope GetSpatialExtent(this IFeatureSource fs, string className, string geomProperty)
         {
             Check.NotNull(fs, "fs");
             return fs.CurrentConnection.FeatureService.GetSpatialExtent(fs.ResourceID, className, geomProperty);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerInterfaceExtensions.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerInterfaceExtensions.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerInterfaceExtensions.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -175,7 +175,7 @@
         /// </summary>
         /// <param name="allowFallbackToContextInformation">True to allow reading spatial extents from the spatial context information, if the spatial query fails.</param>
         /// <returns>The envelope for the data in the table</returns>
-        public static Envelope GetSpatialExtent(this ILayerDefinition layer, bool allowFallbackToContextInformation)
+        public static IEnvelope GetSpatialExtent(this ILayerDefinition layer, bool allowFallbackToContextInformation)
         {
             Check.NotNull(layer, "layer");
             if (layer.CurrentConnection == null)

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinition.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinition.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -24,6 +24,8 @@
 using System.Xml.Serialization;
 using OSGeo.MapGuide.MaestroAPI;
 using System.Drawing;
+using OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using OSGeo.MapGuide.ObjectModels.Common;
 
 namespace OSGeo.MapGuide.ObjectModels.MapDefinition
 {
@@ -120,6 +122,29 @@
             get { return true; }
         }
 
+        void IMapDefinition.SetExtents(double minx, double miny, double maxx, double maxy)
+        {
+            if (this.Extents == null)
+            {
+                var ext = new Box2DType()
+                {
+                    MaxX = maxx,
+                    MaxY = maxy,
+                    MinX = minx,
+                    MinY = miny
+                };
+                this.Extents = ext;
+            }
+            else
+            {
+                this.Extents.MaxX = maxx;
+                this.Extents.MaxY = maxy;
+                this.Extents.MinX = minx;
+                this.Extents.MinY = miny;
+                OnPropertyChanged("Extents");
+            }
+        }
+
         public IMapLayerGroup AddGroup(string groupName)
         {
             if (this.MapLayerGroup == null)
@@ -132,9 +157,11 @@
                 LegendLabel = groupName,
                 Name = groupName,
                 ShowInLegend = true,
-                Visible = true
+                Visible = true,
+                Group = string.Empty
             };
             this.MapLayerGroup.Add(group);
+            OnPropertyChanged("MapLayerGroup");
             return group;
         }
 
@@ -152,30 +179,42 @@
             };
             //TODO: Throw exception if adding to non-existent group?
             layer.Group = string.IsNullOrEmpty(groupName) ? string.Empty : groupName;
+            
+            this.MapLayer.Add(layer);
+            OnPropertyChanged("MapLayer");
 
-            this.MapLayer.Add(layer);
+            if (this.MapLayer.Count == 1) //First one
+            {
+                var ldf = (ILayerDefinition)this.CurrentConnection.ResourceService.GetResource(layer.ResourceId);
+                if (string.IsNullOrEmpty(this.CoordinateSystem))
+                {
+                    this.CoordinateSystem = ldf.GetCoordinateSystemWkt();
+                }
+                if (IsEmpty(this.Extents))
+                {
+                    var env = ldf.GetSpatialExtent(true);
+                    ((IMapDefinition)this).SetExtents(env.MinX, env.MinY, env.MaxX, env.MaxY);
+                }
+            }
+
             return layer;
         }
 
+        private static bool IsEmpty(Box2DType box2DType)
+        {
+            return box2DType == null ||
+                (box2DType.MaxX == 0.0 && 
+                box2DType.MaxY == 0.0 && 
+                box2DType.MinX == 0.0 && 
+                box2DType.MinY == 0.0);
+        }
 
-        OSGeo.MapGuide.ObjectModels.Common.Envelope IMapDefinition.Extents
+
+        OSGeo.MapGuide.ObjectModels.Common.IEnvelope IMapDefinition.Extents
         {
             get
             {
-                if (this.Extents != null)
-                {
-                    return new OSGeo.MapGuide.ObjectModels.Common.Envelope()
-                    {
-                        MaxX = this.Extents.MaxX,
-                        MaxY = this.Extents.MaxY,
-                        MinX = this.Extents.MinX,
-                        MinY = this.Extents.MinY
-                    };
-                }
-                else
-                {
-                    return null;
-                }
+                return this.Extents;
             }
             set
             {
@@ -202,14 +241,26 @@
             {
                 return (IBaseMapDefinition)this.BaseMapDefinition;
             }
-            set
+        }
+
+        void IMapDefinition.InitBaseMap()
+        {
+            if (this.BaseMapDefinition == null)
             {
-                this.BaseMapDefinition = (MapDefinitionTypeBaseMapDefinition)value;
-                if (this.BaseMapDefinition != null)
-                    this.BaseMapDefinition.Parent = this;
+                this.BaseMapDefinition = new MapDefinitionTypeBaseMapDefinition()
+                {
+                    Parent = (IMapDefinition)this,
+                    BaseMapLayerGroup = new System.ComponentModel.BindingList<BaseMapLayerGroupCommonType>(),
+                    FiniteDisplayScale = new System.ComponentModel.BindingList<double>()
+                };
             }
         }
 
+        void IMapDefinition.RemoveBaseMap()
+        {
+            this.BaseMapDefinition = null;
+        }
+
         IEnumerable<IMapLayer> IMapDefinition.MapLayer
         {
             get 
@@ -225,7 +276,10 @@
         {
             var lyr = layer as MapLayerType;
             if (lyr != null)
+            {
                 this.MapLayer.Remove(lyr);
+                OnPropertyChanged("MapLayer");
+            }
         }
 
         IEnumerable<IMapLayerGroup> IMapDefinition.MapLayerGroup
@@ -241,12 +295,122 @@
 
         void IMapDefinition.RemoveGroup(IMapLayerGroup group)
         {
+            Check.NotNull(group, "group");
             var grp = group as MapLayerGroupType;
             if (grp != null)
+            {
                 this.MapLayerGroup.Remove(grp);
+                OnPropertyChanged("MapLayerGroup");
+            }
         }
+
+
+        int IMapDefinition.GetIndex(IMapLayer layer)
+        {
+            Check.NotNull(layer, "layer");
+            var lyr = layer as MapLayerType;
+            if (lyr != null)
+                return this.MapLayer.IndexOf(lyr);
+
+            return -1;
+        }
+
+        int IMapDefinition.MoveUp(IMapLayer layer)
+        {
+            Check.NotNull(layer, "layer");
+            int isrc = ((IMapDefinition)this).GetIndex(layer);
+            if (isrc > 0)
+            {
+                int idst = isrc - 1;
+
+                var src = this.MapLayer[isrc];
+                var dst = this.MapLayer[idst];
+
+                this.MapLayer[isrc] = dst;
+                this.MapLayer[idst] = src;
+
+                OnPropertyChanged("MapLayer");
+
+                return idst;
+            }
+
+            return -1;
+        }
+
+        int IMapDefinition.MoveDown(IMapLayer layer)
+        {
+            Check.NotNull(layer, "layer");
+            int isrc = ((IMapDefinition)this).GetIndex(layer);
+            if (isrc < this.MapLayer.Count - 1)
+            {
+                int idst = isrc + 1;
+
+                var src = this.MapLayer[isrc];
+                var dst = this.MapLayer[idst];
+
+                this.MapLayer[isrc] = dst;
+                this.MapLayer[idst] = src;
+
+                OnPropertyChanged("MapLayer");
+
+                return idst;
+            }
+
+            return -1;
+        }
+
+        int IMapDefinition.GetIndex(IMapLayerGroup group)
+        {
+            Check.NotNull(group, "group");
+            var grp = group as MapLayerGroupType;
+            if (grp != null)
+                return this.MapLayerGroup.IndexOf(grp);
+
+            return -1;
+        }
+
+        void IMapDefinition.SetTopDrawOrder(IMapLayer layer)
+        {
+            Check.NotNull(layer, "layer");
+            int isrc = ((IMapDefinition)this).GetIndex(layer);
+            if (isrc > 0)
+            {
+                var src = this.MapLayer[isrc];
+             
+                //take everything before this and shift them up one position
+                for (int i = isrc - 1; i >= 0; i--)
+                {
+                    this.MapLayer[i+1] = this.MapLayer[i];
+                }
+
+                this.MapLayer[0] = src;
+                OnPropertyChanged("MapLayer");
+            }
+        }
+
+        void IMapDefinition.SetBottomDrawOrder(IMapLayer layer)
+        {
+            Check.NotNull(layer, "layer");
+            int isrc = ((IMapDefinition)this).GetIndex(layer);
+            if (isrc >= 0 && isrc < this.MapLayer.Count)
+            {
+                var src = this.MapLayer[isrc];
+
+                //take everything after this and shift them down one position
+                for (int i = isrc + 1; i < this.MapLayer.Count; i++)
+                {
+                    this.MapLayer[i - 1] = this.MapLayer[i];
+                }
+
+                this.MapLayer[this.MapLayer.Count - 1] = src;
+                OnPropertyChanged("MapLayer");
+            }
+        }
     }
 
+    partial class Box2DType : IEnvelope
+    { }
+
     partial class MapDefinitionTypeBaseMapDefinition : IBaseMapDefinition
     {
         [XmlIgnore]
@@ -277,6 +441,12 @@
             this.FiniteDisplayScale.Remove(value);
         }
 
+        void IBaseMapDefinition.RemoveAllScales()
+        {
+            this.FiniteDisplayScale.Clear();
+            OnPropertyChanged("FiniteDisplayScale");
+        }
+
         IEnumerable<IBaseMapGroup> IBaseMapDefinition.BaseMapLayerGroup
         {
             get 
@@ -288,14 +458,21 @@
             }
         }
 
-        public void AddBaseLayerGroup(IBaseMapGroup group)
+        public IBaseMapGroup AddBaseLayerGroup(string name)
         {
-            var grp = group as BaseMapLayerGroupCommonType;
-            if (grp != null)
+            var grp = new BaseMapLayerGroupCommonType()
             {
-                this.BaseMapLayerGroup.Add(grp);
-                grp.Parent = this.Parent;
-            }
+                Parent = this.Parent,
+                Name = name,
+                BaseMapLayer = new System.ComponentModel.BindingList<BaseMapLayerType>(),
+                ExpandInLegend = true,
+                ShowInLegend = true,
+                LegendLabel = name,
+                Visible = true                
+            };
+            this.BaseMapLayerGroup.Add(grp);
+
+            return grp;
         }
 
         public void RemoveBaseLayerGroup(IBaseMapGroup group)
@@ -364,6 +541,7 @@
                 Selectable = true
             };
             this.BaseMapLayer.Add(layer);
+            OnPropertyChanged("BaseMapLayer");
             return layer;
         }
 
@@ -371,7 +549,60 @@
         {
             var lyr = layer as BaseMapLayerType;
             if (lyr != null)
+            {
                 this.BaseMapLayer.Remove(lyr);
+                OnPropertyChanged("BaseMapLayer");
+            }
         }
+
+        int IBaseMapGroup.MoveUp(IBaseMapLayer layer)
+        {
+            var lyr = layer as BaseMapLayerType;
+            if (lyr != null)
+            {
+                int isrc = this.BaseMapLayer.IndexOf(lyr);
+                if (isrc > 0)
+                {
+                    int idst = isrc - 1;
+                    var src = this.BaseMapLayer[isrc];
+                    var dst = this.BaseMapLayer[idst];
+
+                    //swap
+                    this.BaseMapLayer[isrc] = dst;
+                    this.BaseMapLayer[idst] = src;
+
+                    OnPropertyChanged("BaseMapLayer");
+
+                    return idst;
+                }
+            }
+
+            return -1;
+        }
+
+        int IBaseMapGroup.MoveDown(IBaseMapLayer layer)
+        {
+            var lyr = layer as BaseMapLayerType;
+            if (lyr != null)
+            {
+                int isrc = this.BaseMapLayer.IndexOf(lyr);
+                if (isrc < this.BaseMapLayer.Count - 1)
+                {
+                    int idst = isrc + 1;
+                    var src = this.BaseMapLayer[isrc];
+                    var dst = this.BaseMapLayer[idst];
+
+                    //swap
+                    this.BaseMapLayer[isrc] = dst;
+                    this.BaseMapLayer[idst] = src;
+
+                    OnPropertyChanged("BaseMapLayer");
+
+                    return idst;
+                }
+            }
+
+            return -1;
+        }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinitionInterfaces.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinitionInterfaces.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinitionInterfaces.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -24,6 +24,7 @@
 using OSGeo.MapGuide.ObjectModels.Common;
 using System.Drawing;
 using System.ComponentModel;
+using OSGeo.MapGuide.MaestroAPI;
 
 namespace OSGeo.MapGuide.ObjectModels.MapDefinition
 {
@@ -33,27 +34,200 @@
 
         string CoordinateSystem { get; set; }
 
-        Envelope Extents { get; set; }
+        IEnvelope Extents { get; set; }
 
+        void SetExtents(double minx, double miny, double maxx, double maxy);
+
         Color BackgroundColor { get; set; }
 
         string Metadata { get; set; }
 
-        IBaseMapDefinition BaseMap { get; set; }
+        /// <summary>
+        /// Returns the base map section of this map definition. Ensure <see cref="InitBaseMap"/>
+        /// is called first before accessing this property
+        /// </summary>
+        IBaseMapDefinition BaseMap { get; }
 
+        /// <summary>
+        /// Initializes the base map section of this map definition. Subsequent calls
+        /// do nothing, unless you have cleared the section via <see cref="RemoveBaseMap"/>
+        /// </summary>
+        void InitBaseMap();
+
+        /// <summary>
+        /// Clears the base map section of this map definition. If you want to rebuild
+        /// this section, ensure <see cref="InitBaseMap"/> is called
+        /// </summary>
+        void RemoveBaseMap();
+
         IEnumerable<IMapLayer> MapLayer { get; }
 
+        /// <summary>
+        /// Adds a layer to this map. If this is the first layer to be added, the coordinate system 
+        /// of this map and its extents will be set to the coordinate system and extents of this layer
+        /// if this has not been set already.
+        /// </summary>
+        /// <param name="groupName"></param>
+        /// <param name="layerName"></param>
+        /// <param name="resourceId"></param>
+        /// <returns></returns>
         IMapLayer AddLayer(string groupName, string layerName, string resourceId);
 
         void RemoveLayer(IMapLayer layer);
 
+        int GetIndex(IMapLayer layer);
+
+        int MoveUp(IMapLayer layer);
+
+        int MoveDown(IMapLayer layer);
+
         IEnumerable<IMapLayerGroup> MapLayerGroup { get; }
 
         IMapLayerGroup AddGroup(string groupName);
          
         void RemoveGroup(IMapLayerGroup group);
+
+        int GetIndex(IMapLayerGroup group);
+
+        void SetTopDrawOrder(IMapLayer layer);
+
+        void SetBottomDrawOrder(IMapLayer layer);
     }
 
+    public static class BaseMapDefinitionExtensions
+    {
+        public static bool HasGroups(this IBaseMapDefinition map)
+        {
+            Check.NotNull(map, "map");
+            return new List<IBaseMapGroup>(map.BaseMapLayerGroup).Count > 0;
+        }
+
+        public static IBaseMapGroup GetFirstGroup(this IBaseMapDefinition map)
+        {
+            Check.NotNull(map, "map");
+            var list = new List<IBaseMapGroup>(map.BaseMapLayerGroup);
+            if (list.Count > 0)
+                return list[0];
+            return null;
+        }
+
+        public static bool LayerExists(this IBaseMapDefinition map, string layerName)
+        {
+            Check.NotNull(map, "map");
+            Check.NotEmpty(layerName, "layerName");
+
+            foreach (var group in map.BaseMapLayerGroup)
+            {
+                foreach (var layer in group.BaseMapLayer)
+                {
+                    if (layerName.Equals(layer.Name))
+                        return true;
+                }
+            }
+            return false;
+        }
+
+        public static IBaseMapGroup GetGroup(this IBaseMapDefinition map, string groupName)
+        { 
+            Check.NotNull(map, "map");
+            Check.NotEmpty(groupName, "groupName");
+            foreach (var group in map.BaseMapLayerGroup)
+            {
+                if (groupName.Equals(group.Name))
+                    return group;
+            }
+            return null;
+        }
+
+        public static bool GroupExists(this IBaseMapDefinition map, string groupName)
+        {
+            Check.NotNull(map, "map");
+            Check.NotEmpty(groupName, "groupName");
+            foreach (var group in map.BaseMapLayerGroup)
+            {
+                if (groupName.Equals(group.Name))
+                    return true;
+            }
+            return false;
+        }
+
+        public static IEnumerable<IBaseMapLayer> GetLayersForGroup(this IBaseMapDefinition map, string groupName)
+        {
+            Check.NotNull(map, "map");
+            Check.NotEmpty(groupName, "groupName");
+
+            foreach (var group in map.BaseMapLayerGroup)
+            {
+                if (groupName.Equals(group.Name))
+                {
+                    return group.BaseMapLayer;
+                }
+            }
+
+            return new IBaseMapLayer[0];
+        }
+    }
+
+    public static class MapDefinitionExtensions
+    {
+        public static IMapLayer GetLayerByName(this IMapDefinition map, string name)
+        {
+            Check.NotNull(map, "map");
+            Check.NotEmpty(name, "name");
+            foreach (var layer in map.MapLayer)
+            {
+                if (name.Equals(layer.Name))
+                    return layer;
+            }
+            return null;
+        }
+
+        public static IMapLayerGroup GetGroupByName(this IMapDefinition map, string name)
+        {
+            Check.NotNull(map, "map");
+            Check.NotEmpty(name, "name");
+            foreach (var group in map.MapLayerGroup)
+            {
+                if (name.Equals(group.Name))
+                    return group;
+            }
+            return null;
+        }
+
+        public static int GetLayerCount(this IMapDefinition map)
+        {
+            Check.NotNull(map, "map");
+            return new List<IMapLayer>(map.MapLayer).Count;
+        }
+
+        public static int GetGroupCount(this IMapDefinition map)
+        {
+            Check.NotNull(map, "map");
+            return new List<IMapLayerGroup>(map.MapLayerGroup).Count;
+        }
+
+        public static IEnumerable<IMapLayer> GetLayersForGroup(this IMapDefinition map, string name)
+        {
+            Check.NotNull(map, "map");
+            Check.NotEmpty(name, "name");
+            foreach (var layer in map.MapLayer)
+            {
+                if (name.Equals(layer.Group))
+                    yield return layer;
+            }
+        }
+
+        public static IEnumerable<IMapLayer> GetLayersWithoutGroups(this IMapDefinition map)
+        {
+            Check.NotNull(map, "map");
+            foreach (var layer in map.MapLayer)
+            {
+                if (string.IsNullOrEmpty(layer.Group))
+                    yield return layer;
+            }
+        }
+    }
+
     public interface IBaseMapDefinition
     {
         IEnumerable<double> FiniteDisplayScale { get; }
@@ -64,9 +238,11 @@
 
         IEnumerable<IBaseMapGroup> BaseMapLayerGroup { get; }
 
-        void AddBaseLayerGroup(IBaseMapGroup group);
+        IBaseMapGroup AddBaseLayerGroup(string name);
 
         void RemoveBaseLayerGroup(IBaseMapGroup group);
+
+        void RemoveAllScales();
     }
 
     public interface IMapLegendElementBase : INotifyPropertyChanged
@@ -85,8 +261,6 @@
         string ResourceId { get; set; }
 
         bool Selectable { get; set; }
-
-        IMapDefinition Parent { get; }
     }
 
     public interface IBaseMapGroup : IMapLegendElementBase
@@ -98,6 +272,10 @@
         IBaseMapLayer AddLayer(string layerName, string resourceId);
 
         void RemoveBaseMapLayer(IBaseMapLayer layer);
+
+        int MoveUp(IBaseMapLayer layer);
+
+        int MoveDown(IBaseMapLayer layer);
     }
 
     public interface IMapLayer : IBaseMapLayer

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -118,12 +118,14 @@
             return fs;
         }
 
-        public static MapDefinition CreateMapDefinition(IServerConnection owner, string name)
+        public static IMapDefinition CreateMapDefinition(IServerConnection owner, string name)
         {
             Check.NotNull(owner, "owner");
 
             return new MapDefinition() { 
                 CurrentConnection = owner,
+                CoordinateSystem = string.Empty,
+                Extents = new Box2DType() { MaxX = 0.0, MaxY = 0.0, MinX = 0.0, MinY = 0.0 },
                 Name = name,
                 BackgroundColor = Color.White,
                 MapLayer = new System.ComponentModel.BindingList<MapLayerType>(),
@@ -131,7 +133,7 @@
             };
         }
 
-        public static MapDefinition CreateMapDefinition(IServerConnection owner, string name, string coordinateSystemWkt)
+        public static IMapDefinition CreateMapDefinition(IServerConnection owner, string name, string coordinateSystemWkt)
         {
             var map = CreateMapDefinition(owner, name);
             map.CoordinateSystem = coordinateSystemWkt;
@@ -139,10 +141,10 @@
             return map;
         }
 
-        public static MapDefinition CreateMapDefinition(IServerConnection owner, string name, string coordinateSystemWkt, Envelope env)
+        public static IMapDefinition CreateMapDefinition(IServerConnection owner, string name, string coordinateSystemWkt, IEnvelope env)
         {
             var map = CreateMapDefinition(owner, name, coordinateSystemWkt);
-            map.Extents = new Box2DType() { MinX = env.MinX, MaxX = env.MaxX, MinY = env.MinY, MaxY = env.MaxY };
+            map.Extents = env;
 
             return map;
         }
@@ -668,11 +670,23 @@
             return appDef;
         }
 
-        public static PrintLayout CreatePrintLayout(IServerConnection owner)
+        public static IPrintLayout CreatePrintLayout(IServerConnection owner)
         {
             Check.NotNull(owner, "owner");
 
-            return new PrintLayout() { CurrentConnection = owner };
+            return new PrintLayout()
+            {
+                CurrentConnection = owner,
+                CustomLogos = new System.ComponentModel.BindingList<PrintLayoutLogo>(),
+                CustomText = new System.ComponentModel.BindingList<PrintLayoutText>(),
+                LayoutProperties = new PrintLayoutLayoutProperties(),
+                PageProperties = new PrintLayoutPageProperties()
+                {
+                    BackgroundColor = new PrintLayoutPagePropertiesBackgroundColor()
+                    {
+                    }
+                },
+            };
         }
 
         const string ARBITRARY_XYM = "LOCAL_CS[\"Non-Earth (Meter)\", LOCAL_DATUM[\"Local Datum\", 0], UNIT[\"Meter\", 1], AXIS[\"X\", EAST], AXIS[\"Y\", NORTH]]";
@@ -766,7 +780,7 @@
         /// <param name="maxx"></param>
         /// <param name="maxy"></param>
         /// <returns></returns>
-        public static Envelope CreateEnvelope(double minx, double miny, double maxx, double maxy)
+        public static IEnvelope CreateEnvelope(double minx, double miny, double maxx, double maxy)
         {
             if (minx > maxx)
                 throw new ArgumentException("minx > maxx", "minx");

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayout.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayout.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayout.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -26,7 +26,7 @@
 
 namespace OSGeo.MapGuide.ObjectModels.PrintLayout
 {
-    partial class PrintLayout : IResource
+    partial class PrintLayout : IPrintLayout
     {
         internal PrintLayout() { }
 
@@ -97,5 +97,219 @@
         {
             get { return true; }
         }
+
+        IPrintLayoutPageProperties IPrintLayout.PageProperties
+        {
+            get { return this.PageProperties; }
+        }
+
+        IPrintLayoutProperties IPrintLayout.LayoutProperties
+        {
+            get { return this.LayoutProperties; }
+        }
+
+        IEnumerable<ILogo> IPrintLayout.CustomLogos
+        {
+            get 
+            {
+                foreach (var logo in this.CustomLogos)
+                {
+                    yield return logo;
+                }
+            }
+        }
+
+        void IPrintLayout.RemoveLogo(ILogo logo)
+        {
+            var l = logo as PrintLayoutLogo;
+            if (l != null)
+            {
+                this.CustomLogos.Remove(l);
+                OnPropertyChanged("CustomLogos");
+            }
+        }
+
+        IEnumerable<IText> IPrintLayout.CustomText
+        {
+            get 
+            {
+                foreach (var text in this.CustomText)
+                {
+                    yield return text;
+                }
+            }
+        }
+
+        void IPrintLayout.AddText(IText text)
+        {
+            var t = text as PrintLayoutText;
+            if (t != null)
+            {
+                this.CustomText.Add(t);
+                OnPropertyChanged("CustomText");
+            }
+        }
+
+        void IPrintLayout.RemoveText(IText text)
+        {
+            var t = text as PrintLayoutText;
+            if (t != null)
+            {
+                this.CustomText.Remove(t);
+                OnPropertyChanged("CustomText");
+            }
+        }
+
+        ISize IPrintLayout.CreateLogoSize(float width, float height, string units)
+        {
+            return new PrintLayoutLogoSize() { Width = width, Height = height, Units = units };
+        }
+
+        IPosition IPrintLayout.CreateLogoPosition(float left, float bottom, string units)
+        {
+            return new PrintLayoutLogoPosition() { Left = left, Bottom = bottom, Units = units };
+        }
+
+        IPosition IPrintLayout.CreateTextPosition(float left, float bottom, string units)
+        {
+            return new PrintLayoutTextPosition() { Left = left, Bottom = bottom, Units = units };
+        }
+
+        IFont IPrintLayout.CreateFont(string name, float height, string units)
+        {
+            return new PrintLayoutTextFont() { Name = name, Height = height, Units = units };
+        }
+
+        ILogo IPrintLayout.CreateLogo(string symbolLibraryId, string symbolName, ISize size, IPosition position)
+        {
+            var logo = new PrintLayoutLogo()
+            {
+                Name = symbolName,
+                ResourceId = symbolLibraryId,
+                Position = (PrintLayoutLogoPosition)position,
+                Size = (PrintLayoutLogoSize)size
+            };
+
+            return logo;
+        }
+
+        void IPrintLayout.AddLogo(ILogo logo)
+        {
+            var l = logo as PrintLayoutLogo;
+            if (l != null)
+            {
+                this.CustomLogos.Add(l);
+                OnPropertyChanged("CustomLogos");
+            }
+        }
+
+        IText IPrintLayout.CreateText(string value, IFont font, IPosition pos)
+        {
+            var text = new PrintLayoutText()
+            {
+                Font = (PrintLayoutTextFont)font,
+                Position = (PrintLayoutTextPosition)pos,
+                Value = value
+            };
+            return text;
+        }
     }
+
+    partial class PrintLayoutPageProperties : IPrintLayoutPageProperties
+    {
+
+        System.Drawing.Color IPrintLayoutPageProperties.BackgroundColor
+        {
+            get
+            {
+                int r;
+                int g;
+                int b;
+                if (int.TryParse(this.BackgroundColor.Red, out r) &&
+                    int.TryParse(this.BackgroundColor.Green, out g) &&
+                    int.TryParse(this.BackgroundColor.Blue, out b))
+                {
+                    return System.Drawing.Color.FromArgb(r, g, b);
+                }
+                return new System.Drawing.Color();
+            }
+            set
+            {
+                this.BackgroundColor.Red = value.R.ToString();
+                this.BackgroundColor.Green = value.G.ToString();
+                this.BackgroundColor.Blue = value.B.ToString();
+            }
+        }
+    }
+
+    partial class PrintLayoutLayoutProperties : IPrintLayoutProperties
+    {
+
+    }
+
+    partial class PrintLayoutLogo : ILogo
+    {
+        IPosition ILogo.Position
+        {
+            get { return this.Position; }
+        }
+
+        ISize ILogo.Size
+        {
+            get { return this.Size; }
+        }
+
+        float? ILogo.Rotation
+        {
+            get
+            {
+                return this.RotationSpecified ? new Nullable<float>(this.Rotation) : null;
+            }
+            set
+            {
+                if (value.HasValue)
+                {
+                    this.Rotation = value.Value;
+                    this.RotationSpecified = true;
+                }
+                else
+                {
+                    this.RotationSpecified = false;
+                }
+            }
+        }
+    }
+
+    partial class PrintLayoutLogoPosition : IPosition
+    {
+
+    }
+
+    partial class PrintLayoutLogoSize : ISize
+    {
+
+    }
+
+    partial class PrintLayoutText : IText
+    {
+        IPosition IText.Position
+        {
+            get { return this.Position; }
+        }
+
+        IFont IText.Font
+        {
+            get { return this.Font; }
+        }
+    }
+
+    partial class PrintLayoutTextFont : IFont
+    {
+
+    }
+
+    partial class PrintLayoutTextPosition : IPosition
+    { 
+    
+    }
 }

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayoutInterfaces.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayoutInterfaces.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayoutInterfaces.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -0,0 +1,114 @@
+#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.MaestroAPI.Resource;
+using System.Drawing;
+using System.ComponentModel;
+
+namespace OSGeo.MapGuide.ObjectModels.PrintLayout
+{
+    public interface IPrintLayout : IResource
+    {
+        IPrintLayoutPageProperties PageProperties { get; }
+        IPrintLayoutProperties LayoutProperties { get; }
+
+        ISize CreateLogoSize(float width, float height, string units);
+        IFont CreateFont(string name, float height, string units);
+        IPosition CreateLogoPosition(float left, float bottom, string units);
+        IPosition CreateTextPosition(float left, float bottom, string units);
+
+        IEnumerable<ILogo> CustomLogos { get; }
+        ILogo CreateLogo(string symbolLibraryId, string symbolName, ISize size, IPosition position);
+        void AddLogo(ILogo logo);
+        void RemoveLogo(ILogo logo);
+
+        IEnumerable<IText> CustomText { get; }
+        IText CreateText(string value, IFont font, IPosition text);
+        void AddText(IText text);
+        void RemoveText(IText text);
+    }
+
+    public interface IPrintLayoutPageProperties : INotifyPropertyChanged
+    {
+        Color BackgroundColor { get; set; }
+    }
+
+    public interface IPrintLayoutProperties : INotifyPropertyChanged
+    {
+        bool ShowTitle { get; set; }
+
+        bool ShowLegend { get; set; }
+
+        bool ShowScaleBar { get; set; }
+
+        bool ShowNorthArrow { get; set; }
+
+        bool ShowURL { get; set; }
+
+        bool ShowDateTime { get; set; }
+
+        bool ShowCustomLogos { get; set; }
+
+        bool ShowCustomText { get; set; }
+    }
+
+    public interface IPosition : INotifyPropertyChanged
+    {
+        float Left { get; set; }
+        float Bottom { get; set; }
+        string Units { get; set; }
+    }
+
+    public interface ISize : INotifyPropertyChanged
+    {
+        float Width { get; set; }
+        float Height { get; set; }
+        string Units { get; set; }
+    }
+
+    public interface ILogo : INotifyPropertyChanged
+    {
+        IPosition Position { get; }
+        string ResourceId { get; set; }
+        string Name { get; set; }
+        ISize Size { get; }
+        float? Rotation { get; set; }
+    }
+
+    public interface IFont : INotifyPropertyChanged
+    {
+        string Name { get; set; }
+
+        float Height { get; set; }
+
+        string Units { get; set; }
+    }
+
+    public interface IText : INotifyPropertyChanged
+    {
+        IPosition Position { get; }
+
+        IFont Font { get; }
+
+        string Value { get; set; }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -1529,22 +1529,22 @@
         /// <returns>A FeatureSetReader with the aggregated values</returns>
         public abstract FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, System.Collections.Specialized.NameValueCollection aggregateFunctions);
 
-        public virtual OSGeo.MapGuide.ObjectModels.Common.Envelope GetSpatialExtent(string resourceID, string schema, string geometry)
+        public virtual OSGeo.MapGuide.ObjectModels.Common.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry)
         {
             return GetSpatialExtent(resourceID, schema, geometry, null, false);
         }
 
-        public virtual OSGeo.MapGuide.ObjectModels.Common.Envelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter)
+        public virtual OSGeo.MapGuide.ObjectModels.Common.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter)
         {
             return GetSpatialExtent(resourceID, schema, geometry, filter, false);
         }
 
-        public virtual OSGeo.MapGuide.ObjectModels.Common.Envelope GetSpatialExtent(string resourceID, string schema, string geometry, bool allowFallbackToContextInformation)
+        public virtual OSGeo.MapGuide.ObjectModels.Common.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, bool allowFallbackToContextInformation)
         {
             return GetSpatialExtent(resourceID, schema, geometry, null, allowFallbackToContextInformation);
         }
 
-        protected virtual OSGeo.MapGuide.ObjectModels.Common.Envelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter, bool allowFallbackToContextInformation)
+        protected virtual OSGeo.MapGuide.ObjectModels.Common.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter, bool allowFallbackToContextInformation)
         {
             try
             {

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs	2010-10-15 17:10:52 UTC (rev 5288)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs	2010-10-18 07:16:47 UTC (rev 5289)
@@ -81,9 +81,9 @@
         FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns);
         FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, NameValueCollection aggregateFunctions);
 
-        ObjCommon.Envelope GetSpatialExtent(string resourceID, string schema, string geometry);
-        ObjCommon.Envelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter);
-        ObjCommon.Envelope GetSpatialExtent(string resourceID, string schema, string geometry, bool allowFallbackToContextInformation);
+        ObjCommon.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry);
+        ObjCommon.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter);
+        ObjCommon.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, bool allowFallbackToContextInformation);
 
         FeatureSourceDescription DescribeFeatureSource(string resourceID);
         FeatureSourceDescription DescribeFeatureSource(string resourceID, string schema);



More information about the mapguide-commits mailing list