[mapguide-commits] r5036 - in sandbox/maestro-3.0: Generated Maestro.Base Maestro.Base/Commands/SiteExplorer Maestro.Base/Properties Maestro.Base/UI MaestroAPITests OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/ObjectModels OSGeo.MapGuide.MaestroAPI/Services

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Jul 19 07:20:33 EDT 2010


Author: jng
Date: 2010-07-19 11:20:33 +0000 (Mon, 19 Jul 2010)
New Revision: 5036

Added:
   sandbox/maestro-3.0/Maestro.Base/Commands/SiteExplorer/ResourcePropertiesCommand.cs
   sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.cs
   sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.designer.cs
   sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.resx
   sandbox/maestro-3.0/Maestro.Base/UI/ResourceIconCache.cs
   sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.Designer.cs
   sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs
   sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.resx
   sandbox/maestro-3.0/MaestroAPITests/ObjectTests.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/Envelope.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ResourceList.cs
Modified:
   sandbox/maestro-3.0/Generated/Envelope-1.0.0.designer.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/MaestroAPITests/MaestroAPITests.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/readme.txt
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs
Log:
This submission includes the following changes:
 - Port the resource properties dialog from 2.1 branch
 - Add properties command to the selected object context menu
 - Fix incorrect generated code for Envelope xml class.
 - Use built in generated Envelope class instead of Topology.Geometries.IEnvelope to avoid having to leak out the TF.net library in our API.
 - Add tests for ObjectFactory to verify non-null child object properties of the objects it creates.

Modified: sandbox/maestro-3.0/Generated/Envelope-1.0.0.designer.cs
===================================================================
--- sandbox/maestro-3.0/Generated/Envelope-1.0.0.designer.cs	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/Generated/Envelope-1.0.0.designer.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -258,20 +258,21 @@
     public partial class EnvelopeLowerLeftCoordinate : System.ComponentModel.INotifyPropertyChanged {
         
         [EditorBrowsable(EditorBrowsableState.Never)]
-        private string xField;
+        private double xField;
         
         [EditorBrowsable(EditorBrowsableState.Never)]
-        private string yField;
+        private double yField;
         
         [EditorBrowsable(EditorBrowsableState.Never)]
-        private string zField;
+        private double zField;
         
         [EditorBrowsable(EditorBrowsableState.Never)]
-        private string mField;
+        private double mField;
         
         private static System.Xml.Serialization.XmlSerializer serializer;
-        
-        public string X {
+
+        public double X
+        {
             get {
                 return this.xField;
             }
@@ -288,8 +289,9 @@
                 }
             }
         }
-        
-        public string Y {
+
+        public double Y
+        {
             get {
                 return this.yField;
             }
@@ -306,8 +308,9 @@
                 }
             }
         }
-        
-        public string Z {
+
+        public double Z
+        {
             get {
                 return this.zField;
             }
@@ -324,8 +327,9 @@
                 }
             }
         }
-        
-        public string M {
+
+        public double M
+        {
             get {
                 return this.mField;
             }
@@ -526,20 +530,21 @@
     public partial class EnvelopeUpperRightCoordinate : System.ComponentModel.INotifyPropertyChanged {
         
         [EditorBrowsable(EditorBrowsableState.Never)]
-        private string xField;
+        private double xField;
         
         [EditorBrowsable(EditorBrowsableState.Never)]
-        private string yField;
+        private double yField;
         
         [EditorBrowsable(EditorBrowsableState.Never)]
-        private string zField;
+        private double zField;
         
         [EditorBrowsable(EditorBrowsableState.Never)]
-        private string mField;
+        private double mField;
         
         private static System.Xml.Serialization.XmlSerializer serializer;
-        
-        public string X {
+
+        public double X
+        {
             get {
                 return this.xField;
             }
@@ -556,8 +561,9 @@
                 }
             }
         }
-        
-        public string Y {
+
+        public double Y
+        {
             get {
                 return this.yField;
             }
@@ -574,8 +580,9 @@
                 }
             }
         }
-        
-        public string Z {
+
+        public double Z
+        {
             get {
                 return this.zField;
             }
@@ -592,8 +599,9 @@
                 }
             }
         }
