[mapguide-commits] r5571 - in sandbox/maestro-3.0: Maestro.Editors Maestro.Editors/Common Maestro.Editors/FeatureSource Maestro.Editors/FeatureSource/Providers Maestro.Editors/FeatureSource/Providers/Odbc Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor Maestro.Editors/Properties OSGeo.MapGuide.MaestroAPI/ObjectModels OSGeo.MapGuide.MaestroAPI/Schema OSGeo.MapGuide.MaestroAPI/SchemaOverrides

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Feb 28 10:17:24 EST 2011


Author: jng
Date: 2011-02-28 07:17:24 -0800 (Mon, 28 Feb 2011)
New Revision: 5571

Added:
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.resx
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableOverrideItem.cs
Modified:
   sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/CoordSysOverrideCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/CoordSysOverrideCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/IFdoSpatialContext.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/ClassDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/DataPropertyDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/ConfigurationDocument.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcConfigurationDocument.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcTableItem.cs
Log:
This submission contains the following changes:
 - #1612: Allow item selection in generic item selection dialog by double-click
 - Add ODBC schema override editor
 - Remove redundant edit configuration button from generic editor
 - Fix incorrect serialization of various feature schema elements

Modified: sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.Designer.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.Designer.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -39,6 +39,7 @@
             // 
             resources.ApplyResources(this.lstItems, "lstItems");
             this.lstItems.Name = "lstItems";
+            this.lstItems.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lstItems_MouseDoubleClick);
             this.lstItems.SelectedIndexChanged += new System.EventHandler(this.lstItems_SelectedIndexChanged);
             // 
             // lblPrompt

Modified: sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -174,5 +174,11 @@
         {
             this.DialogResult = DialogResult.OK;
         }
+
+        private void lstItems_MouseDoubleClick(object sender, MouseEventArgs e)
+        {
+            if (lstItems.SelectedItem != null)
+                this.DialogResult = DialogResult.OK;
+        }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/CoordSysOverrideCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/CoordSysOverrideCtrl.Designer.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/CoordSysOverrideCtrl.Designer.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -45,6 +45,7 @@
             // 
             this.contentPanel.Controls.Add(this.grdOverrides);
             this.contentPanel.Controls.Add(this.toolStrip1);
+            resources.ApplyResources(this.contentPanel, "contentPanel");
             // 
             // toolStrip1
             // 
@@ -112,6 +113,7 @@
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
             this.HeaderText = "Coordinate System Overrides";
             this.Name = "CoordSysOverrideCtrl";
+            resources.ApplyResources(this, "$this");
             this.contentPanel.ResumeLayout(false);
             this.contentPanel.PerformLayout();
             this.toolStrip1.ResumeLayout(false);

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/CoordSysOverrideCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/CoordSysOverrideCtrl.resx	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/CoordSysOverrideCtrl.resx	2011-02-28 15:17:24 UTC (rev 5571)
@@ -142,7 +142,7 @@
     <value>0, 25</value>
   </data>
   <data name="grdOverrides.Size" type="System.Drawing.Size, System.Drawing">
-    <value>449, 267</value>
+    <value>449, 87</value>
   </data>
   <data name="grdOverrides.TabIndex" type="System.Int32, mscorlib">
     <value>1</value>
@@ -160,7 +160,7 @@
     <value>0</value>
   </data>
   <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
+    <value>0, 0</value>
   </metadata>
   <data name="btnAdd.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
     <value>Magenta</value>
@@ -219,6 +219,9 @@
   <data name="&gt;&gt;toolStrip1.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
+  <data name="contentPanel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>449, 112</value>
+  </data>
   <data name="&gt;&gt;contentPanel.Name" xml:space="preserve">
     <value>contentPanel</value>
   </data>
@@ -234,6 +237,9 @@
   <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </metadata>
+  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
+    <value>449, 139</value>
+  </data>
   <data name="&gt;&gt;btnAdd.Name" xml:space="preserve">
     <value>btnAdd</value>
   </data>
@@ -268,6 +274,6 @@
     <value>CoordSysOverrideCtrl</value>
   </data>
   <data name="&gt;&gt;$this.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.EditorBindableCollapsiblePanel, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.Common.EditorBindableCollapsiblePanel, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
   </data>
 </root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -35,7 +35,6 @@
             this.grdConnectionParameters = new System.Windows.Forms.DataGridView();
             this.label2 = new System.Windows.Forms.Label();
             this.label3 = new System.Windows.Forms.Label();
-            this.btnEditConfiguration = new System.Windows.Forms.Button();
             this.label4 = new System.Windows.Forms.Label();
             this.cmbLongTransaction = new System.Windows.Forms.ComboBox();
             this.btnTest = new System.Windows.Forms.Button();
@@ -60,7 +59,6 @@
             this.contentPanel.Controls.Add(this.btnTest);
             this.contentPanel.Controls.Add(this.cmbLongTransaction);
             this.contentPanel.Controls.Add(this.label4);
-            this.contentPanel.Controls.Add(this.btnEditConfiguration);
             this.contentPanel.Controls.Add(this.resDataCtrl);
             this.contentPanel.Controls.Add(this.label3);
             this.contentPanel.Controls.Add(this.label2);
@@ -103,13 +101,6 @@
             resources.ApplyResources(this.label3, "label3");
             this.label3.Name = "label3";
             // 
-            // btnEditConfiguration
-            // 
-            resources.ApplyResources(this.btnEditConfiguration, "btnEditConfiguration");
-            this.btnEditConfiguration.Name = "btnEditConfiguration";
-            this.btnEditConfiguration.UseVisualStyleBackColor = true;
-            this.btnEditConfiguration.Click += new System.EventHandler(this.btnEditConfiguration_Click);
-            // 
             // label4
             // 
             resources.ApplyResources(this.label4, "label4");
@@ -213,7 +204,6 @@
         private System.Windows.Forms.TextBox txtProvider;
         private System.Windows.Forms.Label label1;
         private Maestro.Editors.Common.ResourceDataCtrl resDataCtrl;
-        private System.Windows.Forms.Button btnEditConfiguration;
         private System.Windows.Forms.TextBox txtTestResult;
         private System.Windows.Forms.Button btnTest;
         private System.Windows.Forms.ComboBox cmbLongTransaction;

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -196,11 +196,6 @@
             txtTestResult.Text = msg;
         }
 
-        private void btnEditConfiguration_Click(object sender, EventArgs e)
-        {
-
-        }
-
         private void pickAValueToolStripMenuItem_Click(object sender, EventArgs e)
         {
             if (grdConnectionParameters.SelectedCells.Count != 1)

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx	2011-02-28 15:17:24 UTC (rev 5571)
@@ -123,14 +123,14 @@
   </data>
   <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="txtTestResult.Location" type="System.Drawing.Point, System.Drawing">
-    <value>156, 326</value>
+    <value>154, 326</value>
   </data>
   <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="txtTestResult.Multiline" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
   <data name="txtTestResult.Size" type="System.Drawing.Size, System.Drawing">
-    <value>355, 33</value>
+    <value>516, 33</value>
   </data>
   <data name="txtTestResult.TabIndex" type="System.Int32, mscorlib">
     <value>10</value>
@@ -151,7 +151,7 @@
     <value>Bottom, Left</value>
   </data>
   <data name="btnTest.Location" type="System.Drawing.Point, System.Drawing">
-    <value>17, 336</value>
+    <value>15, 326</value>
   </data>
   <data name="btnTest.Size" type="System.Drawing.Size, System.Drawing">
     <value>133, 23</value>
@@ -228,33 +228,6 @@
   <data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
     <value>3</value>
   </data>
-  <data name="btnEditConfiguration.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Bottom, Right</value>
-  </data>
-  <data name="btnEditConfiguration.Location" type="System.Drawing.Point, System.Drawing">
-    <value>517, 336</value>
-  </data>
-  <data name="btnEditConfiguration.Size" type="System.Drawing.Size, System.Drawing">
-    <value>153, 23</value>
-  </data>
-  <data name="btnEditConfiguration.TabIndex" type="System.Int32, mscorlib">
-    <value>6</value>
-  </data>
-  <data name="btnEditConfiguration.Text" xml:space="preserve">
-    <value>Edit Configuration</value>
-  </data>
-  <data name="&gt;&gt;btnEditConfiguration.Name" xml:space="preserve">
-    <value>btnEditConfiguration</value>
-  </data>
-  <data name="&gt;&gt;btnEditConfiguration.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;btnEditConfiguration.Parent" xml:space="preserve">
-    <value>contentPanel</value>
-  </data>
-  <data name="&gt;&gt;btnEditConfiguration.ZOrder" xml:space="preserve">
-    <value>4</value>
-  </data>
   <data name="resDataCtrl.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Bottom, Left, Right</value>
   </data>
@@ -271,13 +244,13 @@
     <value>resDataCtrl</value>
   </data>
   <data name="&gt;&gt;resDataCtrl.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.ResourceDataCtrl, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.Common.ResourceDataCtrl, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
   </data>
   <data name="&gt;&gt;resDataCtrl.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name="&gt;&gt;resDataCtrl.ZOrder" xml:space="preserve">
-    <value>5</value>
+    <value>4</value>
   </data>
   <data name="label3.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -304,7 +277,7 @@
     <value>contentPanel</value>
   </data>
   <data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
-    <value>6</value>
+    <value>5</value>
   </data>
   <data name="label2.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -331,7 +304,7 @@
     <value>contentPanel</value>
   </data>
   <data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
-    <value>7</value>
+    <value>6</value>
   </data>
   <data name="grdConnectionParameters.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
@@ -355,7 +328,7 @@
     <value>contentPanel</value>
   </data>
   <data name="&gt;&gt;grdConnectionParameters.ZOrder" xml:space="preserve">
-    <value>8</value>
+    <value>7</value>
   </data>
   <data name="txtProvider.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
@@ -379,7 +352,7 @@
     <value>contentPanel</value>
   </data>
   <data name="&gt;&gt;txtProvider.ZOrder" xml:space="preserve">
-    <value>9</value>
+    <value>8</value>
   </data>
   <data name="label1.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -406,7 +379,7 @@
     <value>contentPanel</value>
   </data>
   <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
-    <value>10</value>
+    <value>9</value>
   </data>
   <data name="contentPanel.Size" type="System.Drawing.Size, System.Drawing">
     <value>683, 372</value>
@@ -517,6 +490,6 @@
     <value>GenericCtrl</value>
   </data>
   <data name="&gt;&gt;$this.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.EditorBindableCollapsiblePanel, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.Common.EditorBindableCollapsiblePanel, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
   </data>
 </root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.Designer.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.Designer.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -33,7 +33,7 @@
             this.cmbMethod = new System.Windows.Forms.ComboBox();
             this.btnTest = new System.Windows.Forms.Button();
             this.btnEditSchema = new System.Windows.Forms.Button();
-            this.btnRebuild = new System.Windows.Forms.Button();
+            this.btnReset = new System.Windows.Forms.Button();
             this.groupBox2 = new System.Windows.Forms.GroupBox();
             this.txtConnStr = new System.Windows.Forms.TextBox();
             this.groupBox3 = new System.Windows.Forms.GroupBox();
@@ -49,7 +49,7 @@
             this.contentPanel.Controls.Add(this.pnlMethod);
             this.contentPanel.Controls.Add(this.groupBox3);
             this.contentPanel.Controls.Add(this.groupBox2);
-            this.contentPanel.Controls.Add(this.btnRebuild);
+            this.contentPanel.Controls.Add(this.btnReset);
             this.contentPanel.Controls.Add(this.btnEditSchema);
             this.contentPanel.Controls.Add(this.btnTest);
             this.contentPanel.Controls.Add(this.cmbMethod);
@@ -83,12 +83,12 @@
             this.btnEditSchema.UseVisualStyleBackColor = true;
             this.btnEditSchema.Click += new System.EventHandler(this.btnEditSchema_Click);
             // 
-            // btnRebuild
+            // btnReset
             // 
-            resources.ApplyResources(this.btnRebuild, "btnRebuild");
-            this.btnRebuild.Name = "btnRebuild";
-            this.btnRebuild.UseVisualStyleBackColor = true;
-            this.btnRebuild.Click += new System.EventHandler(this.btnRebuild_Click);
+            resources.ApplyResources(this.btnReset, "btnReset");
+            this.btnReset.Name = "btnReset";
+            this.btnReset.UseVisualStyleBackColor = true;
+            this.btnReset.Click += new System.EventHandler(this.btnReset_Click);
             // 
             // groupBox2
             // 
@@ -140,7 +140,7 @@
         #endregion
 
         private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.Button btnRebuild;
+        private System.Windows.Forms.Button btnReset;
         private System.Windows.Forms.Button btnEditSchema;
         private System.Windows.Forms.Button btnTest;
         private System.Windows.Forms.ComboBox cmbMethod;

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -29,6 +29,10 @@
 using Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors;
 using OSGeo.MapGuide.ObjectModels;
 using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.SchemaOverrides;
+using System.Xml;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using Maestro.Editors.FeatureSource.Providers.Odbc.OverrideEditor;
 
 namespace Maestro.Editors.FeatureSource.Providers.Odbc
 {
@@ -196,14 +200,84 @@
             }
         }
 
+        private OdbcConfigurationDocument _doc;
+
+        //This is ODBC, so there will only be one
+        private string _defaultSchemaName;
+
         private void btnEditSchema_Click(object sender, EventArgs e)
         {
+            if (string.IsNullOrEmpty(_defaultSchemaName))
+            {
+                var names = _fs.GetSchemaNames();
+                if (names.Length == 1)
+                {
+                    _defaultSchemaName = names[0];
+                }
+                else
+                {
+                    MessageBox.Show(Properties.Resources.NoSchemasInFeatureSource);
+                    return;
+                }
+            }
 
+            string xml = _fs.GetConfigurationContent();
+            if (!string.IsNullOrEmpty(xml))
+            {
+                _doc = (OdbcConfigurationDocument)ConfigurationDocument.LoadXml(xml);
+            }
+            else
+            {
+                if (_doc == null)
+                {
+                    BuildDefaultDocument();
+                }
+            }
+
+            var diag = new TableConfigurationDialog(_doc, _defaultSchemaName);
+            if (diag.ShowDialog() == DialogResult.OK)
+            {
+                _doc.ClearMappings();
+                foreach (var table in diag.ConfiguredTables)
+                {
+                    _doc.AddOverride(table);
+                }
+                string updatedContent = _doc.ToXml();
+                _fs.SetConfigurationContent(updatedContent);
+                OnResourceChanged();
+            }
         }
 
-        private void btnRebuild_Click(object sender, EventArgs e)
+        private void BuildDefaultDocument()
         {
+            _doc = new OdbcConfigurationDocument();
 
+            var xmlDoc = new XmlDocument();
+            XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable);
+            mgr.AddNamespace("xs", XmlNamespaces.XS);
+            mgr.AddNamespace("xsi", XmlNamespaces.XSI);
+            mgr.AddNamespace("fdo", XmlNamespaces.FDO);
+            mgr.AddNamespace("gml", XmlNamespaces.GML);
+            mgr.AddNamespace("xlink", XmlNamespaces.XLINK);
+            mgr.AddNamespace("fds", XmlNamespaces.FDS);
+
+            var desc = _fs.Describe();
+            _doc.AddSchema(desc.Schemas[0]); //Only one schema is supported by ODBC so this is ok
+
+            var scList = _fs.GetSpatialInfo(false);
+            foreach (var sc in scList.SpatialContext)
+            {
+                _doc.AddSpatialContext(sc);
+            }
         }
+
+        private void btnReset_Click(object sender, EventArgs e)
+        {
+            _fs.SetConfigurationContent(null);
+            _fs.ConfigurationDocument = null;
+            _service.SyncSessionCopy();
+            BuildDefaultDocument();
+            MessageBox.Show(Properties.Resources.ConfigurationDocumentReset);
+        }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.resx	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.resx	2011-02-28 15:17:24 UTC (rev 5571)
@@ -255,31 +255,31 @@
   <data name="&gt;&gt;groupBox2.ZOrder" xml:space="preserve">
     <value>2</value>
   </data>
-  <data name="btnRebuild.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+  <data name="btnReset.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Bottom, Left</value>
   </data>
-  <data name="btnRebuild.Location" type="System.Drawing.Point, System.Drawing">
+  <data name="btnReset.Location" type="System.Drawing.Point, System.Drawing">
     <value>287, 289</value>
   </data>
-  <data name="btnRebuild.Size" type="System.Drawing.Size, System.Drawing">
+  <data name="btnReset.Size" type="System.Drawing.Size, System.Drawing">
     <value>75, 23</value>
   </data>
-  <data name="btnRebuild.TabIndex" type="System.Int32, mscorlib">
+  <data name="btnReset.TabIndex" type="System.Int32, mscorlib">
     <value>5</value>
   </data>
-  <data name="btnRebuild.Text" xml:space="preserve">
-    <value>Rebuild</value>
+  <data name="btnReset.Text" xml:space="preserve">
+    <value>Reset</value>
   </data>
-  <data name="&gt;&gt;btnRebuild.Name" xml:space="preserve">
-    <value>btnRebuild</value>
+  <data name="&gt;&gt;btnReset.Name" xml:space="preserve">
+    <value>btnReset</value>
   </data>