-        
-        public string M {
+
+        public double M
+        {
             get {
                 return this.mField;
             }

Added: sandbox/maestro-3.0/Maestro.Base/Commands/SiteExplorer/ResourcePropertiesCommand.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Commands/SiteExplorer/ResourcePropertiesCommand.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Base/Commands/SiteExplorer/ResourcePropertiesCommand.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,47 @@
+#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 ICSharpCode.Core;
+using Maestro.Base.Services;
+using Maestro.Base.UI;
+
+namespace Maestro.Base.Commands.SiteExplorer
+{
+    internal class ResourcePropertiesCommand : AbstractMenuCommand
+    {
+        public override void Run()
+        {
+            var wb = Workbench.Instance;
+            var items = wb.ActiveSiteExplorer.SelectedItems;
+            var connMgr = ServiceRegistry.GetService<ServerConnectionManager>();
+            var conn = connMgr.GetConnection(wb.ActiveSiteExplorer.ConnectionName);
+
+            //Can only show properties of one selected item
+            if (items.Length == 1)
+            {
+                var icons = ResourceIconCache.CreateDefault();
+                var dlg = new ResourcePropertiesDialog(icons, conn, items[0].ResourceId);
+                dlg.ShowDialog(wb);
+            }
+        }
+    }
+}

Modified: sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin	2010-07-19 11:20:33 UTC (rev 5036)
@@ -302,6 +302,10 @@
             <MenuItem id="Paste"
                       label="${res:SiteExplorer_SelectedFolder_Paste}"
                       class="Maestro.Base.Commands.NotImplementedCommand" />
+            <MenuItem type="Separator" />
+            <MenuItem id="Properties"
+                      label="${res:SiteExplorer_SelectedItem_Properties}"
+                      class="Maestro.Base.Commands.SiteExplorer.ResourcePropertiesCommand" />
         </Condition>
     </Path>
 

Modified: sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj	2010-07-19 11:20:33 UTC (rev 5036)
@@ -34,6 +34,7 @@
     <Reference Include="System" />
     <Reference Include="System.Data" />
     <Reference Include="System.Drawing" />
+    <Reference Include="System.Web" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
   </ItemGroup>
@@ -64,6 +65,7 @@
     <Compile Include="Commands\SiteExplorer\DisconnectCommand.cs" />
     <Compile Include="Commands\SiteExplorer\OpenResourceCommand.cs" />
     <Compile Include="Commands\SiteExplorer\RefreshCommand.cs" />
+    <Compile Include="Commands\SiteExplorer\ResourcePropertiesCommand.cs" />
     <Compile Include="Commands\StartupCommand.cs" />
     <Compile Include="Commands\Test\OpenCoordinateSystemPickerCommand.cs" />
     <Compile Include="Commands\Test\OpenResourceCommand.cs" />
@@ -166,6 +168,12 @@
     <Compile Include="UI\AboutDialog.cs">
       <SubType>Form</SubType>
     </Compile>
+    <Compile Include="UI\BoundsPicker.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="UI\BoundsPicker.designer.cs">
+      <DependentUpon>BoundsPicker.cs</DependentUpon>
+    </Compile>
     <Compile Include="UI\BroadcastTextWriter.cs" />
     <Compile Include="UI\EmbeddedWebBrowser.cs">
       <SubType>UserControl</SubType>
@@ -187,6 +195,13 @@
       <DependentUpon>NewResourceDialog.cs</DependentUpon>
     </Compile>
     <Compile Include="UI\RepositoryTreeModel.cs" />
+    <Compile Include="UI\ResourceIconCache.cs" />
+    <Compile Include="UI\ResourcePropertiesDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="UI\ResourcePropertiesDialog.Designer.cs">
+      <DependentUpon>ResourcePropertiesDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="UI\SingletonViewContent.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -312,6 +327,10 @@
       <DependentUpon>AboutDialog.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="UI\BoundsPicker.resx">
+      <DependentUpon>BoundsPicker.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
     <EmbeddedResource Include="UI\EmbeddedWebBrowser.resx">
       <DependentUpon>EmbeddedWebBrowser.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -324,6 +343,10 @@
       <DependentUpon>NewResourceDialog.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="UI\ResourcePropertiesDialog.resx">
+      <DependentUpon>ResourcePropertiesDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
     <EmbeddedResource Include="UI\SiteExplorer.resx">
       <DependentUpon>SiteExplorer.cs</DependentUpon>
       <SubType>Designer</SubType>

Modified: sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -144,6 +144,90 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Failed to decode the current bounds,
+        ///you may enter new bounds, and these will replace the current.
+        ///Error message: {0}.
+        /// </summary>
+        internal static string BoundsPicker_BoundsDecodeError {
+            get {
+                return ResourceManager.GetString("BoundsPicker_BoundsDecodeError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to You have not entered all the required information..
+        /// </summary>
+        internal static string BoundsPicker_IncompleBoundsError {
+            get {
+                return ResourceManager.GetString("BoundsPicker_IncompleBoundsError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to convert the Max X value.
+        /// </summary>
+        internal static string BoundsPicker_InvalidMaxXError {
+            get {
+                return ResourceManager.GetString("BoundsPicker_InvalidMaxXError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to convert the Max Y value.
+        /// </summary>
+        internal static string BoundsPicker_InvalidMaxYError {
+            get {
+                return ResourceManager.GetString("BoundsPicker_InvalidMaxYError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to convert the Min X value.
+        /// </summary>
+        internal static string BoundsPicker_InvalidMinXError {
+            get {
+                return ResourceManager.GetString("BoundsPicker_InvalidMinXError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to convert the Min Y value.
+        /// </summary>
+        internal static string BoundsPicker_InvalidMinYError {
+            get {
+                return ResourceManager.GetString("BoundsPicker_InvalidMinYError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Missing bounds tag.
+        /// </summary>
+        internal static string BoundsPicker_MissingBoundsError {
+            get {
+                return ResourceManager.GetString("BoundsPicker_MissingBoundsError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The values you have entered appears to be in local regional format, but are required in US regional format.
+        ///Do you want to convert the values?.
+        /// </summary>
+        internal static string BoundsPicker_NumbersInRegionalError {
+            get {
+                return ResourceManager.GetString("BoundsPicker_NumbersInRegionalError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The coordinates you have entered appears to be invalid, do you want to use them anyway?.
+        /// </summary>
+        internal static string BoundsPicker_UseInvalidCoordinatesWarning {
+            get {
+                return ResourceManager.GetString("BoundsPicker_UseInvalidCoordinatesWarning", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Done.
         /// </summary>
         internal static string Browser_Complete {
@@ -650,6 +734,136 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to decode the current bounds,
+        ///you must re-enter the epsg code in the SRS tag manually.
+        ///Error message: {0}..
+        /// </summary>
+        internal static string ResProp_BoundsDecodeError {
+            get {
+                return ResourceManager.GetString("ResProp_BoundsDecodeError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to You must manually enter the EPSG code for the generated bounds..
+        /// </summary>
+        internal static string ResProp_EpsgMissingWarning {
+            get {
+                return ResourceManager.GetString("ResProp_EpsgMissingWarning", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Inherited.
+        /// </summary>
+        internal static string ResProp_InheritedAccess {
+            get {
+                return ResourceManager.GetString("ResProp_InheritedAccess", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Missing bounds tag.
+        /// </summary>
+        internal static string ResProp_MissingBoundsError {
+            get {
+                return ResourceManager.GetString("ResProp_MissingBoundsError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to No access.
+        /// </summary>
+        internal static string ResProp_NoAccess {
+            get {
+                return ResourceManager.GetString("ResProp_NoAccess", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to No spatial data found in FeatureSource.
+        /// </summary>
+        internal static string ResProp_NoSpatialDataError {
+            get {
+                return ResourceManager.GetString("ResProp_NoSpatialDataError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to No spatial data found in FeatureSource, one or more queries failed to execute.
+        /// </summary>
+        internal static string ResProp_NoSpatialDataWithFailuresError {
+            get {
+                return ResourceManager.GetString("ResProp_NoSpatialDataWithFailuresError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Read only.
+        /// </summary>
+        internal static string ResProp_ReadOnlyAccess {
+            get {
+                return ResourceManager.GetString("ResProp_ReadOnlyAccess", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Read/write.
+        /// </summary>
+        internal static string ResProp_ReadWriteAccess {
+            get {
+                return ResourceManager.GetString("ResProp_ReadWriteAccess", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to read resource references.
+        /// </summary>
+        internal static string ResProp_ReferenceReadError {
+            get {
+                return ResourceManager.GetString("ResProp_ReferenceReadError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to read resource references: {0}.
+        /// </summary>
+        internal static string ResProp_ReferenceReadSpecificError {
+            get {
+                return ResourceManager.GetString("ResProp_ReferenceReadSpecificError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to save the resource properties: {0}.
+        /// </summary>
+        internal static string ResProp_SaveError {
+            get {
+                return ResourceManager.GetString("ResProp_SaveError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to obtain the extent for the WFS data.
+        ///Error message: {0}.
+        /// </summary>
+        internal static string ResProp_WFSBoundsReadError {
+            get {
+                return ResourceManager.GetString("ResProp_WFSBoundsReadError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to obtain the extent for the WMS data.
+        ///Error message: {0}.
+        /// </summary>
+        internal static string ResProp_WMSBoundsReadError {
+            get {
+                return ResourceManager.GetString("ResProp_WMSBoundsReadError", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Bitmap scissors_blue {
             get {
                 object obj = ResourceManager.GetObject("scissors_blue", resourceCulture);
@@ -791,6 +1005,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Properties.
+        /// </summary>
+        internal static string SiteExplorer_SelectedItem_Properties {
+            get {
+                return ResourceManager.GetString("SiteExplorer_SelectedItem_Properties", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Rename.
         /// </summary>
         internal static string SiteExplorer_SelectedItem_Rename {

Modified: sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx	2010-07-19 11:20:33 UTC (rev 5036)
@@ -463,4 +463,106 @@
   <data name="SITE_EXPLORER_TOOLTIP_TEMPLATE" xml:space="preserve">
     <value>Resource Name: {1}{0}Resource Type: {2}{0}Created: {3}{0}Last Modified: {4}{0}Owner: {5}</value>
   </data>
+  <data name="ResProp_BoundsDecodeError" xml:space="preserve">
+    <value>Failed to decode the current bounds,
+you must re-enter the epsg code in the SRS tag manually.
+Error message: {0}.</value>
+    <comment>An error message that is displayed if the bounds are in an unexpected format</comment>
+  </data>
+  <data name="ResProp_EpsgMissingWarning" xml:space="preserve">
+    <value>You must manually enter the EPSG code for the generated bounds.</value>
+    <comment>A warning that is displayed when the user must re-enter the EPSG code</comment>
+  </data>
+  <data name="ResProp_InheritedAccess" xml:space="preserve">
+    <value>Inherited</value>
+    <comment>A value that indicates that the user has inherited access to the resource</comment>
+  </data>
+  <data name="ResProp_MissingBoundsError" xml:space="preserve">
+    <value>Missing bounds tag</value>
+    <comment>An error message that is shown if the resource is missing an expected bounds tag</comment>
+  </data>
+  <data name="ResProp_NoAccess" xml:space="preserve">
+    <value>No access</value>
+    <comment>A value that indicates that the user has no access to the resource</comment>
+  </data>
+  <data name="ResProp_NoSpatialDataError" xml:space="preserve">
+    <value>No spatial data found in FeatureSource</value>
+    <comment>An error message that is displayed if the attempt to read the data reveals that there are no spatial data in the featuresource</comment>
+  </data>
+  <data name="ResProp_NoSpatialDataWithFailuresError" xml:space="preserve">
+    <value>No spatial data found in FeatureSource, one or more queries failed to execute</value>
+    <comment>An error message that is displayed if the attempt to read the data reveals that there are no spatial data in the featuresource and that the resource produced an error</comment>
+  </data>
+  <data name="ResProp_ReadOnlyAccess" xml:space="preserve">
+    <value>Read only</value>
+    <comment>A value that indicates that the user has readonly access to the resource</comment>
+  </data>
+  <data name="ResProp_ReadWriteAccess" xml:space="preserve">
+    <value>Read/write</value>
+    <comment>A value that indicates that the user has read/write access to the resource</comment>
+  </data>
+  <data name="ResProp_ReferenceReadError" xml:space="preserve">
+    <value>Failed to read resource references</value>
+    <comment>An error message that is displayed when an attempt to read the resource references fail</comment>
+  </data>
+  <data name="ResProp_ReferenceReadSpecificError" xml:space="preserve">
+    <value>Failed to read resource references: {0}</value>
+    <comment>An error message that is displayed when an attempt to read the resource references fail</comment>
+  </data>
+  <data name="ResProp_SaveError" xml:space="preserve">
+    <value>Failed to save the resource properties: {0}</value>
+    <comment>An error message that is displayed if the save operation fails</comment>
+  </data>
+  <data name="ResProp_WFSBoundsReadError" xml:space="preserve">
+    <value>Failed to obtain the extent for the WFS data.
+Error message: {0}</value>
+    <comment>An error message that is displayed if the attempt to read the data bounds fail</comment>
+  </data>
+  <data name="ResProp_WMSBoundsReadError" xml:space="preserve">
+    <value>Failed to obtain the extent for the WMS data.
+Error message: {0}</value>
+    <comment>An error message that is displayed if the attempt to read the data bounds fail</comment>
+  </data>
+  <data name="BoundsPicker_BoundsDecodeError" xml:space="preserve">
+    <value>Failed to decode the current bounds,
+you may enter new bounds, and these will replace the current.
+Error message: {0}</value>
+    <comment>An error message that is displayed when the bounds fails to parse</comment>
+  </data>
+  <data name="BoundsPicker_IncompleBoundsError" xml:space="preserve">
+    <value>You have not entered all the required information.</value>
+    <comment>An error message that is displayed if the user clicks OK before filling out all required fields</comment>
+  </data>
+  <data name="BoundsPicker_InvalidMaxXError" xml:space="preserve">
+    <value>Failed to convert the Max X value</value>
+    <comment>An error message that is displayed when the Max X value is invalid</comment>
+  </data>
+  <data name="BoundsPicker_InvalidMaxYError" xml:space="preserve">
+    <value>Failed to convert the Max Y value</value>
+    <comment>An error message that is displayed when the Max Y value is invalid</comment>
+  </data>
+  <data name="BoundsPicker_InvalidMinXError" xml:space="preserve">
+    <value>Failed to convert the Min X value</value>
+    <comment>An error message that is displayed when the Min X value is invalid</comment>
+  </data>
+  <data name="BoundsPicker_InvalidMinYError" xml:space="preserve">
+    <value>Failed to convert the Min Y value</value>
+    <comment>An error message that is displayed when the Min Y value is invalid</comment>
+  </data>
+  <data name="BoundsPicker_MissingBoundsError" xml:space="preserve">
+    <value>Missing bounds tag</value>
+    <comment>An error message that indicates that there was no bound tag</comment>
+  </data>
+  <data name="BoundsPicker_NumbersInRegionalError" xml:space="preserve">
+    <value>The values you have entered appears to be in local regional format, but are required in US regional format.
+Do you want to convert the values?</value>
+    <comment>A message that is displayed when it is detected that the user enters number in local format</comment>
+  </data>
+  <data name="BoundsPicker_UseInvalidCoordinatesWarning" xml:space="preserve">
+    <value>The coordinates you have entered appears to be invalid, do you want to use them anyway?</value>
+    <comment>A message displayed when the coordinates cannot be validated</comment>
+  </data>
+  <data name="SiteExplorer_SelectedItem_Properties" xml:space="preserve">
+    <value>Properties</value>
+  </data>
 </root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,180 @@
+#region Disclaimer / License
+// Copyright (C) 2009, Kenneth Skovhede
+// http://www.hexad.dk, opensource at hexad.dk
+// 
+// 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 OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Exceptions;
+
+namespace Maestro.Base.UI
+{
+    public partial class BoundsPicker : Form
+    {
+        private string m_bounds;
+        public string SRSBounds
+        {
+            get { return m_bounds; }
+        }
+
+        public BoundsPicker(string bounds, string[] coordsys)
+            : this()
+        {
+            m_bounds = bounds;
+
+            if (coordsys == null)
+            {
+                SRSLabel.Visible =
+                SRSCombo.Visible =
+                    false;
+                this.Height -= 30;
+            }
+            else
+                SRSCombo.Items.AddRange(coordsys);
+
+            if (!string.IsNullOrEmpty(bounds))
+            {
+                try
+                {
+                    System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
+                    if (bounds.Trim().StartsWith("&lt;"))
+                        bounds = System.Web.HttpUtility.HtmlDecode(bounds);
+                    bounds = "<root>" + bounds + "</root>";
+                    doc.LoadXml(bounds);
+                    System.Xml.XmlNode root = doc["root"];
+                    if (root["Bounds"] != null)
+                    {
+                        if (root["Bounds"].Attributes["SRS"] != null)
+                            SRSCombo.Text = root["Bounds"].Attributes["SRS"].Value;
+
+                        if (root["Bounds"].Attributes["west"] != null)
+                            MinX.Text = root["Bounds"].Attributes["west"].Value;
+                        if (root["Bounds"].Attributes["east"] != null)
+                            MaxX.Text = root["Bounds"].Attributes["east"].Value;
+
+                        if (root["Bounds"].Attributes["south"] != null)
+                            MinY.Text = root["Bounds"].Attributes["south"].Value;
+                        if (root["Bounds"].Attributes["north"] != null)
+                            MaxY.Text = root["Bounds"].Attributes["north"].Value;
+                    }
+                    else
+                        throw new Exception(Properties.Resources.BoundsPicker_MissingBoundsError);
+                }
+                catch(Exception ex)
+                {
+                    string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
+                    MessageBox.Show(this, string.Format(Properties.Resources.BoundsPicker_BoundsDecodeError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
+                }
+            }
+        }
+
+        private BoundsPicker()
+        {
+            InitializeComponent();
+        }
+
+        private void OKBtn_Click(object sender, EventArgs e)
+        {
+            string srs;
+            if (SRSCombo.Text.Trim().Length == 0 || SRSCombo.Visible == false)
+                srs = null;
+            else
+                srs = SRSCombo.Text;
+
+            if (MinX.Text.Trim().Length == 0 || MaxX.Text.Trim().Length == 0 || MinY.Text.Trim().Length == 0 || MaxY.Text.Trim().Length == 0 || (srs == null && SRSCombo.Visible))
+            {
+                MessageBox.Show(this, Properties.Resources.BoundsPicker_IncompleBoundsError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return;
+            }
+
+            double temp;
+            System.Globalization.CultureInfo localCI = System.Globalization.CultureInfo.CurrentUICulture;
+            System.Globalization.CultureInfo usCI = System.Globalization.CultureInfo.InvariantCulture;
+            
+            bool isUs = double.TryParse(MinX.Text, System.Globalization.NumberStyles.Float, usCI, out temp) &&
+                double.TryParse(MaxX.Text, System.Globalization.NumberStyles.Float, usCI, out temp) &&
+                double.TryParse(MinY.Text, System.Globalization.NumberStyles.Float, usCI, out temp) &&
+                double.TryParse(MaxY.Text, System.Globalization.NumberStyles.Float, usCI, out temp);
+
+            bool isLocal = double.TryParse(MinX.Text, System.Globalization.NumberStyles.Float, localCI, out temp) &&
+                double.TryParse(MaxX.Text, System.Globalization.NumberStyles.Float, localCI, out temp) &&
+                double.TryParse(MinY.Text, System.Globalization.NumberStyles.Float, localCI, out temp) &&
+                double.TryParse(MaxY.Text, System.Globalization.NumberStyles.Float, localCI, out temp);
+
+            if (!isUs && isLocal)
+            {
+                switch (MessageBox.Show(this, Properties.Resources.BoundsPicker_NumbersInRegionalError, Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question))
+                {
+                    case DialogResult.Yes:
+                        if (double.TryParse(MinX.Text, System.Globalization.NumberStyles.Float, localCI, out temp))
+                            MinX.Text = temp.ToString(usCI);
+                        else
+                        {
+                            MessageBox.Show(this, Properties.Resources.BoundsPicker_InvalidMinXError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                            return;
+                        }
+                        if (double.TryParse(MaxX.Text, System.Globalization.NumberStyles.Float, localCI, out temp))
+                            MaxX.Text = temp.ToString(usCI);
+                        else
+                        {
+                            MessageBox.Show(this, Properties.Resources.BoundsPicker_InvalidMaxXError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                            return;
+                        }
+                        if (double.TryParse(MinY.Text, System.Globalization.NumberStyles.Float, localCI, out temp))
+                            MinY.Text = temp.ToString(usCI);
+                        else
+                        {
+                            MessageBox.Show(this, Properties.Resources.BoundsPicker_InvalidMinYError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                            return;
+                        }
+                        if (double.TryParse(MaxY.Text, System.Globalization.NumberStyles.Float, localCI, out temp))
+                            MaxY.Text = temp.ToString(usCI);
+                        else
+                        {
+                            MessageBox.Show(this, Properties.Resources.BoundsPicker_InvalidMaxYError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                            return;
+                        }
+                        break;
+                    case DialogResult.Cancel:
+                        return;
+                }
+            }
+
+            if (!isUs && !isLocal)
+            {
+                if (MessageBox.Show(this, Properties.Resources.BoundsPicker_UseInvalidCoordinatesWarning, Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Error) != DialogResult.Yes)
+                    return;
+            }
+
+            m_bounds = "<Bounds west=\"" + MinX.Text + "\" east=\"" + MaxX.Text + "\" south=\"" + MinY.Text + "\" north=\"" + MaxY.Text + "\" ";
+            if (srs != null)
+            {
+                m_bounds += " SRS=\"" + srs + "\"";
+            }
+            m_bounds += " />";
+            
+            this.DialogResult = DialogResult.OK;
+            this.Close();
+        }
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.designer.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,160 @@
+namespace Maestro.Base.UI
+{
+    partial class BoundsPicker
+    {
+        /// <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()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BoundsPicker));
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.MinX = new System.Windows.Forms.TextBox();
+            this.MaxX = new System.Windows.Forms.TextBox();
+            this.MinY = new System.Windows.Forms.TextBox();
+            this.MaxY = new System.Windows.Forms.TextBox();
+            this.SRSLabel = new System.Windows.Forms.Label();
+            this.SRSCombo = new System.Windows.Forms.ComboBox();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.CancelBtn = new System.Windows.Forms.Button();
+            this.OKBtn = new System.Windows.Forms.Button();
+            this.panel1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // label2
+            // 
+            resources.ApplyResources(this.label2, "label2");
+            this.label2.Name = "label2";
+            // 
+            // label3
+            // 
+            resources.ApplyResources(this.label3, "label3");
+            this.label3.Name = "label3";
+            // 
+            // label4
+            // 
+            resources.ApplyResources(this.label4, "label4");
+            this.label4.Name = "label4";
+            // 
+            // MinX
+            // 
+            resources.ApplyResources(this.MinX, "MinX");
+            this.MinX.Name = "MinX";
+            // 
+            // MaxX
+            // 
+            resources.ApplyResources(this.MaxX, "MaxX");
+            this.MaxX.Name = "MaxX";
+            // 
+            // MinY
+            // 
+            resources.ApplyResources(this.MinY, "MinY");
+            this.MinY.Name = "MinY";
+            // 
+            // MaxY
+            // 
+            resources.ApplyResources(this.MaxY, "MaxY");
+            this.MaxY.Name = "MaxY";
+            // 
+            // SRSLabel
+            // 
+            resources.ApplyResources(this.SRSLabel, "SRSLabel");
+            this.SRSLabel.Name = "SRSLabel";
+            // 
+            // SRSCombo
+            // 
+            this.SRSCombo.FormattingEnabled = true;
+            resources.ApplyResources(this.SRSCombo, "SRSCombo");
+            this.SRSCombo.Name = "SRSCombo";
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.CancelBtn);
+            this.panel1.Controls.Add(this.OKBtn);
+            resources.ApplyResources(this.panel1, "panel1");
+            this.panel1.Name = "panel1";
+            // 
+            // CancelBtn
+            // 
+            resources.ApplyResources(this.CancelBtn, "CancelBtn");
+            this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.CancelBtn.Name = "CancelBtn";
+            this.CancelBtn.UseVisualStyleBackColor = true;
+            // 
+            // OKBtn
+            // 
+            resources.ApplyResources(this.OKBtn, "OKBtn");
+            this.OKBtn.Name = "OKBtn";
+            this.OKBtn.UseVisualStyleBackColor = true;
+            this.OKBtn.Click += new System.EventHandler(this.OKBtn_Click);
+            // 
+            // BoundsPicker
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this.CancelBtn;
+            this.Controls.Add(this.panel1);
+            this.Controls.Add(this.SRSCombo);
+            this.Controls.Add(this.SRSLabel);
+            this.Controls.Add(this.MaxY);
+            this.Controls.Add(this.MinY);
+            this.Controls.Add(this.MaxX);
+            this.Controls.Add(this.MinX);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+            this.Name = "BoundsPicker";
+            this.panel1.ResumeLayout(false);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.TextBox MinX;
+        private System.Windows.Forms.TextBox MaxX;
+        private System.Windows.Forms.TextBox MinY;
+        private System.Windows.Forms.TextBox MaxY;
+        private System.Windows.Forms.Label SRSLabel;
+        private System.Windows.Forms.ComboBox SRSCombo;
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.Button CancelBtn;
+        private System.Windows.Forms.Button OKBtn;
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Base/UI/BoundsPicker.resx	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,462 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="label1.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="label1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 8</value>
+  </data>
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>34, 13</value>
+  </data>
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="label1.Text" xml:space="preserve">
+    <value>Min X</value>
+  </data>
+  <data name="&gt;&gt;label1.Name" xml:space="preserve">
+    <value>label1</value>
+  </data>
+  <data name="&gt;&gt;label1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label1.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
+    <value>10</value>
+  </data>
+  <data name="label2.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label2.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 32</value>
+  </data>
+  <data name="label2.Size" type="System.Drawing.Size, System.Drawing">
+    <value>37, 13</value>
+  </data>
+  <data name="label2.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="label2.Text" xml:space="preserve">
+    <value>Max X</value>
+  </data>
+  <data name="&gt;&gt;label2.Name" xml:space="preserve">
+    <value>label2</value>
+  </data>
+  <data name="&gt;&gt;label2.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label2.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
+    <value>9</value>
+  </data>
+  <data name="label3.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label3.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 56</value>
+  </data>
+  <data name="label3.Size" type="System.Drawing.Size, System.Drawing">
+    <value>34, 13</value>
+  </data>
+  <data name="label3.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="label3.Text" xml:space="preserve">
+    <value>Min Y</value>
+  </data>
+  <data name="&gt;&gt;label3.Name" xml:space="preserve">
+    <value>label3</value>
+  </data>
+  <data name="&gt;&gt;label3.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label3.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
+    <value>8</value>
+  </data>
+  <data name="label4.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label4.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 80</value>
+  </data>
+  <data name="label4.Size" type="System.Drawing.Size, System.Drawing">
+    <value>37, 13</value>
+  </data>
+  <data name="label4.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="label4.Text" xml:space="preserve">
+    <value>Max Y</value>
+  </data>
+  <data name="&gt;&gt;label4.Name" xml:space="preserve">
+    <value>label4</value>
+  </data>
+  <data name="&gt;&gt;label4.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label4.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="MinX.Location" type="System.Drawing.Point, System.Drawing">
+    <value>64, 8</value>
+  </data>
+  <data name="MinX.Size" type="System.Drawing.Size, System.Drawing">
+    <value>160, 20</value>
+  </data>
+  <data name="MinX.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="&gt;&gt;MinX.Name" xml:space="preserve">
+    <value>MinX</value>
+  </data>
+  <data name="&gt;&gt;MinX.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;MinX.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;MinX.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="MaxX.Location" type="System.Drawing.Point, System.Drawing">
+    <value>64, 32</value>
+  </data>
+  <data name="MaxX.Size" type="System.Drawing.Size, System.Drawing">
+    <value>160, 20</value>
+  </data>
+  <data name="MaxX.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="&gt;&gt;MaxX.Name" xml:space="preserve">
+    <value>MaxX</value>
+  </data>
+  <data name="&gt;&gt;MaxX.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;MaxX.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;MaxX.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="MinY.Location" type="System.Drawing.Point, System.Drawing">
+    <value>64, 56</value>
+  </data>
+  <data name="MinY.Size" type="System.Drawing.Size, System.Drawing">
+    <value>160, 20</value>
+  </data>
+  <data name="MinY.TabIndex" type="System.Int32, mscorlib">
+    <value>6</value>
+  </data>
+  <data name="&gt;&gt;MinY.Name" xml:space="preserve">
+    <value>MinY</value>
+  </data>
+  <data name="&gt;&gt;MinY.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;MinY.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;MinY.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="MaxY.Location" type="System.Drawing.Point, System.Drawing">
+    <value>64, 80</value>
+  </data>
+  <data name="MaxY.Size" type="System.Drawing.Size, System.Drawing">
+    <value>160, 20</value>
+  </data>
+  <data name="MaxY.TabIndex" type="System.Int32, mscorlib">
+    <value>7</value>
+  </data>
+  <data name="&gt;&gt;MaxY.Name" xml:space="preserve">
+    <value>MaxY</value>
+  </data>
+  <data name="&gt;&gt;MaxY.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;MaxY.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;MaxY.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="SRSLabel.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="SRSLabel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 112</value>
+  </data>
+  <data name="SRSLabel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>29, 13</value>
+  </data>
+  <data name="SRSLabel.TabIndex" type="System.Int32, mscorlib">
+    <value>8</value>
+  </data>
+  <data name="SRSLabel.Text" xml:space="preserve">
+    <value>SRS</value>
+  </data>
+  <data name="&gt;&gt;SRSLabel.Name" xml:space="preserve">
+    <value>SRSLabel</value>
+  </data>
+  <data name="&gt;&gt;SRSLabel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;SRSLabel.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;SRSLabel.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="SRSCombo.Location" type="System.Drawing.Point, System.Drawing">
+    <value>64, 112</value>
+  </data>
+  <data name="SRSCombo.Size" type="System.Drawing.Size, System.Drawing">
+    <value>160, 21</value>
+  </data>
+  <data name="SRSCombo.TabIndex" type="System.Int32, mscorlib">
+    <value>9</value>
+  </data>
+  <data name="&gt;&gt;SRSCombo.Name" xml:space="preserve">
+    <value>SRSCombo</value>
+  </data>
+  <data name="&gt;&gt;SRSCombo.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;SRSCombo.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;SRSCombo.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="CancelBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom</value>
+  </data>
+  <data name="CancelBtn.Location" type="System.Drawing.Point, System.Drawing">
+    <value>121, 8</value>
+  </data>
+  <data name="CancelBtn.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="CancelBtn.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="CancelBtn.Text" xml:space="preserve">
+    <value>Cancel</value>
+  </data>
+  <data name="&gt;&gt;CancelBtn.Name" xml:space="preserve">
+    <value>CancelBtn</value>
+  </data>
+  <data name="&gt;&gt;CancelBtn.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;CancelBtn.Parent" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;CancelBtn.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="OKBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom</value>
+  </data>
+  <data name="OKBtn.Location" type="System.Drawing.Point, System.Drawing">
+    <value>33, 8</value>
+  </data>
+  <data name="OKBtn.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="OKBtn.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="OKBtn.Text" xml:space="preserve">
+    <value>OK</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.Name" xml:space="preserve">
+    <value>OKBtn</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.Parent" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Bottom</value>
+  </data>
+  <data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 142</value>
+  </data>
+  <data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>235, 40</value>
+  </data>
+  <data name="panel1.TabIndex" type="System.Int32, mscorlib">
+    <value>10</value>
+  </data>
+  <data name="&gt;&gt;panel1.Name" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;panel1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;panel1.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 13</value>
+  </data>
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+    <value>235, 182</value>
+  </data>
+  <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
+    <value>CenterParent</value>
+  </data>
+  <data name="$this.Text" xml:space="preserve">
+    <value>Enter the data bounds</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>BoundsPicker</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Base/UI/ResourceIconCache.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ResourceIconCache.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ResourceIconCache.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,124 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+
+namespace Maestro.Base.UI
+{
+    public interface IResourceIconCache
+    {
+        ImageList SmallImageList { get; }
+
+        ImageList LargeImageList { get; }
+
+        string GetImageKeyFromResourceID(string resourceId);
+
+        int GetImageIndexFromResourceID(string resourceId);
+    }
+
+    public class ResourceIconCache : IResourceIconCache
+    {
+        private ImageList _small;
+        private ImageList _large;
+
+        private ResourceIconCache() 
+        {
+            _small = new ImageList();
+            _large = new ImageList();
+        }
+
+        const string UNKNOWN = "UNKNOWN";
+
+        public static ResourceIconCache CreateDefault()
+        {
+            var icons = new ResourceIconCache();
+
+            //TODO: Externalize
+            icons._small.Images.Add(ResourceTypes.DrawingSource.ToString(), Properties.Resources.blueprints);
+            icons._small.Images.Add(ResourceTypes.FeatureSource.ToString(), Properties.Resources.database_share);
+            icons._small.Images.Add(ResourceTypes.Folder.ToString(), Properties.Resources.folder_horizontal);
+            icons._small.Images.Add(ResourceTypes.LayerDefinition.ToString(), Properties.Resources.layer);
+            icons._small.Images.Add(ResourceTypes.MapDefinition.ToString(), Properties.Resources.map);
+            icons._small.Images.Add(ResourceTypes.WebLayout.ToString(), Properties.Resources.application_browser);
+            icons._small.Images.Add(ResourceTypes.ApplicationDefinition.ToString(), Properties.Resources.applications_stack);
+            icons._small.Images.Add(ResourceTypes.SymbolLibrary.ToString(), Properties.Resources.images_stack);
+            icons._small.Images.Add(ResourceTypes.PrintLayout.ToString(), Properties.Resources.printer);
+            icons._small.Images.Add(Properties.Resources.document);
+
+            icons._large.Images.Add(ResourceTypes.DrawingSource.ToString(), Properties.Resources.blueprints);
+            icons._large.Images.Add(ResourceTypes.FeatureSource.ToString(), Properties.Resources.database_share);
+            icons._large.Images.Add(ResourceTypes.Folder.ToString(), Properties.Resources.folder_horizontal);
+            icons._large.Images.Add(ResourceTypes.LayerDefinition.ToString(), Properties.Resources.layer);
+            icons._large.Images.Add(ResourceTypes.MapDefinition.ToString(), Properties.Resources.map);
+            icons._large.Images.Add(ResourceTypes.WebLayout.ToString(), Properties.Resources.application_browser);
+            icons._large.Images.Add(ResourceTypes.ApplicationDefinition.ToString(), Properties.Resources.applications_stack);
+            icons._large.Images.Add(ResourceTypes.SymbolLibrary.ToString(), Properties.Resources.images_stack);
+            icons._large.Images.Add(ResourceTypes.PrintLayout.ToString(), Properties.Resources.printer);
+            icons._large.Images.Add(Properties.Resources.document);
+
+            return icons;
+        }
+
+        public string GetImageKeyFromResourceID(string resourceId)
+        {
+            var rt = ResourceIdentifier.GetResourceType(resourceId);
+            switch (rt)
+            {
+                case ResourceTypes.DrawingSource:
+                case ResourceTypes.FeatureSource:
+                case ResourceTypes.Folder:
+                case ResourceTypes.LayerDefinition:
+                case ResourceTypes.MapDefinition:
+                case ResourceTypes.WebLayout:
+                case ResourceTypes.ApplicationDefinition:
+                case ResourceTypes.SymbolLibrary:
+                case ResourceTypes.PrintLayout:
+                    return rt.ToString();
+                default:
+                    return UNKNOWN;
+            }
+        }
+
+        public int GetImageIndexFromResourceID(string resourceId)
+        {
+            int idx = _small.Images.IndexOfKey(ResourceIdentifier.GetResourceType(resourceId).ToString());
+
+            if (idx < 0)
+                return _small.Images.IndexOfKey(UNKNOWN);
+
+            return idx;
+        }
+
+        public ImageList SmallImageList
+        {
+            get { return _small;  }
+        }
+
+        public ImageList LargeImageList
+        {
+            get { return _large; }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.Designer.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,1034 @@
+namespace Maestro.Base.UI
+{
+    partial class ResourcePropertiesDialog
+    {
+        /// <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.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ResourcePropertiesDialog));
+            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
+            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
+            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
+            this.tabControl1 = new System.Windows.Forms.TabControl();
+            this.SecurityTab = new System.Windows.Forms.TabPage();
+            this.UseInherited = new System.Windows.Forms.CheckBox();
+            this.UsersAndGroups = new System.Windows.Forms.ListView();
+            this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+            this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
+            this.columnHeader3 = new System.Windows.Forms.ColumnHeader();
+            this.WMSTab = new System.Windows.Forms.TabPage();
+            this.WMSClearHeaderButton = new System.Windows.Forms.Button();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.AutoGenerateWMSBounds = new System.Windows.Forms.Button();
+            this.EditWMSBounds = new System.Windows.Forms.Button();
+            this.WMSBounds = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.WMSOpaque = new System.Windows.Forms.CheckBox();
+            this.WMSQueryable = new System.Windows.Forms.CheckBox();
+            this.WMSAvalible = new System.Windows.Forms.CheckBox();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.WMSMetadata = new System.Windows.Forms.TextBox();
+            this.WMSAbstract = new System.Windows.Forms.TextBox();
+            this.WMSKeyWords = new System.Windows.Forms.TextBox();
+            this.WMSTitle = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.WFSTab = new System.Windows.Forms.TabPage();
+            this.WFSClearHeaderButton = new System.Windows.Forms.Button();
+            this.groupBox4 = new System.Windows.Forms.GroupBox();
+            this.AutoGenerateWFSBounds = new System.Windows.Forms.Button();
+            this.WFSOtherSRS = new System.Windows.Forms.ComboBox();
+            this.WFSPrimarySRS = new System.Windows.Forms.ComboBox();
+            this.label12 = new System.Windows.Forms.Label();
+            this.label11 = new System.Windows.Forms.Label();
+            this.EditWFSBounds = new System.Windows.Forms.Button();
+            this.WFSBounds = new System.Windows.Forms.TextBox();
+            this.label10 = new System.Windows.Forms.Label();
+            this.WFSAvalible = new System.Windows.Forms.CheckBox();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.WFSMetadata = new System.Windows.Forms.TextBox();
+            this.WFSAbstract = new System.Windows.Forms.TextBox();
+            this.WFSKeywords = new System.Windows.Forms.TextBox();
+            this.WFSTitle = new System.Windows.Forms.TextBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.label7 = new System.Windows.Forms.Label();
+            this.label8 = new System.Windows.Forms.Label();
+            this.label9 = new System.Windows.Forms.Label();
+            this.CustomTab = new System.Windows.Forms.TabPage();
+            this.ClearHeaderButton = new System.Windows.Forms.Button();
+            this.dataGridView1 = new System.Windows.Forms.DataGridView();
+            this.ItemKey = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ItemValue = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ReferenceTab = new System.Windows.Forms.TabPage();
+            this.LoadingReferences = new System.Windows.Forms.ProgressBar();
+            this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+            this.OutReferences = new System.Windows.Forms.GroupBox();
+            this.OutReferenceList = new System.Windows.Forms.ListView();
+            this.InReferences = new System.Windows.Forms.GroupBox();
+            this.InReferenceList = new System.Windows.Forms.ListView();
+            this.panel2 = new System.Windows.Forms.Panel();
+            this.ResourceID = new System.Windows.Forms.TextBox();
+            this.label13 = new System.Windows.Forms.Label();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.CancelBtn = new System.Windows.Forms.Button();
+            this.OKBtn = new System.Windows.Forms.Button();
+            this.ReferenceWorker = new System.ComponentModel.BackgroundWorker();
+            this.UserAndGroupImages = new System.Windows.Forms.ImageList(this.components);
+            this.securityContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.readWriteAccessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.readOnlyAccessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.denyAccessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.inheritedAccessRightsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+            this.tabControl1.SuspendLayout();
+            this.SecurityTab.SuspendLayout();
+            this.WMSTab.SuspendLayout();
+            this.groupBox2.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.WFSTab.SuspendLayout();
+            this.groupBox4.SuspendLayout();
+            this.groupBox3.SuspendLayout();
+            this.CustomTab.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
+            this.ReferenceTab.SuspendLayout();
+            this.splitContainer1.Panel1.SuspendLayout();
+            this.splitContainer1.Panel2.SuspendLayout();
+            this.splitContainer1.SuspendLayout();
+            this.OutReferences.SuspendLayout();
+            this.InReferences.SuspendLayout();
+            this.panel2.SuspendLayout();
+            this.panel1.SuspendLayout();
+            this.securityContextMenu.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // tabControl1
+            // 
+            this.tabControl1.Controls.Add(this.SecurityTab);
+            this.tabControl1.Controls.Add(this.WMSTab);
+            this.tabControl1.Controls.Add(this.WFSTab);
+            this.tabControl1.Controls.Add(this.CustomTab);
+            this.tabControl1.Controls.Add(this.ReferenceTab);
+            this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.tabControl1.Location = new System.Drawing.Point(0, 32);
+            this.tabControl1.Name = "tabControl1";
+            this.tabControl1.SelectedIndex = 0;
+            this.tabControl1.Size = new System.Drawing.Size(354, 387);
+            this.tabControl1.TabIndex = 4;
+            this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged);
+            // 
+            // SecurityTab
+            // 
+            this.SecurityTab.Controls.Add(this.UseInherited);
+            this.SecurityTab.Controls.Add(this.UsersAndGroups);
+            this.SecurityTab.Location = new System.Drawing.Point(4, 22);
+            this.SecurityTab.Name = "SecurityTab";
+            this.SecurityTab.Padding = new System.Windows.Forms.Padding(3);
+            this.SecurityTab.Size = new System.Drawing.Size(346, 361);
+            this.SecurityTab.TabIndex = 0;
+            this.SecurityTab.Text = "Security";
+            this.SecurityTab.UseVisualStyleBackColor = true;
+            // 
+            // UseInherited
+            // 
+            this.UseInherited.AutoSize = true;
+            this.UseInherited.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.UseInherited.Location = new System.Drawing.Point(16, 16);
+            this.UseInherited.Name = "UseInherited";
+            this.UseInherited.Size = new System.Drawing.Size(166, 17);
+            this.UseInherited.TabIndex = 1;
+            this.UseInherited.Text = "Use inherited security settings";
+            this.UseInherited.UseVisualStyleBackColor = true;
+            this.UseInherited.CheckedChanged += new System.EventHandler(this.UseInherited_CheckedChanged);
+            // 
+            // UsersAndGroups
+            // 
+            this.UsersAndGroups.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.UsersAndGroups.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1,
+            this.columnHeader2,
+            this.columnHeader3});
+            this.UsersAndGroups.Enabled = false;
+            this.UsersAndGroups.FullRowSelect = true;
+            this.UsersAndGroups.Location = new System.Drawing.Point(16, 40);
+            this.UsersAndGroups.Name = "UsersAndGroups";
+            this.UsersAndGroups.Size = new System.Drawing.Size(316, 310);
+            this.UsersAndGroups.TabIndex = 0;
+            this.UsersAndGroups.UseCompatibleStateImageBehavior = false;
+            this.UsersAndGroups.View = System.Windows.Forms.View.Details;
+            // 
+            // columnHeader1
+            // 
+            this.columnHeader1.Text = "Name";
+            this.columnHeader1.Width = 88;
+            // 
+            // columnHeader2
+            // 
+            this.columnHeader2.Text = "Description";
+            this.columnHeader2.Width = 104;
+            // 
+            // columnHeader3
+            // 
+            this.columnHeader3.Text = "Access";
+            this.columnHeader3.Width = 93;
+            // 
+            // WMSTab
+            // 
+            this.WMSTab.Controls.Add(this.WMSClearHeaderButton);
+            this.WMSTab.Controls.Add(this.groupBox2);
+            this.WMSTab.Controls.Add(this.groupBox1);
+            this.WMSTab.Location = new System.Drawing.Point(4, 22);
+            this.WMSTab.Name = "WMSTab";
+            this.WMSTab.Padding = new System.Windows.Forms.Padding(3);
+            this.WMSTab.Size = new System.Drawing.Size(346, 361);
+            this.WMSTab.TabIndex = 1;
+            this.WMSTab.Text = "WMS";
+            this.WMSTab.UseVisualStyleBackColor = true;
+            // 
+            // WMSClearHeaderButton
+            // 
+            this.WMSClearHeaderButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.WMSClearHeaderButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.WMSClearHeaderButton.Location = new System.Drawing.Point(220, 325);
+            this.WMSClearHeaderButton.Name = "WMSClearHeaderButton";
+            this.WMSClearHeaderButton.Size = new System.Drawing.Size(119, 23);
+            this.WMSClearHeaderButton.TabIndex = 10;
+            this.WMSClearHeaderButton.Text = "Clear all WMS data";
+            this.WMSClearHeaderButton.UseVisualStyleBackColor = true;
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox2.Controls.Add(this.AutoGenerateWMSBounds);
+            this.groupBox2.Controls.Add(this.EditWMSBounds);
+            this.groupBox2.Controls.Add(this.WMSBounds);
+            this.groupBox2.Controls.Add(this.label4);
+            this.groupBox2.Controls.Add(this.WMSOpaque);
+            this.groupBox2.Controls.Add(this.WMSQueryable);
+            this.groupBox2.Controls.Add(this.WMSAvalible);
+            this.groupBox2.Location = new System.Drawing.Point(8, 176);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(332, 144);
+            this.groupBox2.TabIndex = 9;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Functionality";
+            // 
+            // AutoGenerateWMSBounds
+            // 
+            this.AutoGenerateWMSBounds.Image = ((System.Drawing.Image)(resources.GetObject("AutoGenerateWMSBounds.Image")));
+            this.AutoGenerateWMSBounds.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.AutoGenerateWMSBounds.Location = new System.Drawing.Point(304, 116);
+            this.AutoGenerateWMSBounds.Name = "AutoGenerateWMSBounds";
+            this.AutoGenerateWMSBounds.Size = new System.Drawing.Size(24, 20);
+            this.AutoGenerateWMSBounds.TabIndex = 9;
+            this.AutoGenerateWMSBounds.UseVisualStyleBackColor = true;
+            // 
+            // EditWMSBounds
+            // 
+            this.EditWMSBounds.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.EditWMSBounds.Location = new System.Drawing.Point(304, 96);
+            this.EditWMSBounds.Name = "EditWMSBounds";
+            this.EditWMSBounds.Size = new System.Drawing.Size(24, 20);
+            this.EditWMSBounds.TabIndex = 8;
+            this.EditWMSBounds.Text = "...";
+            this.EditWMSBounds.UseVisualStyleBackColor = true;
+            // 
+            // WMSBounds
+            // 
+            this.WMSBounds.Location = new System.Drawing.Point(88, 96);
+            this.WMSBounds.Multiline = true;
+            this.WMSBounds.Name = "WMSBounds";
+            this.WMSBounds.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.WMSBounds.Size = new System.Drawing.Size(216, 40);
+            this.WMSBounds.TabIndex = 7;
+            this.WMSBounds.TextChanged += new System.EventHandler(this.WMSBounds_TextChanged);
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label4.Location = new System.Drawing.Point(8, 96);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(43, 13);
+            this.label4.TabIndex = 5;
+            this.label4.Text = "Bounds";
+            // 
+            // WMSOpaque
+            // 
+            this.WMSOpaque.AutoSize = true;
+            this.WMSOpaque.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.WMSOpaque.Location = new System.Drawing.Point(8, 72);
+            this.WMSOpaque.Name = "WMSOpaque";
+            this.WMSOpaque.Size = new System.Drawing.Size(64, 17);
+            this.WMSOpaque.TabIndex = 6;
+            this.WMSOpaque.Text = "Opaque";
+            this.WMSOpaque.UseVisualStyleBackColor = true;
+            this.WMSOpaque.CheckedChanged += new System.EventHandler(this.WMSOpaque_CheckedChanged);
+            // 
+            // WMSQueryable
+            // 
+            this.WMSQueryable.AutoSize = true;
+            this.WMSQueryable.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.WMSQueryable.Location = new System.Drawing.Point(8, 48);
+            this.WMSQueryable.Name = "WMSQueryable";
+            this.WMSQueryable.Size = new System.Drawing.Size(74, 17);
+            this.WMSQueryable.TabIndex = 3;
+            this.WMSQueryable.Text = "Queryable";
+            this.WMSQueryable.UseVisualStyleBackColor = true;
+            this.WMSQueryable.CheckedChanged += new System.EventHandler(this.WMSQueryable_CheckedChanged);
+            // 
+            // WMSAvalible
+            // 
+            this.WMSAvalible.AutoSize = true;
+            this.WMSAvalible.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.WMSAvalible.Location = new System.Drawing.Point(8, 24);
+            this.WMSAvalible.Name = "WMSAvalible";
+            this.WMSAvalible.Size = new System.Drawing.Size(63, 17);
+            this.WMSAvalible.TabIndex = 4;
+            this.WMSAvalible.Text = "Avalible";
+            this.WMSAvalible.UseVisualStyleBackColor = true;
+            this.WMSAvalible.CheckedChanged += new System.EventHandler(this.WMSAvalible_CheckedChanged);
+            // 
+            // 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.WMSMetadata);
+            this.groupBox1.Controls.Add(this.WMSAbstract);
+            this.groupBox1.Controls.Add(this.WMSKeyWords);
+            this.groupBox1.Controls.Add(this.WMSTitle);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Controls.Add(this.label5);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Location = new System.Drawing.Point(8, 8);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(332, 160);
+            this.groupBox1.TabIndex = 8;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Description";
+            // 
+            // WMSMetadata
+            // 
+            this.WMSMetadata.Location = new System.Drawing.Point(80, 112);
+            this.WMSMetadata.Multiline = true;
+            this.WMSMetadata.Name = "WMSMetadata";
+            this.WMSMetadata.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.WMSMetadata.Size = new System.Drawing.Size(248, 40);
+            this.WMSMetadata.TabIndex = 11;
+            this.WMSMetadata.TextChanged += new System.EventHandler(this.WMSMetadata_TextChanged);
+            // 
+            // WMSAbstract
+            // 
+            this.WMSAbstract.Location = new System.Drawing.Point(80, 64);
+            this.WMSAbstract.Multiline = true;
+            this.WMSAbstract.Name = "WMSAbstract";
+            this.WMSAbstract.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.WMSAbstract.Size = new System.Drawing.Size(248, 40);
+            this.WMSAbstract.TabIndex = 10;
+            this.WMSAbstract.TextChanged += new System.EventHandler(this.WMSAbstract_TextChanged);
+            // 
+            // WMSKeyWords
+            // 
+            this.WMSKeyWords.Location = new System.Drawing.Point(80, 40);
+            this.WMSKeyWords.Name = "WMSKeyWords";
+            this.WMSKeyWords.Size = new System.Drawing.Size(248, 20);
+            this.WMSKeyWords.TabIndex = 9;
+            this.WMSKeyWords.TextChanged += new System.EventHandler(this.WMSKeyWords_TextChanged);
+            // 
+            // WMSTitle
+            // 
+            this.WMSTitle.Location = new System.Drawing.Point(80, 16);
+            this.WMSTitle.Name = "WMSTitle";
+            this.WMSTitle.Size = new System.Drawing.Size(248, 20);
+            this.WMSTitle.TabIndex = 8;
+            this.WMSTitle.TextChanged += new System.EventHandler(this.WMSTitle_TextChanged);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label1.Location = new System.Drawing.Point(8, 16);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(27, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Title";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label5.Location = new System.Drawing.Point(8, 64);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(46, 13);
+            this.label5.TabIndex = 7;
+            this.label5.Text = "Abstract";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label2.Location = new System.Drawing.Point(8, 112);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(52, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Metadata";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label3.Location = new System.Drawing.Point(8, 40);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(53, 13);
+            this.label3.TabIndex = 2;
+            this.label3.Text = "Keywords";
+            // 
+            // WFSTab
+            // 
+            this.WFSTab.Controls.Add(this.WFSClearHeaderButton);
+            this.WFSTab.Controls.Add(this.groupBox4);
+            this.WFSTab.Controls.Add(this.groupBox3);
+            this.WFSTab.Location = new System.Drawing.Point(4, 22);
+            this.WFSTab.Name = "WFSTab";
+            this.WFSTab.Padding = new System.Windows.Forms.Padding(3);
+            this.WFSTab.Size = new System.Drawing.Size(346, 361);
+            this.WFSTab.TabIndex = 2;
+            this.WFSTab.Text = "WFS";
+            this.WFSTab.UseVisualStyleBackColor = true;
+            // 
+            // WFSClearHeaderButton
+            // 
+            this.WFSClearHeaderButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.WFSClearHeaderButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.WFSClearHeaderButton.Location = new System.Drawing.Point(220, 324);
+            this.WFSClearHeaderButton.Name = "WFSClearHeaderButton";
+            this.WFSClearHeaderButton.Size = new System.Drawing.Size(119, 23);
+            this.WFSClearHeaderButton.TabIndex = 11;
+            this.WFSClearHeaderButton.Text = "Clear all WFS data";
+            this.WFSClearHeaderButton.UseVisualStyleBackColor = true;
+            this.WFSClearHeaderButton.Click += new System.EventHandler(this.WFSClearHeaderButton_Click);
+            // 
+            // groupBox4
+            // 
+            this.groupBox4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox4.Controls.Add(this.AutoGenerateWFSBounds);
+            this.groupBox4.Controls.Add(this.WFSOtherSRS);
+            this.groupBox4.Controls.Add(this.WFSPrimarySRS);
+            this.groupBox4.Controls.Add(this.label12);
+            this.groupBox4.Controls.Add(this.label11);
+            this.groupBox4.Controls.Add(this.EditWFSBounds);
+            this.groupBox4.Controls.Add(this.WFSBounds);
+            this.groupBox4.Controls.Add(this.label10);
+            this.groupBox4.Controls.Add(this.WFSAvalible);
+            this.groupBox4.Location = new System.Drawing.Point(7, 176);
+            this.groupBox4.Name = "groupBox4";
+            this.groupBox4.Size = new System.Drawing.Size(332, 144);
+            this.groupBox4.TabIndex = 10;
+            this.groupBox4.TabStop = false;
+            this.groupBox4.Text = "Functionality";
+            // 
+            // AutoGenerateWFSBounds
+            // 
+            this.AutoGenerateWFSBounds.Image = ((System.Drawing.Image)(resources.GetObject("AutoGenerateWFSBounds.Image")));
+            this.AutoGenerateWFSBounds.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.AutoGenerateWFSBounds.Location = new System.Drawing.Point(304, 116);
+            this.AutoGenerateWFSBounds.Name = "AutoGenerateWFSBounds";
+            this.AutoGenerateWFSBounds.Size = new System.Drawing.Size(24, 20);
+            this.AutoGenerateWFSBounds.TabIndex = 15;
+            this.AutoGenerateWFSBounds.UseVisualStyleBackColor = true;
+            // 
+            // WFSOtherSRS
+            // 
+            this.WFSOtherSRS.FormattingEnabled = true;
+            this.WFSOtherSRS.Location = new System.Drawing.Point(88, 72);
+            this.WFSOtherSRS.Name = "WFSOtherSRS";
+            this.WFSOtherSRS.Size = new System.Drawing.Size(240, 21);
+            this.WFSOtherSRS.TabIndex = 14;
+            this.WFSOtherSRS.TextChanged += new System.EventHandler(this.WFSOtherSRS_TextChanged);
+            // 
+            // WFSPrimarySRS
+            // 
+            this.WFSPrimarySRS.FormattingEnabled = true;
+            this.WFSPrimarySRS.Location = new System.Drawing.Point(88, 48);
+            this.WFSPrimarySRS.Name = "WFSPrimarySRS";
+            this.WFSPrimarySRS.Size = new System.Drawing.Size(240, 21);
+            this.WFSPrimarySRS.TabIndex = 13;
+            // 
+            // label12
+            // 
+            this.label12.AutoSize = true;
+            this.label12.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label12.Location = new System.Drawing.Point(8, 72);
+            this.label12.Name = "label12";
+            this.label12.Size = new System.Drawing.Size(58, 13);
+            this.label12.TabIndex = 11;
+            this.label12.Text = "Other SRS";
+            // 
+            // label11
+            // 
+            this.label11.AutoSize = true;
+            this.label11.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label11.Location = new System.Drawing.Point(8, 48);
+            this.label11.Name = "label11";
+            this.label11.Size = new System.Drawing.Size(66, 13);
+            this.label11.TabIndex = 9;
+            this.label11.Text = "Primary SRS";
+            // 
+            // EditWFSBounds
+            // 
+            this.EditWFSBounds.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.EditWFSBounds.Location = new System.Drawing.Point(304, 96);
+            this.EditWFSBounds.Name = "EditWFSBounds";
+            this.EditWFSBounds.Size = new System.Drawing.Size(24, 20);
+            this.EditWFSBounds.TabIndex = 8;
+            this.EditWFSBounds.Text = "...";
+            this.EditWFSBounds.UseVisualStyleBackColor = true;
+            // 
+            // WFSBounds
+            // 
+            this.WFSBounds.Location = new System.Drawing.Point(88, 96);
+            this.WFSBounds.Multiline = true;
+            this.WFSBounds.Name = "WFSBounds";
+            this.WFSBounds.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.WFSBounds.Size = new System.Drawing.Size(216, 40);
+            this.WFSBounds.TabIndex = 7;
+            this.WFSBounds.TextChanged += new System.EventHandler(this.WFSBounds_TextChanged);
+            // 
+            // label10
+            // 
+            this.label10.AutoSize = true;
+            this.label10.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label10.Location = new System.Drawing.Point(8, 96);
+            this.label10.Name = "label10";
+            this.label10.Size = new System.Drawing.Size(43, 13);
+            this.label10.TabIndex = 5;
+            this.label10.Text = "Bounds";
+            // 
+            // WFSAvalible
+            // 
+            this.WFSAvalible.AutoSize = true;
+            this.WFSAvalible.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.WFSAvalible.Location = new System.Drawing.Point(8, 24);
+            this.WFSAvalible.Name = "WFSAvalible";
+            this.WFSAvalible.Size = new System.Drawing.Size(63, 17);
+            this.WFSAvalible.TabIndex = 4;
+            this.WFSAvalible.Text = "Avalible";
+            this.WFSAvalible.UseVisualStyleBackColor = true;
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox3.Controls.Add(this.WFSMetadata);
+            this.groupBox3.Controls.Add(this.WFSAbstract);
+            this.groupBox3.Controls.Add(this.WFSKeywords);
+            this.groupBox3.Controls.Add(this.WFSTitle);
+            this.groupBox3.Controls.Add(this.label6);
+            this.groupBox3.Controls.Add(this.label7);
+            this.groupBox3.Controls.Add(this.label8);
+            this.groupBox3.Controls.Add(this.label9);
+            this.groupBox3.Location = new System.Drawing.Point(7, 8);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(332, 160);
+            this.groupBox3.TabIndex = 9;
+            this.groupBox3.TabStop = false;
+            this.groupBox3.Text = "Description";
+            // 
+            // WFSMetadata
+            // 
+            this.WFSMetadata.Location = new System.Drawing.Point(80, 112);
+            this.WFSMetadata.Multiline = true;
+            this.WFSMetadata.Name = "WFSMetadata";
+            this.WFSMetadata.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.WFSMetadata.Size = new System.Drawing.Size(248, 40);
+            this.WFSMetadata.TabIndex = 11;
+            // 
+            // WFSAbstract
+            // 
+            this.WFSAbstract.Location = new System.Drawing.Point(80, 64);
+            this.WFSAbstract.Multiline = true;
+            this.WFSAbstract.Name = "WFSAbstract";
+            this.WFSAbstract.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.WFSAbstract.Size = new System.Drawing.Size(248, 40);
+            this.WFSAbstract.TabIndex = 10;
+            // 
+            // WFSKeywords
+            // 
+            this.WFSKeywords.Location = new System.Drawing.Point(80, 40);
+            this.WFSKeywords.Name = "WFSKeywords";
+            this.WFSKeywords.Size = new System.Drawing.Size(248, 20);
+            this.WFSKeywords.TabIndex = 9;
+            // 
+            // WFSTitle
+            // 
+            this.WFSTitle.Location = new System.Drawing.Point(80, 16);
+            this.WFSTitle.Name = "WFSTitle";
+            this.WFSTitle.Size = new System.Drawing.Size(248, 20);
+            this.WFSTitle.TabIndex = 8;
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label6.Location = new System.Drawing.Point(8, 16);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(27, 13);
+            this.label6.TabIndex = 0;
+            this.label6.Text = "Title";
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label7.Location = new System.Drawing.Point(8, 64);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(46, 13);
+            this.label7.TabIndex = 7;
+            this.label7.Text = "Abstract";
+            // 
+            // label8
+            // 
+            this.label8.AutoSize = true;
+            this.label8.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label8.Location = new System.Drawing.Point(8, 112);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(52, 13);
+            this.label8.TabIndex = 1;
+            this.label8.Text = "Metadata";
+            // 
+            // label9
+            // 
+            this.label9.AutoSize = true;
+            this.label9.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label9.Location = new System.Drawing.Point(8, 40);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(53, 13);
+            this.label9.TabIndex = 2;
+            this.label9.Text = "Keywords";
+            // 
+            // CustomTab
+            // 
+            this.CustomTab.Controls.Add(this.ClearHeaderButton);
+            this.CustomTab.Controls.Add(this.dataGridView1);
+            this.CustomTab.Location = new System.Drawing.Point(4, 22);
+            this.CustomTab.Name = "CustomTab";
+            this.CustomTab.Size = new System.Drawing.Size(346, 361);
+            this.CustomTab.TabIndex = 3;
+            this.CustomTab.Text = "Custom Metadata";
+            this.CustomTab.UseVisualStyleBackColor = true;
+            // 
+            // ClearHeaderButton
+            // 
+            this.ClearHeaderButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.ClearHeaderButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.ClearHeaderButton.Location = new System.Drawing.Point(224, 328);
+            this.ClearHeaderButton.Name = "ClearHeaderButton";
+            this.ClearHeaderButton.Size = new System.Drawing.Size(119, 23);
+            this.ClearHeaderButton.TabIndex = 11;
+            this.ClearHeaderButton.Text = "Clear all metadata";
+            this.ClearHeaderButton.UseVisualStyleBackColor = true;
+            this.ClearHeaderButton.Click += new System.EventHandler(this.ClearHeaderButton_Click);
+            // 
+            // dataGridView1
+            // 
+            this.dataGridView1.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)));
+            dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
+            dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
+            dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
+            dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
+            dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
+            dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
+            this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
+            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.ItemKey,
+            this.ItemValue});
+            dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
+            dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
+            dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
+            dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
+            dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
+            dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
+            this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle2;
+            this.dataGridView1.Location = new System.Drawing.Point(8, 8);
+            this.dataGridView1.Name = "dataGridView1";
+            dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
+            dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.Control;
+            dataGridViewCellStyle3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.WindowText;
+            dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight;
+            dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
+            dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
+            this.dataGridView1.RowHeadersDefaultCellStyle = dataGridViewCellStyle3;
+            this.dataGridView1.Size = new System.Drawing.Size(336, 312);
+            this.dataGridView1.TabIndex = 0;
+            this.dataGridView1.Leave += new System.EventHandler(this.dataGridView1_Leave);
+            // 
+            // ItemKey
+            // 
+            this.ItemKey.HeaderText = "Key";
+            this.ItemKey.Name = "ItemKey";
+            // 
+            // ItemValue
+            // 
+            this.ItemValue.HeaderText = "Value";
+            this.ItemValue.Name = "ItemValue";
+            // 
+            // ReferenceTab
+            // 
+            this.ReferenceTab.Controls.Add(this.LoadingReferences);
+            this.ReferenceTab.Controls.Add(this.splitContainer1);
+            this.ReferenceTab.Location = new System.Drawing.Point(4, 22);
+            this.ReferenceTab.Name = "ReferenceTab";
+            this.ReferenceTab.Padding = new System.Windows.Forms.Padding(3);
+            this.ReferenceTab.Size = new System.Drawing.Size(346, 361);
+            this.ReferenceTab.TabIndex = 4;
+            this.ReferenceTab.Text = "References";
+            this.ReferenceTab.UseVisualStyleBackColor = true;
+            // 
+            // LoadingReferences
+            // 
+            this.LoadingReferences.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.LoadingReferences.Location = new System.Drawing.Point(32, 88);
+            this.LoadingReferences.Name = "LoadingReferences";
+            this.LoadingReferences.Size = new System.Drawing.Size(288, 23);
+            this.LoadingReferences.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
+            this.LoadingReferences.TabIndex = 1;
+            // 
+            // splitContainer1
+            // 
+            this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.splitContainer1.Location = new System.Drawing.Point(3, 3);
+            this.splitContainer1.Name = "splitContainer1";
+            this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+            // 
+            // splitContainer1.Panel1
+            // 
+            this.splitContainer1.Panel1.Controls.Add(this.OutReferences);
+            // 
+            // splitContainer1.Panel2
+            // 
+            this.splitContainer1.Panel2.Controls.Add(this.InReferences);
+            this.splitContainer1.Size = new System.Drawing.Size(340, 355);
+            this.splitContainer1.SplitterDistance = 175;
+            this.splitContainer1.TabIndex = 0;
+            // 
+            // OutReferences
+            // 
+            this.OutReferences.Controls.Add(this.OutReferenceList);
+            this.OutReferences.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.OutReferences.Enabled = false;
+            this.OutReferences.Location = new System.Drawing.Point(0, 0);
+            this.OutReferences.Name = "OutReferences";
+            this.OutReferences.Size = new System.Drawing.Size(340, 175);
+            this.OutReferences.TabIndex = 0;
+            this.OutReferences.TabStop = false;
+            this.OutReferences.Text = "This resource references";
+            // 
+            // OutReferenceList
+            // 
+            this.OutReferenceList.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.OutReferenceList.FullRowSelect = true;
+            this.OutReferenceList.GridLines = true;
+            this.OutReferenceList.Location = new System.Drawing.Point(3, 16);
+            this.OutReferenceList.Name = "OutReferenceList";
+            this.OutReferenceList.Size = new System.Drawing.Size(334, 156);
+            this.OutReferenceList.TabIndex = 0;
+            this.OutReferenceList.UseCompatibleStateImageBehavior = false;
+            this.OutReferenceList.View = System.Windows.Forms.View.List;
+            // 
+            // InReferences
+            // 
+            this.InReferences.Controls.Add(this.InReferenceList);
+            this.InReferences.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.InReferences.Enabled = false;
+            this.InReferences.Location = new System.Drawing.Point(0, 0);
+            this.InReferences.Name = "InReferences";
+            this.InReferences.Size = new System.Drawing.Size(340, 176);
+            this.InReferences.TabIndex = 1;
+            this.InReferences.TabStop = false;
+            this.InReferences.Text = "This resource is referenced by";
+            // 
+            // InReferenceList
+            // 
+            this.InReferenceList.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.InReferenceList.FullRowSelect = true;
+            this.InReferenceList.GridLines = true;
+            this.InReferenceList.Location = new System.Drawing.Point(3, 16);
+            this.InReferenceList.Name = "InReferenceList";
+            this.InReferenceList.Size = new System.Drawing.Size(334, 157);
+            this.InReferenceList.TabIndex = 1;
+            this.InReferenceList.UseCompatibleStateImageBehavior = false;
+            this.InReferenceList.View = System.Windows.Forms.View.List;
+            // 
+            // panel2
+            // 
+            this.panel2.Controls.Add(this.ResourceID);
+            this.panel2.Controls.Add(this.label13);
+            this.panel2.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panel2.Location = new System.Drawing.Point(0, 0);
+            this.panel2.Name = "panel2";
+            this.panel2.Size = new System.Drawing.Size(354, 32);
+            this.panel2.TabIndex = 5;
+            // 
+            // ResourceID
+            // 
+            this.ResourceID.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.ResourceID.Location = new System.Drawing.Point(88, 6);
+            this.ResourceID.Name = "ResourceID";
+            this.ResourceID.ReadOnly = true;
+            this.ResourceID.Size = new System.Drawing.Size(260, 20);
+            this.ResourceID.TabIndex = 1;
+            // 
+            // label13
+            // 
+            this.label13.AutoSize = true;
+            this.label13.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label13.Location = new System.Drawing.Point(8, 8);
+            this.label13.Name = "label13";
+            this.label13.Size = new System.Drawing.Size(67, 13);
+            this.label13.TabIndex = 0;
+            this.label13.Text = "Resource ID";
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.CancelBtn);
+            this.panel1.Controls.Add(this.OKBtn);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.panel1.Location = new System.Drawing.Point(0, 419);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(354, 40);
+            this.panel1.TabIndex = 3;
+            // 
+            // CancelBtn
+            // 
+            this.CancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.CancelBtn.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.CancelBtn.Location = new System.Drawing.Point(261, 8);
+            this.CancelBtn.Name = "CancelBtn";
+            this.CancelBtn.Size = new System.Drawing.Size(75, 23);
+            this.CancelBtn.TabIndex = 1;
+            this.CancelBtn.Text = "Cancel";
+            this.CancelBtn.UseVisualStyleBackColor = true;
+            this.CancelBtn.Click += new System.EventHandler(this.CancelBtn_Click);
+            // 
+            // OKBtn
+            // 
+            this.OKBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.OKBtn.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.OKBtn.Location = new System.Drawing.Point(180, 8);
+            this.OKBtn.Name = "OKBtn";
+            this.OKBtn.Size = new System.Drawing.Size(75, 23);
+            this.OKBtn.TabIndex = 0;
+            this.OKBtn.Text = "OK";
+            this.OKBtn.UseVisualStyleBackColor = true;
+            this.OKBtn.Click += new System.EventHandler(this.OKBtn_Click);
+            // 
+            // ReferenceWorker
+            // 
+            this.ReferenceWorker.WorkerReportsProgress = true;
+            this.ReferenceWorker.WorkerSupportsCancellation = true;
+            this.ReferenceWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.ReferenceWorker_DoWork);
+            this.ReferenceWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.ReferenceWorker_RunWorkerCompleted);
+            // 
+            // UserAndGroupImages
+            // 
+            this.UserAndGroupImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("UserAndGroupImages.ImageStream")));
+            this.UserAndGroupImages.TransparentColor = System.Drawing.Color.Transparent;
+            this.UserAndGroupImages.Images.SetKeyName(0, "WriteUser.ico");
+            this.UserAndGroupImages.Images.SetKeyName(1, "ReadOnlyUser.ico");
+            this.UserAndGroupImages.Images.SetKeyName(2, "DenyUser.ico");
+            this.UserAndGroupImages.Images.SetKeyName(3, "WriteGroup.ico");
+            this.UserAndGroupImages.Images.SetKeyName(4, "ReadOnlyGroup.ico");
+            this.UserAndGroupImages.Images.SetKeyName(5, "DenyGroup.ico");
+            this.UserAndGroupImages.Images.SetKeyName(6, "InheritedUser.ico");
+            this.UserAndGroupImages.Images.SetKeyName(7, "InheritedGroup.ico");
+            // 
+            // securityContextMenu
+            // 
+            this.securityContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.readWriteAccessToolStripMenuItem,
+            this.readOnlyAccessToolStripMenuItem,
+            this.denyAccessToolStripMenuItem,
+            this.inheritedAccessRightsToolStripMenuItem});
+            this.securityContextMenu.Name = "securityContextMenu";
+            this.securityContextMenu.Size = new System.Drawing.Size(184, 92);
+            // 
+            // readWriteAccessToolStripMenuItem
+            // 
+            this.readWriteAccessToolStripMenuItem.Name = "readWriteAccessToolStripMenuItem";
+            this.readWriteAccessToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
+            this.readWriteAccessToolStripMenuItem.Text = "Read write access";
+            // 
+            // readOnlyAccessToolStripMenuItem
+            // 
+            this.readOnlyAccessToolStripMenuItem.Name = "readOnlyAccessToolStripMenuItem";
+            this.readOnlyAccessToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
+            this.readOnlyAccessToolStripMenuItem.Text = "Read only access";
+            // 
+            // denyAccessToolStripMenuItem
+            // 
+            this.denyAccessToolStripMenuItem.Name = "denyAccessToolStripMenuItem";
+            this.denyAccessToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
+            this.denyAccessToolStripMenuItem.Text = "Deny access";
+            // 
+            // inheritedAccessRightsToolStripMenuItem
+            // 
+            this.inheritedAccessRightsToolStripMenuItem.Name = "inheritedAccessRightsToolStripMenuItem";
+            this.inheritedAccessRightsToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
+            this.inheritedAccessRightsToolStripMenuItem.Text = "Inherited access rights";
+            // 
+            // ResourcePropertiesDialog
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(354, 459);
+            this.Controls.Add(this.tabControl1);
+            this.Controls.Add(this.panel2);
+            this.Controls.Add(this.panel1);
+            this.Name = "ResourcePropertiesDialog";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Resource Properties";
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnFormClosing);
+            this.tabControl1.ResumeLayout(false);
+            this.SecurityTab.ResumeLayout(false);
+            this.SecurityTab.PerformLayout();
+            this.WMSTab.ResumeLayout(false);
+            this.groupBox2.ResumeLayout(false);
+            this.groupBox2.PerformLayout();
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.WFSTab.ResumeLayout(false);
+            this.groupBox4.ResumeLayout(false);
+            this.groupBox4.PerformLayout();
+            this.groupBox3.ResumeLayout(false);
+            this.groupBox3.PerformLayout();
+            this.CustomTab.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
+            this.ReferenceTab.ResumeLayout(false);
+            this.splitContainer1.Panel1.ResumeLayout(false);
+            this.splitContainer1.Panel2.ResumeLayout(false);
+            this.splitContainer1.ResumeLayout(false);
+            this.OutReferences.ResumeLayout(false);
+            this.InReferences.ResumeLayout(false);
+            this.panel2.ResumeLayout(false);
+            this.panel2.PerformLayout();
+            this.panel1.ResumeLayout(false);
+            this.securityContextMenu.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TabControl tabControl1;
+        private System.Windows.Forms.TabPage SecurityTab;
+        private System.Windows.Forms.CheckBox UseInherited;
+        private System.Windows.Forms.ListView UsersAndGroups;
+        private System.Windows.Forms.ColumnHeader columnHeader1;
+        private System.Windows.Forms.ColumnHeader columnHeader2;
+        private System.Windows.Forms.ColumnHeader columnHeader3;
+        private System.Windows.Forms.TabPage WMSTab;
+        private System.Windows.Forms.Button WMSClearHeaderButton;
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.Button AutoGenerateWMSBounds;
+        private System.Windows.Forms.Button EditWMSBounds;
+        private System.Windows.Forms.TextBox WMSBounds;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.CheckBox WMSOpaque;
+        private System.Windows.Forms.CheckBox WMSQueryable;
+        private System.Windows.Forms.CheckBox WMSAvalible;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TextBox WMSMetadata;
+        private System.Windows.Forms.TextBox WMSAbstract;
+        private System.Windows.Forms.TextBox WMSKeyWords;
+        private System.Windows.Forms.TextBox WMSTitle;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.TabPage WFSTab;
+        private System.Windows.Forms.Button WFSClearHeaderButton;
+        private System.Windows.Forms.GroupBox groupBox4;
+        private System.Windows.Forms.Button AutoGenerateWFSBounds;
+        private System.Windows.Forms.ComboBox WFSOtherSRS;
+        private System.Windows.Forms.ComboBox WFSPrimarySRS;
+        private System.Windows.Forms.Label label12;
+        private System.Windows.Forms.Label label11;
+        private System.Windows.Forms.Button EditWFSBounds;
+        private System.Windows.Forms.TextBox WFSBounds;
+        private System.Windows.Forms.Label label10;
+        private System.Windows.Forms.CheckBox WFSAvalible;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.TextBox WFSMetadata;
+        private System.Windows.Forms.TextBox WFSAbstract;
+        private System.Windows.Forms.TextBox WFSKeywords;
+        private System.Windows.Forms.TextBox WFSTitle;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.Label label8;
+        private System.Windows.Forms.Label label9;
+        private System.Windows.Forms.TabPage CustomTab;
+        private System.Windows.Forms.Button ClearHeaderButton;
+        private System.Windows.Forms.DataGridView dataGridView1;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ItemKey;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ItemValue;
+        private System.Windows.Forms.TabPage ReferenceTab;
+        private System.Windows.Forms.ProgressBar LoadingReferences;
+        private System.Windows.Forms.SplitContainer splitContainer1;
+        private System.Windows.Forms.GroupBox OutReferences;
+        private System.Windows.Forms.ListView OutReferenceList;
+        private System.Windows.Forms.GroupBox InReferences;
+        private System.Windows.Forms.ListView InReferenceList;
+        private System.Windows.Forms.Panel panel2;
+        private System.Windows.Forms.TextBox ResourceID;
+        private System.Windows.Forms.Label label13;
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.Button CancelBtn;
+        private System.Windows.Forms.Button OKBtn;
+        private System.ComponentModel.BackgroundWorker ReferenceWorker;
+        private System.Windows.Forms.ImageList UserAndGroupImages;
+        private System.Windows.Forms.ContextMenuStrip securityContextMenu;
+        private System.Windows.Forms.ToolStripMenuItem readWriteAccessToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem readOnlyAccessToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem denyAccessToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem inheritedAccessRightsToolStripMenuItem;
+        private System.Windows.Forms.ToolTip toolTip;
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,1013 @@
+#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 OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+using System.Collections.Specialized;
+using OSGeo.MapGuide.MaestroAPI.ObjectModels;
+using OSGeo.MapGuide.MaestroAPI.Exceptions;
+using OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using OSGeo.MapGuide.ObjectModels.FeatureSource;
+
+namespace Maestro.Base.UI
+{
+    public partial class ResourcePropertiesDialog : Form
+    {
+        private ResourcePropertiesDialog()
+        {
+            InitializeComponent();
+        }
+
+        private IResourceIconCache m_icons;
+        private IServerConnection m_connection;
+        private ResourceIdentifier m_resourceId;
+
+        private ResourceDocumentHeaderType m_resourceHeader;
+        private ResourceFolderHeaderType m_folderHeader;
+
+        private bool m_isUpdating = false;
+        private string[] m_srslist = null;
+
+        private const int RWUSER = 0;
+        private const int ROUSER = 1;
+        private const int NOUSER = 2;
+        private const int RWGROUP = 3;
+        private const int ROGROUP = 4;
+        private const int NOGROUP = 5;
+        private const int IHUSER = 6;
+        private const int IHGROUP = 7;
+
+        private string[] StatusNames =
+        {
+            Properties.Resources.ResProp_ReadWriteAccess,
+            Properties.Resources.ResProp_ReadOnlyAccess,
+            Properties.Resources.ResProp_NoAccess,
+            Properties.Resources.ResProp_ReadWriteAccess,
+            Properties.Resources.ResProp_ReadOnlyAccess,
+            Properties.Resources.ResProp_NoAccess,
+            Properties.Resources.ResProp_InheritedAccess,
+            Properties.Resources.ResProp_InheritedAccess
+        };
+
+        private object m_lock = new object();
+        private volatile System.Threading.Thread m_backgroundThread = null;
+        private bool m_hasLoadedRefs = false;
+        
+        private string m_openResource = null;
+
+        /// <summary>
+        /// A resource that the main form should open after this form has closed
+        /// </summary>
+        public string OpenResource { get { return m_openResource; } }
+
+        public ResourcePropertiesDialog(IResourceIconCache icons, IServerConnection connection, string resourceId)
+            : this()
+        {
+            m_connection = connection;
+            m_resourceId = resourceId;
+            ResourceID.Text = resourceId;
+            m_icons = icons;
+
+            InReferenceList.SmallImageList = OutReferenceList.SmallImageList = icons.SmallImageList;
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            Dictionary<string, ListViewItem> ul = new Dictionary<string, ListViewItem>();
+            Dictionary<string, ListViewItem> gl = new Dictionary<string, ListViewItem>();
+
+            UsersAndGroups.Items.Clear();
+            foreach (UserListUser u in m_connection.ResourceService.EnumerateUsers().Items)
+            {
+                ListViewItem lvi = new ListViewItem(new string[] { u.FullName, u.Description, StatusNames[IHUSER] }, IHUSER);
+                lvi.Tag = u;
+                UsersAndGroups.Items.Add(lvi);
+                ul.Add(u.Name, lvi);
+            }
+
+            foreach (GroupListGroup g in m_connection.ResourceService.EnumerateGroups().Group)
+            {
+                ListViewItem lvi = new ListViewItem(new string[] { g.Name, g.Description, StatusNames[IHGROUP] }, IHGROUP);
+                lvi.Tag = g;
+                UsersAndGroups.Items.Add(lvi);
+                gl.Add(g.Name, lvi);
+            }
+
+            if (m_resourceId.IsFolder)
+            {
+                m_folderHeader = m_connection.ResourceService.GetFolderHeader(m_resourceId);
+                if (m_folderHeader.Security.Users != null && m_folderHeader.Security.Users.User != null)
+                    foreach (ResourceSecurityTypeUsersUser u in m_folderHeader.Security.Users.User)
+                        if (ul.ContainsKey(u.Name))
+                            UpdateListItem(u, ul[u.Name]);
+
+                if (m_folderHeader.Security.Groups != null && m_folderHeader.Security.Groups.Group != null)
+                    foreach (ResourceSecurityTypeGroupsGroup g in m_folderHeader.Security.Groups.Group)
+                        if (gl.ContainsKey(g.Name))
+                            UpdateListItem(g, gl[g.Name]);
+
+                UseInherited.Checked = m_folderHeader.Security.Inherited;
+                tabControl1.TabPages.Remove(WMSTab);
+                tabControl1.TabPages.Remove(WFSTab);
+                tabControl1.TabPages.Remove(CustomTab);
+                tabControl1.TabPages.Remove(ReferenceTab);
+            }
+            else
+            {
+                m_resourceHeader = m_connection.ResourceService.GetResourceHeader(m_resourceId);
+                if (m_resourceHeader.Security.Users != null && m_resourceHeader.Security.Users.User != null)
+                    foreach (ResourceSecurityTypeUsersUser u in m_resourceHeader.Security.Users.User)
+                        if (ul.ContainsKey(u.Name))
+                            UpdateListItem(u, ul[u.Name]);
+
+                if (m_resourceHeader.Security.Groups != null && m_resourceHeader.Security.Groups.Group != null)
+                    foreach (ResourceSecurityTypeGroupsGroup g in m_resourceHeader.Security.Groups.Group)
+                        if (gl.ContainsKey(g.Name))
+                            UpdateListItem(g, gl[g.Name]);
+
+                UseInherited.Checked = m_resourceHeader.Security.Inherited;
+                if (m_resourceId.Extension != "LayerDefinition")
+                    tabControl1.TabPages.Remove(WMSTab);
+                else
+                    UpdateWMSDisplay();
+
+                if (m_resourceId.Extension != "FeatureSource")
+                    tabControl1.TabPages.Remove(WFSTab);
+                else
+                    UpdateWFSDisplay();
+            }
+
+            //Hide the tabControl if it only has one tab
+            if (tabControl1.TabCount == 1)
+            {
+                foreach (Control c in new System.Collections.ArrayList(tabControl1.TabPages[0].Controls))
+                {
+                    tabControl1.Controls.Remove(c);
+                    c.Top += tabControl1.Top;
+                    this.Controls.Add(c);
+
+                }
+
+                this.Controls.Remove(tabControl1);
+            }
+
+            this.Text = m_resourceId;
+            UseInherited_CheckedChanged(null, null);
+
+        }
+
+        private void UpdateWFSDisplay()
+        {
+            try
+            {
+                m_isUpdating = true;
+                if (m_resourceHeader.Metadata != null && m_resourceHeader.Metadata.Simple != null && m_resourceHeader.Metadata.Simple.Property != null)
+                {
+                    var props = m_resourceHeader.Metadata.GetProperties();
+
+                    WFSTitle.Text = props["_Title"];
+                    WFSKeywords.Text = props["_Keywords"];
+                    WFSAbstract.Text = props["_Abstract"];
+                    WFSMetadata.Text = props["_ExtendedMetadata"];
+
+                    WFSPrimarySRS.Text = props["_PrimarySRS"];
+                    WFSOtherSRS.Text = props["_OtherSRS"];
+                    WFSAvalible.Checked = props["_IsPublished"] == "1";
+                    WFSBounds.Text = props["_Bounds"];
+                }
+                else
+                {
+                    WFSTitle.Text =
+                    WFSKeywords.Text =
+                    WFSAbstract.Text =
+                    WFSMetadata.Text = "";
+
+                    WFSPrimarySRS.Text =
+                    WFSOtherSRS.Text =
+                    WFSBounds.Text = "";
+                    WFSAvalible.Checked = false;
+                }
+            }
+            finally
+            {
+                m_isUpdating = false;
+            }
+
+            UpdateCustomDisplay();
+        }
+
+        private void UpdateWMSDisplay()
+        {
+            try
+            {
+                m_isUpdating = true;
+                if (m_resourceHeader.Metadata != null && m_resourceHeader.Metadata.Simple != null && m_resourceHeader.Metadata.Simple.Property != null)
+                {
+                    var props = m_resourceHeader.Metadata.GetProperties();
+                    WMSTitle.Text = props["_Title"];
+                    WMSKeyWords.Text = props["_Keywords"];
+                    WMSAbstract.Text = props["_Abstract"];
+                    WMSMetadata.Text = props["_ExtendedMetadata"];
+
+                    WMSQueryable.Checked = props["_Queryable"] == "1";
+                    WMSOpaque.Checked = props["_Opaque"] == "1";
+                    WMSAvalible.Checked = props["_IsPublished"] == "1";
+                    WMSBounds.Text = props["_Bounds"];
+                }
+                else
+                {
+                    WMSTitle.Text =
+                    WMSKeyWords.Text =
+                    WMSAbstract.Text =
+                    WMSMetadata.Text = "";
+
+                    WMSQueryable.Checked =
+                    WMSOpaque.Checked =
+                    WMSAvalible.Checked = false;
+
+                    WMSBounds.Text = "";
+                }
+            }
+            finally
+            {
+                m_isUpdating = false;
+            }
+            UpdateCustomDisplay();
+        }
+
+        private void UpdateCustomDisplay()
+        {
+            dataGridView1.Rows.Clear();
+            if (m_resourceHeader.Metadata != null && m_resourceHeader.Metadata.Simple != null && m_resourceHeader.Metadata.Simple.Property != null)
+            {
+                foreach (ResourceDocumentHeaderTypeMetadataSimpleProperty prop in m_resourceHeader.Metadata.Simple.Property)
+                    dataGridView1.Rows.Add(new string[] { prop.Name, prop.Value });
+            }
+        }
+
+        private void UseInherited_CheckedChanged(object sender, EventArgs e)
+        {
+            UsersAndGroups.Enabled = !UseInherited.Checked;
+        }
+
+        private void UpdateListItem(ResourceSecurityTypeUsersUser u, ListViewItem lvi)
+        {
+            if (u == null)
+                lvi.ImageIndex = IHUSER;
+
+            switch (u.Permissions)
+            {
+                case PermissionsType.rw:
+                    lvi.ImageIndex = RWUSER;
+                    break;
+                case PermissionsType.r:
+                    lvi.ImageIndex = ROUSER;
+                    break;
+                case PermissionsType.n:
+                    lvi.ImageIndex = NOUSER;
+                    break;
+            }
+
+            lvi.SubItems[2].Text = StatusNames[lvi.ImageIndex];
+        }
+
+        private void UpdateListItem(ResourceSecurityTypeGroupsGroup g, ListViewItem lvi)
+        {
+            if (g == null)
+                lvi.ImageIndex = IHGROUP;
+
+            switch (g.Permissions)
+            {
+                case PermissionsType.rw:
+                    lvi.ImageIndex = RWGROUP;
+                    break;
+                case PermissionsType.r:
+                    lvi.ImageIndex = ROGROUP;
+                    break;
+                case PermissionsType.n:
+                    lvi.ImageIndex = NOGROUP;
+                    break;
+            }
+            lvi.SubItems[2].Text = StatusNames[lvi.ImageIndex];
+        }
+
+        private void ClearHeaderButton_Click(object sender, EventArgs e)
+        {
+            m_resourceHeader.Metadata = null;
+            UpdateCustomDisplay();
+        }
+
+        private void WMSTitle_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Title", WMSTitle.Text);
+        }
+
+        private void EnsureMetaData()
+        {
+            if (m_resourceHeader != null)
+            {
+                /*
+                if (m_resourceHeader.Metadata == null)
+                    m_resourceHeader.Metadata = new ResourceDocumentHeaderTypeMetadata();
+                if (m_resourceHeader.Metadata.Simple == null)
+                    m_resourceHeader.Metadata.Simple = new ResourceDocumentHeaderTypeMetadataSimple();
+                if (m_resourceHeader.Metadata.Simple.Property == null)
+                    m_resourceHeader.Metadata.Simple.Property = new ResourceDocumentHeaderTypeMetadataSimplePropertyCollection();
+                */
+
+                if (m_resourceId.Extension == "LayerDefinition")
+                {
+                    if (m_resourceHeader.Metadata == null)
+                        m_resourceHeader.Metadata = ObjectFactory.CreateMetadata();
+
+                    var props = m_resourceHeader.Metadata.GetProperties();
+                    bool apply = false;
+
+                    if (props["_Title"] == null)
+                    {
+                        props["_Title"] = "";
+                        apply = true;
+                    }
+
+                    if (props["_Keywords"] == null)
+                    {
+                        props["_Keywords"] = "";
+                        apply = true;
+                    }
+
+                    if (props["_Abstract"] == null)
+                    {
+                        props["_Abstract"] = "";
+                        apply = true;
+                    }
+
+                    if (props["_ExtendedMetadata"] == null)
+                    {
+                        props["_ExtendedMetadata"] = "";
+                        apply = true;
+                    }
+
+                    if (props["_Queryable"] == null)
+                    {
+                        props["_Queryable"] = "0";
+                        apply = true;
+                    }
+
+                    if (props["_Opaque"] == null)
+                    {
+                        props["_Opaque"] = "0";
+                        apply = true;
+                    }
+
+                    if (props["_IsPublished"] == null)
+                    {
+                        props["_IsPublished"] = "0";
+                        apply = true;
+                    }
+
+                    if (props["_Bounds"] == null)
+                    {
+                        props["_Bounds"] = "";
+                        apply = true;
+                    }
+
+                    if (apply)
+                        m_resourceHeader.Metadata.ApplyProperties(props);
+                }
+            }
+        }
+
+        private void WMSKeyWords_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Keywords", WMSKeyWords.Text);
+        }
+
+        private void WMSAbstract_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Abstract", WMSAbstract.Text);
+        }
+
+        private void WMSMetadata_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_ExtendedMetadata", WMSMetadata.Text);
+        }
+
+        private void WMSAvalible_CheckedChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_IsPublished", Convert.ToInt32(WMSAvalible.Checked).ToString());
+        }
+
+        private void WMSBounds_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Bounds", WMSBounds.Text);
+        }
+
+        private void WMSQueryable_CheckedChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Queryable", Convert.ToInt32(WMSQueryable.Checked).ToString());
+        }
+
+        private void WMSOpaque_CheckedChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Opaque", Convert.ToInt32(WMSOpaque.Checked).ToString());
+        }
+
+        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (tabControl1.SelectedTab == CustomTab)
+                UpdateCustomDisplay();
+            else if (tabControl1.SelectedTab == WMSTab)
+                UpdateWMSDisplay();
+            else if (tabControl1.SelectedTab == WFSTab)
+            {
+                FillCoordSysLists();
+                UpdateWFSDisplay();
+            }
+            else if (tabControl1.SelectedTab == ReferenceTab)
+            {
+                if (!m_hasLoadedRefs)
+                {
+                    LoadingReferences.Visible = true;
+                    ReferenceWorker.RunWorkerAsync(m_resourceId);
+                }
+            }
+        }
+
+        private void FillCoordSysLists()
+        {
+            if (WFSPrimarySRS.Items.Count == 0)
+            {
+                try
+                {
+                    List<string> items = new List<string>();
+                    foreach (OSGeo.MapGuide.MaestroAPI.CoordinateSystem.CoordinateSystemBase c in m_connection.CoordinateSystemCatalog.Coordsys)
+                    {
+                        if (c.Code.StartsWith("EPSG:"))
+                            items.Add(c.Code);
+                    }
+
+                    m_srslist = items.ToArray();
+                    try
+                    {
+                        WFSPrimarySRS.BeginUpdate();
+                        WFSPrimarySRS.Items.AddRange(m_srslist);
+                    }
+                    finally
+                    {
+                        WFSPrimarySRS.EndUpdate();
+                    }
+
+                    try
+                    {
+                        WFSOtherSRS.BeginUpdate();
+                        WFSOtherSRS.Items.AddRange(m_srslist);
+                    }
+                    finally
+                    {
+                        WFSOtherSRS.EndUpdate();
+                    }
+                }
+                catch
+                {
+                }
+            }
+        }
+
+        private void WFSTitle_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Title", WFSTitle.Text);
+        }
+
+        private void WFSKeywords_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Keywords", WFSKeywords.Text);
+        }
+
+        private void WFSAbstract_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Abstract", WFSAbstract.Text);
+        }
+
+        private void WFSMetadata_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_ExtendedMetadata", WFSMetadata.Text);
+        }
+
+        private void checkBox3_CheckedChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_IsPublished", Convert.ToInt32(WFSAvalible.Checked).ToString());
+        }
+
+        private void WFSPrimarySRS_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_PrimarySRS", WFSPrimarySRS.Text);
+        }
+
+        private void WFSOtherSRS_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_OtherSRS", WFSOtherSRS.Text);
+        }
+
+        private void WFSBounds_TextChanged(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            EnsureMetaData();
+            m_resourceHeader.Metadata.SetProperty("_Bounds", WFSBounds.Text);
+        }
+
+        private void WFSClearHeaderButton_Click(object sender, EventArgs e)
+        {
+            if (m_isUpdating)
+                return;
+            m_resourceHeader.Metadata = null;
+            UpdateWFSDisplay();
+        }
+
+        private void dataGridView1_Leave(object sender, EventArgs e)
+        {
+            EnsureMetaData();
+            m_resourceHeader.Metadata.Simple.Property.Clear();
+
+            foreach (DataGridViewRow dr in dataGridView1.Rows)
+            {
+                string k = dr.Cells[0].Value == null || dr.Cells[0].Value == DBNull.Value ? "" : dr.Cells[0].Value.ToString();
+                string v = dr.Cells[1].Value == null || dr.Cells[1].Value == DBNull.Value ? "" : dr.Cells[1].Value.ToString();
+
+                if (!string.IsNullOrEmpty(k))
+                    m_resourceHeader.Metadata.SetProperty(k, v);
+            }
+        }
+
+        private void OKBtn_Click(object sender, EventArgs e)
+        {
+            m_openResource = null;
+
+            try
+            {
+                //Update security info
+                if (m_resourceId.IsFolder)
+                {
+                    m_folderHeader.Security.Inherited = UseInherited.Checked;
+                    if (m_folderHeader.Security.Inherited)
+                    {
+                        m_folderHeader.Security.Groups = null;
+                        m_folderHeader.Security.Users = null;
+                    }
+                    else
+                    {
+                        m_folderHeader.Security.Groups = ObjectFactory.CreateSecurityGroup();
+                        m_folderHeader.Security.Users = ObjectFactory.CreateSecurityUser();
+                        //m_folderHeader.Security.Groups.Group = new ResourceSecurityTypeGroupsGroupCollection();
+                        //m_folderHeader.Security.Users.User = new ResourceSecurityTypeUsersUserCollection();
+                        ReadSecurityData(m_folderHeader.Security.Groups.Group, m_folderHeader.Security.Users.User);
+                    }
+                }
+                else
+                {
+                    m_resourceHeader.Security.Inherited = UseInherited.Checked;
+                    if (m_resourceHeader.Security.Inherited)
+                    {
+                        m_resourceHeader.Security.Groups = null;
+                        m_resourceHeader.Security.Users = null;
+                    }
+                    else
+                    {
+                        m_resourceHeader.Security.Groups = ObjectFactory.CreateSecurityGroup();
+                        m_resourceHeader.Security.Users = ObjectFactory.CreateSecurityUser();
+                        //m_resourceHeader.Security.Groups.Group = new ResourceSecurityTypeGroupsGroupCollection();
+                        //m_resourceHeader.Security.Users.User = new ResourceSecurityTypeUsersUserCollection();
+                        ReadSecurityData(m_resourceHeader.Security.Groups.Group, m_resourceHeader.Security.Users.User);
+                    }
+                }
+
+                //Save header
+                if (m_resourceId.IsFolder)
+                    m_connection.ResourceService.SetFolderHeader(m_resourceId, m_folderHeader);
+                else
+                    m_connection.ResourceService.SetResourceHeader(m_resourceId, m_resourceHeader);
+            }
+            catch (Exception ex)
+            {
+                string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
+                MessageBox.Show(this, string.Format(Properties.Resources.ResProp_SaveError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return;
+            }
+
+            this.DialogResult = DialogResult.OK;
+            this.Close();
+        }
+
+        private void ReadSecurityData(IList<ResourceSecurityTypeGroupsGroup> groups, IList<ResourceSecurityTypeUsersUser> users)
+        {
+            foreach (ListViewItem lvi in UsersAndGroups.Items)
+            {
+                if (lvi.Tag as UserListUser != null)
+                {
+                    ResourceSecurityTypeUsersUser u = new ResourceSecurityTypeUsersUser();
+                    u.Name = (lvi.Tag as UserListUser).Name;
+                    if (lvi.ImageIndex == RWUSER)
+                        u.Permissions = PermissionsType.rw;
+                    else if (lvi.ImageIndex == ROUSER)
+                        u.Permissions = PermissionsType.r;
+                    else if (lvi.ImageIndex == NOUSER)
+                        u.Permissions = PermissionsType.n;
+                    else
+                        continue;
+                    users.Add(u);
+                }
+                else if (lvi.Tag as GroupListGroup != null && lvi.ImageIndex != IHGROUP)
+                {
+                    ResourceSecurityTypeGroupsGroup g = new ResourceSecurityTypeGroupsGroup();
+                    g.Name = (lvi.Tag as GroupListGroup).Name;
+                    if (lvi.ImageIndex == RWGROUP)
+                        g.Permissions = PermissionsType.rw;
+                    else if (lvi.ImageIndex == ROGROUP)
+                        g.Permissions = PermissionsType.r;
+                    else if (lvi.ImageIndex == NOGROUP)
+                        g.Permissions = PermissionsType.n;
+                    else
+                        continue;
+                    groups.Add(g);
+                }
+            }
+        }
+
+        private void securityContextMenu_Opening(object sender, CancelEventArgs e)
+        {
+            readWriteAccessToolStripMenuItem.Enabled =
+                readOnlyAccessToolStripMenuItem.Enabled =
+                denyAccessToolStripMenuItem.Enabled =
+                inheritedAccessRightsToolStripMenuItem.Enabled =
+                    UsersAndGroups.SelectedItems.Count > 0;
+        }
+
+        private void readWriteAccessToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            foreach (ListViewItem lvi in UsersAndGroups.SelectedItems)
+            {
+                if (lvi.Tag as UserListUser != null)
+                    lvi.ImageIndex = RWUSER;
+                else
+                    lvi.ImageIndex = RWGROUP;
+
+                lvi.SubItems[2].Text = StatusNames[lvi.ImageIndex];
+            }
+        }
+
+        private void readOnlyAccessToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            foreach (ListViewItem lvi in UsersAndGroups.SelectedItems)
+            {
+                if (lvi.Tag as UserListUser != null)
+                    lvi.ImageIndex = ROUSER;
+                else
+                    lvi.ImageIndex = ROGROUP;
+
+                lvi.SubItems[2].Text = StatusNames[lvi.ImageIndex];
+            }
+        }
+
+        private void denyAccessToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            foreach (ListViewItem lvi in UsersAndGroups.SelectedItems)
+            {
+                if (lvi.Tag as UserListUser != null)
+                    lvi.ImageIndex = NOUSER;
+                else
+                    lvi.ImageIndex = NOGROUP;
+
+                lvi.SubItems[2].Text = StatusNames[lvi.ImageIndex];
+            }
+        }
+
+        private void inheritedAccessRightsToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            foreach (ListViewItem lvi in UsersAndGroups.SelectedItems)
+            {
+                if (lvi.Tag as UserListUser != null)
+                    lvi.ImageIndex = IHUSER;
+                else
+                    lvi.ImageIndex = IHGROUP;
+
+                lvi.SubItems[2].Text = StatusNames[lvi.ImageIndex];
+            }
+        }
+
+        private void EditWMSBounds_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                if (m_srslist == null)
+                {
+                    List<string> items = new List<string>();
+                    foreach (OSGeo.MapGuide.MaestroAPI.CoordinateSystem.CoordinateSystemBase c in m_connection.CoordinateSystemCatalog.Coordsys)
+                    {
+                        if (c.Code.StartsWith("EPSG:"))
+                            items.Add(c.Code);
+                    }
+
+                    m_srslist = items.ToArray();
+                }
+            }
+            catch
+            {
+            }
+
+            BoundsPicker bp = new BoundsPicker(WMSBounds.Text, m_srslist);
+            if (bp.ShowDialog(this) == DialogResult.OK)
+                WMSBounds.Text = bp.SRSBounds;
+        }
+
+        private void EditWFSBounds_Click(object sender, EventArgs e)
+        {
+            BoundsPicker bp = new BoundsPicker(WFSBounds.Text, null);
+            if (bp.ShowDialog(this) == DialogResult.OK)
+                WFSBounds.Text = bp.SRSBounds;
+        }
+
+        private void AutoGenerateWMSBounds_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                string srs = "EPSG:????";
+                string bounds = WMSBounds.Text;
+                bool warnedEPSG = false;
+
+                try
+                {
+                    if (!string.IsNullOrEmpty(bounds))
+                    {
+                        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
+                        if (bounds.Trim().StartsWith("&lt;"))
+                            bounds = System.Web.HttpUtility.HtmlDecode(bounds);
+                        bounds = "<root>" + bounds + "</root>";
+                        doc.LoadXml(bounds);
+                        System.Xml.XmlNode root = doc["root"];
+                        if (root["Bounds"] != null)
+                        {
+                            if (root["Bounds"].Attributes["SRS"] != null)
+                                srs = root["Bounds"].Attributes["SRS"].Value;
+                        }
+                        else
+                            throw new Exception(Properties.Resources.ResProp_MissingBoundsError);
+                    }
+                }
+                catch (Exception ex)
+                {
+                    string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
+                    warnedEPSG = true;
+                    MessageBox.Show(this, string.Format(Properties.Resources.ResProp_BoundsDecodeError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+
+                System.Globalization.CultureInfo ic = System.Globalization.CultureInfo.InvariantCulture;
+                ILayerDefinition ldef = (ILayerDefinition)m_connection.ResourceService.GetResource(m_resourceId);
+                var env = ldef.GetSpatialExtent(true);
+
+                //TODO: Convert to lon/lat
+
+                bounds = "<Bounds west=\"" + env.MinX.ToString(ic) + "\" east=\"" + env.MaxX.ToString(ic) + "\" south=\"" + env.MinY.ToString(ic) + "\" north=\"" + env.MaxY.ToString(ic) + "\" ";
+                bounds += " SRS=\"" + srs + "\"";
+                bounds += " />";
+
+                WMSBounds.Text = bounds;
+
+                if ((srs == "" || srs == "EPSG:????") && !warnedEPSG)
+                {
+                    MessageBox.Show(this, Properties.Resources.ResProp_EpsgMissingWarning, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                    WMSBounds.SelectionStart = WMSBounds.Text.IndexOf("SRS=\"") + "SRS=\"".Length;
+                    WMSBounds.SelectionLength = WMSBounds.Text.IndexOf("\"", WMSBounds.SelectionStart) - WMSBounds.SelectionStart;
+                    WMSBounds.ScrollToCaret();
+                    WMSBounds.Focus();
+                }
+            }
+            catch (Exception ex)
+            {
+                string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
+                MessageBox.Show(this, string.Format(Properties.Resources.ResProp_WMSBoundsReadError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void AutoGenerateWFSBounds_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                System.Globalization.CultureInfo ic = System.Globalization.CultureInfo.InvariantCulture;
+                FeatureSourceType fs = (FeatureSourceType)m_connection.ResourceService.GetResource(m_resourceId);
+                bool failures = false;
+
+                Envelope env = null;
+                foreach (FeatureSourceDescription.FeatureSourceSchema scm in fs.Describe().Schemas)
+                {
+                    foreach (FeatureSetColumn col in scm.Columns)
+                    {
+                        if (col.Type == Utility.GeometryType || col.Type == Utility.RasterType)
+                        {
+                            try
+                            {
+                                Envelope re = m_connection.FeatureService.GetSpatialExtent(fs.ResourceID, scm.Name, col.Name, true);
+                                if (env == null)
+                                    env = re;
+                                else
+                                    env.ExpandToInclude(re);
+                            }
+                            catch
+                            {
+                                failures = true;
+                            }
+                        }
+                    }
+                }
+
+                if (env == null)
+                    throw new Exception(failures ? Properties.Resources.ResProp_NoSpatialDataWithFailuresError : Properties.Resources.ResProp_NoSpatialDataError);
+
+                WFSBounds.Text = "<Bounds west=\"" + env.MinX.ToString(ic) + "\" east=\"" + env.MaxX.ToString(ic) + "\" south=\"" + env.MinY.ToString(ic) + "\" north=\"" + env.MaxY.ToString(ic) + "\" />";
+            }
+            catch (Exception ex)
+            {
+                string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
+                MessageBox.Show(this, string.Format(Properties.Resources.ResProp_WFSBoundsReadError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void ReferenceWorker_DoWork(object sender, DoWorkEventArgs e)
+        {
+            try
+            {
+                lock(m_lock)
+                    m_backgroundThread = System.Threading.Thread.CurrentThread;
+
+                string resourceId = (ResourceIdentifier)e.Argument;
+
+                List<string> lst = new List<string>();
+                foreach (string s in  m_connection.ResourceService.EnumerateResourceReferences(resourceId).ResourceId)
+                    if (!lst.Contains(s))
+                        lst.Add(s);
+
+                System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
+                using (var ms = m_connection.ResourceService.GetResourceXmlData(resourceId))
+                {
+                    doc.Load(ms);
+                }
+
+                List<KeyValuePair<System.Xml.XmlNode, string>> refs = Utility.GetResourceIdPointers(doc);
+                List<string> r = new List<string>();
+                foreach (KeyValuePair<System.Xml.XmlNode, string> s in refs)
+                    if (!r.Contains(s.Value))
+                        r.Add(s.Value);
+                e.Result = new object[] { lst, r };
+            }
+            catch(System.Threading.ThreadAbortException)
+            {
+                System.Threading.Thread.ResetAbort();
+                e.Cancel = true;
+                return;
+            }
+            finally
+            {
+                lock(m_lock)
+                    m_backgroundThread = null;
+            }
+        }
+
+        private void ReferenceWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
+        {
+            LoadingReferences.Visible = false;
+
+            if (e.Cancelled)
+            {
+                this.Close();
+                return;
+            }
+            if (e.Error != null || e.Result as object[] == null || (e.Result as object[]).Length != 2)
+            {
+                if (e.Error != null)
+                    MessageBox.Show(this, string.Format(Properties.Resources.ResProp_ReferenceReadSpecificError, e.Error.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                else
+                    MessageBox.Show(this, Properties.Resources.ResProp_ReferenceReadError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+
+                return;
+            }
+
+            OutReferences.Enabled = InReferences.Enabled = true;
+
+            List<string> l1 = ((object[])e.Result)[0] as List<string>;
+            List<string> l2 = ((object[])e.Result)[1] as List<string>;
+
+            foreach (string s in l2)
+                OutReferenceList.Items.Add(s, m_icons.GetImageIndexFromResourceID(s));
+
+            foreach (string s in l1)
+                InReferenceList.Items.Add(s, m_icons.GetImageIndexFromResourceID(s));
+
+            m_hasLoadedRefs = true;
+        }
+
+        private void OutReferenceList_DoubleClick(object sender, EventArgs e)
+        {
+            if (OutReferenceList.SelectedItems.Count == 1)
+            {
+                m_openResource = OutReferenceList.SelectedItems[0].Text;
+                this.Close();
+            }
+        }
+
+        private void InReferenceList_DoubleClick(object sender, EventArgs e)
+        {
+            if (InReferenceList.SelectedItems.Count == 1)
+            {
+                m_openResource = InReferenceList.SelectedItems[0].Text;
+                this.Close();
+            }
+        }
+
+        private void CancelBtn_Click(object sender, EventArgs e)
+        {
+            m_openResource = null;
+        }
+
+        private void OnFormClosing(object sender, FormClosingEventArgs e)
+        {
+            lock (m_lock)
+            {
+                if (m_backgroundThread != null)
+                {
+                    this.Enabled = false;
+                    m_backgroundThread.Abort();
+                    e.Cancel = true;
+                    return;
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.resx	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,356 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="AutoGenerateWMSBounds.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAXNJREFUOE+tkrFL
+        AnEcxYWmoD+gsc3FpaFNqsnBKBpqCII22xy6IQNxqcEWwUmIDiKMME2oJSEi4VoqCCoIo646Q07zyAw8
+        0OJevZ8YRkIcdfAdjt+9z/e9dz+H47+f22APXi9WQa6p7aCcmYaRGUf1RBLTcV8kEkE4HMbV8RaeUv2o
+        Hg2hcjiIh5gTpZQHDWMG5rUXpaQLzwfe76B4fAO6rqO4O4fHFSca92Ow7gZgXnqghrpQSvThrTiBen4S
+        utwtYOXtXpj59aabaDQK06yhdrOHwtqo2PxeGBGCYmIYdUMRkIoy25zP8x9RCDEMA7ncObSYS1jfX3JD
+        S06JLS+noc7Z2wtp9XC27EZ2cxGBhQCCwfnfhe0QWZYhSRLoiN2wWJ/PZw9CoN/vF2JC6OzPEDoilEBb
+        944idkFhezxbEAI4BGiaBlVVRSxbEPbBGJZlieEvtw1hDEVRviC8fITacsKP0+m0gDCO7VJb22ifnfD9
+        A5gpQ9n5eKQcAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="AutoGenerateWFSBounds.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAXNJREFUOE+tkrFL
+        AnEcxYWmoD+gsc3FpaFNqsnBKBpqCII22xy6IQNxqcEWwUmIDiKMME2oJSEi4VoqCCoIo646Q07zyAw8
+        0OJevZ8YRkIcdfAdjt+9z/e9dz+H47+f22APXi9WQa6p7aCcmYaRGUf1RBLTcV8kEkE4HMbV8RaeUv2o
+        Hg2hcjiIh5gTpZQHDWMG5rUXpaQLzwfe76B4fAO6rqO4O4fHFSca92Ow7gZgXnqghrpQSvThrTiBen4S
+        utwtYOXtXpj59aabaDQK06yhdrOHwtqo2PxeGBGCYmIYdUMRkIoy25zP8x9RCDEMA7ncObSYS1jfX3JD
+        S06JLS+noc7Z2wtp9XC27EZ2cxGBhQCCwfnfhe0QWZYhSRLoiN2wWJ/PZw9CoN/vF2JC6OzPEDoilEBb
+        944idkFhezxbEAI4BGiaBlVVRSxbEPbBGJZlieEvtw1hDEVRviC8fITacsKP0+m0gDCO7VJb22ifnfD9
+        A5gpQ9n5eKQcAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <metadata name="ItemKey.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ItemValue.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ReferenceWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="UserAndGroupImages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>154, 17</value>
+  </metadata>
+  <data name="UserAndGroupImages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAS
+        KwAAAk1TRnQBSQFMAgEBCAEAARQBAAEUAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABMAMAAQEBAAEgBgABMP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AQgABVQICAasBUQFU
+        AWIB+WAAAR4BbAEQAf4BZAGlAWMB/wFxAa8BcAH/AW0BrAFtAf8BaAGoAWgB/wFkAaUBZAH/AWIBowFh
+        Af8BZQGmAWUB/wFnAacBZgH/AWkBqQFpAf8BQwGBAUMB/wEMAUEBDAH/ATYCAQFXFAABRQIBAXkBNgGF
+        ATYB/wFQAZcBTwH/AU0BlQFMAf8BSAGRAUgB/wFCAY0BQgH/AUEBjAFBAf8BRgGPAUUB/wFEAYsBRAH/
+        AQwBOgEMAf8BHwGBAR8B/wEuAgEBRhQAAQcCAQIHAgEBCAEFAgEBBQFgAggB1QFNAaIBwAH+AVEBVAFj
+        AfkBBQIBAQUBAgMBIAABBwIBAgcCAQEIAQUCAQEFAQMCAQIDAgEBAwEeAgEBKQErARcBTwH7ASsBFwF+
+        AfsBKwEXAVsB+wE/AgEBaQgAAT8CAQFpAYEB1QGBAf8BPQG9ATsB/wE9Ab0BOwH/AT0BvQE7Af8BPQG9
+        ATsB/wFDAb4BQQH/AWAByAFfAf8BPQG9ATsB/wE9Ab0BOwH/AT0BvQE7Af8BWAF/AS4B/wGTAQwBHQH/
+        ARwBgQEcAf8UAAFUAZoBVAH/AT0BvQE7Af8BPQG9ATsB/wE9Ab0BOwH/AT0BvQE7Af8BUwHEAVEB/wFO
+        AcIBTAH/AT0BvQE7Af8BOwG3ATkB/wGUAQwBHgH/AT0BvQE7Af8BNgGGATYB/wwAAQ0CAQEPAXoBigFm
+        Af4BgAGiAXYB/gGAAaIBdgH+AYABogF3Af4BgAGgAXcB/gFGAYsBqQH+AZIBzAHqAf8BqwGlAaYB/wGp
+        AaoBowH/AbEBsAGrAf8BrQKYAf4BBgIBAQYMAAENAgEBDwF6AYoBZgH+AYABogF2Af4BgAGiAXYB/gGA
+        AaIBdwH+AYABoAF3Af4BgAGWAXQB/gIRAecB/wETARUBtAH/AUMBTAFBAf4BLQEgAWoB/gEmARMBsQH+
+        AUECAQFwBAABUQICAZ4BaAHKAWcB/wE9Ab0BOwH/AT0BvQE7Af8BPQG9ATsB/wE9Ab0BOwH/AVIBmAFR
+        Af8BMgGBATAB/wF8AdEBegH/AT0BvQE7Af8BPQG9ATsB/wE8AbwBOgH/ATEBkAEvAf8BUAGXAU8B/xQA
+        AXUBswF0Af8BPQG9ATsB/wE9Ab0BOwH/AT0BvQE7Af8BRAG/AUIB/wEgAYEBHgH/AR8BgQEeAf8BQQG+
+        AT8B/wE9Ab0BOwH/ASgBegEnAf8BPQG9ATsB/wFjAaUBYgH/DAABQwIBAXYBUwGXAUEB/gFLAZIBQQH+
+        AUsBkgFBAf4BSwGSAUEB/gF4AYcBZAH+AYABngF4Af4BpQGiAaAB/wHFAdwBqwH/AcoB2wGZAf8B3AHb
+        AZ0B/wFaAgUBwQG1AqQB/gwAAUMCAQF2AVMBlwFBAf4BSwGSAUEB/gFLAZIBQQH+AUsBkgFBAf4BeAGH
+        AWQB/gE1ASgBYgH+AREBEwHgAf8BEwEYAYAB/wE/AVgBLwH+AYABoAF3Af4BXQEPAREB6gEsARUBcwH8
+        BAABUgICAaIBZgHJAWUB/wE8AbwBOwH/ATwBvAE7Af8BPAG8ATsB/wF1Ac4BdAH/AWwBoAFoAv8C9wH/
+        AVoBngFZAf8BPAG8ATsB/wE8AbwBOwH/ATABjQEvAf8BjQEMAR0B/wEsAVABJgH/CAABFgIBARwBQAIB
+        AW0BQQIBAW8BegG2AXkB/wE8AbsBOwH/ATwBuwE7Af8BPAG7ATsB/wGGAdABhQH/AecB6gHgAf8B1AHh
+        Ac4B/wGEAdMBgwH/ATwBuwE7Af8BlAEMAR4B/wExAT0BGwH/AWoBqQFpAf8MAAFJAgIBgwFQAZUBQQH+
+        AUsBkgFBAf4BSwGSAUEB/gFxAZ4BXQH+AZgBngF/Af4BUAF/AUEB/gGnAqIB/wHJAdsBmQH/AckB1wGL
+        Af8B2wHWAYYB/wFeAgYBygF5ATYBMwH2DAABSQICAYMBUAGVAUEB/gFLAZIBQQH+AUsBkgFBAf4BcQGe
+        AV0B/gGYAZ4BfwH+AREBEwGTAf8BEgEVAZQB/wFLAZIBQQH+ARIBFQGjAf8BcgF/AV4B/gFNAgIBkwEm
+        ARMBsQH+BAABTQICAZMBbQHJAWwB/wE7AbgBOgH/ATsBuAE6Af8BOwG4AToB/wGBAbkBgAH/AfwB9QH0
+        Af8B/gL2Af8BQwGLAT8B/wFUAcEBUwH/ATsBuAE6Af8BOwG4AToB/wFGAaMBNgH/AZQBDAEeAf8BLQIB
+        AUQBEwIBARgB6AG4AYIB/wHkAZ8BUwH/AcwBjgFLAf8BdAGvAXIB/wE6AbYBOQH/AToBtgE5Af8BOgG2
+        ATkB/wFMAZMBSQH/AfwB9QH0Af8B/AH1AfQB/wFYAZsBVgH/AToBtgE5Af8BPAGyATkB/wGRARABHgH/
+        ASUBOQEYAf8BDQIBARABsAF/AWgB/gG8AYIBcwH+AYABfwFBAf4BUgGSAUEB/gFKAY0BQAH+AUoBjQFA
+        Af4BegGGAWUB/gHTAbwBuwH+AcMBtgGwAf4BsQKsAf8ByQHWAYsB/wHJAdABgQH/AeEB1wGEAf8BZwIO
+        AeUBigFNAUwB+QENAgEBEAGwAX8BaAH+AbwBggFzAf4BgAF/AUEB/gFSAZIBQQH+AUoBjQFAAf4BSgGN
+        AUAB/gF6AYYBZQH+AdMBvAG7Af4BSgE+AWkB/gIRAecB/wFKAYcBQAH+AUoBiQFAAf4BEwEVAccB/wFe
+        ARMBGwHyASwBFQFpAfwEAAEzAgEBUAGIAdMBhwH/ATkBswE4Af8BOQGzATgB/wE9AbQBPAH/ATUBgQEx
+        Af8B3wLYAf8B2QLSAf8BwAHNAbkB/wGOAdABjQH/AXQBDAEYAf8BSAGYATQB/wE6AbMBOgH/AZQBDAEe
+        Af8BNgIBAVUBPAIBAWQB5QGgAVUB/wHjAZgBRQH/AdUBjwFBAf8BPwGKAToB/wE8AbEBPAH/ATgBsAE3
+        Af8BTgG2AU0B/wFlAYoBYAH/AYEBmgHAAf8BgQGbAcAB/wE9AQ0BEgH/AW4BXwEqAf8BOAGwATcB/wGC
+        ASkBIgH/AU8BHgEMAfUBQgIBAXIBvAF/AUEB/gG8AX8BQQH+AY0BewE/Af4BgAGcAXAB/gFJAYYBPgH+
+        AUoBhgE/Af4BUgF/AUEB/gGOAYQBlAH+AZ8BjQGVAf4BpQGoAaEB/wG+Ac0BngH/AdEB0AGBAf8B7QHg
+        AacB/wFhAggB1gFyAisB9QFCAgEBcgG8AX8BQQH+AbwBfwFBAf4BjQF7AT8B/gGAAZwBcAH+AUkBhgE+
+        Af4BSgGGAT8B/gFSAX8BQQH+AY4BhAGUAf4BmwGKAZEB/gIRAdkB/wERARMB3AH/AS0BKAFXAf4BFQEX
+        AacB/wEmARMBsQH+ASwCAQFCCAABUQGVAUwB/wFQAbYBTwH/ATcBrAE3Af8BcQG0AXEB/wEmAXkBmAH/
+        AREBdwHVAf8BKwGBAdkB/wETAXYB0gH/AUkBgQFaAf8BJwErARYB/wGDAQwBGwH/AZQBDAEeAf8BXAIS
+        Ae8EAAE+AgEBZwHjAZ4BUwH/AeEBlgFEAf8B4AGVAUQB/wGuAY0BbAH/AVkBmgFUAf8BgQHJAYEB/wFK
+        AYoBnwH/AYABrgHqAf8BqQHWAf4B/wGqAdcB/gH/AVwBXgFlAf8BfwEMARoB/wGUAQwBHgH/AWQBDAEW
+        Af8BBwIBAQcBRQIBAXkBvAF/AUEB/gG8AX8BQQH+AbMBfwFBAf4BVQF1ATwB/gGAAZcBegH+AV0BfwFy
+        Af4BcQF/Aa8B/gGTAaUBwAH+AZcBpgHAAf4BRAF8AaYB/gGeAY0BiQH+AdEBzgHNAf8BqQGTAZIB/gFt
+        AhQB7AQAAUUCAQF5AbwBfwFBAf4BvAF/AUEB/gGzAX8BQQH+AVUBdQE8Af4BgAGXAXoB/gFdAX8BcgH+
+        AXEBfwGvAf4BkwGlAcAB/gGXAaYBwAH+AUUBegGkAf4BNgEpAVsB/gESARMBpgH/AUoBEgEuAfgBHwIB
+        ASoMAAEJAgEBCgFPATYBIgH2AXMBpwFwAf8BDgF1AdIB/wG4Ad0B/QH/AY0BygL/AYwByQL/AZYBzgH+
+        Af8BcAGlAecB/wFiAZUBjAH/AU0BkgFHAf8BSQICAYQIAAEwAgEBSQHgAZ0BXQH/AdwBjQFCAf8B3AGN
+        AUIB/wGvAW0BTQH/AdcC0QH/AY0BmAGeAf8BmwHIAfMB/wGKAcgC/wGJAcgC/wGJAcgC/wGIAccC/wGK
+        AbwB7wH/ASYCAQE2CAABNgIBAVYBuAF/AUEB/gG3AX8BQQH+AbwBfwFhAf4BvQGlAaMB/gGfAYcBhgH+
+        AX0BfwGyAf4BgAGbAcEB/gGAAZsBwQH+AYABmwHBAf4BgAGbAcEB/gFHATUBVQH5EAABNgIBAVYBuAF/
+        AUEB/gG3AX8BQQH+AbwBfwFhAf4BvQGlAaMB/gGfAYcBhgH+AX0BfwGyAf4BgAGbAcEB/gGAAZsBwQH+
+        AYABmwHBAf4BgAGbAcEB/gFHATUBVQH5IAABVAICAagBtgHcAf0B/wGIAccC/wGIAccC/wGIAccC/wGH
+        AccC/wGJAccB/gH/ATcBgwHeAf8BBQIBAQUQAAHUAaABgQH/AdQBggFAAf8B0QGHAU4B/wFuAXcBhwH/
+        AR8BeAHLAf8BFAF5AdcB/wGHAcYB/gH/AYMBxAL/AYMBwwL/AYIBwwL/AYEBwwL/AYcBxQH+Af8BXQIJ
+        AdkMAAGwAX8BcwH+AbMBfwFBAf4BgAF8AX4B/gFQAX8BqgH+AUYBcwGZAf4BgAGcAcEB/gGAAZgBwQH+
+        AYABmAHBAf4BgAGXAcEB/gGAAZcBwQH+AYsBoAG+Af4BBAIBAQQQAAGwAX8BcwH+AbMBfwFBAf4BgAF8
+        AX4B/gFQAX8BqgH+AUYBcwGZAf4BgAGcAcEB/gGAAZgBwQH+AYABmAHBAf4BgAGXAcEB/gGAAZcBwQH+
+        AYsBoAG+Af4BBAIBAQQcAAEoAYEB4QH/AYMBxAL/AYMBwwL/AYIBwwL/AYEBwwL/AYEBwgL/AYEBwgL/
+        AbMB2gH9Af8BPAIBAWIQAAEcAgEBJgGxAXIBUQH/ASoBfAHIAf8BpQHVAf4B/wGDAb0B8AH/AT0BjAHq
+        Af8BgQHAAv8BgQG/Av8BgQG/Av8BgQG/Av8BgQG+Av8BgQG+Av8BKAGBAegB/wwAAQMCAQECAVsCBAG/
+        AYwBoQG+Af4BgAGbAcAB/gFHAX8BpwH+AYABlQHBAf4BgAGTAcEB/gGAAZMBwQH+AYABkgHBAf4BgAGS
+        AcEB/gGCAZ8BwAH+ARsCAQEkEAABAwIBAQIBWwIEAb8BjAGhAb4B/gGAAZsBwAH+AUcBfwGnAf4BgAGV
+        AcEB/gGAAZMBwQH+AYABkwHBAf4BgAGSAcEB/gGAAZIBwQH+AYIBnwHAAf4BGwIBASQcAAF1AawB8QH/
+        AYEBwAL/AYEBvwL/AYEBvwL/AYEBvwL/AYEBvgL/AYEBvgL/AY4ByQH+Af8BVwIDAbQUAAEaAgEBIgGr
+        AdYB/AH/AYYBxgL/AYEBuQHwAf8BMAGIAfEB/wGAAbsC/wF/AbsC/wF+AboC/wF+AboC/wF9AboC/wF8
+        AbkC/wEfAYEB8AH/EAABZQEOARAB5wGAAZgBwQH+AYABmAHBAf4BVgF/AaYB/gGAAZgBwQH+AYABjgHB
+        Af4BgAGOAcEB/gGAAY0BwQH+AX8BjQHBAf4BgAGdAb8B/gECAwEUAAFlAQ4BEAHnAYABmAHBAf4BgAGY
+        AcEB/gFWAX8BpgH+AYABmAHBAf4BgAGOAcEB/gGAAY4BwQH+AYABjQHBAf4BfwGNAcEB/gGAAZ0BvwH+
+        AQIDARwAAWsBqQH0Af8BgQG8Av8BgAG7Av8BfwG7Av8BfwG7Av8BfgG6Av8BfQG6Av8BjQHHAf4B/wFT
+        AgIBoxQAAU8CAgGZAYEBwgH+Af8BgQHAAv8BgQG8AfkB/wE0AYYB5gH/AYEBwQH+Af8BdwG3Av8BdwG2
+        Av8BdgG2Av8BdQG2Av8BhgHEAf4B/wFPAgIBmBAAAVoBfwG3Af4BgAGTAcEB/gGAAZMBwQH+AXoBfwGs
+        Af4BcQGCAcAB/gF6AYoBwQH+AXkBigHBAf4BeQGJAcEB/gF9AYwBwQH+AWQBGQEjAfEYAAFaAX8BtwH+
+        AYABkwHBAf4BgAGTAcEB/gF6AX8BrAH+AXEBggHAAf4BegGKAcEB/gF5AYoBwQH+AXkBiQHBAf4BfQGM
+        AcEB/gFkARkBIwHxIAABHwGDAfYB/wF+AboB/gH/AXkBtwL/AXgBtwL/AXgBtwL/AXcBtgL/AXcBtgL/
+        AaQB0QH8Af8BIgIBAS8UAAFPAgIBlQGBAb0B/gH/AYABuwL/AX8BugH+Af8BbQGeAdkB/wFIAZsB/gH/
+        AXkBtwH+Af8BcAGzAv8BcAGzAv8BewG4Af4B/wE8AZUB/gH/FAABXgIFAckBgAGNAcEB/gF/AY0BwQH+
+        AX0BiwHAAf4BYQF/AaMB/gFdAX8BwAH+AYABnQHAAf4BgAGcAcAB/gFPASsBQQH2HAABXgIFAckBgAGN
+        AcEB/gF/AY0BwQH+AX0BiwHAAf4BYQF/AaMB/gFdAX8BwAH+AYABnQHAAf4BgAGcAcAB/gFPASsBQQH2
+        JAABMAIBAUkBmgHMAf0B/wFzAbQC/wFyAbQC/wFyAbQC/wFxAbMC/wGBAb0B/gH/ATIBfwHPAf4YAAER
+        AgEBFQGcAc4B/QH/AXcBtgL/AXYBtgL/AXQBtAH8Af8BYQGWAdQB/wEhAYYB/AH/AXoBtQH+Af8BeAG0
+        Af4B/wFbARwBJgHuGAABAwIBAQMBgAGQAcAB/gF3AYgBwQH+AXYBiAHBAf4BgAGaAcAB/gE1AgEBVAEG
+        AgEBBgECAwEgAAEDAgEBAwGAAZABwAH+AXcBiAHBAf4BdgGIAcEB/gGAAZoBwAH+ATUCAQFUAQYCAQEG
+        AQIDASwAAVQCAgGnAYEBvQH9Af8BggHBAf4B/wGBAbsB/gH/AaUB0gH9Af8BKQGMAf4B/wEDAgEBAxwA
+        AV4BBQEGAckBjwHHAf4B/wFvAbIC/wFzAbQB/gH/AYABuAH9Af8BDgIBAREoAAEDAgEBAgFUAgIBqAFd
+        AgUBxAEaAgEBIzAAAQMCAQECAVQCAgGoAV0CBQHEARoCAQEjPAABDAIBAQ4BUgICAaUBWgIEAccBPAIB
+        AWIoAAEsAgEBQgFcAgUByAFSAgIBnwECAwFAAAEiAgEBMDwAAVUCAgGrAVEBVAFiAfl4AAEiAgEBMCQA
+        ARgCAQEfAT8CAQFqAUECAQFvAT0CAQFmATsCAQFgATgCAQFaAT8CAQFpAXwBpwGwAf4BXQIHAdEBNAIB
+        AVIBAwIBAQIUAAEYAgEBHwE/AgEBagFBAgEBbwE9AgEBZgE7AgEBYAE4AgEBWgFRATgBSQH4AU0BogHA
+        Af4BTgFiAXEB+gE0AgEBUgEDAgEBAhQAARgCAQEfAT8CAQFqAUECAQFvAT0CAQFmATsCAQFgATgCAQFa
+        ATsCAQFgATwCAQFjAT4CAQFnASsBFwFPAfsBKwEXAX4B+wErARcBWwH7AT8CAQFpGAABBwIBAgcCAQEI
+        AQUCAQEFAQoCAQELAXwBpwGwAf4BXQIHAdEBBQIBAQUBAgMBEAABOwIBAWABgAGhAX8B/gFvAZ0BWgH+
+        AW0BnAFYAf4BcQGeAVwB/gF0AZ4BYAH+AXcBnwFjAf4BdAGeAWAB/gEwAbAB8wH/ASkBoQHnAf8BPgGh
+        AeQB/wFuAX8BWgH+AQUCAQEFDAABOwIBAWABgAGhAX8B/gFvAZ0BWgH+AW0BnAFYAf4BcQGeAVwB/gF0
+        AZ4BYAH+AXcBnwFjAf4BdAGeAWAB/gFEAYoBpwH+AZIBzAHqAf8BqwGlAaYB/wGsAaoBpgH/AXQCIgHz
+        Aa0CmAH+AQYCAQEGBAABOwIBAWABgAGhAX8B/gFvAZ0BWgH+AW0BnAFYAf4BcQGeAVwB/gF0AZ4BYAH+
+        AXcBnwFjAf4BdAGeAWAB/gFwAZMBWwH+AhEB5wH/ARIBFQGzAf8BTAFNAUEB/gFcARIBFQHvASYBEwGx
+        Af4BQQIBAXAMAAENAgEBDwF6AYoBZgH+AYABogF2Af4BgAGiAXYB/gGAAaIBdwH+AYABoAF3Af4BMQGw
+        AfMB/wEpAaEB5wH/AUoBfwGvAf4BgAGfAXcB/gFEAX8BNAH+DAABXwIHAdIBTwGUAUEB/gFLAZIBQQH+
+        AUsBkgFBAf4BSwGSAUEB/gF3AZ8BYgH+AVMBfwFBAf4BUwGXAUEB/gFLAZIBQQH+ATQBwAHvAf8BKQGh
+        AecB/wFIAX8BrQH+ATwCAQFkDAABXwIHAdIBTwGUAUEB/gFLAZIBQQH+AUsBkgFBAf4BSwGSAUEB/gF3
+        AZ8BYgH+AVMBfwFBAf4BUwGXAUEB/gFLAZIBQQH+AaUBogGgAf8BxQHcAasB/wHVAd4BpQH/AWACCAHY
+        AVwCBQHAAbUCpAH+BAABXwIHAdIBTwGUAUEB/gFLAZIBQQH+AUsBkgFBAf4BSwGSAUEB/gF3AZ8BYgH+
+        AVMBfwFBAf4BUwGXAUEB/gEsASYBWAH+AREBEwHgAf8BKAEaAW8B/gFSAWQBQQH+ATwCAQFkAWABDgEP
+        AegBLAEVAXMB/AwAAUMCAQF2AVMBlwFBAf4BSwGSAUEB/gFLAZIBQQH+AUsBkgFBAf4BeAGHAWQB/gGA
+        AZ4BeAH+ATQBwAHvAf8BKQGhAecB/wE/AX8BoQH+AYABoAF3Af4BAwIBAQIIAAFfAgwB4gFNAZMBQQH+
+        AUsBkgFBAf4BSwGSAUEB/gFLAZIBQQH+AUsBfwFBAf4B0gG8AboB/gF+AYkBaQH+AUsBkgFBAf4BSwGS
+        AUEB/gE0AcAB8AH/ASkBoQHnAf8BYwIJAdwMAAFfAgwB4gFNAZMBQQH+AUsBkgFBAf4BSwGSAUEB/gFL
+        AZIBQQH+AUsBfwFBAf4B0gG8AboB/gF+AYkBaQH+AUsBkgFBAf4BpwKiAf8ByQHbAZkB/wHTAdoBlAH/
+        AWMCCQHcAV4CBQHJAXkBNgEzAfYEAAFfAgwB4gFNAZMBQQH+AUsBkgFBAf4BSwGSAUEB/gFLAZIBQQH+
+        AUsBfwFBAf4B0gG8AboB/gF+AYkBaQH+AREBFAGTAf8BEgEVAZQB/wFLAZIBQQH+ARIBFQGjAf8BSQIC
+        AYYBSwICAYsBJgETAbEB/gwAAUkCAgGDAVABlQFBAf4BSwGSAUEB/gFLAZIBQQH+AXEBngFdAf4BmAGe
+        AX8B/gFQAX8BQQH+AU0BkwFBAf4BNAHAAfAB/wEpAaEB5wH/AYABhAGYAf4BBwIBAQgIAAFdAggB2QFN
+        AZABQQH+AUsBjwFBAf4BSwGPAUEB/gFnAZoBVAH+AYABhwF5Af4B0wK8Af4BSgF/AT0B/gFOAZEBQQH+
+        AUsBjwFBAf4BSwGPAUEB/gGWAcgB2AH/AZsChgH+AWQBCQEKAdoIAAFdAggB2QFNAZABQQH+AUsBjwFB
+        Af4BSwGPAUEB/gFnAZoBVAH+AYABhwF5Af4B0wK8Af4BSgF/AT0B/gFOAZEBQQH+AbECrAH/AckB1gGL
+        Af8C1AGBAf8BZgIMAeIBZwIOAeUBigFNAUwB+QQAAV0CCAHZAU0BkAFBAf4BSwGPAUEB/gFLAY8BQQH+
+        AWcBmgFUAf4BgAGHAXkB/gHTArwB/gFKAX8BPQH+ATUBNgFMAf4CEQHnAf8BSgGJAUAB/gFpAZcBVQH+
+        ATUBFgGcAf0BXgETARsB8gEsARUBaQH8AQ0CAQEQAbABfwFoAf4BvAGCAXMB/gGAAX8BQQH+AVIBkgFB
+        Af4BSgGNAUAB/gFKAY0BQAH+AXoBhgFlAf4B0wG8AbsB/gHDAbYBsAH+AYABnwF3Af4BSgGNAUAB/gGW
+        AcgB1wH/AbICsAH/AWQBCQEKAdoIAAFSAgIBoAFWAZEBQgH+AUoBiQE/Af4BSgGJAT8B/gGAAZgBfQH+
+        AcABrgGtAf4BuwKnAf4BpQGeAYwB/gGAAaABewH+AUoBiQE/Af4BSgGJAT8B/gGAAaABeQH+AYABfwGa
+        Af4BUQFBAZoB/gFSAgIBnwQAAVICAgGgAVYBkQFCAf4BSgGJAT8B/gFKAYkBPwH+AYABmAF9Af4BwAGu
+        Aa0B/gG7AqcB/gGlAZ4BjAH+AYABoAF7Af4BjwGFAX8B/gG+Ac4BnwH/AeEB1gGDAf8BagEPAQ4B5gFh
+        AggB1gFyAisB9QQAAVICAgGgAVYBkQFCAf4BSgGJAT8B/gFKAYkBPwH+AYABmAF9Af4BwAGuAa0B/gG7
+        AqcB/gGlAZ4BjAH+AYABngF7Af4BEQESAdkB/wERARMB3AH/ATYBLAFgAf4BUwEPATcB9wEmARMBsQH+
+        ASwCAQJCAgEBcgG8AX8BQQH+AbwBfwFBAf4BjQF7AT8B/gGAAZwBcAH+AUkBhgE+Af4BSgGGAT8B/gFS
+        AX8BQQH+AY4BhAGUAf4BnwGNAZUB/gFoAX8BUgH+AUkBhgE+Af4BSQGGAT4B/gGRAY4BxwH/AVEBQQGa
+        Af4BUgICAZ8EAAEIAgEBCQGAAYwBcgH+AUsBhAFBAf4BSAF/AT0B/gFFAW4BWQH+AS0BbAGkAf4BTgF/
+        AaoB/gEsAWoBogH+AWMBfwFhAf4BSQGBAT0B/gFSAYkBQQH+AV0BfwFFAf4EAAFhAgkB2wECAwEEAAEI
+        AgEBCQGAAYwBcgH+AUsBhAFBAf4BSAF/AT0B/gFFAW4BWQH+AS0BbAGkAf4BTgF/AaoB/gEsAWoBogH+
+        AWMBfwFhAf4BSQGBAT0B/gGYAY8BggH+AdEBzgHNAf8BqQGTAZIB/gFtAhQB7AgAAQgCAQEJAYABjAFy
+        Af4BSwGEAUEB/gFIAX8BPQH+AUUBbgFZAf4BLQFsAaQB/gFOAX8BqgH+ASwBagGiAf4BYwF/AWEB/gFI
+        AX8BPQH+ATABKgFUAf4BEQETAaUB/wFTAQ8BKAH3AR8CAQEqBAABRQIBAXkBvAF/AUEB/gG8AX8BQQH+
+        AbMBfwFBAf4BVQF1ATwB/gGAAZcBegH+AV0BfwFyAf4BcQF/Aa8B/gGTAaUBwAH+AZcBpgHAAf4BRAF8
+        AaYB/gFrAYQBWQH+AYABjAFxAf4BPAIBAWQBYQIJAdsBAgMBCAABEwIBARgBXwEYARUB8AFMAn8B/gGS
+        AaIBvAH+AYABnAHBAf4BgAGcAcEB/gGAAZ0BwQH+AYABiQG0Af4BWQF/AWcB/gFcAgcB0wECAwEUAAET
+        AgEBGAFfARgBFQHwAUwCfwH+AZIBogG8Af4BgAGcAcEB/gGAAZwBwQH+AYABnQHBAf4BgAGJAbQB/gFZ
+        AX8BZwH+AVwCBwHTAQIDARQAARMCAQEYAV8BGAEVAfABTAJ/Af4BkgGiAbwB/gGAAZwBwQH+AYABnAHB
+        Af4BgAGdAcEB/gGAAYkBtAH+AVkBfwFnAf4BXAIHAdMBAgMBDAABNgIBAVYBuAF/AUEB/gG3AX8BQQH+
+        AbwBfwFhAf4BvQGlAaMB/gGfAYcBhgH+AX0BfwGyAf4BgAGbAcEB/gGAAZsBwQH+AYABmwHBAf4BgAGb
+        AcEB/gFHATUBVQH5HAABBAIBAQQBegGpAeoB/wGAAZoBwQH+AYcBxgL/AYABmgHBAf4BgAGaAcEB/gGA
+        AZoBwQH+AUIBfAGqAf4gAAEEAgEBBAF6AakB6gH/AYABmgHBAf4BhwHGAv8BgAGaAcEB/gGAAZoBwQH+
+        AYABmgHBAf4BQgF8AaoB/iAAAQQCAQEEAXoBqQHqAf8BgAGaAcEB/gGHAcYC/wGAAZoBwQH+AYABmgHB
+        Af4BgAGaAcEB/gFCAXwBqgH+GAABsAF/AXMB/gGzAX8BQQH+AYABfAF+Af4BUAF/AaoB/gFGAXMBmQH+
+        AYABnAHBAf4BgAGYAcEB/gGAAZgBwQH+AYABlwHBAf4BgAGXAcEB/gGLAaABvgH+AQQCAQEEGAABNwIB
+        AVkBiwGiAcEB/gGAAZgBwQH+AYABlwHBAf4BgAGXAcEB/gGAAZYBwQH+AYABlgHBAf4BhgGeAb0B/gEF
+        AgEBBRwAATcCAQFZAYsBogHBAf4BgAGYAcEB/gGAAZcBwQH+AYABlwHBAf4BgAGWAcEB/gGAAZYBwQH+
+        AYYBngG9Af4BBQIBAQUcAAE3AgEBWQGLAaIBwQH+AYABmAHBAf4BgAGXAcEB/gGAAZcBwQH+AYABlgHB
+        Af4BgAGWAcEB/gGGAZ4BvQH+AQUCAQEFFAABAwIBAQIBWwIEAb8BjAGhAb4B/gGAAZsBwAH+AUcBfwGn
+        Af4BgAGVAcEB/gGAAZMBwQH+AYABkwHBAf4BgAGSAcEB/gGAAZIBwQH+AYIBnwHAAf4BGwIBASQYAAFI
+        AgIBgQGOAcgB/gH/AYABkwHBAf4BgQG9Av8BgAGTAcEB/gGAAZIBwQH+AYABkgHBAf4BlAGkAcAB/gEW
+        AgEBHBwAAUgCAgGBAY4ByAH+Af8BgAGTAcEB/gGBAb0C/wGAAZMBwQH+AYABkgHBAf4BgAGSAcEB/gGU
+        AaQBwAH+ARYCAQEcHAABSAICAYEBjgHIAf4B/wGAAZMBwQH+AYEBvQL/AYABkwHBAf4BgAGSAcEB/gGA
+        AZIBwQH+AZQBpAHAAf4BFgIBARwYAAFlAQ4BEAHnAYABmAHBAf4BgAGYAcEB/gFWAX8BpgH+AYABmAHB
+        Af4BgAGOAcEB/gGAAY4BwQH+AYABjQHBAf4BfwGNAcEB/gGAAZ0BvwH+AQIDARgAASgCAQE5AYwBogHA
+        Af4BgAGPAcEB/gGAAY4BwQH+AYABjgHBAf4BgAGOAcEB/gGAAY0BwQH+AYABlwG+Af4gAAEoAgEBOQGM
+        AaIBwAH+AYABjwHBAf4BgAGOAcEB/gGAAY4BwQH+AYABjgHBAf4BgAGNAcEB/gGAAZcBvgH+IAABKAIB
+        ATkBjAGiAcAB/gGAAY8BwQH+AYABjgHBAf4BgAGOAcEB/gGAAY4BwQH+AYABjQHBAf4BgAGXAb4B/hwA
+        AVoBfwG3Af4BgAGTAcEB/gGAAZMBwQH+AXoBfwGsAf4BcQGCAcAB/gF6AYoBwQH+AXkBigHBAf4BeQGJ
+        AcEB/gF9AYwBwQH+AWQBGQEjAfEgAAFMAZoB+wH/AXwBiwHBAf4BeQG1Av8BegGKAcEB/gF6AYoBwQH+
+        AYABjwHBAf4BTgEoAT8B9iQAAUwBmgH7Af8BfAGLAcEB/gF5AbUC/wF6AYoBwQH+AXoBigHBAf4BgAGP
+        AcEB/gFOASgBPwH2JAABTAGaAfsB/wF8AYsBwQH+AXkBtQL/AXoBigHBAf4BegGKAcEB/gGAAY8BwQH+
+        AU4BKAE/AfYcAAFeAgUByQGAAY0BwQH+AX8BjQHBAf4BfQGLAcAB/gFhAX8BowH+AV0BfwHAAf4BgAGd
+        AcAB/gGAAZwBwAH+AU8BKwFBAfYkAAEaAgEBIwFsAYABwQH+AYABkwHBAf4BegGKAcEB/gGAAZkBwQH+
+        AUsBfwHBAf4BAgMBJAABGgIBASMBbAGAAcEB/gGAAZMBwQH+AXoBigHBAf4BgAGZAcEB/gFLAX8BwQH+
+        AQIDASQAARoCAQEjAWwBgAHBAf4BgAGTAcEB/gF6AYoBwQH+AYABmQHBAf4BSwF/AcEB/gECAwEcAAED
+        AgEBAwGAAZABwAH+AXcBiAHBAf4BdgGIAcEB/gGAAZoBwAH+ATUCAQFUAQYCAQEGAQIDATAAAU0CAgGT
+        AV4CBgHPAUMCAQF2NAABTQICAZMBXgIGAc8BQwIBAXY0AAFNAgIBkwFeAgYBzwFDAgEBdigAAQMCAQEC
+        AVQCAgGoAV0CBQHEARoCAQEjJAABQgFNAT4HAAE+AwABKAMAAUADAAEwAwABAQEAAQEFAAGAAQEWAAP/
+        gQAB/wE/Av8BwAEBAfABAAH4AQcB+AEBAYABAQHwAQAB4AEAAeABAAGAAQEB8AEAAeABAAHgAQABgAEB
+        AYABAAHgAQAB4AEAAYAHAAGABwABwAEBAwABAQEAAQEBwAEDAQABAwEAAQ8BAAEPAfABBwGAAQMBgAEH
+        AYABBwHwAQcBgAEDAYABBwGAAQcB8AEHAcABAwHAAQcBwAEHAfABBwHAAQMBwAEPAcABDwHwAQcBwAEH
+        AcABHwHAAR8B8AEPAcABDwHAAT8BwAE/AfgBDwHgAX8B4QH/AeEB/wH8AT8B8AL/AX8B/wE/A/8BfwHA
+        AQcBwAEHAcABAQH4AQcBgAEDAYABAAGAAQAB4AEDAYABAwGAAQABgAEAAeABAQGAAQMBgAEAAYABAAHg
+        AQEBgAEBAYABAAGAAgABAQGAAQABgAEAAYADAAGAAQQBgAEBAYABAQIAAcABBwHAAQcBwAEHAQABDwHg
+        AR8B4AEfAeABHwGAAQcB4AEPAeABDwHgAQ8BgAEHAeABDwHgAQ8B4AEPAcABBwHgAR8B4AEfAeABHwHA
+        AQ8B8AEfAfABHwHwAR8BwAEfAfABHwHwAR8B8AEfAcABPwH8AX8B/AF/AfwBfwHhAf8L
+</value>
+  </data>
+  <metadata name="securityContextMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>314, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>470, 17</value>
+  </metadata>
+</root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj	2010-07-19 11:20:33 UTC (rev 5036)
@@ -47,6 +47,7 @@
     <Compile Include="CapabilityTests.cs" />
     <Compile Include="FeatureReaderTests.cs" />
     <Compile Include="HttpConnectionTests.cs" />
+    <Compile Include="ObjectTests.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">
       <AutoGen>True</AutoGen>

Added: sandbox/maestro-3.0/MaestroAPITests/ObjectTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/ObjectTests.cs	                        (rev 0)
+++ sandbox/maestro-3.0/MaestroAPITests/ObjectTests.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,75 @@
+#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 NUnit.Framework;
+using OSGeo.MapGuide.MaestroAPI.ObjectModels;
+
+namespace MaestroAPITests
+{
+    /// <summary>
+    /// This test fixture is to ensure all objects created by <see cref="ObjectFactory"/> have no
+    /// null child object properties where there shouldn't be any.
+    /// </summary>
+    [TestFixture]
+    public class ObjectTests
+    {
+        [Test]
+        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);
+            Assert.AreEqual(env.MaxY, .1);
+
+            Assert.Catch<ArgumentException>(() => ObjectFactory.CreateEnvelope(.1, -.1, -.1, .1));
+            Assert.Catch<ArgumentException>(() => ObjectFactory.CreateEnvelope(-.1, .1, .1, -.1));
+            Assert.Catch<ArgumentException>(() => ObjectFactory.CreateEnvelope(.1, .1, -.1, -.1));
+        }
+
+        [Test]
+        public void TestSecurityUser()
+        {
+            var user = ObjectFactory.CreateSecurityUser();
+            Assert.IsNotNull(user.User);
+        }
+
+        [Test]
+        public void TestSecurityGroup()
+        {
+            var group = ObjectFactory.CreateSecurityGroup();
+            Assert.IsNotNull(group.Group);
+        }
+
+        [Test]
+        public void TestResourceMetadata()
+        {
+            var meta = ObjectFactory.CreateMetadata();
+            Assert.IsNotNull(meta.Simple);
+            Assert.IsNotNull(meta.Simple.Property);
+
+            Assert.AreEqual(0, meta.GetProperties().Count);
+        }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-07-19 11:20:33 UTC (rev 5036)
@@ -188,6 +188,7 @@
     <Compile Include="Mapping\RuntimeMapBase.cs" />
     <Compile Include="ObjectModels\ApplicationDefinition.cs" />
     <Compile Include="ObjectModels\DrawingSource.cs" />
+    <Compile Include="ObjectModels\Envelope.cs" />
     <Compile Include="ObjectModels\FeatureSource.cs" />
     <Compile Include="ObjectModels\LayerDefinition.cs" />
     <Compile Include="ObjectModels\LoadProcedure.cs" />
@@ -195,6 +196,7 @@
     <Compile Include="ObjectModels\ObjectFactory.cs" />
     <Compile Include="ObjectModels\PrintLayout.cs" />
     <Compile Include="ObjectModels\ResourceItems.cs" />
+    <Compile Include="ObjectModels\ResourceList.cs" />
     <Compile Include="ObjectModels\SymbolDefinition.cs" />
     <Compile Include="ObjectModels\SymbolLibrary.cs" />
     <Compile Include="ObjectModels\UnmanagedDataList.cs" />

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/Envelope.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/Envelope.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/Envelope.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,85 @@
+#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;
+
+namespace OSGeo.MapGuide.ObjectModels.Common
+{
+    partial class Envelope
+    {
+        internal Envelope() { }
+
+        /// <summary>
+        /// Gets or sets the lower X value
+        /// </summary>
+        public double MinX
+        {
+            get { return this.lowerLeftCoordinateField.X; }
+            set { this.lowerLeftCoordinateField.X = value; }
+        }
+
+        /// <summary>
+        /// Gets or set the lower Y value
+        /// </summary>
+        public double MinY
+        {
+            get { return this.lowerLeftCoordinateField.Y; }
+            set { this.lowerLeftCoordinateField.Y = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the upper X value
+        /// </summary>
+        public double MaxX
+        {
+            get { return this.upperRightCoordinateField.X; }
+            set { this.upperRightCoordinateField.X = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the upper Y value
+        /// </summary>
+        public double MaxY
+        {
+            get { return this.upperRightCoordinateField.Y; }
+            set { this.upperRightCoordinateField.Y = value; }
+        }
+
+        /// <summary>
+        /// Expands this envelope to accomodate the given envelope
+        /// </summary>
+        /// <param name="env"></param>
+        public void ExpandToInclude(Envelope env)
+        {
+            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;
+        }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -252,5 +252,14 @@
                 return this.ConnectionString.Contains(ALIAS_PREFIX);
             }
         }
+
+        /// <summary>
+        /// Convenience method to return the description of this feature source
+        /// </summary>
+        /// <returns></returns>
+        public FeatureSourceDescription Describe()
+        {
+            return this.CurrentConnection.FeatureService.DescribeFeatureSource(this.ResourceID);
+        }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerDefinition.cs	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerDefinition.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -23,11 +23,17 @@
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using System.Xml.Serialization;
 using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.ObjectModels.Common;
 
 namespace OSGeo.MapGuide.ObjectModels.LayerDefinition
 {
-    partial class LayerDefinition : IResource
+    public interface ILayerDefinition : IResource
     {
+        Envelope GetSpatialExtent(bool allowFallbackToContextInformation);
+    }
+
+    partial class LayerDefinition : ILayerDefinition
+    {
         private static readonly Version RES_VERSION = new Version(1, 0, 0);
 
         [XmlIgnore]
@@ -105,7 +111,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 Topology.Geometries.IEnvelope GetSpatialExtent(bool allowFallbackToContextInformation)
+        public Envelope GetSpatialExtent(bool allowFallbackToContextInformation)
         {
             if (this.CurrentConnection == null)
                 throw new System.Exception("No server set for object");

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -30,6 +30,7 @@
 using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
 using OSGeo.MapGuide.ObjectModels.PrintLayout;
 using OSGeo.MapGuide.ObjectModels.LoadProcedure;
+using OSGeo.MapGuide.ObjectModels.Common;
 
 namespace OSGeo.MapGuide.MaestroAPI.ObjectModels
 {
@@ -46,9 +47,14 @@
             return new LayerDefinition();
         }
 
-        public static FeatureSourceType CreateFeatureSource()
+        public static FeatureSourceType CreateFeatureSource(string provider, string connectionString)
         {
-            return new FeatureSourceType();
+            var fs = new FeatureSourceType()
+            {
+                Provider = provider,
+                ConnectionString = connectionString
+            };
+            return fs;
         }
 
         public static MapDefinition CreateMapDefinition()
@@ -85,5 +91,75 @@
         {
             return new LoadProcedure();
         }
+
+        /// <summary>
+        /// Creates an empty resource document header metadata object
+        /// </summary>
+        /// <returns></returns>
+        public static ResourceDocumentHeaderTypeMetadata CreateMetadata()
+        {
+            return new ResourceDocumentHeaderTypeMetadata()
+            {
+                Simple = new ResourceDocumentHeaderTypeMetadataSimple()
+                {
+                    Property = new System.ComponentModel.BindingList<ResourceDocumentHeaderTypeMetadataSimpleProperty>()
+                }
+            };
+        }
+
+        /// <summary>
+        /// Creates an envelope (bounding box)
+        /// </summary>
+        /// <param name="minx"></param>
+        /// <param name="miny"></param>
+        /// <param name="maxx"></param>
+        /// <param name="maxy"></param>
+        /// <returns></returns>
+        public static Envelope CreateEnvelope(double minx, double miny, double maxx, double maxy)
+        {
+            if (minx > maxx)
+                throw new ArgumentException("minx > maxx", "minx");
+
+            if (miny > maxy)
+                throw new ArgumentException("miny > maxy", "miny");
+
+            return new Envelope()
+            {
+                LowerLeftCoordinate = new EnvelopeLowerLeftCoordinate()
+                {
+                    X = minx,
+                    Y = miny
+                },
+                UpperRightCoordinate = new EnvelopeUpperRightCoordinate()
+                {
+                    X = maxx,
+                    Y = maxy
+                }
+            };
+        }
+
+        /// <summary>
+        /// Creates an empty group security object
+        /// </summary>
+        /// <returns></returns>
+        public static ResourceSecurityTypeGroups CreateSecurityGroup()
+        {
+            return new ResourceSecurityTypeGroups()
+            {
+                Group = new System.ComponentModel.BindingList<ResourceSecurityTypeGroupsGroup>()
+            };
+        }
+
+        /// <summary>
+        /// Creates an empty user security object
+        /// </summary>
+        /// <returns></returns>
+        public static ResourceSecurityTypeUsers CreateSecurityUser()
+        {
+            return new ResourceSecurityTypeUsers()
+            {
+                User = new System.ComponentModel.BindingList<ResourceSecurityTypeUsersUser>()
+            };
+        }
     }
 }

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ResourceList.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ResourceList.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ResourceList.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -0,0 +1,135 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections.Specialized;
+using System.Xml.Serialization;
+
+namespace OSGeo.MapGuide.ObjectModels.Common
+{
+    partial class ResourceSecurityTypeGroups
+    {
+        internal ResourceSecurityTypeGroups() { }
+    }
+
+    partial class ResourceSecurityTypeUsers
+    {
+        internal ResourceSecurityTypeUsers() { }
+    }
+
+    partial class ResourceDocumentHeaderType
+    {
+        internal ResourceDocumentHeaderType() { }
+
+        //Required for saving/updating
+
+        [XmlAttribute("noNamespaceSchemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
+        public string ValidatingSchema 
+        {
+            get { return "ResourceDocumentHeader-1.0.0.xsd"; }
+            set { }
+        }
+    }
+
+    partial class ResourceFolderHeaderType
+    {
+        internal ResourceFolderHeaderType() { }
+
+        //Required for saving/updating
+
+        [XmlAttribute("noNamespaceSchemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
+        public string ValidatingSchema
+        {
+            get { return "ResourceFolderHeader-1.0.0.xsd"; }
+            set { }
+        }
+    }
+
+    partial class ResourceDocumentHeaderTypeMetadataSimple
+    {
+        internal ResourceDocumentHeaderTypeMetadataSimple() { }
+    }
+
+    partial class ResourceDocumentHeaderTypeMetadata
+    {
+        internal ResourceDocumentHeaderTypeMetadata() { }
+        
+        /// <summary>
+        /// Returns a <see cref="NameValueCollection"/> of all the metadata properties
+        /// </summary>
+        /// <returns></returns>
+        public NameValueCollection GetProperties()
+        {
+            var dict = new NameValueCollection();
+            foreach (var val in this.Simple.Property)
+            {
+                dict.Add(val.Name, val.Value);
+            }
+            return dict;
+        }
+
+        /// <summary>
+        /// Sets a metadata property.
+        /// </summary>
+        /// <param name="name"></param>
+        /// <param name="value"></param>
+        public void SetProperty(string name, string value)
+        {
+            foreach (var val in this.Simple.Property)
+            {
+                if (val.Name == name)
+                {
+                    val.Value = value;
+                    return;
+                }
+            }
+
+            this.Simple.Property.Add(new ResourceDocumentHeaderTypeMetadataSimpleProperty()
+            {
+                Name = name,
+                Value = value
+            });
+        }
+
+        /// <summary>
+        /// Applies the specified set of properties to this instance
+        /// </summary>
+        /// <param name="values"></param>
+        public void ApplyProperties(NameValueCollection values)
+        {
+            var dict = GetProperties();
+            foreach (string key in values.Keys)
+            {
+                dict[key] = values[key];
+            }
+
+            this.Simple.Property.Clear();
+            foreach (string key in dict.Keys)
+            {
+                this.Simple.Property.Add(new ResourceDocumentHeaderTypeMetadataSimpleProperty()
+                {
+                    Name = key,
+                    Value = dict[key]
+                });
+            }
+        }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/readme.txt
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/readme.txt	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/readme.txt	2010-07-19 11:20:33 UTC (rev 5036)
@@ -13,4 +13,13 @@
 
 XmlElement[]
 
-A simple search for XmlAnyElementAttribute will reveal the bits of code that need to change.
\ No newline at end of file
+A simple search for XmlAnyElementAttribute will reveal the bits of code that need to change.
+
+
+A special note about ObjectFactory
+----------------------------------
+
+Due to the fragile nature of serializing auto-generated classes and the need to avoid NullReferenceExceptions
+at all costs, all constructors of all auto-generated classes are marked internal. External consumers of this
+API will need to use ObjectFactory to create these classes. That way, ObjectFactory ensures that any
+child object properties are properly initialized.
\ No newline at end of file

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -1539,38 +1539,49 @@
         /// <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 Topology.Geometries.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry)
+        public virtual OSGeo.MapGuide.ObjectModels.Common.Envelope GetSpatialExtent(string resourceID, string schema, string geometry)
         {
             return GetSpatialExtent(resourceID, schema, geometry, null, false);
         }
 
-        public virtual Topology.Geometries.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter)
+        public virtual OSGeo.MapGuide.ObjectModels.Common.Envelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter)
         {
             return GetSpatialExtent(resourceID, schema, geometry, filter, false);
         }
 
-        public virtual Topology.Geometries.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, bool allowFallbackToContextInformation)
+        public virtual OSGeo.MapGuide.ObjectModels.Common.Envelope GetSpatialExtent(string resourceID, string schema, string geometry, bool allowFallbackToContextInformation)
         {
             return GetSpatialExtent(resourceID, schema, geometry, null, allowFallbackToContextInformation);
         }
 
-        protected virtual Topology.Geometries.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter, bool allowFallbackToContextInformation)
+        protected virtual OSGeo.MapGuide.ObjectModels.Common.Envelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter, bool allowFallbackToContextInformation)
         {
             try
             {
                 System.Collections.Specialized.NameValueCollection fun = new System.Collections.Specialized.NameValueCollection();
                 fun.Add("extent", "SpatialExtents(\"" + geometry + "\")");
                 using (FeatureSetReader fsr = AggregateQueryFeatureSource(resourceID, schema, filter, fun))
+                {
                     if (fsr.Read())
                     {
                         Topology.Geometries.IGeometry geom = fsr.Row["extent"] as Topology.Geometries.IGeometry;
                         if (geom == null)
+                        {
                             throw new Exception("No data found in resource: " + resourceID);
+                        }
                         else
-                            return geom.EnvelopeInternal;
+                        {
+                            var env = geom.EnvelopeInternal;
+                            return OSGeo.MapGuide.MaestroAPI.ObjectModels.ObjectFactory.CreateEnvelope(
+                                env.MinX,
+                                env.MinY,
+                                env.MaxX,
+                                env.MaxY);
+                        }
                     }
                     else
                         throw new Exception("No data found in resource: " + resourceID);
+                }
             }
             catch
             {
@@ -1580,7 +1591,7 @@
                         ObjCommon.FdoSpatialContextList lst = this.GetSpatialContextInfo(resourceID, false);
                         if (lst.SpatialContext != null && lst.SpatialContext.Count >= 1)
                         {
-                            return new Topology.Geometries.Envelope(
+                            return OSGeo.MapGuide.MaestroAPI.ObjectModels.ObjectFactory.CreateEnvelope(
                                 double.Parse(lst.SpatialContext[0].Extent.LowerLeftCoordinate.X, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture),
                                 double.Parse(lst.SpatialContext[0].Extent.UpperRightCoordinate.X, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture),
                                 double.Parse(lst.SpatialContext[0].Extent.LowerLeftCoordinate.Y, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture),

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs	2010-07-16 21:14:16 UTC (rev 5035)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs	2010-07-19 11:20:33 UTC (rev 5036)
@@ -81,9 +81,9 @@
         FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns);
         FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, NameValueCollection aggregateFunctions);
 
-        Topology.Geometries.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry);
-        Topology.Geometries.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter);
-        Topology.Geometries.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, bool allowFallbackToContextInformation);
+        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);
 
         FeatureSourceDescription DescribeFeatureSource(string resourceID);
         FeatureSourceDescription DescribeFeatureSource(string resourceID, string schema);



More information about the mapguide-commits mailing list