-  <data name="&gt;&gt;btnRebuild.Type" xml:space="preserve">
+  <data name="&gt;&gt;btnReset.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;btnRebuild.Parent" xml:space="preserve">
+  <data name="&gt;&gt;btnReset.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
-  <data name="&gt;&gt;btnRebuild.ZOrder" xml:space="preserve">
+  <data name="&gt;&gt;btnReset.ZOrder" xml:space="preserve">
     <value>3</value>
   </data>
   <data name="btnEditSchema.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.Designer.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -0,0 +1,214 @@
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.OverrideEditor
+{
+    partial class TableConfigCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TableConfigCtrl));
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtTable = new System.Windows.Forms.TextBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.txtKey = new System.Windows.Forms.TextBox();
+            this.btnKey = new System.Windows.Forms.Button();
+            this.btnX = new System.Windows.Forms.Button();
+            this.txtX = new System.Windows.Forms.TextBox();
+            this.btnY = new System.Windows.Forms.Button();
+            this.txtY = new System.Windows.Forms.TextBox();
+            this.btnZ = new System.Windows.Forms.Button();
+            this.txtZ = new System.Windows.Forms.TextBox();
+            this.chkGeometry = new System.Windows.Forms.CheckBox();
+            this.btnSpatialContext = new System.Windows.Forms.Button();
+            this.txtSpatialContext = new System.Windows.Forms.TextBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // txtTable
+            // 
+            resources.ApplyResources(this.txtTable, "txtTable");
+            this.txtTable.Name = "txtTable";
+            this.txtTable.ReadOnly = true;
+            // 
+            // 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";
+            // 
+            // label5
+            // 
+            resources.ApplyResources(this.label5, "label5");
+            this.label5.Name = "label5";
+            // 
+            // txtKey
+            // 
+            resources.ApplyResources(this.txtKey, "txtKey");
+            this.txtKey.Name = "txtKey";
+            this.txtKey.ReadOnly = true;
+            this.txtKey.TextChanged += new System.EventHandler(this.txtKey_TextChanged);
+            // 
+            // btnKey
+            // 
+            resources.ApplyResources(this.btnKey, "btnKey");
+            this.btnKey.Name = "btnKey";
+            this.btnKey.UseVisualStyleBackColor = true;
+            this.btnKey.Click += new System.EventHandler(this.btnKey_Click);
+            // 
+            // btnX
+            // 
+            resources.ApplyResources(this.btnX, "btnX");
+            this.btnX.Name = "btnX";
+            this.btnX.UseVisualStyleBackColor = true;
+            this.btnX.Click += new System.EventHandler(this.btnX_Click);
+            // 
+            // txtX
+            // 
+            resources.ApplyResources(this.txtX, "txtX");
+            this.txtX.Name = "txtX";
+            this.txtX.ReadOnly = true;
+            this.txtX.TextChanged += new System.EventHandler(this.txtX_TextChanged);
+            // 
+            // btnY
+            // 
+            resources.ApplyResources(this.btnY, "btnY");
+            this.btnY.Name = "btnY";
+            this.btnY.UseVisualStyleBackColor = true;
+            this.btnY.Click += new System.EventHandler(this.btnY_Click);
+            // 
+            // txtY
+            // 
+            resources.ApplyResources(this.txtY, "txtY");
+            this.txtY.Name = "txtY";
+            this.txtY.ReadOnly = true;
+            this.txtY.TextChanged += new System.EventHandler(this.txtY_TextChanged);
+            // 
+            // btnZ
+            // 
+            resources.ApplyResources(this.btnZ, "btnZ");
+            this.btnZ.Name = "btnZ";
+            this.btnZ.UseVisualStyleBackColor = true;
+            this.btnZ.Click += new System.EventHandler(this.btnZ_Click);
+            // 
+            // txtZ
+            // 
+            resources.ApplyResources(this.txtZ, "txtZ");
+            this.txtZ.Name = "txtZ";
+            this.txtZ.ReadOnly = true;
+            this.txtZ.TextChanged += new System.EventHandler(this.txtZ_TextChanged);
+            // 
+            // chkGeometry
+            // 
+            resources.ApplyResources(this.chkGeometry, "chkGeometry");
+            this.chkGeometry.Name = "chkGeometry";
+            this.chkGeometry.UseVisualStyleBackColor = true;
+            this.chkGeometry.CheckedChanged += new System.EventHandler(this.chkGeometry_CheckedChanged);
+            // 
+            // btnSpatialContext
+            // 
+            resources.ApplyResources(this.btnSpatialContext, "btnSpatialContext");
+            this.btnSpatialContext.Name = "btnSpatialContext";
+            this.btnSpatialContext.UseVisualStyleBackColor = true;
+            this.btnSpatialContext.Click += new System.EventHandler(this.btnSpatialContext_Click);
+            // 
+            // txtSpatialContext
+            // 
+            resources.ApplyResources(this.txtSpatialContext, "txtSpatialContext");
+            this.txtSpatialContext.Name = "txtSpatialContext";
+            this.txtSpatialContext.ReadOnly = true;
+            this.txtSpatialContext.TextChanged += new System.EventHandler(this.txtSpatialContext_TextChanged);
+            // 
+            // label6
+            // 
+            resources.ApplyResources(this.label6, "label6");
+            this.label6.Name = "label6";
+            // 
+            // TableConfigCtrl
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+            this.Controls.Add(this.btnSpatialContext);
+            this.Controls.Add(this.txtSpatialContext);
+            this.Controls.Add(this.label6);
+            this.Controls.Add(this.chkGeometry);
+            this.Controls.Add(this.btnZ);
+            this.Controls.Add(this.txtZ);
+            this.Controls.Add(this.btnY);
+            this.Controls.Add(this.txtY);
+            this.Controls.Add(this.btnX);
+            this.Controls.Add(this.txtX);
+            this.Controls.Add(this.btnKey);
+            this.Controls.Add(this.txtKey);
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.txtTable);
+            this.Controls.Add(this.label1);
+            this.Name = "TableConfigCtrl";
+            resources.ApplyResources(this, "$this");
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtTable;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.TextBox txtKey;
+        private System.Windows.Forms.Button btnKey;
+        private System.Windows.Forms.Button btnX;
+        private System.Windows.Forms.TextBox txtX;
+        private System.Windows.Forms.Button btnY;
+        private System.Windows.Forms.TextBox txtY;
+        private System.Windows.Forms.Button btnZ;
+        private System.Windows.Forms.TextBox txtZ;
+        private System.Windows.Forms.CheckBox chkGeometry;
+        private System.Windows.Forms.Button btnSpatialContext;
+        private System.Windows.Forms.TextBox txtSpatialContext;
+        private System.Windows.Forms.Label label6;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -0,0 +1,231 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using Maestro.Editors.Common;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.OverrideEditor
+{
+    public partial class TableConfigCtrl : UserControl
+    {
+        public TableConfigCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private string[] _scNames;
+
+        public void SetSpatialContexts(string[] spatialContextNames)
+        {
+            _scNames = spatialContextNames;
+        }
+
+        private TableOverrideItem _item;
+
+        public void Reset()
+        {
+            _item = null;
+            chkGeometry.Checked = false;
+            txtKey.Text = txtTable.Text = txtX.Text = txtY.Text = txtZ.Text = string.Empty;
+        }
+
+        internal void Init(TableOverrideItem item)
+        {
+            Reset();
+            chkGeometry.Checked = !string.IsNullOrEmpty(item.Class.DefaultGeometryPropertyName);
+            txtTable.Text = item.TableName;
+            txtSpatialContext.Text = item.SpatialContext;
+            txtKey.Text = item.Key;
+            txtX.Text = item.X;
+            txtY.Text = item.Y;
+            txtZ.Text = item.Z;
+            _item = item;
+        }
+
+        private void txtSpatialContext_TextChanged(object sender, EventArgs e)
+        {
+            if (_item != null)
+                _item.SpatialContext = txtSpatialContext.Text;
+        }
+
+        private void txtKey_TextChanged(object sender, EventArgs e)
+        {
+            if (_item != null)
+                _item.Key = txtKey.Text;
+        }
+
+        private void txtX_TextChanged(object sender, EventArgs e)
+        {
+            if (_item != null)
+                _item.X = txtX.Text;
+        }
+
+        private void txtY_TextChanged(object sender, EventArgs e)
+        {
+            if (_item != null)
+                _item.Y = txtY.Text;
+        }
+
+        private void txtZ_TextChanged(object sender, EventArgs e)
+        {
+            if (_item != null)
+                _item.Z = txtZ.Text;
+        }
+
+        private void chkGeometry_CheckedChanged(object sender, EventArgs e)
+        {
+            if (!chkGeometry.Checked)
+            {
+                if (_item != null)
+                {
+                    //Remove existing geometry property if defined
+                    if (!string.IsNullOrEmpty(_item.Class.DefaultGeometryPropertyName))
+                    {
+                        var prop = _item.Class.FindProperty(_item.Class.DefaultGeometryPropertyName);
+                        if (prop != null)
+                        {
+                            _item.Class.RemoveProperty(prop);
+                        }
+                        _item.Class.DefaultGeometryPropertyName = null;
+                    }
+                }
+                txtSpatialContext.Text = txtX.Text = txtY.Text = txtZ.Text = string.Empty;
+            }
+            else
+            {
+                if (_item != null)
+                {
+                    //Set logical geometry property
+                    var prop = new GeometricPropertyDefinition("Geometry", "");
+                    prop.GeometricTypes = FeatureGeometricType.Point;
+                    prop.HasElevation = true;
+                    prop.HasMeasure = true;
+
+                    _item.Class.AddProperty(prop);
+                    _item.Class.DefaultGeometryPropertyName = prop.Name;
+
+                    if (_scNames.Length > 0)
+                        txtSpatialContext.Text = _scNames[0];
+                }
+            }
+        }
+
+        private string[] GetPropertyNames()
+        {
+            List<string> values = new List<string>();
+            foreach (var prop in _item.Class.Properties)
+            {
+                if (prop.Type == PropertyDefinitionType.Data)
+                {
+                    values.Add(prop.Name);
+                }
+            }
+            return values.ToArray();
+        }
+
+        private string[] GetNumericPropertyNames()
+        {
+            List<string> values = new List<string>();
+            foreach (var prop in _item.Class.Properties)
+            {
+                if (prop.Type == PropertyDefinitionType.Data)
+                {
+                    var dt = ((DataPropertyDefinition)prop).DataType;
+                    switch (dt)
+                    {
+                        case DataPropertyType.Byte:
+                        case DataPropertyType.Double:
+                        case DataPropertyType.Int16:
+                        case DataPropertyType.Int32:
+                        case DataPropertyType.Int64:
+                        case DataPropertyType.Single:
+                            values.Add(prop.Name);
+                            break;
+                    }
+                }
+            }
+            return values.ToArray();
+        }
+
+        private void btnKey_Click(object sender, EventArgs e)
+        {
+            var item = GenericItemSelectionDialog.SelectItem(Properties.Resources.SelectProperty, Properties.Resources.SelectProperty, GetPropertyNames());
+            if (!string.IsNullOrEmpty(item))
+            {
+                txtKey.Text = item;
+
+                //Change the mapped logical class
+                var prop = _item.Class.FindProperty(item);
+                if (prop != null && prop.Type == PropertyDefinitionType.Data)
+                {
+                    _item.Class.ClearIdentityProperties();
+                    _item.Class.AddProperty((DataPropertyDefinition)prop, true);
+                }
+            }
+        }
+
+        private void btnX_Click(object sender, EventArgs e)
+        {
+            if (!chkGeometry.Checked)
+            {
+                MessageBox.Show(Properties.Resources.CheckGeometryFirst);
+                return;
+            }
+
+            var item = GenericItemSelectionDialog.SelectItem(Properties.Resources.SelectProperty, Properties.Resources.SelectProperty, GetNumericPropertyNames());
+            if (!string.IsNullOrEmpty(item))
+            {
+                txtX.Text = item;
+            }
+        }
+
+        private void btnY_Click(object sender, EventArgs e)
+        {
+            if (!chkGeometry.Checked)
+            {
+                MessageBox.Show(Properties.Resources.CheckGeometryFirst);
+                return;
+            }
+
+            var item = GenericItemSelectionDialog.SelectItem(Properties.Resources.SelectProperty, Properties.Resources.SelectProperty, GetNumericPropertyNames());
+            if (!string.IsNullOrEmpty(item))
+            {
+                txtY.Text = item;
+            }
+        }
+
+        private void btnZ_Click(object sender, EventArgs e)
+        {
+            if (!chkGeometry.Checked)
+            {
+                MessageBox.Show(Properties.Resources.CheckGeometryFirst);
+                return;
+            }
+
+            var item = GenericItemSelectionDialog.SelectItem(Properties.Resources.SelectProperty, Properties.Resources.SelectProperty, GetNumericPropertyNames());
+            if (!string.IsNullOrEmpty(item))
+            {
+                txtZ.Text = item;
+            }
+        }
+
+        private void btnSpatialContext_Click(object sender, EventArgs e)
+        {
+            if (!chkGeometry.Checked)
+            {
+                MessageBox.Show(Properties.Resources.CheckGeometryFirst);
+                return;
+            }
+
+            var item = GenericItemSelectionDialog.SelectItem(Properties.Resources.SelectSpatialContext, Properties.Resources.SelectSpatialContext, _scNames);
+            if (!string.IsNullOrEmpty(item))
+            {
+                txtSpatialContext.Text = item;
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigCtrl.resx	2011-02-28 15:17:24 UTC (rev 5571)
@@ -0,0 +1,609 @@
+<?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>11, 11</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>Table</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>17</value>
+  </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="txtTable.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtTable.Location" type="System.Drawing.Point, System.Drawing">
+    <value>14, 28</value>
+  </data>
+  <data name="txtTable.Size" type="System.Drawing.Size, System.Drawing">
+    <value>155, 20</value>
+  </data>
+  <data name="txtTable.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;txtTable.Name" xml:space="preserve">
+    <value>txtTable</value>
+  </data>
+  <data name="&gt;&gt;txtTable.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;txtTable.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;txtTable.ZOrder" xml:space="preserve">
+    <value>16</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>11, 52</value>
+  </data>
+  <data name="label2.Size" type="System.Drawing.Size, System.Drawing">
+    <value>63, 13</value>
+  </data>
+  <data name="label2.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="label2.Text" xml:space="preserve">
+    <value>Key Column</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>15</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>11, 171</value>
+  </data>
+  <data name="label3.Size" type="System.Drawing.Size, System.Drawing">
+    <value>52, 13</value>
+  </data>
+  <data name="label3.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="label3.Text" xml:space="preserve">
+    <value>X Column</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>14</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>11, 213</value>
+  </data>
+  <data name="label4.Size" type="System.Drawing.Size, System.Drawing">
+    <value>52, 13</value>
+  </data>
+  <data name="label4.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="label4.Text" xml:space="preserve">
+    <value>Y Column</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>13</value>
+  </data>
+  <data name="label5.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label5.Location" type="System.Drawing.Point, System.Drawing">
+    <value>11, 254</value>
+  </data>
+  <data name="label5.Size" type="System.Drawing.Size, System.Drawing">
+    <value>52, 13</value>
+  </data>
+  <data name="label5.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="label5.Text" xml:space="preserve">
+    <value>Z Column</value>
+  </data>
+  <data name="&gt;&gt;label5.Name" xml:space="preserve">
+    <value>label5</value>
+  </data>
+  <data name="&gt;&gt;label5.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;label5.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;label5.ZOrder" xml:space="preserve">
+    <value>12</value>
+  </data>
+  <data name="txtKey.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtKey.Location" type="System.Drawing.Point, System.Drawing">
+    <value>14, 69</value>
+  </data>
+  <data name="txtKey.Size" type="System.Drawing.Size, System.Drawing">
+    <value>116, 20</value>
+  </data>
+  <data name="txtKey.TabIndex" type="System.Int32, mscorlib">
+    <value>6</value>
+  </data>
+  <data name="&gt;&gt;txtKey.Name" xml:space="preserve">
+    <value>txtKey</value>
+  </data>
+  <data name="&gt;&gt;txtKey.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;txtKey.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;txtKey.ZOrder" xml:space="preserve">
+    <value>11</value>
+  </data>
+  <data name="btnKey.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Right</value>
+  </data>
+  <data name="btnKey.Location" type="System.Drawing.Point, System.Drawing">
+    <value>136, 67</value>
+  </data>
+  <data name="btnKey.Size" type="System.Drawing.Size, System.Drawing">
+    <value>33, 23</value>
+  </data>
+  <data name="btnKey.TabIndex" type="System.Int32, mscorlib">
+    <value>7</value>
+  </data>
+  <data name="btnKey.Text" xml:space="preserve">
+    <value>...</value>
+  </data>
+  <data name="&gt;&gt;btnKey.Name" xml:space="preserve">
+    <value>btnKey</value>
+  </data>
+  <data name="&gt;&gt;btnKey.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;btnKey.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;btnKey.ZOrder" xml:space="preserve">
+    <value>10</value>
+  </data>
+  <data name="btnX.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Right</value>
+  </data>
+  <data name="btnX.Location" type="System.Drawing.Point, System.Drawing">
+    <value>136, 185</value>
+  </data>
+  <data name="btnX.Size" type="System.Drawing.Size, System.Drawing">
+    <value>33, 23</value>
+  </data>
+  <data name="btnX.TabIndex" type="System.Int32, mscorlib">
+    <value>9</value>
+  </data>
+  <data name="btnX.Text" xml:space="preserve">
+    <value>...</value>
+  </data>
+  <data name="&gt;&gt;btnX.Name" xml:space="preserve">
+    <value>btnX</value>
+  </data>
+  <data name="&gt;&gt;btnX.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;btnX.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;btnX.ZOrder" xml:space="preserve">
+    <value>8</value>
+  </data>
+  <data name="txtX.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtX.Location" type="System.Drawing.Point, System.Drawing">
+    <value>14, 187</value>
+  </data>
+  <data name="txtX.Size" type="System.Drawing.Size, System.Drawing">
+    <value>116, 20</value>
+  </data>
+  <data name="txtX.TabIndex" type="System.Int32, mscorlib">
+    <value>8</value>
+  </data>
+  <data name="&gt;&gt;txtX.Name" xml:space="preserve">
+    <value>txtX</value>
+  </data>
+  <data name="&gt;&gt;txtX.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;txtX.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;txtX.ZOrder" xml:space="preserve">
+    <value>9</value>
+  </data>
+  <data name="btnY.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Right</value>
+  </data>
+  <data name="btnY.Location" type="System.Drawing.Point, System.Drawing">
+    <value>136, 227</value>
+  </data>
+  <data name="btnY.Size" type="System.Drawing.Size, System.Drawing">
+    <value>33, 23</value>
+  </data>
+  <data name="btnY.TabIndex" type="System.Int32, mscorlib">
+    <value>11</value>
+  </data>
+  <data name="btnY.Text" xml:space="preserve">
+    <value>...</value>
+  </data>
+  <data name="&gt;&gt;btnY.Name" xml:space="preserve">
+    <value>btnY</value>
+  </data>
+  <data name="&gt;&gt;btnY.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;btnY.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;btnY.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="txtY.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtY.Location" type="System.Drawing.Point, System.Drawing">
+    <value>14, 229</value>
+  </data>
+  <data name="txtY.Size" type="System.Drawing.Size, System.Drawing">
+    <value>116, 20</value>
+  </data>
+  <data name="txtY.TabIndex" type="System.Int32, mscorlib">
+    <value>10</value>
+  </data>
+  <data name="&gt;&gt;txtY.Name" xml:space="preserve">
+    <value>txtY</value>
+  </data>
+  <data name="&gt;&gt;txtY.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;txtY.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;txtY.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="btnZ.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Right</value>
+  </data>
+  <data name="btnZ.Location" type="System.Drawing.Point, System.Drawing">
+    <value>136, 268</value>
+  </data>
+  <data name="btnZ.Size" type="System.Drawing.Size, System.Drawing">
+    <value>33, 23</value>
+  </data>
+  <data name="btnZ.TabIndex" type="System.Int32, mscorlib">
+    <value>13</value>
+  </data>
+  <data name="btnZ.Text" xml:space="preserve">
+    <value>...</value>
+  </data>
+  <data name="&gt;&gt;btnZ.Name" xml:space="preserve">
+    <value>btnZ</value>
+  </data>
+  <data name="&gt;&gt;btnZ.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;btnZ.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;btnZ.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="txtZ.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtZ.Location" type="System.Drawing.Point, System.Drawing">
+    <value>14, 270</value>
+  </data>
+  <data name="txtZ.Size" type="System.Drawing.Size, System.Drawing">
+    <value>116, 20</value>
+  </data>
+  <data name="txtZ.TabIndex" type="System.Int32, mscorlib">
+    <value>12</value>
+  </data>
+  <data name="&gt;&gt;txtZ.Name" xml:space="preserve">
+    <value>txtZ</value>
+  </data>
+  <data name="&gt;&gt;txtZ.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;txtZ.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;txtZ.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="chkGeometry.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="chkGeometry.Location" type="System.Drawing.Point, System.Drawing">
+    <value>14, 95</value>
+  </data>
+  <data name="chkGeometry.Size" type="System.Drawing.Size, System.Drawing">
+    <value>71, 17</value>
+  </data>
+  <data name="chkGeometry.TabIndex" type="System.Int32, mscorlib">
+    <value>14</value>
+  </data>
+  <data name="chkGeometry.Text" xml:space="preserve">
+    <value>Geometry</value>
+  </data>
+  <data name="&gt;&gt;chkGeometry.Name" xml:space="preserve">
+    <value>chkGeometry</value>
+  </data>
+  <data name="&gt;&gt;chkGeometry.Type" xml:space="preserve">
+    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;chkGeometry.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;chkGeometry.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="btnSpatialContext.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Right</value>
+  </data>
+  <data name="btnSpatialContext.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="btnSpatialContext.Location" type="System.Drawing.Point, System.Drawing">
+    <value>136, 137</value>
+  </data>
+  <data name="btnSpatialContext.Size" type="System.Drawing.Size, System.Drawing">
+    <value>33, 23</value>
+  </data>
+  <data name="btnSpatialContext.TabIndex" type="System.Int32, mscorlib">
+    <value>17</value>
+  </data>
+  <data name="btnSpatialContext.Text" xml:space="preserve">
+    <value>...</value>
+  </data>
+  <data name="&gt;&gt;btnSpatialContext.Name" xml:space="preserve">
+    <value>btnSpatialContext</value>
+  </data>
+  <data name="&gt;&gt;btnSpatialContext.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;btnSpatialContext.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;btnSpatialContext.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="txtSpatialContext.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtSpatialContext.Location" type="System.Drawing.Point, System.Drawing">
+    <value>14, 139</value>
+  </data>
+  <data name="txtSpatialContext.Size" type="System.Drawing.Size, System.Drawing">
+    <value>116, 20</value>
+  </data>
+  <data name="txtSpatialContext.TabIndex" type="System.Int32, mscorlib">
+    <value>16</value>
+  </data>
+  <data name="&gt;&gt;txtSpatialContext.Name" xml:space="preserve">
+    <value>txtSpatialContext</value>
+  </data>
+  <data name="&gt;&gt;txtSpatialContext.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;txtSpatialContext.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;txtSpatialContext.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="label6.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label6.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="label6.Location" type="System.Drawing.Point, System.Drawing">
+    <value>11, 123</value>
+  </data>
+  <data name="label6.Size" type="System.Drawing.Size, System.Drawing">
+    <value>78, 13</value>
+  </data>
+  <data name="label6.TabIndex" type="System.Int32, mscorlib">
+    <value>15</value>
+  </data>
+  <data name="label6.Text" xml:space="preserve">
+    <value>Spatial Context</value>
+  </data>
+  <data name="&gt;&gt;label6.Name" xml:space="preserve">
+    <value>label6</value>
+  </data>
+  <data name="&gt;&gt;label6.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;label6.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;label6.ZOrder" xml:space="preserve">
+    <value>2</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.Size" type="System.Drawing.Size, System.Drawing">
+    <value>186, 373</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>TableConfigCtrl</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.UserControl, 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.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.Designer.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -0,0 +1,183 @@
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.OverrideEditor
+{
+    partial class TableConfigurationDialog
+    {
+        /// <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(TableConfigurationDialog));
+            this.btnSave = new System.Windows.Forms.Button();
+            this.btnCancel = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+            this.grdTables = new System.Windows.Forms.DataGridView();
+            this.tableConfigCtrl = new Maestro.Editors.FeatureSource.Providers.Odbc.OverrideEditor.TableConfigCtrl();
+            this.COL_OVERRIDE = new System.Windows.Forms.DataGridViewCheckBoxColumn();
+            this.COL_NAME = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.COL_KEY = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.COL_X = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.COL_Y = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.COL_Z = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.splitContainer1.Panel1.SuspendLayout();
+            this.splitContainer1.Panel2.SuspendLayout();
+            this.splitContainer1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdTables)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // btnSave
+            // 
+            resources.ApplyResources(this.btnSave, "btnSave");
+            this.btnSave.Name = "btnSave";
+            this.btnSave.UseVisualStyleBackColor = true;
+            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+            // 
+            // btnCancel
+            // 
+            resources.ApplyResources(this.btnCancel, "btnCancel");
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.UseVisualStyleBackColor = true;
+            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // splitContainer1
+            // 
+            resources.ApplyResources(this.splitContainer1, "splitContainer1");
+            this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+            this.splitContainer1.Name = "splitContainer1";
+            // 
+            // splitContainer1.Panel1
+            // 
+            this.splitContainer1.Panel1.Controls.Add(this.grdTables);
+            // 
+            // splitContainer1.Panel2
+            // 
+            this.splitContainer1.Panel2.Controls.Add(this.tableConfigCtrl);
+            // 
+            // grdTables
+            // 
+            this.grdTables.AllowUserToAddRows = false;
+            this.grdTables.AllowUserToDeleteRows = false;
+            this.grdTables.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.grdTables.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.COL_OVERRIDE,
+            this.COL_NAME,
+            this.COL_KEY,
+            this.COL_X,
+            this.COL_Y,
+            this.COL_Z});
+            resources.ApplyResources(this.grdTables, "grdTables");
+            this.grdTables.Name = "grdTables";
+            this.grdTables.RowHeadersVisible = false;
+            this.grdTables.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.grdTables_CellContentClick);
+            this.grdTables.CurrentCellDirtyStateChanged += new System.EventHandler(this.grdTables_CurrentCellDirtyStateChanged);
+            this.grdTables.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.grdTables_CellContentClick);
+            // 
+            // tableConfigCtrl
+            // 
+            resources.ApplyResources(this.tableConfigCtrl, "tableConfigCtrl");
+            this.tableConfigCtrl.Name = "tableConfigCtrl";
+            // 
+            // COL_OVERRIDE
+            // 
+            this.COL_OVERRIDE.DataPropertyName = "Override";
+            resources.ApplyResources(this.COL_OVERRIDE, "COL_OVERRIDE");
+            this.COL_OVERRIDE.Name = "COL_OVERRIDE";
+            // 
+            // COL_NAME
+            // 
+            this.COL_NAME.DataPropertyName = "TableName";
+            resources.ApplyResources(this.COL_NAME, "COL_NAME");
+            this.COL_NAME.Name = "COL_NAME";
+            this.COL_NAME.ReadOnly = true;
+            // 
+            // COL_KEY
+            // 
+            this.COL_KEY.DataPropertyName = "Key";
+            resources.ApplyResources(this.COL_KEY, "COL_KEY");
+            this.COL_KEY.Name = "COL_KEY";
+            this.COL_KEY.ReadOnly = true;
+            // 
+            // COL_X
+            // 
+            this.COL_X.DataPropertyName = "X";
+            resources.ApplyResources(this.COL_X, "COL_X");
+            this.COL_X.Name = "COL_X";
+            this.COL_X.ReadOnly = true;
+            // 
+            // COL_Y
+            // 
+            this.COL_Y.DataPropertyName = "Y";
+            resources.ApplyResources(this.COL_Y, "COL_Y");
+            this.COL_Y.Name = "COL_Y";
+            this.COL_Y.ReadOnly = true;
+            // 
+            // COL_Z
+            // 
+            this.COL_Z.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+            this.COL_Z.DataPropertyName = "Z";
+            resources.ApplyResources(this.COL_Z, "COL_Z");
+            this.COL_Z.Name = "COL_Z";
+            this.COL_Z.ReadOnly = true;
+            // 
+            // TableConfigurationDialog
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+            resources.ApplyResources(this, "$this");
+            this.Controls.Add(this.splitContainer1);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.btnCancel);
+            this.Controls.Add(this.btnSave);
+            this.Name = "TableConfigurationDialog";
+            this.ShowIcon = false;
+            this.splitContainer1.Panel1.ResumeLayout(false);
+            this.splitContainer1.Panel2.ResumeLayout(false);
+            this.splitContainer1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.grdTables)).EndInit();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button btnSave;
+        private System.Windows.Forms.Button btnCancel;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.SplitContainer splitContainer1;
+        private System.Windows.Forms.DataGridView grdTables;
+        private TableConfigCtrl tableConfigCtrl;
+        private System.Windows.Forms.DataGridViewCheckBoxColumn COL_OVERRIDE;
+        private System.Windows.Forms.DataGridViewTextBoxColumn COL_NAME;
+        private System.Windows.Forms.DataGridViewTextBoxColumn COL_KEY;
+        private System.Windows.Forms.DataGridViewTextBoxColumn COL_X;
+        private System.Windows.Forms.DataGridViewTextBoxColumn COL_Y;
+        private System.Windows.Forms.DataGridViewTextBoxColumn COL_Z;
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -0,0 +1,142 @@
+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.SchemaOverrides;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.OverrideEditor
+{
+    public partial class TableConfigurationDialog : Form
+    {
+        private BindingList<TableOverrideItem> _tables;
+
+        private TableConfigurationDialog()
+        {
+            InitializeComponent();
+            grdTables.AutoGenerateColumns = false;
+            _tables = new BindingList<TableOverrideItem>();
+            grdTables.DataSource = _tables;
+        }
+
+        public TableConfigurationDialog(OdbcConfigurationDocument doc, string schemaName)
+            : this()
+        {
+            tableConfigCtrl.SetSpatialContexts(doc.GetSpatialContextNames());
+
+            var schema = doc.GetSchema(schemaName);
+            Dictionary<string, TableOverrideItem> tables = new Dictionary<string, TableOverrideItem>();
+            List<TableOverrideItem> existing = new List<TableOverrideItem>();
+            foreach (var tbl in doc.GetMappingsForSchema(schemaName))
+            {
+                var cls = doc.GetClass(schemaName, tbl.ClassName);
+                tables[tbl.ClassName] = new TableOverrideItem()
+                {
+                    Override = true,
+                    Class = cls,
+                    TableName = tbl.ClassName,
+                    Key = cls.IdentityProperties.Count > 0 ? cls.IdentityProperties[0].Name : string.Empty,
+                    X = tbl.XColumn,
+                    Y = tbl.YColumn,
+                    Z = tbl.ZColumn
+                };
+                if (!string.IsNullOrEmpty(cls.DefaultGeometryPropertyName))
+                {
+                    var prop = cls.FindProperty(cls.DefaultGeometryPropertyName) as GeometricPropertyDefinition;
+                    if (prop != null)
+                        tables[tbl.ClassName].SpatialContext = prop.SpatialContextAssociation;
+                }
+                existing.Add(tables[tbl.ClassName]);
+            }
+            foreach (var cls in schema.Classes)
+            {
+                if (!tables.ContainsKey(cls.Name))
+                {
+                    tables[cls.Name] = new TableOverrideItem()
+                    {
+                        Override = false,
+                        Class = cls,
+                        TableName = cls.Name,
+                        Geometry = false,
+                        Key = cls.IdentityProperties.Count > 0 ? cls.IdentityProperties[0].Name : string.Empty
+                    };
+                }
+            }
+
+            foreach (var tbl in tables.Values)
+            {
+                _tables.Add(tbl);
+            }
+        }
+
+        public OdbcTableItem[] ConfiguredTables
+        {
+            get
+            {
+                var items = new List<OdbcTableItem>();
+                foreach (DataGridViewRow row in grdTables.Rows)
+                {
+                    if (row.Cells[0].Value != null && (bool)row.Cells[0].Value)
+                    {
+                        var table = (TableOverrideItem)row.DataBoundItem;
+                        items.Add(new OdbcTableItem()
+                        {
+                            ClassName = table.Class.Name,
+                            SchemaName = table.Class.Parent.Name,
+                            SpatialContextName = table.SpatialContext,
+                            XColumn = table.X,
+                            YColumn = table.Y,
+                            ZColumn = table.Z
+                        });
+                    }
+                }
+                return items.ToArray();
+            }
+        }
+
+        private void btnCancel_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.Cancel;
+        }
+
+        private void btnSave_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.OK;
+        }
+
+        private void grdTables_CurrentCellDirtyStateChanged(object sender, EventArgs e)
+        {
+            var cell = grdTables.CurrentCell;
+            if (cell is DataGridViewCheckBoxCell)
+            {
+                grdTables.CommitEdit(DataGridViewDataErrorContexts.Commit);
+                if (cell.Value != null && Convert.ToBoolean(cell.Value))
+                {
+                    var row = grdTables.Rows[cell.RowIndex];
+                    tableConfigCtrl.Reset();
+                    tableConfigCtrl.Init((TableOverrideItem)row.DataBoundItem);
+                }
+                else
+                {
+                    tableConfigCtrl.Reset();
+                }
+            }
+        }
+
+        private void grdTables_CellContentClick(object sender, DataGridViewCellEventArgs e)
+        {
+            if (e.RowIndex >= 0)
+            {
+                tableConfigCtrl.Reset();
+                var row = grdTables.Rows[e.RowIndex];
+                if (row.Cells[0].Value != null && Convert.ToBoolean(row.Cells[0].Value))
+                {
+                    tableConfigCtrl.Init((TableOverrideItem)row.DataBoundItem);
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableConfigurationDialog.resx	2011-02-28 15:17:24 UTC (rev 5571)
@@ -0,0 +1,414 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="btnSave.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Right</value>
+  </data>
+  <data name="btnSave.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="btnSave.Location" type="System.Drawing.Point, System.Drawing">
+    <value>512, 306</value>
+  </data>
+  <data name="btnSave.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="btnSave.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="btnSave.Text" xml:space="preserve">
+    <value>Save</value>
+  </data>
+  <data name="&gt;&gt;btnSave.Name" xml:space="preserve">
+    <value>btnSave</value>
+  </data>
+  <data name="&gt;&gt;btnSave.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;btnSave.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;btnSave.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="btnCancel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Right</value>
+  </data>
+  <data name="btnCancel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="btnCancel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>593, 306</value>
+  </data>
+  <data name="btnCancel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="btnCancel.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="btnCancel.Text" xml:space="preserve">
+    <value>Cancel</value>
+  </data>
+  <data name="&gt;&gt;btnCancel.Name" xml:space="preserve">
+    <value>btnCancel</value>
+  </data>
+  <data name="&gt;&gt;btnCancel.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;btnCancel.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;btnCancel.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="label1.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="label1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>13, 13</value>
+  </data>
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>467, 13</value>
+  </data>
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="label1.Text" xml:space="preserve">
+    <value>Specify Geometry and Identity Properties. Tick Override to edit. Only overriden rows can be edited</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>1</value>
+  </data>
+  <data name="splitContainer1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>16, 39</value>
+  </data>
+  <metadata name="COL_OVERRIDE.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="COL_OVERRIDE.HeaderText" xml:space="preserve">
+    <value>Override</value>
+  </data>
+  <data name="COL_OVERRIDE.Width" type="System.Int32, mscorlib">
+    <value>60</value>
+  </data>
+  <metadata name="COL_NAME.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="COL_NAME.HeaderText" xml:space="preserve">
+    <value>Name</value>
+  </data>
+  <metadata name="COL_KEY.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="COL_KEY.HeaderText" xml:space="preserve">
+    <value>Key</value>
+  </data>
+  <data name="COL_KEY.Width" type="System.Int32, mscorlib">
+    <value>50</value>
+  </data>
+  <metadata name="COL_X.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="COL_X.HeaderText" xml:space="preserve">
+    <value>X Column</value>
+  </data>
+  <data name="COL_X.Width" type="System.Int32, mscorlib">
+    <value>50</value>
+  </data>
+  <metadata name="COL_Y.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="COL_Y.HeaderText" xml:space="preserve">
+    <value>Y Column</value>
+  </data>
+  <data name="COL_Y.Width" type="System.Int32, mscorlib">
+    <value>50</value>
+  </data>
+  <metadata name="COL_Z.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="COL_Z.HeaderText" xml:space="preserve">
+    <value>Z Column</value>
+  </data>
+  <data name="grdTables.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="grdTables.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="grdTables.Size" type="System.Drawing.Size, System.Drawing">
+    <value>454, 250</value>
+  </data>
+  <data name="grdTables.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;grdTables.Name" xml:space="preserve">
+    <value>grdTables</value>
+  </data>
+  <data name="&gt;&gt;grdTables.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;grdTables.Parent" xml:space="preserve">
+    <value>splitContainer1.Panel1</value>
+  </data>
+  <data name="&gt;&gt;grdTables.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Panel1.Name" xml:space="preserve">
+    <value>splitContainer1.Panel1</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Panel1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Panel1.Parent" xml:space="preserve">
+    <value>splitContainer1</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Panel1.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="tableConfigCtrl.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="tableConfigCtrl.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="tableConfigCtrl.Size" type="System.Drawing.Size, System.Drawing">
+    <value>194, 250</value>
+  </data>
+  <data name="tableConfigCtrl.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;tableConfigCtrl.Name" xml:space="preserve">
+    <value>tableConfigCtrl</value>
+  </data>
+  <data name="&gt;&gt;tableConfigCtrl.Type" xml:space="preserve">
+    <value>Maestro.Editors.FeatureSource.Providers.Odbc.OverrideEditor.TableConfigCtrl, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
+  </data>
+  <data name="&gt;&gt;tableConfigCtrl.Parent" xml:space="preserve">
+    <value>splitContainer1.Panel2</value>
+  </data>
+  <data name="&gt;&gt;tableConfigCtrl.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Panel2.Name" xml:space="preserve">
+    <value>splitContainer1.Panel2</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Panel2.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Panel2.Parent" xml:space="preserve">
+    <value>splitContainer1</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Panel2.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="splitContainer1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>652, 250</value>
+  </data>
+  <data name="splitContainer1.SplitterDistance" type="System.Int32, mscorlib">
+    <value>454</value>
+  </data>
+  <data name="splitContainer1.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Name" xml:space="preserve">
+    <value>splitContainer1</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.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.ClientSize" type="System.Drawing.Size, System.Drawing">
+    <value>680, 341</value>
+  </data>
+  <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
+    <value>WindowsDefaultBounds</value>
+  </data>
+  <data name="$this.Text" xml:space="preserve">
+    <value>Table Configuration</value>
+  </data>
+  <data name="&gt;&gt;COL_OVERRIDE.Name" xml:space="preserve">
+    <value>COL_OVERRIDE</value>
+  </data>
+  <data name="&gt;&gt;COL_OVERRIDE.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewCheckBoxColumn, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;COL_NAME.Name" xml:space="preserve">
+    <value>COL_NAME</value>
+  </data>
+  <data name="&gt;&gt;COL_NAME.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;COL_KEY.Name" xml:space="preserve">
+    <value>COL_KEY</value>
+  </data>
+  <data name="&gt;&gt;COL_KEY.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;COL_X.Name" xml:space="preserve">
+    <value>COL_X</value>
+  </data>
+  <data name="&gt;&gt;COL_X.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;COL_Y.Name" xml:space="preserve">
+    <value>COL_Y</value>
+  </data>
+  <data name="&gt;&gt;COL_Y.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;COL_Z.Name" xml:space="preserve">
+    <value>COL_Z</value>
+  </data>
+  <data name="&gt;&gt;COL_Z.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>TableConfigurationDialog</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.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableOverrideItem.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableOverrideItem.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OverrideEditor/TableOverrideItem.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -0,0 +1,118 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.ComponentModel;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.OverrideEditor
+{
+    internal class TableOverrideItem : INotifyPropertyChanged
+    {
+        public ClassDefinition Class { get; set; }
+
+        public string TableName { get; set; }
+
+        private bool _override;
+        private string _key;
+        private string _x;
+        private string _y;
+        private string _z;
+        private string _spatialContext;
+
+        public bool Override
+        {
+            get
+            {
+                return _override;
+            }
+            set
+            {
+                _override = value;
+                OnPropertyChanged("Override");
+            }
+        }
+
+        [DisplayName("Spatial Context")]
+        public string SpatialContext
+        {
+            get { return _spatialContext; }
+            set
+            {
+                _spatialContext = value;
+                if (!string.IsNullOrEmpty(Class.DefaultGeometryPropertyName))
+                {
+                    var prop = Class.FindProperty(Class.DefaultGeometryPropertyName) as GeometricPropertyDefinition;
+                    if (prop != null)
+                        prop.SpatialContextAssociation = value;
+                }
+                OnPropertyChanged("SpatialContext");
+            }
+        }
+
+        [DisplayName("Key Column")]
+        public string Key
+        {
+            get { return _key; }
+            set
+            {
+                _key = value;
+                OnPropertyChanged("Key");
+            }
+        }
+
+        private bool _geom;
+
+        [DisplayName("Has Geometry")]
+        public bool Geometry
+        {
+            get { return _geom; }
+            set
+            {
+                _geom = value;
+                OnPropertyChanged("Geometry");
+            }
+        }
+
+        [DisplayName("X Column")]
+        public string X
+        {
+            get { return _x; }
+            set
+            {
+                _x = value;
+                OnPropertyChanged("X");
+            }
+        }
+
+        [DisplayName("Y Column")]
+        public string Y
+        {
+            get { return _y; }
+            set
+            {
+                _y = value;
+                OnPropertyChanged("Y");
+            }
+        }
+
+        [DisplayName("Z Column")]
+        public string Z
+        {
+            get { return _z; }
+            set
+            {
+                _z = value;
+                OnPropertyChanged("Z");
+            }
+        }
+
+        private void OnPropertyChanged(string name)
+        {
+            var handler = this.PropertyChanged;
+            if (handler != null)
+                handler(this, new PropertyChangedEventArgs(name));
+        }
+
+        public event PropertyChangedEventHandler PropertyChanged;
+    }
+}

Modified: sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2011-02-28 15:17:24 UTC (rev 5571)
@@ -225,6 +225,19 @@
     <Compile Include="FeatureSource\Providers\Odbc\OdbcProviderCtrl.Designer.cs">
       <DependentUpon>OdbcProviderCtrl.cs</DependentUpon>
     </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\OverrideEditor\TableConfigCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\OverrideEditor\TableConfigCtrl.Designer.cs">
+      <DependentUpon>TableConfigCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\OverrideEditor\TableConfigurationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\OverrideEditor\TableConfigurationDialog.Designer.cs">
+      <DependentUpon>TableConfigurationDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\OverrideEditor\TableOverrideItem.cs" />
     <Compile Include="FeatureSource\Providers\Odbc\SubEditors\ConnectionStringCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -969,6 +982,12 @@
     <EmbeddedResource Include="FeatureSource\Providers\Odbc\OdbcProviderCtrl.resx">
       <DependentUpon>OdbcProviderCtrl.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="FeatureSource\Providers\Odbc\OverrideEditor\TableConfigCtrl.resx">
+      <DependentUpon>TableConfigCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FeatureSource\Providers\Odbc\OverrideEditor\TableConfigurationDialog.resx">
+      <DependentUpon>TableConfigurationDialog.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="FeatureSource\Providers\Odbc\SubEditors\ConnectionStringCtrl.resx">
       <DependentUpon>ConnectionStringCtrl.cs</DependentUpon>
     </EmbeddedResource>

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -205,6 +205,15 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Ensure the Geometry box is checked.
+        /// </summary>
+        internal static string CheckGeometryFirst {
+            get {
+                return ResourceManager.GetString("CheckGeometryFirst", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Bitmap clipboard_paste {
             get {
                 object obj = ResourceManager.GetObject("clipboard-paste", resourceCulture);
@@ -310,6 +319,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Configuration Document has been reset.
+        /// </summary>
+        internal static string ConfigurationDocumentReset {
+            get {
+                return ResourceManager.GetString("ConfigurationDocumentReset", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Confirm.
         /// </summary>
         internal static string Confirm {
@@ -1838,6 +1856,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Feature Source has no schemas.
+        /// </summary>
+        internal static string NoSchemasInFeatureSource {
+            get {
+                return ResourceManager.GetString("NoSchemasInFeatureSource", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to No site service available.
         /// </summary>
         internal static string NoSiteService {
@@ -2208,6 +2235,24 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Select Property.
+        /// </summary>
+        internal static string SelectProperty {
+            get {
+                return ResourceManager.GetString("SelectProperty", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Select Spatial Context.
+        /// </summary>
+        internal static string SelectSpatialContext {
+            get {
+                return ResourceManager.GetString("SelectSpatialContext", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Please specify the symbol library first.
         /// </summary>
         internal static string SelectSymbolLibraryFirst {

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2011-02-28 15:17:24 UTC (rev 5571)
@@ -1106,4 +1106,19 @@
   <data name="Infinity" xml:space="preserve">
     <value>Infinity</value>
   </data>
+  <data name="SelectProperty" xml:space="preserve">
+    <value>Select Property</value>
+  </data>
+  <data name="NoSchemasInFeatureSource" xml:space="preserve">
+    <value>Feature Source has no schemas</value>
+  </data>
+  <data name="SelectSpatialContext" xml:space="preserve">
+    <value>Select Spatial Context</value>
+  </data>
+  <data name="CheckGeometryFirst" xml:space="preserve">
+    <value>Ensure the Geometry box is checked</value>
+  </data>
+  <data name="ConfigurationDocumentReset" xml:space="preserve">
+    <value>Configuration Document has been reset</value>
+  </data>
 </root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -369,6 +369,17 @@
         }
 
         /// <summary>
+        /// Gets the names of all the schemas in this feature source
+        /// </summary>
+        /// <param name="fs"></param>
+        /// <returns></returns>
+        public static string[] GetSchemaNames(this IFeatureSource fs)
+        {
+            Check.NotNull(fs, "fs");
+            return fs.CurrentConnection.FeatureService.GetSchemas(fs.ResourceID);
+        }
+
+        /// <summary>
         /// Sets the connection properties of the feature source
         /// </summary>
         /// <param name="fs"></param>
@@ -421,10 +432,29 @@
             if (string.IsNullOrEmpty(fs.ConfigurationDocument))
                 fs.ConfigurationDocument = "config.xml";
 
-            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xmlContent)))
+            if (string.IsNullOrEmpty(xmlContent))
             {
-                fs.SetResourceData(fs.ConfigurationDocument, ResourceDataType.Stream, ms);
+                bool hasResourceData = false;
+                var resDataList = fs.EnumerateResourceData();
+                foreach (var resData in resDataList)
+                {
+                    if (resData.Name == fs.ConfigurationDocument)
+                    {
+                        hasResourceData = true;
+                        break;
+                    }
+                }
+
+                if (hasResourceData)
+                    fs.DeleteResourceData(fs.ConfigurationDocument);
             }
+            else
+            {
+                using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xmlContent)))
+                {
+                    fs.SetResourceData(fs.ConfigurationDocument, ResourceDataType.Stream, ms);
+                }
+            }
         }
 
         /// <summary>

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/IFdoSpatialContext.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/IFdoSpatialContext.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/IFdoSpatialContext.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -121,7 +121,7 @@
                 crs.AppendChild(remarks);
 
                 var csName = doc.CreateElement("gml", "srsName", XmlNamespaces.GML);
-                csName.InnerText = this.CoordinateSystemName;
+                csName.InnerText = string.IsNullOrEmpty(this.CoordinateSystemName) ? this.Name : this.CoordinateSystemName;
                 crs.AppendChild(csName);
 
                 var ext = doc.CreateElement("gml", "validArea", XmlNamespaces.GML);
@@ -146,7 +146,7 @@
 
                 if (string.IsNullOrEmpty(this.CoordinateSystemWkt))
                 {
-                    baseCrs.SetAttribute("href", XmlNamespaces.XLINK, "http://fdo.osgeo.org/schemas/feature/crs/#" + this.CoordinateSystemName);
+                    baseCrs.SetAttribute("href", XmlNamespaces.XLINK, "http://fdo.osgeo.org/schemas/feature/crs/#" + (string.IsNullOrEmpty(this.CoordinateSystemName) ? this.Name : this.CoordinateSystemName));
                 }
                 else
                 {

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/ClassDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/ClassDefinition.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/ClassDefinition.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -106,6 +106,11 @@
         }
 
         /// <summary>
+        /// Removes the assigned identity properties
+        /// </summary>
+        public void ClearIdentityProperties() { _identity.Clear(); }
+
+        /// <summary>
         /// Gets the properties
         /// </summary>
         public ReadOnlyCollection<PropertyDefinition> Properties

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/DataPropertyDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/DataPropertyDefinition.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/DataPropertyDefinition.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -68,17 +68,17 @@
                 case DataPropertyType.Byte:
                     return "fdo:byte";
                 case DataPropertyType.DateTime:
-                    return "xs:datetime";
+                    return "xs:dateTime";
                 case DataPropertyType.Double:
-                    return "fdo:double";
+                    return "xs:double";
                 case DataPropertyType.Int16:
-                    return "fdo:int16";
+                    return "xs:int16";
                 case DataPropertyType.Int32:
                     return "fdo:int32";
                 case DataPropertyType.Int64:
-                    return "fdo:int64";
+                    return "xs:int64";
                 case DataPropertyType.Single:
-                    return "fdo:single";
+                    return "xs:single";
                 case DataPropertyType.String:
                     return "xs:string";
                 case DataPropertyType.Clob:

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -76,10 +76,109 @@
 
         public string SpatialContextAssociation { get; set; }
 
-        public FeatureGeometricType GeometricTypes { get; set; }
+        private FeatureGeometricType _geometricTypes;
 
-        public SpecificGeometryType[] SpecificGeometryTypes { get; set; }
+        public FeatureGeometricType GeometricTypes
+        {
+            get { return _geometricTypes; }
+            set
+            {
+                _geometricTypes = value;
 
+                Dictionary<SpecificGeometryType, SpecificGeometryType> sgts = new Dictionary<SpecificGeometryType, SpecificGeometryType>();
+                foreach (FeatureGeometricType fgt in Enum.GetValues(typeof(FeatureGeometricType)))
+                {
+                    if ((_geometricTypes & fgt) > 0)
+                    {
+                        switch (fgt)
+                        {
+                            case FeatureGeometricType.Point:
+                                sgts.Add(SpecificGeometryType.Point, SpecificGeometryType.Point);
+                                sgts.Add(SpecificGeometryType.MultiPoint, SpecificGeometryType.MultiPoint);
+                                break;
+                            case FeatureGeometricType.Curve:
+                                sgts.Add(SpecificGeometryType.LineString, SpecificGeometryType.LineString);
+                                sgts.Add(SpecificGeometryType.MultiLineString, SpecificGeometryType.MultiLineString);
+                                sgts.Add(SpecificGeometryType.CurveString, SpecificGeometryType.CurveString);
+                                sgts.Add(SpecificGeometryType.MultiCurveString, SpecificGeometryType.MultiCurveString);
+                                break;
+                            case FeatureGeometricType.Surface:
+                                sgts.Add(SpecificGeometryType.Polygon, SpecificGeometryType.Polygon);
+                                sgts.Add(SpecificGeometryType.MultiPolygon, SpecificGeometryType.MultiPolygon);
+                                sgts.Add(SpecificGeometryType.CurvePolygon, SpecificGeometryType.CurvePolygon);
+                                sgts.Add(SpecificGeometryType.MultiCurvePolygon, SpecificGeometryType.MultiCurvePolygon);
+                                break;
+                        }
+                    }
+                }
+
+                _sgts = new List<SpecificGeometryType>(sgts.Keys).ToArray();
+            }
+        }
+
+        private SpecificGeometryType[] _sgts;
+
+        public SpecificGeometryType[] SpecificGeometryTypes
+        {
+            get { return _sgts; }
+            set
+            {
+                _sgts = value;
+
+                bool hasPoint = false;
+                bool hasLine = false;
+                bool hasPoly = false;
+
+                for (int i = 0; i < _sgts.Length; i++)
+                {
+                    if (_sgts[i] == SpecificGeometryType.Point ||
+                        _sgts[i] == SpecificGeometryType.MultiPoint)
+                        hasPoint = true;
+
+                    if (_sgts[i] == SpecificGeometryType.LineString ||
+                        _sgts[i] == SpecificGeometryType.MultiLineString ||
+                        _sgts[i] == SpecificGeometryType.CurveString ||
+                        _sgts[i] == SpecificGeometryType.MultiCurveString)
+                        hasLine = true;
+
+                    if (_sgts[i] == SpecificGeometryType.Polygon ||
+                        _sgts[i] == SpecificGeometryType.MultiPolygon ||
+                        _sgts[i] == SpecificGeometryType.CurvePolygon ||
+                        _sgts[i] == SpecificGeometryType.MultiCurvePolygon)
+                        hasPoly = true;
+
+                    if (_sgts[i] == SpecificGeometryType.MultiGeometry)
+                        hasPoly = hasPoint = hasLine = true;
+                }
+
+                FeatureGeometricType? fgt = null;
+                if (hasPoint)
+                {
+                    if (fgt.HasValue)
+                        fgt = fgt.Value | FeatureGeometricType.Point;
+                    else
+                        fgt = FeatureGeometricType.Point;
+                }
+                if (hasLine)
+                {
+                    if (fgt.HasValue)
+                        fgt = fgt.Value | FeatureGeometricType.Curve;
+                    else
+                        fgt = FeatureGeometricType.Curve;
+                }
+                if (hasPoly)
+                {
+                    if (fgt.HasValue)
+                        fgt = fgt.Value | FeatureGeometricType.Surface;
+                    else
+                        fgt = FeatureGeometricType.Surface;
+                }
+
+                if (fgt.HasValue)
+                    _geometricTypes = fgt.Value;
+            }
+        }
+
         public override PropertyDefinitionType Type
         {
             get { return PropertyDefinitionType.Geometry; }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/ConfigurationDocument.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/ConfigurationDocument.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/ConfigurationDocument.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -52,6 +52,18 @@
             return null;
         }
 
+        public string[] GetSpatialContextNames()
+        {
+            List<string> names = new List<string>();
+
+            foreach (var ctx in _spatialContexts)
+            {
+                names.Add(ctx.Name);
+            }
+
+            return names.ToArray();
+        }
+
         public void AddSchema(FeatureSchema schema) { _schemas.Add(schema); }
 
         public void RemoveSchema(FeatureSchema schema) { _schemas.Remove(schema); }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcConfigurationDocument.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcConfigurationDocument.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcConfigurationDocument.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -37,7 +37,9 @@
             item.Parent = this;
         }
 
-        private List<OdbcTableItem> GetMappingsForSchema(string schemaName)
+        public void ClearMappings() { _tables.Clear(); }
+
+        public List<OdbcTableItem> GetMappingsForSchema(string schemaName)
         {
             List<OdbcTableItem> items = new List<OdbcTableItem>();
             foreach (var item in _tables)

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcTableItem.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcTableItem.cs	2011-02-28 09:46:21 UTC (rev 5570)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcTableItem.cs	2011-02-28 15:17:24 UTC (rev 5571)
@@ -51,11 +51,32 @@
                     var table = doc.CreateElement("Table");
                     table.SetAttribute("name", this.ClassName);
                     {
+                        PropertyDefinition geomProp = null;
                         foreach (var prop in cls.Properties)
                         {
+                            //If this is geometry, we'll handle it later
+                            if (prop.Name == cls.DefaultGeometryPropertyName)
+                            {
+                                geomProp = prop;
+                                continue;
+                            }
+
                             var el = doc.CreateElement("element");
                             el.SetAttribute("name", prop.Name);
 
+                            var col = doc.CreateElement("Column");
+                            col.SetAttribute("name", prop.Name);
+
+                            el.AppendChild(col);
+                            table.AppendChild(el);
+                        }
+
+                        //Append geometry mapping
+                        if (geomProp != null)
+                        {
+                            var el = doc.CreateElement("element");
+                            el.SetAttribute("name", geomProp.Name);
+
                             if (!string.IsNullOrEmpty(this.XColumn))
                                 el.SetAttribute("xColumnName", this.XColumn);
                             if (!string.IsNullOrEmpty(this.YColumn))
@@ -63,10 +84,6 @@
                             if (!string.IsNullOrEmpty(this.ZColumn))
                                 el.SetAttribute("zColumnName", this.ZColumn);
 
-                            var col = doc.CreateElement("Column");
-                            col.SetAttribute("name", prop.Name);
-
-                            el.AppendChild(col);
                             table.AppendChild(el);
                         }
                     }
@@ -95,18 +112,25 @@
             }
 
             var table = node["Table"];
-            var el = table["element"];
 
-            var x = el.Attributes["xColumnName"];
-            var y = el.Attributes["yColumnName"];
-            var z = el.Attributes["zColumnName"];
+            foreach (System.Xml.XmlNode el in table.ChildNodes)
+            {
+                var colName = el.Attributes["name"];
 
-            if (x != null)
-                this.XColumn = x.Value;
-            if (y != null)
-                this.YColumn = y.Value;
-            if (z != null)
-                this.ZColumn = z.Value;
+                if (colName.Value == cls.DefaultGeometryPropertyName)
+                {
+                    var x = el.Attributes["xColumnName"];
+                    var y = el.Attributes["yColumnName"];
+                    var z = el.Attributes["zColumnName"];
+
+                    if (x != null)
+                        this.XColumn = x.Value;
+                    if (y != null)
+                        this.YColumn = y.Value;
+                    if (z != null)
+                        this.ZColumn = z.Value;
+                }
+            }
         }
     }
 }



More information about the mapguide-commits mailing list