[mapguide-commits] r5508 - in sandbox/maestro-3.0: . Doc Install Maestro Maestro.Editors Maestro.Editors/FeatureSource/Providers Maestro.Editors/FeatureSource/Providers/Odbc Maestro.Editors/FeatureSource/Providers/Odbc/Drivers Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors Maestro.Editors/FeatureSource/Providers/Rdbms Maestro.Editors/LayerDefinition Maestro.Editors/MapDefinition Maestro.Editors/Properties Maestro.Login MaestroAPITests OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/Commands OSGeo.MapGuide.MaestroAPI/Feature OSGeo.MapGuide.MaestroAPI/ObjectModels OSGeo.MapGuide.MaestroAPI/Resource/Validation OSGeo.MapGuide.MaestroAPI/Schema OSGeo.MapGuide.MaestroAPI.Http OSGeo.MapGuide.MaestroAPI.Native

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Thu Jan 27 06:11:10 EST 2011


Author: jng
Date: 2011-01-27 03:11:10 -0800 (Thu, 27 Jan 2011)
New Revision: 5508

Added:
   sandbox/maestro-3.0/Doc/
   sandbox/maestro-3.0/Doc/MaestroAPI.shfbproj
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/OracleDriver.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/OracleMsDriver.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/SqlServerDriver.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcDriverInfo.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcDriverMap.cs
   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/FeatureSource/Providers/Odbc/SubEditors/
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/IOdbcSubEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/OdbcDriverMap.xml
Modified:
   sandbox/maestro-3.0/Install/Maestro.nsi
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FsEditorMap.xml
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.resx
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
   sandbox/maestro-3.0/Maestro.Login/LoginDialog.cs
   sandbox/maestro-3.0/Maestro/Maestro.csproj
   sandbox/maestro-3.0/Maestro/Maestro.sln
   sandbox/maestro-3.0/MaestroAPITests/ResourceTests.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeDataReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeature.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeRecord.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeSqlReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Utility.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClrFdoTypeMap.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureReaderBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IFeatureReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/PropertyValue.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ReaderBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/RecordBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/FeatureSourceValidator.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/PropertyDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/SchemaElement.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Utility.cs
Log:
My first submission for the new year contains the following changes:
 - Update NSIS installer script to include missing files.
 - Add a work-in-progress of a specialized ODBC feature source editor.
 - Fix reader/record classes for the local implementation
 - Remove the ability to set FDO connection strings for feature sources as this is does not properly handle escaping of reserved characters (bug in System.Data.Common.DbConnectionStringBuilder that cannot be worked around). All connections properties are now specified as NameValueCollection objects
 - Add various API commentary
 - Add first cut of the sandcastle project file to generate the API docs. The resulting chm was 23Mb (!!!). Obviously there are some stuff that need not be completely documented.


Property changes on: sandbox/maestro-3.0/Doc
___________________________________________________________________
Added: svn:ignore
   + Help


Added: sandbox/maestro-3.0/Doc/MaestroAPI.shfbproj
===================================================================
--- sandbox/maestro-3.0/Doc/MaestroAPI.shfbproj	                        (rev 0)
+++ sandbox/maestro-3.0/Doc/MaestroAPI.shfbproj	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,68 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <!-- The configuration and platform will be used to determine which
+         assemblies to include from solution and project documentation
+         sources -->
+    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{cb4aa0db-a135-4a98-ab15-f31e8e964b91}</ProjectGuid>
+    <SHFBSchemaVersion>1.9.0.0</SHFBSchemaVersion>
+    <!-- AssemblyName, Name, and RootNamespace are not used by SHFB but Visual
+         Studio adds them anyway -->
+    <AssemblyName>Documentation</AssemblyName>
+    <RootNamespace>Documentation</RootNamespace>
+    <Name>Documentation</Name>
+    <!-- SHFB properties -->
+    <OutputPath>.\Help\</OutputPath>
+    <HtmlHelpName>MaestroAPI</HtmlHelpName>
+    <FrameworkVersion>2.0.50727</FrameworkVersion>
+    <HelpTitle>MapGuide Maestro API Documentation</HelpTitle>
+    <IndentHtml>True</IndentHtml>
+    <PresentationStyle>vs2005</PresentationStyle>
+    <SandcastlePath>
+    </SandcastlePath>
+    <DocumentationSources>
+      <DocumentationSource sourceFile="..\SDK\bin\Release\OSGeo.MapGuide.MaestroAPI.dll" />
+      <DocumentationSource sourceFile="..\SDK\bin\Release\OSGeo.MapGuide.MaestroAPI.xml" />
+      <DocumentationSource sourceFile="..\SDK\bin\Release\Maestro.Packaging.dll" />
+      <DocumentationSource sourceFile="..\SDK\bin\Release\Maestro.Packaging.xml" />
+      <DocumentationSource sourceFile="..\SDK\bin\Release\Maestro.Editors.dll" />
+      <DocumentationSource sourceFile="..\SDK\bin\Release\Maestro.Editors.xml" />
+      <DocumentationSource sourceFile="..\SDK\bin\Release\Maestro.Login.dll" />
+      <DocumentationSource sourceFile="..\SDK\bin\Release\Maestro.Login.xml" />
+      <DocumentationSource sourceFile="..\SDK\bin\Release\Maestro.Shared.UI.dll" />
+      <DocumentationSource sourceFile="..\SDK\bin\Release\Maestro.Shared.UI.xml" />
+    </DocumentationSources>
+    <VisibleItems>Attributes, InheritedMembers, InheritedFrameworkMembers, Protected, SealedProtected</VisibleItems>
+    <ApiFilter>
+    </ApiFilter>
+    <SdkLinkType>None</SdkLinkType>
+    <FeedbackEMailAddress>jumpinjackie at gmail.com</FeedbackEMailAddress>
+    <WebsiteSdkLinkType>None</WebsiteSdkLinkType>
+    <HtmlSdkLinkType>None</HtmlSdkLinkType>
+    <MSHelp2SdkLinkType>None</MSHelp2SdkLinkType>
+    <MSHelpViewerSdkLinkType>None</MSHelpViewerSdkLinkType>
+  </PropertyGroup>
+  <!-- There are no properties for these groups.  AnyCPU needs to appear in
+       order for Visual Studio to perform the build.  The others are optional
+       common platform types that may appear. -->
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|Win32' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|Win32' ">
+  </PropertyGroup>
+  <!-- Import the SHFB build targets -->
+  <Import Project="$(SHFBROOT)\SandcastleHelpFileBuilder.targets" />
+</Project>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Install/Maestro.nsi
===================================================================
--- sandbox/maestro-3.0/Install/Maestro.nsi	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Install/Maestro.nsi	2011-01-27 11:11:10 UTC (rev 5508)
@@ -1,9 +1,9 @@
 ;----------------------------------------------------------------------
 ; NSIS Installer script for MapGuide Maestro
+; based off the same script for FDO Toolbox
 ;
-; Author: Jackie Ng (jumpinjackie at gmail.com)
-; 
-; 
+;
+; Author: Jackie Ng (jumpinjackie at gmail.com) 
 ;----------------------------------------------------------------------
 
 ;----------------------
@@ -76,7 +76,7 @@
 #!if "${RELEASE_VERSION}" != "Trunk"
 #	VIProductVersion "${RELEASE_VERSION}"
 #	VIAddVersionKey "ProductName" "${INST_PRODUCT_NAME}"
-#	VIAddVersionKey "LegalCopyright" "© 2010 Jackie Ng"
+#	VIAddVersionKey "LegalCopyright" "© 2011 Jackie Ng"
 #	VIAddVersionKey "FileDescription" "Installer package for MapGuide Maestro"
 #	VIAddVersionKey "FileVersion" "${RELEASE_VERSION}"
 #!endif
@@ -185,9 +185,11 @@
     File "${INST_OUTPUT_MAESTRO}\MaestroFsPreview.exe.config"
 	File "${INST_OUTPUT_MAESTRO}\ConnectionProviders.xml"
     File "${INST_OUTPUT_MAESTRO}\FsEditorMap.xml"
+    File "${INST_OUTPUT_MAESTRO}\OdbcDriverMap.xml"
 	
 	# libraries
 	File "${INST_OUTPUT_MAESTRO}\Aga.Controls.dll"
+    File "${INST_OUTPUT_MAESTRO}\Ciloci.Flee.dll"
 	File "${INST_OUTPUT_MAESTRO}\ICSharpCode.Core.dll"
 	File "${INST_OUTPUT_MAESTRO}\ICSharpCode.Core.WinForms.dll"
     File "${INST_OUTPUT_MAESTRO}\ICSharpCode.SharpZipLib.dll"
@@ -235,11 +237,12 @@
 	# TODO: Add more useful information to Add/Remove programs
 	# See: http://nsis.sourceforge.net/Add_uninstall_information_to_Add/Remove_Programs
 	
-	# create FDO Toolbox shortcuts. Use INST_PRODUCT_QUALIFIED so we can have x86 and x64 entries that don't clash
+	# create Maestro shortcuts. Use INST_PRODUCT_QUALIFIED so we can have x86 and x64 entries that don't clash
 	CreateDirectory "$SMPROGRAMS\${INST_PRODUCT_QUALIFIED}"
 	
 	CreateShortCut "$SMPROGRAMS\${INST_PRODUCT_QUALIFIED}\${LNK_MAESTRO}.lnk" "$INSTDIR\${EXE_MAESTRO}"
 	#CreateShortCut "$SMPROGRAMS\${INST_PRODUCT_QUALIFIED}\MgCooker.lnk" "$INSTDIR\MgCooker.exe"
+    #CreateShortCut "$SMPROGRAMS\${INST_PRODUCT_QUALIFIED}\Maestro Feature Source Preview.lnk" "$INSTDIR\MaestroFsPreview.exe"
 	#CreateShortCut "$SMPROGRAMS\${INST_PRODUCT_QUALIFIED}\User Documentation.lnk" "$INSTDIR\${HELP_USER}"
 	#CreateShortCut "$SMPROGRAMS\${INST_PRODUCT_QUALIFIED}\Core API Documentation.lnk" "$INSTDIR\${HELP_API}"
 	CreateShortCut "$SMPROGRAMS\${INST_PRODUCT_QUALIFIED}\Uninstall.lnk" "$INSTDIR\uninstall.exe"

Modified: sandbox/maestro-3.0/Maestro/Maestro.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro/Maestro.csproj	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro/Maestro.csproj	2011-01-27 11:11:10 UTC (rev 5508)
@@ -97,6 +97,10 @@
       <Link>FsEditorMap.xml</Link>
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <Content Include="..\Maestro.Editors\OdbcDriverMap.xml">
+      <Link>OdbcDriverMap.xml</Link>
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
     <Content Include="..\OSGeo.MapGuide.MaestroAPI\ConnectionProviders.xml">
       <Link>ConnectionProviders.xml</Link>
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>

Modified: sandbox/maestro-3.0/Maestro/Maestro.sln
===================================================================
--- sandbox/maestro-3.0/Maestro/Maestro.sln	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro/Maestro.sln	2011-01-27 11:11:10 UTC (rev 5508)
@@ -1,6 +1,6 @@
 
 Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
+# Visual C# Express 2008
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maestro", "Maestro.csproj", "{E0C36475-2B70-4F6D-ACE0-8943167806DC}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "..\Thirdparty\SharpDevelop\ICSharpCode.Core\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
@@ -9,8 +9,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maestro.Base", "..\Maestro.Base\Maestro.Base.csproj", "{F1E2F468-5030-4DBA-968C-9620284AFAA1}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaestroBaseTests", "..\MaestroBaseTests\MaestroBaseTests.csproj", "{CE5F281C-0162-4832-87BB-A677D13D116F}"
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaestroFsPreview", "..\MaestroFsPreview\MaestroFsPreview.csproj", "{59BE5E18-17B6-431D-836E-C0AABA6D69E8}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maestro.AddIn.ExtendedObjectModels", "..\Maestro.AddIn.ExtendedObjectModels\Maestro.AddIn.ExtendedObjectModels.csproj", "{32BA7DF6-1AFA-441D-9231-5624C5920706}"
@@ -41,10 +39,6 @@
 		{F1E2F468-5030-4DBA-968C-9620284AFAA1}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{F1E2F468-5030-4DBA-968C-9620284AFAA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{F1E2F468-5030-4DBA-968C-9620284AFAA1}.Release|Any CPU.Build.0 = Release|Any CPU
-		{CE5F281C-0162-4832-87BB-A677D13D116F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{CE5F281C-0162-4832-87BB-A677D13D116F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{CE5F281C-0162-4832-87BB-A677D13D116F}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{CE5F281C-0162-4832-87BB-A677D13D116F}.Release|Any CPU.Build.0 = Release|Any CPU
 		{59BE5E18-17B6-431D-836E-C0AABA6D69E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{59BE5E18-17B6-431D-836E-C0AABA6D69E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{59BE5E18-17B6-431D-836E-C0AABA6D69E8}.Release|Any CPU.ActiveCfg = Release|Any CPU

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -30,6 +30,8 @@
 using System.Diagnostics;
 using System.Collections.Specialized;
 using Maestro.Editors.Common;
+using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Editors.FeatureSource.Providers.Odbc;
 
 namespace Maestro.Editors.FeatureSource.Providers
 {

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/OracleDriver.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/OracleDriver.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/OracleDriver.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,43 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.Drivers
+{
+    public class OracleDriver : OdbcDriverInfo
+    {
+        public override string OdbcConnectionString
+        {
+            get
+            {
+                var builder = new System.Data.Odbc.OdbcConnectionStringBuilder();
+
+                return builder.ToString();
+            }
+            set
+            {
+                var builder = new System.Data.Odbc.OdbcConnectionStringBuilder(value);
+
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/OracleMsDriver.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/OracleMsDriver.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/OracleMsDriver.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,43 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.Drivers
+{
+    public class OracleMsDriver : OdbcDriverInfo
+    {
+        public override string OdbcConnectionString
+        {
+            get
+            {
+                var builder = new System.Data.Odbc.OdbcConnectionStringBuilder();
+
+                return builder.ToString();
+            }
+            set
+            {
+                var builder = new System.Data.Odbc.OdbcConnectionStringBuilder(value);
+
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/SqlServerDriver.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/SqlServerDriver.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/Drivers/SqlServerDriver.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,56 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.ComponentModel;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.Drivers
+{
+    public class SqlServerDriver : OdbcDriverInfo
+    {
+        [Description("The SQL Server Name")]
+        public string ServerName { get; set; }
+
+        [Description("The SQL Server database")]
+        public string Database { get; set; }
+
+        [Description("Username")]
+        public string UserName { get; set; }
+
+        [Description("Password")]
+        public string Password { get; set; }
+
+        public override string OdbcConnectionString
+        {
+            get
+            {
+                var builder = new System.Data.Odbc.OdbcConnectionStringBuilder();
+
+                return builder.ToString();
+            }
+            set
+            {
+                var builder = new System.Data.Odbc.OdbcConnectionStringBuilder(value);
+
+            }
+        }
+    }
+}

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

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcDriverMap.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcDriverMap.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcDriverMap.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,94 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc
+{
+    internal static class OdbcDriverMap
+    {
+        static Dictionary<string, Type> _drivers;
+
+        static OdbcDriverMap()
+        {
+            _drivers = new Dictionary<string, Type>();
+            if (System.IO.File.Exists("OdbcEditorMap.xml"))
+            {
+                var doc = new XmlDocument();
+                doc.Load("OdbcEditorMap.xml");
+                var list = doc.SelectNodes("//OdbcDriverMap/Driver");
+                foreach (XmlNode node in list)
+                {
+                    try
+                    {
+                        string provider = node.Attributes["name"].Value.ToUpper();
+                        string typeName = node.Attributes["type"].Value;
+
+                        _drivers[provider] = Type.GetType(typeName);
+                    }
+                    catch { }
+                }
+            }
+        }
+
+        public static string[] EnumerateDrivers()
+        {
+            return new List<string>(_drivers.Keys).ToArray();
+        }
+        
+        public static OdbcDriverInfo GetDriver(string provider)
+        {
+            OdbcDriverInfo driver = null;
+
+            string name = provider.ToUpper();
+            if (_drivers.ContainsKey(name))
+            {
+                driver = (OdbcDriverInfo)Activator.CreateInstance(_drivers[name]);
+            }
+            else
+            {
+                throw new OdbcDriverNotFoundException(provider);
+            }
+
+            return driver;
+        }
+    }
+
+    [global::System.Serializable]
+    public class OdbcDriverNotFoundException : Exception
+    {
+        //
+        // For guidelines regarding the creation of new exception types, see
+        //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
+        // and
+        //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
+        //
+
+        public OdbcDriverNotFoundException() { }
+        public OdbcDriverNotFoundException(string message) : base(message) { }
+        public OdbcDriverNotFoundException(string message, Exception inner) : base(message, inner) { }
+        protected OdbcDriverNotFoundException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.Designer.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,153 @@
+namespace Maestro.Editors.FeatureSource.Providers.Odbc
+{
+    partial class OdbcProviderCtrl
+    {
+        /// <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(OdbcProviderCtrl));
+            this.label1 = new System.Windows.Forms.Label();
+            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.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.txtConnStr = new System.Windows.Forms.TextBox();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.txtConnectionStatus = new System.Windows.Forms.TextBox();
+            this.pnlMethod = new System.Windows.Forms.Panel();
+            this.contentPanel.SuspendLayout();
+            this.groupBox2.SuspendLayout();
+            this.groupBox3.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // contentPanel
+            // 
+            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.btnEditSchema);
+            this.contentPanel.Controls.Add(this.btnTest);
+            this.contentPanel.Controls.Add(this.cmbMethod);
+            this.contentPanel.Controls.Add(this.label1);
+            resources.ApplyResources(this.contentPanel, "contentPanel");
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // cmbMethod
+            // 
+            resources.ApplyResources(this.cmbMethod, "cmbMethod");
+            this.cmbMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbMethod.FormattingEnabled = true;
+            this.cmbMethod.Name = "cmbMethod";
+            this.cmbMethod.SelectedIndexChanged += new System.EventHandler(this.cmbMethod_SelectedIndexChanged);
+            // 
+            // btnTest
+            // 
+            resources.ApplyResources(this.btnTest, "btnTest");
+            this.btnTest.Name = "btnTest";
+            this.btnTest.UseVisualStyleBackColor = true;
+            this.btnTest.Click += new System.EventHandler(this.btnTest_Click);
+            // 
+            // btnEditSchema
+            // 
+            resources.ApplyResources(this.btnEditSchema, "btnEditSchema");
+            this.btnEditSchema.Name = "btnEditSchema";
+            this.btnEditSchema.UseVisualStyleBackColor = true;
+            this.btnEditSchema.Click += new System.EventHandler(this.btnEditSchema_Click);
+            // 
+            // btnRebuild
+            // 
+            resources.ApplyResources(this.btnRebuild, "btnRebuild");
+            this.btnRebuild.Name = "btnRebuild";
+            this.btnRebuild.UseVisualStyleBackColor = true;
+            this.btnRebuild.Click += new System.EventHandler(this.btnRebuild_Click);
+            // 
+            // groupBox2
+            // 
+            resources.ApplyResources(this.groupBox2, "groupBox2");
+            this.groupBox2.Controls.Add(this.txtConnStr);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.TabStop = false;
+            // 
+            // txtConnStr
+            // 
+            resources.ApplyResources(this.txtConnStr, "txtConnStr");
+            this.txtConnStr.Name = "txtConnStr";
+            this.txtConnStr.ReadOnly = true;
+            // 
+            // groupBox3
+            // 
+            resources.ApplyResources(this.groupBox3, "groupBox3");
+            this.groupBox3.Controls.Add(this.txtConnectionStatus);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.TabStop = false;
+            // 
+            // txtConnectionStatus
+            // 
+            resources.ApplyResources(this.txtConnectionStatus, "txtConnectionStatus");
+            this.txtConnectionStatus.Name = "txtConnectionStatus";
+            this.txtConnectionStatus.ReadOnly = true;
+            // 
+            // pnlMethod
+            // 
+            resources.ApplyResources(this.pnlMethod, "pnlMethod");
+            this.pnlMethod.Name = "pnlMethod";
+            // 
+            // OdbcProviderCtrl
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+            this.HeaderText = "ODBC Feature Source";
+            this.Name = "OdbcProviderCtrl";
+            resources.ApplyResources(this, "$this");
+            this.contentPanel.ResumeLayout(false);
+            this.contentPanel.PerformLayout();
+            this.groupBox2.ResumeLayout(false);
+            this.groupBox2.PerformLayout();
+            this.groupBox3.ResumeLayout(false);
+            this.groupBox3.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Button btnRebuild;
+        private System.Windows.Forms.Button btnEditSchema;
+        private System.Windows.Forms.Button btnTest;
+        private System.Windows.Forms.ComboBox cmbMethod;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.TextBox txtConnectionStatus;
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.TextBox txtConnStr;
+        private System.Windows.Forms.Panel pnlMethod;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,209 @@
+#region Disclaimer / License
+// Copyright (C) 2011, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using Maestro.Editors.Common;
+using OSGeo.MapGuide.ObjectModels.FeatureSource;
+using Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors;
+using OSGeo.MapGuide.ObjectModels;
+using OSGeo.MapGuide.MaestroAPI;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc
+{
+    internal partial class OdbcProviderCtrl : EditorBindableCollapsiblePanel
+    {
+        enum OdbcConnectionMethod
+        {
+            ManagedFile,
+            Unmanaged,
+            DSN,
+            KnownDriver,
+            RawConnectionString,
+        }
+
+        public OdbcProviderCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IEditorService _service;
+        private IFeatureSource _fs;
+
+        void InternalConnectionChanged(object sender, EventArgs e)
+        {
+            btnTest.Enabled = true;
+            if (this.ChildEditor != null)
+                txtConnStr.Text = Utility.ToConnectionString(this.ChildEditor.ConnectionProperties);
+            else
+                txtConnStr.Text = string.Empty;
+
+            if (!_init)
+                OnResourceChanged();
+        }
+
+        private bool _init = false;
+
+        public override void Bind(IEditorService service)
+        {
+            _init = true;
+            _service = service;
+            _fs = (IFeatureSource)_service.GetEditedResource();
+
+            cmbMethod.DataSource = (OdbcConnectionMethod[])Enum.GetValues(typeof(OdbcConnectionMethod));
+            var values = _fs.GetConnectionProperties();
+            string odbcStr = values["ConnectionString"];
+            if (!string.IsNullOrEmpty(odbcStr))
+            {
+                //See if it is file-basd
+                if (odbcStr.Contains("Dbq="))
+                {
+                    if (odbcStr.Contains("%MG_DATA_FILE_PATH%"))
+                    {
+                        cmbMethod.SelectedItem = OdbcConnectionMethod.ManagedFile;
+                    }
+                    else if (odbcStr.Contains("%MG_DATA_PATH_ALIAS"))
+                    {
+                        cmbMethod.SelectedItem = OdbcConnectionMethod.Unmanaged;
+                    }
+                    else
+                    {
+                        cmbMethod.SelectedItem = OdbcConnectionMethod.RawConnectionString;
+                    }
+                }
+                else //Non-file connection string. Has to be a known driver
+                {
+                    cmbMethod.SelectedItem = OdbcConnectionMethod.KnownDriver;
+                }
+            }
+            else if (values["DataSourceName"] != null)
+            {
+                cmbMethod.SelectedItem = OdbcConnectionMethod.DSN;
+            }
+            else
+            {
+                cmbMethod.SelectedItem = OdbcConnectionMethod.RawConnectionString;
+            }
+
+            //Fall back to raw connection string if we still can't figure it out
+            if (this.ChildEditor == null)
+                cmbMethod.SelectedItem = OdbcConnectionMethod.RawConnectionString;
+
+            System.Diagnostics.Debug.Assert(this.ChildEditor != null);
+            if (values.Count > 0)
+                this.ChildEditor.ConnectionProperties = values;
+
+            _init = false;
+        }
+
+        public IOdbcSubEditor ChildEditor
+        {
+            get;
+            private set;
+        }
+
+        private void cmbMethod_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            txtConnStr.Text = txtConnectionStatus.Text = string.Empty;
+            OdbcConnectionMethod method = (OdbcConnectionMethod)cmbMethod.SelectedItem;
+            IOdbcSubEditor childEditor = null;
+            switch (method)
+            {
+                case OdbcConnectionMethod.DSN:
+                    childEditor = new DSNCtrl();
+                    break;
+                case OdbcConnectionMethod.KnownDriver:
+                    childEditor = new KnownDriversCtrl();
+                    break;
+                case OdbcConnectionMethod.ManagedFile:
+                    childEditor = new ManagedCtrl();
+                    break;
+                case OdbcConnectionMethod.RawConnectionString:
+                    childEditor = new ConnectionStringCtrl();
+                    break;
+                case OdbcConnectionMethod.Unmanaged:
+                    childEditor = new UnmanagedCtrl();
+                    break;
+            }
+
+            if (childEditor != null)
+            {
+                childEditor.Bind(_service);
+                //See if the current connection settings apply
+                try
+                {
+                    childEditor.ConnectionProperties = _fs.GetConnectionProperties();
+                }
+                catch { }
+
+                childEditor.ConnectionChanged += InternalConnectionChanged;
+                pnlMethod.Controls.Clear();
+                childEditor.Content.Dock = DockStyle.Fill;
+                pnlMethod.Controls.Add(childEditor.Content);
+            }
+
+            if (this.ChildEditor != null)
+                this.ChildEditor.ConnectionChanged -= InternalConnectionChanged;
+
+            this.ChildEditor = childEditor;
+
+            if (this.ChildEditor != null)
+            {
+                if (!_init)
+                    _fs.ApplyConnectionProperties(this.ChildEditor.ConnectionProperties);
+
+                btnTest.Enabled = true;
+            }
+            else
+            {
+                btnTest.Enabled = false;
+            }
+        }
+
+        private void btnTest_Click(object sender, EventArgs e)
+        {
+            txtConnectionStatus.Text = string.Empty;
+            if (this.ChildEditor != null)
+            {
+                var props = this.ChildEditor.ConnectionProperties;
+                _fs.ApplyConnectionProperties(props);
+                //Flush back to session before testing
+                _service.SyncSessionCopy();
+                string result = _fs.TestConnection();
+
+                txtConnectionStatus.Text = string.Format(Properties.Resources.FdoConnectionStatus, result);
+            }
+        }
+
+        private void btnEditSchema_Click(object sender, EventArgs e)
+        {
+
+        }
+
+        private void btnRebuild_Click(object sender, EventArgs e)
+        {
+
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/OdbcProviderCtrl.resx	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,420 @@
+<?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="pnlMethod.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="pnlMethod.AutoScroll" 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="pnlMethod.Location" type="System.Drawing.Point, System.Drawing">
+    <value>23, 33</value>
+  </data>
+  <data name="pnlMethod.Size" type="System.Drawing.Size, System.Drawing">
+    <value>504, 152</value>
+  </data>
+  <data name="pnlMethod.TabIndex" type="System.Int32, mscorlib">
+    <value>9</value>
+  </data>
+  <data name="&gt;&gt;pnlMethod.Name" xml:space="preserve">
+    <value>pnlMethod</value>
+  </data>
+  <data name="&gt;&gt;pnlMethod.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;pnlMethod.Parent" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;pnlMethod.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="groupBox3.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Left, Right</value>
+  </data>
+  <data name="txtConnectionStatus.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="txtConnectionStatus.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 16</value>
+  </data>
+  <data name="txtConnectionStatus.Multiline" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="txtConnectionStatus.Size" type="System.Drawing.Size, System.Drawing">
+    <value>495, 27</value>
+  </data>
+  <data name="txtConnectionStatus.TabIndex" type="System.Int32, mscorlib">
+    <value>7</value>
+  </data>
+  <data name="&gt;&gt;txtConnectionStatus.Name" xml:space="preserve">
+    <value>txtConnectionStatus</value>
+  </data>
+  <data name="&gt;&gt;txtConnectionStatus.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;txtConnectionStatus.Parent" xml:space="preserve">
+    <value>groupBox3</value>
+  </data>
+  <data name="&gt;&gt;txtConnectionStatus.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="groupBox3.Location" type="System.Drawing.Point, System.Drawing">
+    <value>23, 237</value>
+  </data>
+  <data name="groupBox3.Size" type="System.Drawing.Size, System.Drawing">
+    <value>501, 46</value>
+  </data>
+  <data name="groupBox3.TabIndex" type="System.Int32, mscorlib">
+    <value>8</value>
+  </data>
+  <data name="groupBox3.Text" xml:space="preserve">
+    <value>Messages</value>
+  </data>
+  <data name="&gt;&gt;groupBox3.Name" xml:space="preserve">
+    <value>groupBox3</value>
+  </data>
+  <data name="&gt;&gt;groupBox3.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBox3.Parent" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;groupBox3.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="groupBox2.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Left, Right</value>
+  </data>
+  <data name="txtConnStr.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="txtConnStr.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 16</value>
+  </data>
+  <data name="txtConnStr.Multiline" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="txtConnStr.Size" type="System.Drawing.Size, System.Drawing">
+    <value>495, 24</value>
+  </data>
+  <data name="txtConnStr.TabIndex" type="System.Int32, mscorlib">
+    <value>7</value>
+  </data>
+  <data name="&gt;&gt;txtConnStr.Name" xml:space="preserve">
+    <value>txtConnStr</value>
+  </data>
+  <data name="&gt;&gt;txtConnStr.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;txtConnStr.Parent" xml:space="preserve">
+    <value>groupBox2</value>
+  </data>
+  <data name="&gt;&gt;txtConnStr.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="groupBox2.Location" type="System.Drawing.Point, System.Drawing">
+    <value>23, 191</value>
+  </data>
+  <data name="groupBox2.Size" type="System.Drawing.Size, System.Drawing">
+    <value>501, 43</value>
+  </data>
+  <data name="groupBox2.TabIndex" type="System.Int32, mscorlib">
+    <value>7</value>
+  </data>
+  <data name="groupBox2.Text" xml:space="preserve">
+    <value>Computed Connection String</value>
+  </data>
+  <data name="&gt;&gt;groupBox2.Name" xml:space="preserve">
+    <value>groupBox2</value>
+  </data>
+  <data name="&gt;&gt;groupBox2.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBox2.Parent" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <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">
+    <value>Bottom, Left</value>
+  </data>
+  <data name="btnRebuild.Location" type="System.Drawing.Point, System.Drawing">
+    <value>287, 289</value>
+  </data>
+  <data name="btnRebuild.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="btnRebuild.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="btnRebuild.Text" xml:space="preserve">
+    <value>Rebuild</value>
+  </data>
+  <data name="&gt;&gt;btnRebuild.Name" xml:space="preserve">
+    <value>btnRebuild</value>
+  </data>
+  <data name="&gt;&gt;btnRebuild.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">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;btnRebuild.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="btnEditSchema.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Left</value>
+  </data>
+  <data name="btnEditSchema.Location" type="System.Drawing.Point, System.Drawing">
+    <value>151, 289</value>
+  </data>
+  <data name="btnEditSchema.Size" type="System.Drawing.Size, System.Drawing">
+    <value>130, 23</value>
+  </data>
+  <data name="btnEditSchema.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="btnEditSchema.Text" xml:space="preserve">
+    <value>Edit Schema</value>
+  </data>
+  <data name="&gt;&gt;btnEditSchema.Name" xml:space="preserve">
+    <value>btnEditSchema</value>
+  </data>
+  <data name="&gt;&gt;btnEditSchema.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;btnEditSchema.Parent" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;btnEditSchema.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="btnTest.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Left</value>
+  </data>
+  <data name="btnTest.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="btnTest.Location" type="System.Drawing.Point, System.Drawing">
+    <value>23, 289</value>
+  </data>
+  <data name="btnTest.Size" type="System.Drawing.Size, System.Drawing">
+    <value>122, 23</value>
+  </data>
+  <data name="btnTest.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="btnTest.Text" xml:space="preserve">
+    <value>Test Connection</value>
+  </data>
+  <data name="&gt;&gt;btnTest.Name" xml:space="preserve">
+    <value>btnTest</value>
+  </data>
+  <data name="&gt;&gt;btnTest.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;btnTest.Parent" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;btnTest.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="cmbMethod.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="cmbMethod.Location" type="System.Drawing.Point, System.Drawing">
+    <value>138, 6</value>
+  </data>
+  <data name="cmbMethod.Size" type="System.Drawing.Size, System.Drawing">
+    <value>389, 21</value>
+  </data>
+  <data name="cmbMethod.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;cmbMethod.Name" xml:space="preserve">
+    <value>cmbMethod</value>
+  </data>
+  <data name="&gt;&gt;cmbMethod.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;cmbMethod.Parent" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;cmbMethod.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="label1.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>20, 9</value>
+  </data>
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>100, 13</value>
+  </data>
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="label1.Text" xml:space="preserve">
+    <value>Connection Method</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>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="contentPanel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>552, 325</value>
+  </data>
+  <data name="&gt;&gt;contentPanel.Name" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name="&gt;&gt;contentPanel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;contentPanel.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;contentPanel.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
+    <value>552, 352</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>OdbcProviderCtrl</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <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

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.Designer.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,63 @@
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    partial class ConnectionStringCtrl
+    {
+        /// <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(ConnectionStringCtrl));
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtConnStr = new System.Windows.Forms.TextBox();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // txtConnStr
+            // 
+            resources.ApplyResources(this.txtConnStr, "txtConnStr");
+            this.txtConnStr.Name = "txtConnStr";
+            // 
+            // ConnectionStringCtrl
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.txtConnStr);
+            this.Controls.Add(this.label1);
+            this.Name = "ConnectionStringCtrl";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtConnStr;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,71 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.Collections.Specialized;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    public partial class ConnectionStringCtrl : EditorBase, IOdbcSubEditor
+    {
+        public ConnectionStringCtrl()
+        {
+            InitializeComponent();
+        }
+
+        public override void Bind(IEditorService service)
+        {
+            service.RegisterCustomNotifier(this);
+        }
+
+        void OnConnectionChanged()
+        {
+            var handler = this.ConnectionChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public NameValueCollection ConnectionProperties
+        {
+            get
+            {
+                var values = new NameValueCollection();
+                values["ConnectionString"] = txtConnStr.Text;
+                return values;
+            }
+            set
+            {
+                txtConnStr.Text = value["ConnectionString"];
+            }
+        }
+
+        public event EventHandler ConnectionChanged;
+
+        public Control Content
+        {
+            get { return this; }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ConnectionStringCtrl.resx	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,192 @@
+<?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>3, 10</value>
+  </data>
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>170, 13</value>
+  </data>
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="label1.Text" xml:space="preserve">
+    <value>Enter the ODBC Connection String</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>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="txtConnStr.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="txtConnStr.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 26</value>
+  </data>
+  <data name="txtConnStr.Multiline" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="txtConnStr.Size" type="System.Drawing.Size, System.Drawing">
+    <value>583, 158</value>
+  </data>
+  <data name="txtConnStr.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;txtConnStr.Name" xml:space="preserve">
+    <value>txtConnStr</value>
+  </data>
+  <data name="&gt;&gt;txtConnStr.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;txtConnStr.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;txtConnStr.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 13</value>
+  </data>
+  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
+    <value>589, 187</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>ConnectionStringCtrl</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>Maestro.Editors.EditorBase, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
+  </data>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.Designer.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,65 @@
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    partial class DSNCtrl
+    {
+        /// <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(DSNCtrl));
+            this.label1 = new System.Windows.Forms.Label();
+            this.lstDSN = new System.Windows.Forms.ListBox();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // lstDSN
+            // 
+            resources.ApplyResources(this.lstDSN, "lstDSN");
+            this.lstDSN.FormattingEnabled = true;
+            this.lstDSN.Name = "lstDSN";
+            this.lstDSN.SelectedIndexChanged += new System.EventHandler(this.lstDSN_SelectedIndexChanged);
+            // 
+            // DSNCtrl
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.lstDSN);
+            this.Controls.Add(this.label1);
+            this.Name = "DSNCtrl";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.ListBox lstDSN;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,84 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.MaestroAPI;
+using System.Collections.Specialized;
+using OSGeo.MapGuide.ObjectModels.FeatureSource;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    public partial class DSNCtrl : EditorBase, IOdbcSubEditor
+    {
+        public DSNCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private IFeatureSource _fs;
+
+        public override void Bind(IEditorService service)
+        {
+            service.RegisterCustomNotifier(this);
+            _fs = (IFeatureSource)service.GetEditedResource();
+            lstDSN.DataSource = service.FeatureService.GetConnectionPropertyValues("OSGeo.ODBC", "DataSourceName", string.Empty);
+        }
+
+        void OnConnectionChanged()
+        {
+            var handler = this.ConnectionChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public NameValueCollection ConnectionProperties
+        {
+            get
+            {
+                var values = new NameValueCollection();
+                if (lstDSN.SelectedItem != null)
+                    values["DataSourceName"] = lstDSN.SelectedItem.ToString();
+                return values;
+            }
+            set
+            {
+                lstDSN.SelectedItem = value["DataSourceName"];
+            }
+        }
+
+        public event EventHandler ConnectionChanged;
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private void lstDSN_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (lstDSN.SelectedItem != null)
+                OnConnectionChanged();
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/DSNCtrl.resx	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,189 @@
+<?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>3, 3</value>
+  </data>
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>98, 13</value>
+  </data>
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="label1.Text" xml:space="preserve">
+    <value>Data Source Name</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>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="lstDSN.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="lstDSN.Location" type="System.Drawing.Point, System.Drawing">
+    <value>119, 3</value>
+  </data>
+  <data name="lstDSN.Size" type="System.Drawing.Size, System.Drawing">
+    <value>270, 147</value>
+  </data>
+  <data name="lstDSN.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;lstDSN.Name" xml:space="preserve">
+    <value>lstDSN</value>
+  </data>
+  <data name="&gt;&gt;lstDSN.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ListBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;lstDSN.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;lstDSN.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 13</value>
+  </data>
+  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
+    <value>392, 156</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>DSNCtrl</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>Maestro.Editors.EditorBase, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
+  </data>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/IOdbcSubEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/IOdbcSubEditor.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/IOdbcSubEditor.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,36 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Collections.Specialized;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    internal interface IOdbcSubEditor : IEditorBindable
+    {
+        NameValueCollection ConnectionProperties { get; set; }
+
+        event EventHandler ConnectionChanged;
+
+        Control Content { get; }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.Designer.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,81 @@
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    partial class KnownDriversCtrl
+    {
+        /// <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(KnownDriversCtrl));
+            this.label1 = new System.Windows.Forms.Label();
+            this.propGrid = new System.Windows.Forms.PropertyGrid();
+            this.lstDriver = new System.Windows.Forms.ListBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // propGrid
+            // 
+            resources.ApplyResources(this.propGrid, "propGrid");
+            this.propGrid.Name = "propGrid";
+            // 
+            // lstDriver
+            // 
+            resources.ApplyResources(this.lstDriver, "lstDriver");
+            this.lstDriver.FormattingEnabled = true;
+            this.lstDriver.Name = "lstDriver";
+            this.lstDriver.SelectedIndexChanged += new System.EventHandler(this.lstDriver_SelectedIndexChanged);
+            // 
+            // label2
+            // 
+            resources.ApplyResources(this.label2, "label2");
+            this.label2.Name = "label2";
+            // 
+            // KnownDriversCtrl
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.lstDriver);
+            this.Controls.Add(this.propGrid);
+            this.Controls.Add(this.label1);
+            this.Name = "KnownDriversCtrl";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.PropertyGrid propGrid;
+        private System.Windows.Forms.ListBox lstDriver;
+        private System.Windows.Forms.Label label2;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,94 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.Collections.Specialized;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    public partial class KnownDriversCtrl : EditorBase, IOdbcSubEditor
+    {
+        public KnownDriversCtrl()
+        {
+            InitializeComponent();
+        }
+
+        public override void Bind(IEditorService service)
+        {
+            service.RegisterCustomNotifier(this);
+            lstDriver.DataSource = OdbcDriverMap.EnumerateDrivers();
+        }
+
+        void OnConnectionChanged()
+        {
+            var handler = this.ConnectionChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public NameValueCollection ConnectionProperties
+        {
+            get
+            {
+                var values = new NameValueCollection();
+                if (this.SelectedDriver != null)
+                    values["ConnectionString"] = this.SelectedDriver.OdbcConnectionString;
+                return values;
+            }
+            set
+            {
+                if (this.SelectedDriver != null && value["ConnectionString"] != null)
+                    this.SelectedDriver.OdbcConnectionString = value["ConnectionString"];
+            }
+        }
+
+        public event EventHandler ConnectionChanged;
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        private OdbcDriverInfo _SelectedDriver;
+
+        public OdbcDriverInfo SelectedDriver
+        {
+            get { return _SelectedDriver; }
+            set 
+            { 
+                _SelectedDriver = value;
+                propGrid.SelectedObject = value;
+            }
+        }
+
+        private void lstDriver_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (lstDriver.SelectedItem != null)
+            {
+                this.SelectedDriver = OdbcDriverMap.GetDriver(lstDriver.SelectedItem.ToString());
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/KnownDriversCtrl.resx	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,243 @@
+<?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>3, 11</value>
+  </data>
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>35, 13</value>
+  </data>
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="label1.Text" xml:space="preserve">
+    <value>Driver</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>3</value>
+  </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="propGrid.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="propGrid.HelpVisible" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="propGrid.Location" type="System.Drawing.Point, System.Drawing">
+    <value>152, 35</value>
+  </data>
+  <data name="propGrid.Size" type="System.Drawing.Size, System.Drawing">
+    <value>270, 147</value>
+  </data>
+  <data name="propGrid.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="&gt;&gt;propGrid.Name" xml:space="preserve">
+    <value>propGrid</value>
+  </data>
+  <data name="&gt;&gt;propGrid.Type" xml:space="preserve">
+    <value>System.Windows.Forms.PropertyGrid, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;propGrid.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;propGrid.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="lstDriver.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left</value>
+  </data>
+  <data name="lstDriver.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 35</value>
+  </data>
+  <data name="lstDriver.Size" type="System.Drawing.Size, System.Drawing">
+    <value>140, 147</value>
+  </data>
+  <data name="lstDriver.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="&gt;&gt;lstDriver.Name" xml:space="preserve">
+    <value>lstDriver</value>
+  </data>
+  <data name="&gt;&gt;lstDriver.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ListBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;lstDriver.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;lstDriver.ZOrder" xml:space="preserve">
+    <value>1</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>149, 11</value>
+  </data>
+  <data name="label2.Size" type="System.Drawing.Size, System.Drawing">
+    <value>85, 13</value>
+  </data>
+  <data name="label2.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="label2.Text" xml:space="preserve">
+    <value>Driver Properties</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>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 13</value>
+  </data>
+  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
+    <value>425, 196</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>KnownDriversCtrl</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>Maestro.Editors.EditorBase, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
+  </data>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.Designer.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,65 @@
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    partial class ManagedCtrl
+    {
+        /// <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(ManagedCtrl));
+            this.resDataCtrl = new Maestro.Editors.Common.ResourceDataCtrl();
+            this.label1 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // resDataCtrl
+            // 
+            resources.ApplyResources(this.resDataCtrl, "resDataCtrl");
+            this.resDataCtrl.MarkedFile = "";
+            this.resDataCtrl.MarkEnabled = true;
+            this.resDataCtrl.Name = "resDataCtrl";
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // ManagedCtrl
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.resDataCtrl);
+            this.Name = "ManagedCtrl";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private Maestro.Editors.Common.ResourceDataCtrl resDataCtrl;
+        private System.Windows.Forms.Label label1;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,130 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.MaestroAPI;
+using System.Collections.Specialized;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    public partial class ManagedCtrl : EditorBase, IOdbcSubEditor
+    {
+        public ManagedCtrl()
+        {
+            InitializeComponent();
+            resDataCtrl.ResourceDataMarked += new Maestro.Editors.Common.ResourceDataSelectionEventHandler(OnResourceDataMarked);
+            resDataCtrl.ResourceDataUploaded += new Maestro.Editors.Common.ResourceDataCtrl.ResourceUploadEventHandler(OnResourceDataAdded);
+        }
+
+        void OnResourceDataAdded(string dataName, string origPath)
+        {
+            OnResourceChanged();
+        }
+
+        void OnResourceDataMarked(object sender, string dataName)
+        {
+            OnConnectionChanged();
+        }
+
+        public override void Bind(IEditorService service)
+        {
+            service.RegisterCustomNotifier(this);
+            resDataCtrl.Init(service);
+        }
+
+        void OnConnectionChanged()
+        {
+            var handler = this.ConnectionChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public NameValueCollection ConnectionProperties
+        {
+            get
+            {
+                var values = new NameValueCollection();
+
+                if (string.IsNullOrEmpty(resDataCtrl.MarkedFile))
+                    return values;
+                    //throw new InvalidOperationException(Properties.Resources.OdbcNoMarkedFile);
+
+                string drv = InferDriver(resDataCtrl.MarkedFile);
+                if (drv == null)
+                    return values;
+                    //throw new InvalidOperationException(string.Format(Properties.Resources.OdbcCannotInferDriver, resDataCtrl.MarkedFile));
+
+                var inner = new System.Data.Odbc.OdbcConnectionStringBuilder();
+                inner["Driver"] = drv;
+                inner["Dbq"] = "%MG_DATA_FILE_PATH%" + resDataCtrl.MarkedFile;
+                values["ConnectionString"] = inner.ToString();
+
+                return values;
+            }
+            set
+            {
+                var inner = new System.Data.Odbc.OdbcConnectionStringBuilder();
+                if (value["ConnectionString"] == null)
+                    throw new InvalidOperationException(string.Format(Properties.Resources.FdoConnectionStringComponentNotFound, "ConnectionString"));
+
+                inner.ConnectionString = value["ConnectionString"];
+                if (inner["Dbq"] == null)
+                    throw new InvalidOperationException(string.Format(Properties.Resources.OdbcConnectionStringComponentNotFound, "Dbq"));
+
+                string path = inner["Dbq"].ToString();
+                if (path.Contains("%MG_DATA_FILE_PATH%"))
+                    resDataCtrl.MarkedFile = path.Substring("%MG_DATA_FILE_PATH%".Length);
+            }
+        }
+
+        public event EventHandler ConnectionChanged;
+
+        private static string InferDriver(string fileName)
+        {
+            string ext = System.IO.Path.GetExtension(fileName).ToUpper();
+            switch (ext)
+            { 
+                case ".ACCDB":
+                    return Properties.Resources.OdbcDriverAccess64;
+                case ".MDB":
+                    return Properties.Resources.OdbcDriverAccess;
+                case ".XLS":
+                    return Properties.Resources.OdbcDriverExcel;
+                case ".XLSX":
+                case ".XLSM":
+                case ".XLSB":
+                    return Properties.Resources.OdbcDriverExcel64;
+            }
+            return null;
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        public event EventHandler ResourceChanged;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/ManagedCtrl.resx	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,189 @@
+<?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="resDataCtrl.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="resDataCtrl.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 35</value>
+  </data>
+  <data name="resDataCtrl.Size" type="System.Drawing.Size, System.Drawing">
+    <value>497, 152</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="resDataCtrl.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;resDataCtrl.Name" xml:space="preserve">
+    <value>resDataCtrl</value>
+  </data>
+  <data name="&gt;&gt;resDataCtrl.Type" xml:space="preserve">
+    <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>$this</value>
+  </data>
+  <data name="&gt;&gt;resDataCtrl.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="label1.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 11</value>
+  </data>
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>171, 13</value>
+  </data>
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="label1.Text" xml:space="preserve">
+    <value>Data File (Mark the designated file)</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>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 13</value>
+  </data>
+  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
+    <value>503, 190</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>ManagedCtrl</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>Maestro.Editors.EditorBase, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
+  </data>
+</root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.Designer.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,72 @@
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    partial class UnmanagedCtrl
+    {
+        /// <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(UnmanagedCtrl));
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtFilePath = new System.Windows.Forms.TextBox();
+            this.btnBrowse = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // txtFilePath
+            // 
+            resources.ApplyResources(this.txtFilePath, "txtFilePath");
+            this.txtFilePath.Name = "txtFilePath";
+            // 
+            // btnBrowse
+            // 
+            resources.ApplyResources(this.btnBrowse, "btnBrowse");
+            this.btnBrowse.Name = "btnBrowse";
+            this.btnBrowse.UseVisualStyleBackColor = true;
+            // 
+            // UnmanagedCtrl
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.btnBrowse);
+            this.Controls.Add(this.txtFilePath);
+            this.Controls.Add(this.label1);
+            this.Name = "UnmanagedCtrl";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtFilePath;
+        private System.Windows.Forms.Button btnBrowse;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,108 @@
+#region Disclaimer / License
+// Copyright (C) 2011, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.Collections.Specialized;
+
+namespace Maestro.Editors.FeatureSource.Providers.Odbc.SubEditors
+{
+    public partial class UnmanagedCtrl : EditorBase, IOdbcSubEditor
+    {
+        public UnmanagedCtrl()
+        {
+            InitializeComponent();
+        }
+
+        public override void Bind(IEditorService service)
+        {
+            service.RegisterCustomNotifier(this);
+        }
+
+        public Control Content
+        {
+            get { return this; }
+        }
+
+        void OnConnectionChanged()
+        {
+            var handler = this.ConnectionChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        private static string InferDriver(string fileName)
+        {
+            string ext = System.IO.Path.GetExtension(fileName).ToUpper();
+            switch (ext)
+            {
+                case ".ACCDB":
+                    return Properties.Resources.OdbcDriverAccess64;
+                case ".MDB":
+                    return Properties.Resources.OdbcDriverAccess;
+                case ".XLS":
+                    return Properties.Resources.OdbcDriverExcel;
+                case ".XLSX":
+                case ".XLSM":
+                case ".XLSB":
+                    return Properties.Resources.OdbcDriverExcel64;
+            }
+            return null;
+        }
+
+        public NameValueCollection ConnectionProperties
+        {
+            get
+            {
+                var values = new NameValueCollection();
+                string path = txtFilePath.Text;
+                if (string.IsNullOrEmpty(path))
+                    return values;
+                    //throw new InvalidOperationException(Properties.Resources.OdbcNoMarkedFile);
+
+                string drv = InferDriver(path);
+                if (drv == null)
+                    return values;
+                    //throw new InvalidOperationException(string.Format(Properties.Resources.OdbcCannotInferDriver, path));
+
+                var inner = new System.Data.Odbc.OdbcConnectionStringBuilder();
+                inner["Driver"] = drv;
+                inner["Dbq"] = path;
+                values["ConnectionString"] = inner.ToString();
+
+                return values;
+            }
+            set
+            {
+                var cstr = value["ConnectionString"];
+                var builder = new System.Data.Common.DbConnectionStringBuilder();
+                builder.ConnectionString = cstr;
+                if (builder["Dbq"] != null)
+                    txtFilePath.Text = builder["Dbq"].ToString();
+            }
+        }
+
+        public event EventHandler ConnectionChanged;
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Odbc/SubEditors/UnmanagedCtrl.resx	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,216 @@
+<?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>0, 12</value>
+  </data>
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>74, 13</value>
+  </data>
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="label1.Text" xml:space="preserve">
+    <value>Data File Path</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>2</value>
+  </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="txtFilePath.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtFilePath.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 28</value>
+  </data>
+  <data name="txtFilePath.Size" type="System.Drawing.Size, System.Drawing">
+    <value>451, 20</value>
+  </data>
+  <data name="txtFilePath.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;txtFilePath.Name" xml:space="preserve">
+    <value>txtFilePath</value>
+  </data>
+  <data name="&gt;&gt;txtFilePath.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;txtFilePath.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;txtFilePath.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="btnBrowse.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Right</value>
+  </data>
+  <data name="btnBrowse.Location" type="System.Drawing.Point, System.Drawing">
+    <value>460, 26</value>
+  </data>
+  <data name="btnBrowse.Size" type="System.Drawing.Size, System.Drawing">
+    <value>27, 23</value>
+  </data>
+  <data name="btnBrowse.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="btnBrowse.Text" xml:space="preserve">
+    <value>...</value>
+  </data>
+  <data name="&gt;&gt;btnBrowse.Name" xml:space="preserve">
+    <value>btnBrowse</value>
+  </data>
+  <data name="&gt;&gt;btnBrowse.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;btnBrowse.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;btnBrowse.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 13</value>
+  </data>
+  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
+    <value>490, 70</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>UnmanagedCtrl</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>Maestro.Editors.EditorBase, 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/Rdbms/RdbmsBaseCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -27,6 +27,8 @@
 using Maestro.Editors.Common;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using Maestro.Shared.UI;
+using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Editors.FeatureSource.Providers.Odbc;
 
 namespace Maestro.Editors.FeatureSource.Providers.Rdbms
 {

Modified: sandbox/maestro-3.0/Maestro.Editors/FsEditorMap.xml
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FsEditorMap.xml	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/FsEditorMap.xml	2011-01-27 11:11:10 UTC (rev 5508)
@@ -6,6 +6,7 @@
 generic editor will be used
 -->
 <FeatureSourceEditorMap>
+    <Editor provider="OSGeo.ODBC" type="Maestro.Editors.FeatureSource.Providers.Odbc.OdbcProviderCtrl" />
     <Editor provider="OSGeo.SDF" type="Maestro.Editors.FeatureSource.Providers.Sdf.SdfFileCtrl" />
     <Editor provider="OSGeo.SQLite" type="Maestro.Editors.FeatureSource.Providers.SQLite.SQLiteFileCtrl" />
     <Editor provider="OSGeo.SHP" type="Maestro.Editors.FeatureSource.Providers.Shp.ShpFileCtrl" />

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.Designer.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.Designer.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -39,7 +39,7 @@
             this.resSettings.ContentBackgroundColor = System.Drawing.SystemColors.Control;
             resources.ApplyResources(this.resSettings, "resSettings");
             this.resSettings.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.resSettings.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.resSettings.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
             this.resSettings.HeaderText = "Resource Settings";
             this.resSettings.Name = "resSettings";
             // 
@@ -48,7 +48,7 @@
             this.layerProperties.ContentBackgroundColor = System.Drawing.SystemColors.Control;
             resources.ApplyResources(this.layerProperties, "layerProperties");
             this.layerProperties.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.layerProperties.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.layerProperties.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
             this.layerProperties.HeaderText = "Layer Properties Visible in Viewer";
             this.layerProperties.Name = "layerProperties";
             // 
@@ -57,7 +57,7 @@
             this.layerStyles.ContentBackgroundColor = System.Drawing.SystemColors.Control;
             resources.ApplyResources(this.layerStyles, "layerStyles");
             this.layerStyles.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.layerStyles.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.layerStyles.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
             this.layerStyles.HeaderText = "Layer Styles";
             this.layerStyles.Name = "layerStyles";
             // 

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.resx	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.resx	2011-01-27 11:11:10 UTC (rev 5508)
@@ -126,7 +126,7 @@
     <value>0, 0</value>
   </data>
   <data name="resSettings.Size" type="System.Drawing.Size, System.Drawing">
-    <value>671, 267</value>
+    <value>655, 267</value>
   </data>
   <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="resSettings.TabIndex" type="System.Int32, mscorlib">
@@ -136,7 +136,7 @@
     <value>resSettings</value>
   </data>
   <data name="&gt;&gt;resSettings.Type" xml:space="preserve">
-    <value>Maestro.Editors.LayerDefinition.Vector.VectorLayerSettingsSectionCtrl, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.LayerDefinition.Vector.VectorLayerSettingsSectionCtrl, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
   </data>
   <data name="&gt;&gt;resSettings.Parent" xml:space="preserve">
     <value>$this</value>
@@ -151,7 +151,7 @@
     <value>0, 267</value>
   </data>
   <data name="layerProperties.Size" type="System.Drawing.Size, System.Drawing">
-    <value>671, 235</value>
+    <value>655, 235</value>
   </data>
   <data name="layerProperties.TabIndex" type="System.Int32, mscorlib">
     <value>1</value>
@@ -160,7 +160,7 @@
     <value>layerProperties</value>
   </data>
   <data name="&gt;&gt;layerProperties.Type" xml:space="preserve">
-    <value>Maestro.Editors.LayerDefinition.LayerPropertiesSectionCtrl, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.LayerDefinition.LayerPropertiesSectionCtrl, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
   </data>
   <data name="&gt;&gt;layerProperties.Parent" xml:space="preserve">
     <value>$this</value>
@@ -175,7 +175,7 @@
     <value>0, 502</value>
   </data>
   <data name="layerStyles.Size" type="System.Drawing.Size, System.Drawing">
-    <value>671, 319</value>
+    <value>655, 319</value>
   </data>
   <data name="layerStyles.TabIndex" type="System.Int32, mscorlib">
     <value>2</value>
@@ -184,7 +184,7 @@
     <value>layerStyles</value>
   </data>
   <data name="&gt;&gt;layerStyles.Type" xml:space="preserve">
-    <value>Maestro.Editors.LayerDefinition.Vector.VectorLayerStyleSectionCtrl, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.LayerDefinition.Vector.VectorLayerStyleSectionCtrl, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
   </data>
   <data name="&gt;&gt;layerStyles.Parent" xml:space="preserve">
     <value>$this</value>
@@ -199,12 +199,12 @@
     <value>True</value>
   </data>
   <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
-    <value>671, 530</value>
+    <value>655, 530</value>
   </data>
   <data name="&gt;&gt;$this.Name" xml:space="preserve">
     <value>VectorLayerEditorCtrl</value>
   </data>
   <data name="&gt;&gt;$this.Type" xml:space="preserve">
-    <value>Maestro.Editors.EditorBase, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.EditorBase, 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/Maestro.Editors.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2011-01-27 11:11:10 UTC (rev 5508)
@@ -214,6 +214,48 @@
     <Compile Include="FeatureSource\Providers\GenericCtrl.Designer.cs">
       <DependentUpon>GenericCtrl.cs</DependentUpon>
     </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\Drivers\OracleDriver.cs" />
+    <Compile Include="FeatureSource\Providers\Odbc\Drivers\OracleMsDriver.cs" />
+    <Compile Include="FeatureSource\Providers\Odbc\Drivers\SqlServerDriver.cs" />
+    <Compile Include="FeatureSource\Providers\Odbc\OdbcDriverInfo.cs" />
+    <Compile Include="FeatureSource\Providers\Odbc\OdbcDriverMap.cs" />
+    <Compile Include="FeatureSource\Providers\Odbc\OdbcProviderCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\OdbcProviderCtrl.Designer.cs">
+      <DependentUpon>OdbcProviderCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\ConnectionStringCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\ConnectionStringCtrl.Designer.cs">
+      <DependentUpon>ConnectionStringCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\DSNCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\DSNCtrl.Designer.cs">
+      <DependentUpon>DSNCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\IOdbcSubEditor.cs" />
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\KnownDriversCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\KnownDriversCtrl.Designer.cs">
+      <DependentUpon>KnownDriversCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\ManagedCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\ManagedCtrl.Designer.cs">
+      <DependentUpon>ManagedCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\UnmanagedCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\Odbc\SubEditors\UnmanagedCtrl.Designer.cs">
+      <DependentUpon>UnmanagedCtrl.cs</DependentUpon>
+    </Compile>
     <Compile Include="FeatureSource\Providers\Rdbms\MySqlCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -900,6 +942,24 @@
       <DependentUpon>GenericCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="FeatureSource\Providers\Odbc\OdbcProviderCtrl.resx">
+      <DependentUpon>OdbcProviderCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FeatureSource\Providers\Odbc\SubEditors\ConnectionStringCtrl.resx">
+      <DependentUpon>ConnectionStringCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FeatureSource\Providers\Odbc\SubEditors\DSNCtrl.resx">
+      <DependentUpon>DSNCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FeatureSource\Providers\Odbc\SubEditors\KnownDriversCtrl.resx">
+      <DependentUpon>KnownDriversCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FeatureSource\Providers\Odbc\SubEditors\ManagedCtrl.resx">
+      <DependentUpon>ManagedCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FeatureSource\Providers\Odbc\SubEditors\UnmanagedCtrl.resx">
+      <DependentUpon>UnmanagedCtrl.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="FeatureSource\Providers\Rdbms\MySqlCtrl.resx">
       <DependentUpon>MySqlCtrl.cs</DependentUpon>
     </EmbeddedResource>
@@ -1702,6 +1762,9 @@
     <Content Include="FsEditorMap.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <Content Include="OdbcDriverMap.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
     <None Include="Resources\ui-separator.png" />
     <None Include="Resources\gear--plus.png" />
     <None Include="Resources\gear--pencil.png" />

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.Designer.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.Designer.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -38,7 +38,7 @@
             this.mapSettingsCtrl.ContentBackgroundColor = System.Drawing.SystemColors.Control;
             resources.ApplyResources(this.mapSettingsCtrl, "mapSettingsCtrl");
             this.mapSettingsCtrl.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.mapSettingsCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.mapSettingsCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
             this.mapSettingsCtrl.HeaderText = "Map Settings";
             this.mapSettingsCtrl.Name = "mapSettingsCtrl";
             // 
@@ -47,7 +47,7 @@
             this.mapLayersCtrl.ContentBackgroundColor = System.Drawing.SystemColors.Control;
             resources.ApplyResources(this.mapLayersCtrl, "mapLayersCtrl");
             this.mapLayersCtrl.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.mapLayersCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.mapLayersCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
             this.mapLayersCtrl.HeaderText = "Layers";
             this.mapLayersCtrl.Name = "mapLayersCtrl";
             // 

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.resx	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapDefinitionEditorCtrl.resx	2011-01-27 11:11:10 UTC (rev 5508)
@@ -126,7 +126,7 @@
     <value>0, 0</value>
   </data>
   <data name="mapSettingsCtrl.Size" type="System.Drawing.Size, System.Drawing">
-    <value>588, 206</value>
+    <value>572, 206</value>
   </data>
   <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="mapSettingsCtrl.TabIndex" type="System.Int32, mscorlib">
@@ -136,7 +136,7 @@
     <value>mapSettingsCtrl</value>
   </data>
   <data name="&gt;&gt;mapSettingsCtrl.Type" xml:space="preserve">
-    <value>Maestro.Editors.MapDefinition.MapSettingsSectionCtrl, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.MapDefinition.MapSettingsSectionCtrl, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
   </data>
   <data name="&gt;&gt;mapSettingsCtrl.Parent" xml:space="preserve">
     <value>$this</value>
@@ -151,7 +151,7 @@
     <value>0, 206</value>
   </data>
   <data name="mapLayersCtrl.Size" type="System.Drawing.Size, System.Drawing">
-    <value>588, 319</value>
+    <value>572, 319</value>
   </data>
   <data name="mapLayersCtrl.TabIndex" type="System.Int32, mscorlib">
     <value>1</value>
@@ -160,7 +160,7 @@
     <value>mapLayersCtrl</value>
   </data>
   <data name="&gt;&gt;mapLayersCtrl.Type" xml:space="preserve">
-    <value>Maestro.Editors.MapDefinition.MapLayersSectionCtrl, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.MapDefinition.MapLayersSectionCtrl, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
   </data>
   <data name="&gt;&gt;mapLayersCtrl.Parent" xml:space="preserve">
     <value>$this</value>
@@ -175,12 +175,12 @@
     <value>True</value>
   </data>
   <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
-    <value>588, 500</value>
+    <value>572, 500</value>
   </data>
   <data name="&gt;&gt;$this.Name" xml:space="preserve">
     <value>MapDefinitionEditorCtrl</value>
   </data>
   <data name="&gt;&gt;$this.Type" xml:space="preserve">
-    <value>Maestro.Editors.EditorBase, Maestro.Editors, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.EditorBase, Maestro.Editors, Version=3.0.0.5475, Culture=neutral, PublicKeyToken=null</value>
   </data>
 </root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/OdbcDriverMap.xml
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/OdbcDriverMap.xml	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/OdbcDriverMap.xml	2011-01-27 11:11:10 UTC (rev 5508)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- 
+This file allows the ODBC Known Driver connection builder to load builders of known
+ODBC drivers. Connection builders specified in this file must inherit from the 
+Maestro.Editors.FeatureSource.Providers.Odbc.OdbcDriverInfo class
+
+To create your own ODBC driver connection builder, extend the OdbcDriverInfo class. Define the
+appropriate driver connection properties (control the PropertyGrid display using the
+System.ComponentModel.DisplayNameAttribute and System.ComponentModel.DescriptionAttribute) and
+override the ToOdbcConnectionString() method to turn this into the matching ODBC connection string
+
+Once that is done, register the fully-qualified type in this file and it will be picked up by
+the connection builder.
+-->
+<OdbcDriverMap>
+    <Driver name="SQL Server" type="Maestro.Editors.FeatureSource.Providers.Odbc.Drivers.SqlServerDriver" />
+</OdbcDriverMap>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -559,6 +559,24 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to FDO Connection Status: {0}.
+        /// </summary>
+        internal static string FdoConnectionStatus {
+            get {
+                return ResourceManager.GetString("FdoConnectionStatus", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The component &quot;{0}&quot; could not be found in the specified FDO connection string.
+        /// </summary>
+        internal static string FdoConnectionStringComponentNotFound {
+            get {
+                return ResourceManager.GetString("FdoConnectionStringComponentNotFound", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to An error occured while copying file: {0}.
         /// </summary>
         internal static string FileCopyError {
@@ -1838,6 +1856,69 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Could not infer ODBC driver from file name: {0}.
+        /// </summary>
+        internal static string OdbcCannotInferDriver {
+            get {
+                return ResourceManager.GetString("OdbcCannotInferDriver", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The component &quot;{0}&quot; could not be found in the specified ODBC connection string.
+        /// </summary>
+        internal static string OdbcConnectionStringComponentNotFound {
+            get {
+                return ResourceManager.GetString("OdbcConnectionStringComponentNotFound", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to {Microsoft Access Driver (*.mdb)}.
+        /// </summary>
+        internal static string OdbcDriverAccess {
+            get {
+                return ResourceManager.GetString("OdbcDriverAccess", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to {Microsoft Access Driver (*.mdb, *.accdb)}.
+        /// </summary>
+        internal static string OdbcDriverAccess64 {
+            get {
+                return ResourceManager.GetString("OdbcDriverAccess64", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to {Microsoft Excel Driver (*.xls)}.
+        /// </summary>
+        internal static string OdbcDriverExcel {
+            get {
+                return ResourceManager.GetString("OdbcDriverExcel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to {Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}.
+        /// </summary>
+        internal static string OdbcDriverExcel64 {
+            get {
+                return ResourceManager.GetString("OdbcDriverExcel64", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Could not infer ODBC driver. No file specified.
+        /// </summary>
+        internal static string OdbcNoMarkedFile {
+            get {
+                return ResourceManager.GetString("OdbcNoMarkedFile", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Operation Cancelled.
         /// </summary>
         internal static string OperationCancelled {

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2011-01-27 11:11:10 UTC (rev 5508)
@@ -1073,4 +1073,31 @@
   <data name="CoordinateTransformationFailed" xml:space="preserve">
     <value>Failed to transform coordinates: {0}</value>
   </data>
+  <data name="OdbcDriverAccess" xml:space="preserve">
+    <value>{Microsoft Access Driver (*.mdb)}</value>
+  </data>
+  <data name="OdbcDriverAccess64" xml:space="preserve">
+    <value>{Microsoft Access Driver (*.mdb, *.accdb)}</value>
+  </data>
+  <data name="OdbcDriverExcel" xml:space="preserve">
+    <value>{Microsoft Excel Driver (*.xls)}</value>
+  </data>
+  <data name="OdbcDriverExcel64" xml:space="preserve">
+    <value>{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}</value>
+  </data>
+  <data name="OdbcCannotInferDriver" xml:space="preserve">
+    <value>Could not infer ODBC driver from file name: {0}</value>
+  </data>
+  <data name="OdbcNoMarkedFile" xml:space="preserve">
+    <value>Could not infer ODBC driver. No file specified</value>
+  </data>
+  <data name="FdoConnectionStringComponentNotFound" xml:space="preserve">
+    <value>The component "{0}" could not be found in the specified FDO connection string</value>
+  </data>
+  <data name="OdbcConnectionStringComponentNotFound" xml:space="preserve">
+    <value>The component "{0}" could not be found in the specified ODBC connection string</value>
+  </data>
+  <data name="FdoConnectionStatus" xml:space="preserve">
+    <value>FDO Connection Status: {0}</value>
+  </data>
 </root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Login/LoginDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Login/LoginDialog.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/Maestro.Login/LoginDialog.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -187,7 +187,7 @@
                         //string format = "Url={0};Username={1};Password={2};Locale={3};AllowUntestedVersion={4}";
                         //string connStr = string.Format(format, _http.Server, _http.Username, _http.Password, _http.Language, true);
 
-                        System.Data.Common.DbConnectionStringBuilder builder = new System.Data.Common.DbConnectionStringBuilder();
+                        var builder = new System.Data.Common.DbConnectionStringBuilder();
                         builder["Url"] = _http.Server;
                         builder["Username"] = _http.Username;
                         builder["Password"] = _http.Password;

Modified: sandbox/maestro-3.0/MaestroAPITests/ResourceTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/ResourceTests.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/MaestroAPITests/ResourceTests.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -19,26 +19,28 @@
 #endregion
 using System;
 using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.IO;
 using System.Text;
+
+using NMock2;
 using NUnit.Framework;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Exceptions;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+using OSGeo.MapGuide.MaestroAPI.Resource.Conversion;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.ObjectModels;
 using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using OSGeo.MapGuide.ObjectModels.Common;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using OSGeo.MapGuide.ObjectModels.LoadProcedure;
 using OSGeo.MapGuide.ObjectModels.MapDefinition;
+using OSGeo.MapGuide.ObjectModels.PrintLayout;
+using OSGeo.MapGuide.ObjectModels.SymbolDefinition;
+using OSGeo.MapGuide.ObjectModels.SymbolLibrary;
 using OSGeo.MapGuide.ObjectModels.WebLayout;
-using OSGeo.MapGuide.ObjectModels.SymbolLibrary;
-using OSGeo.MapGuide.ObjectModels.SymbolDefinition;
-using OSGeo.MapGuide.ObjectModels.PrintLayout;
-using OSGeo.MapGuide.MaestroAPI.Exceptions;
-using OSGeo.MapGuide.MaestroAPI.Resource.Conversion;
-using NMock2;
-using OSGeo.MapGuide.MaestroAPI.Resource;
-using OSGeo.MapGuide.ObjectModels.Common;
-using OSGeo.MapGuide.MaestroAPI;
-using OSGeo.MapGuide.ObjectModels.LoadProcedure;
-using OSGeo.MapGuide.ObjectModels;
-using OSGeo.MapGuide.MaestroAPI.Services;
-using System.IO;
 
 namespace MaestroAPITests
 {
@@ -651,48 +653,69 @@
 
             var fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SDF");
             Assert.IsTrue(fs.ConnectionString.Length == 0);
+            
+            var connParams = new NameValueCollection();
+            connParams["File"] = "%MG_DATA_FILE_PATH%Foo.sdf";
 
-            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SDF", "File=%MG_DATA_FILE_PATH%Foo.sdf");
+            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SDF", connParams);
 
             Assert.IsTrue(fs.UsesEmbeddedDataFiles);
             Assert.IsFalse(fs.UsesAliasedDataFiles);
             Assert.AreEqual(fs.GetEmbeddedDataName(), "Foo.sdf");
             Assert.Catch<InvalidOperationException>(() => fs.GetAliasedFileName());
             Assert.Catch<InvalidOperationException>(() => fs.GetAliasName());
+            
+            connParams.Clear();
+            connParams["File"] = "%MG_DATA_FILE_PATH%Bar.sdf";
+            connParams["ReadOnly"] = "TRUE";
 
-            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SDF", "File=%MG_DATA_FILE_PATH%Bar.sdf;ReadOnly=TRUE");
+            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SDF", connParams);
 
             Assert.IsTrue(fs.UsesEmbeddedDataFiles);
             Assert.IsFalse(fs.UsesAliasedDataFiles);
             Assert.AreEqual(fs.GetEmbeddedDataName(), "Bar.sdf");
             Assert.Catch<InvalidOperationException>(() => fs.GetAliasedFileName());
             Assert.Catch<InvalidOperationException>(() => fs.GetAliasName());
+            
+            connParams.Clear();
+            connParams["DefaultFileLocation"] = "%MG_DATA_PATH_ALIAS[foobar]%";
 
-            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SHP", "DefaultFileLocation=%MG_DATA_PATH_ALIAS[foobar]%");
+            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SHP", connParams);
 
             Assert.IsTrue(fs.UsesAliasedDataFiles);
             Assert.IsFalse(fs.UsesEmbeddedDataFiles);
             Assert.AreEqual(fs.GetAliasName(), "foobar");
             Assert.IsEmpty(fs.GetAliasedFileName());
             Assert.Catch<InvalidOperationException>(() => fs.GetEmbeddedDataName());
+            
+            connParams.Clear();
+            connParams["DefaultFileLocation"] = "%MG_DATA_PATH_ALIAS[foobar]%Test.sdf";
 
-            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SDF", "DefaultFileLocation=%MG_DATA_PATH_ALIAS[foobar]%Test.sdf");
+            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SDF", connParams);
 
             Assert.IsTrue(fs.UsesAliasedDataFiles);
             Assert.IsFalse(fs.UsesEmbeddedDataFiles);
             Assert.AreEqual(fs.GetAliasName(), "foobar");
             Assert.AreEqual(fs.GetAliasedFileName(), "Test.sdf");
             Assert.Catch<InvalidOperationException>(() => fs.GetEmbeddedDataName());
+            
+            connParams.Clear();
+            connParams["DefaultFileLocation"] = "%MG_DATA_PATH_ALIAS[foobar]%Test.sdf";
+            connParams["ReadOnly"] = "TRUE";
 
-            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SDF", "DefaultFileLocation=%MG_DATA_PATH_ALIAS[foobar]%Test.sdf;ReadOnly=TRUE");
+            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SDF", connParams);
 
             Assert.IsTrue(fs.UsesAliasedDataFiles);
             Assert.IsFalse(fs.UsesEmbeddedDataFiles);
             Assert.AreEqual(fs.GetAliasName(), "foobar");
             Assert.AreEqual(fs.GetAliasedFileName(), "Test.sdf");
             Assert.Catch<InvalidOperationException>(() => fs.GetEmbeddedDataName());
+            
+            connParams.Clear();
+            connParams["Service"] = "(local)\\SQLEXPRESS";
+            connParams["DataStore"] = "TEST";
 
-            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SQLServerSpatial", "Service=(local)\\SQLEXPRESS;DataStore=TEST");
+            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SQLServerSpatial", connParams);
 
             Assert.IsFalse(fs.UsesEmbeddedDataFiles);
             Assert.IsFalse(fs.UsesAliasedDataFiles);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -29,6 +29,7 @@
 using OSGeo.MapGuide.MaestroAPI.Services;
 using OSGeo.MapGuide.ObjectModels;
 using OSGeo.MapGuide.MaestroAPI.Schema;
+using System.Collections.Specialized;
 
 namespace OSGeo.MapGuide.MaestroAPI.Commands
 {
@@ -294,7 +295,9 @@
                             // 4. If no spatial contexts are detected, assign a default one from the load procedure and save the modified feature source.
 
                             //Step 1: Create feature source document
-                            var fs = ObjectFactory.CreateFeatureSource(this.Parent, "OSGeo.SHP", "DefaultFileLocation=%MG_DATA_FILE_PATH%" + dataName);
+                            var conp = new NameValueCollection();
+                            conp["DefaultFileLocation"] = "%MG_DATA_FILE_PATH%" + dataName;
+                            var fs = ObjectFactory.CreateFeatureSource(this.Parent, "OSGeo.SHP", conp);
                             fs.ResourceID = fsId;
 
                             this.Parent.ResourceService.SaveResource(fs);
@@ -557,7 +560,6 @@
                                 // 4. If no spatial contexts are detected, assign a default one from the load procedure and save the modified feature source.
 
                                 //Step 1: Create feature source document
-                                string prefix = "File=%MG_DATA_FILE_PATH%";
                                 string provider = "OSGeo.SDF";
 
                                 switch (proc.Type)
@@ -566,8 +568,9 @@
                                         provider = "OSGeo.SQLite";
                                         break;
                                 }
-
-                                var fs = ObjectFactory.CreateFeatureSource(this.Parent, provider, prefix + dataName);
+                                var conp = new NameValueCollection();
+                                conp["File"] = "%MG_DATA_FILE_PATH%" + dataName;
+                                var fs = ObjectFactory.CreateFeatureSource(this.Parent, provider, conp);
                                 fs.ResourceID = fsId;
 
                                 this.Parent.ResourceService.SaveResource(fs);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -23,6 +23,7 @@
 using System.Xml;
 using System.Reflection;
 using System.Collections.Specialized;
+using System.Data.Common;
 
 namespace OSGeo.MapGuide.MaestroAPI
 {
@@ -157,7 +158,7 @@
 
         internal static NameValueCollection ParseConnectionString(string connectionString)
         {
-            System.Data.Common.DbConnectionStringBuilder builder = new System.Data.Common.DbConnectionStringBuilder();
+            var builder = new DbConnectionStringBuilder();
             builder.ConnectionString = connectionString;
 
             NameValueCollection values = new NameValueCollection();

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClrFdoTypeMap.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClrFdoTypeMap.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClrFdoTypeMap.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -30,6 +30,11 @@
     /// </summary>
     public static class ClrFdoTypeMap
     {
+        /// <summary>
+        /// Gets the CLR type for the specified data type
+        /// </summary>
+        /// <param name="dataPropertyType"></param>
+        /// <returns></returns>
         public static Type GetClrType(DataPropertyType dataPropertyType)
         {
             switch (dataPropertyType)
@@ -60,6 +65,11 @@
             throw new ArgumentException();
         }
 
+        /// <summary>
+        /// Gets the CLR type for the specified property value type
+        /// </summary>
+        /// <param name="propertyValueType"></param>
+        /// <returns></returns>
         public static Type GetClrType(PropertyValueType propertyValueType)
         {
             switch (propertyValueType)
@@ -95,6 +105,11 @@
             throw new ArgumentException();
         }
 
+        /// <summary>
+        /// Gets the clr type for the specified property definition
+        /// </summary>
+        /// <param name="prop"></param>
+        /// <returns></returns>
         public static Type GetClrType(PropertyDefinition prop)
         {
             switch (prop.Type)

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureReaderBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureReaderBase.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureReaderBase.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -46,6 +46,16 @@
             }
         }
 
+        public IFeatureReader GetFeatureObject(string name)
+        {
+            return ((IFeature)this.Current).GetFeatureObject(name);
+        }
+
+        public IFeatureReader GetFeatureObject(int index)
+        {
+            return ((IFeature)this.Current).GetFeatureObject(index);
+        }
+
         public override string GetName(int index)
         {
             return this.ClassDefinition.Properties[index].Name;

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IFeatureReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IFeatureReader.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IFeatureReader.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -25,13 +25,41 @@
 
 namespace OSGeo.MapGuide.MaestroAPI.Feature
 {
+    /// <summary>
+    /// Provides a forward-only, read-only iterator 
+    /// for reading features selected from a feature source
+    /// </summary>
     public interface IFeatureReader : IReader, IFeature, IEnumerable<IFeature>
     {
         
     }
 
+    /// <summary>
+    /// Provides access to the property values within each feature for a <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IFeatureReader"/>
+    /// </summary>
     public interface IFeature : IRecord
     {
+        /// <summary>
+        /// Gets the class definition of the object currently being read. If the user has requested 
+        /// only a subset of the class properties (as specified in the filter text), the class 
+        /// definition reflects what the user has requested, rather than the full class definition. 
+        /// </summary>
         ClassDefinition ClassDefinition { get; }
+
+        /// <summary>
+        /// Gets a <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IFeatureReader"/> containing
+        /// all the nested features of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        IFeatureReader GetFeatureObject(string name);
+
+        /// <summary>
+        /// Gets a <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IFeatureReader"/> containing
+        /// all the nested features at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
+        IFeatureReader GetFeatureObject(int index);
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IReader.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IReader.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -24,73 +24,295 @@
 
 namespace OSGeo.MapGuide.MaestroAPI.Feature
 {
+    /// <summary>
+    /// Provides a forward-only, read-only iterator for reading data. You must call <see cref="ReadNext"/> 
+    /// before you can access any data
+    /// </summary>
     public interface IReader : IDisposable, IRecord
     {
+        /// <summary>
+        /// Advances the reader to the next item and determines whether there is another object to read. 
+        /// </summary>
+        /// <returns></returns>
         bool ReadNext();
 
+        /// <summary>
+        /// Closes the object, freeing any resources it may be holding. 
+        /// </summary>
         void Close();
     }
 
+    /// <summary>
+    /// Defines the types of readers
+    /// </summary>
     public enum ReaderType : int
     {
+        /// <summary>
+        /// The reader is a Data Reader
+        /// </summary>
         Data = 1,
+        /// <summary>
+        /// The reader is a SQL Reader
+        /// </summary>
         Sql = 2,
+        /// <summary>
+        /// The reader is a Feature Reader
+        /// </summary>
         Feature = 0
     }
 
+    /// <summary>
+    /// Provides a means for resetting a <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IRecord"/>
+    /// instance
+    /// </summary>
     public interface IRecordReset
     {
         void Update(IRecord record);
     }
 
+    /// <summary>
+    /// Provides a means for initializing a <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IRecord"/>
+    /// instance with <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.PropertyValue"/> instances
+    /// </summary>
     public interface IRecordInitialize
     {
+        /// <summary>
+        /// Gets the specified property value by name
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         PropertyValue GetValue(string name);
+
+        /// <summary>
+        /// Adds the specified property value
+        /// </summary>
+        /// <param name="name"></param>
+        /// <param name="value"></param>
         void PutValue(string name, PropertyValue value);
     }
 
+    /// <summary>
+    /// Provides access to the property values within each result for a <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IReader"/>
+    /// </summary>
     public interface IRecord
     {
+        /// <summary>
+        /// Gets the number of fields in this record
+        /// </summary>
         int FieldCount { get; }
 
+        /// <summary>
+        /// Gets the name of the field at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         string GetName(int index);
+
+        /// <summary>
+        /// Gets the CLR type of the field at the specified index
+        /// </summary>
+        /// <param name="i"></param>
+        /// <returns></returns>
         Type GetFieldType(int i);
 
+        /// <summary>
+        /// Gets whether the specified property name has a null property value
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         bool IsNull(string name);
+
+        /// <summary>
+        /// Gets whether the property value at the specified index has a null property value. You must
+        /// call this method first to determine if it is safe to call the corresponding GetXXX() methods
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         bool IsNull(int index);
 
+        /// <summary>
+        /// Gets the boolean value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         bool GetBoolean(string name);
+
+        /// <summary>
+        /// Gets the byte value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         byte GetByte(string name);
+
+        /// <summary>
+        /// Gets the blob value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         byte[] GetBlob(string name);
+
+        /// <summary>
+        /// Gets the clob value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         char[] GetClob(string name);
+
+        /// <summary>
+        /// Gets the double value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         double GetDouble(string name);
+
+        /// <summary>
+        /// Gets the datetime value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         DateTime GetDateTime(string name);
-        IFeatureReader GetFeatureObject(string name);
+
+        /// <summary>
+        /// Gets the int16 value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         short GetInt16(string name);
+        
+        /// <summary>
+        /// Gets the int32 value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         int GetInt32(string name);
+
+        /// <summary>
+        /// Gets the int64 value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         long GetInt64(string name);
+
+        /// <summary>
+        /// Gets the single value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         float GetSingle(string name);
+
+        /// <summary>
+        /// Gets the string value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         string GetString(string name);
+
+        /// <summary>
+        /// Gets the geometry value of the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         IGeometry GetGeometry(string name);
 
+        /// <summary>
+        /// Gets the boolean value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         bool GetBoolean(int index);
+
+        /// <summary>
+        /// Gets the byte value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         byte GetByte(int index);
+
+        /// <summary>
+        /// Gets the blob value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         byte[] GetBlob(int index);
+
+        /// <summary>
+        /// Gets the clob value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         char[] GetClob(int index);
+
+        /// <summary>
+        /// Gets the double value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         double GetDouble(int index);
+
+        /// <summary>
+        /// Gets the datetime value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         DateTime GetDateTime(int index);
-        IFeatureReader GetFeatureObject(int index);
+        
+        /// <summary>
+        /// Gets the int16 value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         short GetInt16(int index);
+
+        /// <summary>
+        /// Gets the int32 value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         int GetInt32(int index);
+        
+        /// <summary>
+        /// Gets the int64 value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         long GetInt64(int index);
+
+        /// <summary>
+        /// Gets the single value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         float GetSingle(int index);
+
+        /// <summary>
+        /// Gets the string value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         string GetString(int index);
+        
+        /// <summary>
+        /// Gets the geometry value at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         IGeometry GetGeometry(int index);
 
         //byte[] GetRaster(string name);
         //byte[] GetRaster(int index);
 
+        /// <summary>
+        /// Gets the object at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
         object this[int index] { get; }
+
+        /// <summary>
+        /// Gets the object value for the specified property
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
         object this[string name] { get; }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/PropertyValue.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/PropertyValue.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/PropertyValue.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -119,6 +119,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores byte data
+    /// </summary>
     public class ByteValue : ValueTypePropertyValue<byte>
     {
         public override PropertyValueType Type
@@ -127,6 +130,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores boolean data
+    /// </summary>
     public class BooleanValue : ValueTypePropertyValue<bool>
     {
         public override PropertyValueType Type
@@ -135,6 +141,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores blob data
+    /// </summary>
     public class BlobValue : ReferenceTypePropertyValue<byte[]>
     {
         public override PropertyValueType Type
@@ -143,6 +152,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores clob data
+    /// </summary>
     public class ClobValue : ReferenceTypePropertyValue<char[]>
     {
         public override PropertyValueType Type
@@ -151,6 +163,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores datetime data
+    /// </summary>
     public class DateTimeValue : ValueTypePropertyValue<DateTime>
     {
         public override PropertyValueType Type
@@ -159,6 +174,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores double data
+    /// </summary>
     public class DoubleValue : ValueTypePropertyValue<double>
     {
         public override PropertyValueType Type
@@ -167,6 +185,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores feature data
+    /// </summary>
     public class FeatureValue : ReferenceTypePropertyValue<IFeature[]>
     {
         public override PropertyValueType Type
@@ -175,6 +196,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores geometry data
+    /// </summary>
     public class GeometryValue : ReferenceTypePropertyValue<IGeometry>
     {
         public override PropertyValueType Type
@@ -183,6 +207,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores int16 data
+    /// </summary>
     public class Int16Value : ValueTypePropertyValue<short>
     {
         public override PropertyValueType Type
@@ -191,6 +218,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores int32 data
+    /// </summary>
     public class Int32Value : ValueTypePropertyValue<int>
     {
         public override PropertyValueType Type
@@ -199,6 +229,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores int64 data
+    /// </summary>
     public class Int64Value : ValueTypePropertyValue<long>
     {
         public override PropertyValueType Type
@@ -207,6 +240,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores raster data
+    /// </summary>
     public class RasterValue : ReferenceTypePropertyValue<byte[]>
     {
         public override PropertyValueType Type
@@ -215,6 +251,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores float data
+    /// </summary>
     public class SingleValue : ValueTypePropertyValue<float>
     {
         public override PropertyValueType Type
@@ -223,6 +262,9 @@
         }
     }
 
+    /// <summary>
+    /// Stores string data
+    /// </summary>
     public class StringValue : ReferenceTypePropertyValue<string>
     {
         public override PropertyValueType Type

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ReaderBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ReaderBase.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ReaderBase.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -95,10 +95,7 @@
             return this.Current.GetDateTime(name);
         }
 
-        public IFeatureReader GetFeatureObject(string name)
-        {
-            return this.Current.GetFeatureObject(name);
-        }
+        
 
         public short GetInt16(string name)
         {
@@ -160,11 +157,6 @@
             return this.Current.GetDateTime(index);
         }
 
-        public IFeatureReader GetFeatureObject(int index)
-        {
-            return this.Current.GetFeatureObject(index);
-        }
-
         public short GetInt16(int index)
         {
             return this.Current.GetInt16(index);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/RecordBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/RecordBase.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/RecordBase.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -288,16 +288,16 @@
                     case PropertyValueType.Double:
                         ((DoubleValue)val).Value = record.GetDouble(i);
                         break;
-                    case PropertyValueType.Feature:
-                        {
-                            List<IFeature> features = new List<IFeature>();
-                            foreach (var feat in record.GetFeatureObject(i))
-                            {
-                                features.Add(feat);
-                            }
-                            ((FeatureValue)val).Value = features.ToArray();
-                        }
-                        break;
+                    //case PropertyValueType.Feature:
+                    //    {
+                    //        List<IFeature> features = new List<IFeature>();
+                    //        foreach (var feat in record.GetFeatureObject(i))
+                    //        {
+                    //            features.Add(feat);
+                    //        }
+                    //        ((FeatureValue)val).Value = features.ToArray();
+                    //    }
+                    //    break;
                     case PropertyValueType.Geometry:
                         ((GeometryValue)val).Value = record.GetGeometry(i);
                         break;

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -102,6 +102,24 @@
             get { return true; }
         }
 
+        public void ClearConnectionProperties()
+        {
+            this.Parameter.Clear();
+        }
+
+        public string[] ConnectionPropertyNames
+        {
+            get
+            {
+                var names = new List<string>();
+                foreach (var p in this.Parameter)
+                {
+                    names.Add(p.Name);
+                }
+                return names.ToArray();
+            }
+        }
+
         public string GetConnectionProperty(string name)
         {
             foreach (var p in this.Parameter)
@@ -142,35 +160,8 @@
         {
             get
             {
-                List<string> values = new List<string>();
-                if (this.Parameter != null)
-                {
-                    foreach (var p in this.Parameter)
-                    {
-                        values.Add(p.Name + "=" + p.Value);
-                    }
-                }
-                return string.Join(";", values.ToArray());
+                return Utility.ToConnectionString(this.GetConnectionProperties());
             }
-            set
-            {
-                if (value == null)
-                    throw new ArgumentNullException("value");
-
-                if (this.Parameter == null)
-                    this.Parameter = new System.ComponentModel.BindingList<NameValuePairType>();
-
-                this.Parameter.Clear();
-                string[] tokens = value.Split(';');
-                foreach (var tok in tokens)
-                {
-                    string[] values = tok.Split('=');
-                    if (values.Length == 2)
-                    {
-                        this.Parameter.Add(new NameValuePairType() { Name = values[0], Value = values[1] });
-                    }
-                }
-            }
         }
 
         const string DATA_TAG = "%MG_DATA_FILE_PATH%";

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -26,6 +26,7 @@
 using System.ComponentModel;
 using System.IO;
 using OSGeo.MapGuide.MaestroAPI.Schema;
+using System.Collections.Specialized;
 
 namespace OSGeo.MapGuide.ObjectModels.FeatureSource
 {
@@ -35,6 +36,16 @@
     public interface IFeatureSource : IResource
     {
         /// <summary>
+        /// Removes all specified connection properties
+        /// </summary>
+        void ClearConnectionProperties();
+
+        /// <summary>
+        /// Gets an array of names of the currently specified connection properties
+        /// </summary>
+        string[] ConnectionPropertyNames { get; }
+
+        /// <summary>
         /// Gets or sets the FDO provider.
         /// </summary>
         /// <value>The FDO provider.</value>
@@ -55,10 +66,10 @@
         void SetConnectionProperty(string name, string value);
 
         /// <summary>
-        /// Gets or sets the connection string.
+        /// Gets the connection string.
         /// </summary>
         /// <value>The connection string.</value>
-        string ConnectionString { get; set; }
+        string ConnectionString { get; }
 
         /// <summary>
         /// Gets the name of the embedded data resource. Can only be called if <see cref="UsesEmbeddedDataFiles"/> returns true.
@@ -342,6 +353,42 @@
     public static class FeatureSourceExtensions
     {
         /// <summary>
+        /// Gets a collection of connection properties
+        /// </summary>
+        /// <param name="fs"></param>
+        /// <returns></returns>
+        public static NameValueCollection GetConnectionProperties(this IFeatureSource fs)
+        {
+            Check.NotNull(fs, "fs");
+            var values = new NameValueCollection();
+            foreach (string name in fs.ConnectionPropertyNames)
+            {
+                values[name] = fs.GetConnectionProperty(name);
+            }
+            return values;
+        }
+
+        /// <summary>
+        /// Sets the connection properties of the feature source
+        /// </summary>
+        /// <param name="fs"></param>
+        /// <param name="values"></param>
+        public static void ApplyConnectionProperties(this IFeatureSource fs, NameValueCollection values)
+        {
+            Check.NotNull(fs, "fs");
+            Check.NotNull(values, "values");
+
+            fs.ClearConnectionProperties();
+
+            foreach (string name in values.Keys)
+            {
+                string value = values[name];
+
+                fs.SetConnectionProperty(name, value);
+            }
+        }
+
+        /// <summary>
         /// Gets the configuration document content
         /// </summary>
         /// <param name="fs"></param>
@@ -465,6 +512,7 @@
             fs.AddSpatialContextOverride(new OSGeo.MapGuide.ObjectModels.FeatureSource_1_0_0.SpatialContextType() { Name = name, CoordinateSystem = coordSys });
         }
 
+
         /// <summary>
         /// Tests the connection settings in this feature source
         /// </summary>

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/ObjectFactory.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -220,12 +220,12 @@
         /// </summary>
         /// <param name="owner">The owner.</param>
         /// <param name="provider">The provider.</param>
-        /// <param name="connectionString">The connection string.</param>
+        /// <param name="values">The connection properties.</param>
         /// <returns></returns>
-        public static IFeatureSource CreateFeatureSource(IServerConnection owner, string provider, string connectionString)
+        public static IFeatureSource CreateFeatureSource(IServerConnection owner, string provider, NameValueCollection values)
         {
             var fs = CreateFeatureSource(owner, provider);
-            fs.ConnectionString = connectionString;
+            fs.ApplyConnectionProperties(values);
 
             return fs;
         }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/FeatureSourceValidator.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/FeatureSourceValidator.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/FeatureSourceValidator.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -98,7 +98,7 @@
             {
                 var ids = cl.IdentityProperties;
                 if (ids.Count == 0)
-                    issues.Add(new ValidationIssue(feature, ValidationStatus.Information, string.Format(Properties.Resources.FS_PrimaryKeyMissingInformation, cl)));
+                    issues.Add(new ValidationIssue(feature, ValidationStatus.Information, string.Format(Properties.Resources.FS_PrimaryKeyMissingInformation, cl.QualifiedName)));
             }
 
             context.MarkValidated(resource.ResourceID);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -24,6 +24,9 @@
 
 namespace OSGeo.MapGuide.MaestroAPI.Schema
 {
+    /// <summary>
+    /// Defines the valid types of geometric storage in a geometric property
+    /// </summary>
     public enum FeatureGeometricType
     {
         Point = 1,
@@ -33,6 +36,9 @@
         All = Curve | Point | Solid | Surface
     }
 
+    /// <summary>
+    /// Defines the valid specific geometry types for geometric storage
+    /// </summary>
     public enum SpecificGeometryType
     {
         Point = 1,
@@ -48,6 +54,9 @@
         MultiCurvePolygon = 13
     }
 
+    /// <summary>
+    /// A geometric property
+    /// </summary>
     public class GeometricPropertyDefinition : PropertyDefinition
     {
         private GeometricPropertyDefinition() { this.SpecificGeometryTypes = new SpecificGeometryType[0]; }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/PropertyDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/PropertyDefinition.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/PropertyDefinition.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -24,6 +24,9 @@
 
 namespace OSGeo.MapGuide.MaestroAPI.Schema
 {
+    /// <summary>
+    /// Defines the types of properties in a FDO class definition
+    /// </summary>
     public enum PropertyDefinitionType
     {
         Data = 100,
@@ -33,6 +36,9 @@
         Object = 101
     }
 
+    /// <summary>
+    /// Defines the valid types of property values
+    /// </summary>
     public enum PropertyValueType
     {
         Blob = 10,
@@ -52,6 +58,9 @@
         String = 9
     }
 
+    /// <summary>
+    /// Defines the valid data types of data properties
+    /// </summary>
     public enum DataPropertyType
     {
         Blob = PropertyValueType.Blob,
@@ -67,10 +76,19 @@
         String = PropertyValueType.String
     }
 
+    /// <summary>
+    /// Base class of all property definitions
+    /// </summary>
     public abstract class PropertyDefinition : SchemaElement, IFdoSerializable
     {
+        /// <summary>
+        /// Gets the parent class definition
+        /// </summary>
         public ClassDefinition Parent { get; internal set; }
 
+        /// <summary>
+        /// Gets the type of property
+        /// </summary>
         public abstract PropertyDefinitionType Type { get; }
 
         public abstract void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/SchemaElement.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/SchemaElement.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/SchemaElement.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -23,10 +23,19 @@
 
 namespace OSGeo.MapGuide.MaestroAPI.Schema
 {
+    /// <summary>
+    /// Base class of all FDO schema elements
+    /// </summary>
     public abstract class SchemaElement
     {
+        /// <summary>
+        /// Gets or sets the name of this element
+        /// </summary>
         public string Name { get; set; }
 
+        /// <summary>
+        /// Gets or sets the description of this element
+        /// </summary>
         public string Description { get; set; }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Utility.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Utility.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Utility.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -23,6 +23,7 @@
 using System.Collections.Generic;
 using OSGeo.MapGuide.MaestroAPI.IO;
 using OSGeo.MapGuide.MaestroAPI.Schema;
+using System.Collections.Specialized;
 
 namespace OSGeo.MapGuide.MaestroAPI
 {
@@ -35,6 +36,26 @@
 		private static System.Globalization.CultureInfo m_enCI = new System.Globalization.CultureInfo("en-US");
 
         /// <summary>
+        /// Converts the specified name value collection into a connection string
+        /// </summary>
+        /// <param name="values"></param>
+        /// <returns></returns>
+        public static string ToConnectionString(NameValueCollection values)
+        {
+            List<string> tokens = new List<string>();
+
+            foreach (string name in values.Keys)
+            {
+                string value = values[name];
+                if (value.Contains(";"))
+                    value = "\"" + value + "\"";
+                tokens.Add(name + "=" + value);
+            }
+
+            return string.Join(";", tokens.ToArray());
+        }
+
+        /// <summary>
         /// Strips the version component from provider name
         /// </summary>
         /// <param name="providername">The provider name.</param>

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -35,6 +35,16 @@
             : base(source)
         { }
 
+        public IFeatureReader GetFeatureObject(string name)
+        {
+            return ((IFeature)this.Current).GetFeatureObject(name);
+        }
+
+        public IFeatureReader GetFeatureObject(int index)
+        {
+            return ((IFeature)this.Current).GetFeatureObject(index);
+        }
+
         public override ReaderType ReaderType
         {
             get { return ReaderType.Feature; }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeDataReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeDataReader.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeDataReader.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -28,16 +28,22 @@
     public class LocalNativeDataReader : ReaderBase
     {
         private MgDataReader _reader;
+        private Topology.IO.WKTReader _mgReader;
+        private MgAgfReaderWriter _agfRw;
+        private MgWktReaderWriter _wktRw;
 
         public LocalNativeDataReader(MgDataReader reader) 
         {
             _reader = reader;
+            _mgReader = new Topology.IO.WKTReader();
+            _agfRw = new MgAgfReaderWriter();
+            _wktRw = new MgWktReaderWriter();
         }
 
         protected override IRecord ReadNextRecord()
         {
             if (_reader.ReadNext())
-                return new LocalNativeRecord(_reader);
+                return new LocalNativeRecord(_reader, _mgReader, _agfRw, _wktRw);
 
             return null;
         }
@@ -47,6 +53,14 @@
             _reader.Close();
         }
 
+        public override void Dispose()
+        {
+            _reader.Dispose();
+            _agfRw.Dispose();
+            _wktRw.Dispose();
+            base.Dispose();
+        }
+
         public override ReaderType ReaderType
         {
             get { return ReaderType.Data; }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeature.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeature.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeature.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -21,14 +21,88 @@
 using System.Collections.Generic;
 using System.Text;
 using OSGeo.MapGuide.MaestroAPI.Feature;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace OSGeo.MapGuide.MaestroAPI.Native
 {
     public class LocalNativeFeature : FeatureBase
     {
-        public LocalNativeFeature(MgFeatureReader reader)
+        public LocalNativeFeature(MgFeatureReader reader, Topology.IO.WKTReader mgReader, MgAgfReaderWriter agfRw, MgWktReaderWriter wktRw)
             : base(Utility.ConvertClassDefinition(reader.GetClassDefinition()))
         {
+            for (int i = 0; i < reader.GetPropertyCount(); i++)
+            {
+                string name = _ordinalMap[i];
+                GetByteReaderMethod getblob = () => { return reader.GetBLOB(name); };
+                GetByteReaderMethod getclob = () => { return reader.GetCLOB(name); };
+                GetByteReaderMethod getgeom = () => { return reader.GetGeometry(name); };
+                if (!reader.IsNull(name))
+                {
+                    var pt = (PropertyValueType)reader.GetPropertyType(name);
+                    switch (pt)
+                    {
+                        case PropertyValueType.Blob:
+                            ((BlobValue)_values[name]).Value = Utility.StreamAsArray(new MgReadOnlyStream(getblob));
+                            break;
+                        case PropertyValueType.Boolean:
+                            ((BooleanValue)_values[name]).Value = reader.GetBoolean(name);
+                            break;
+                        case PropertyValueType.Byte:
+                            ((ByteValue)_values[name]).Value = reader.GetByte(name);
+                            break;
+                        case PropertyValueType.Clob:
+                            byte[] b = Utility.StreamAsArray(new MgReadOnlyStream(getclob));
+                            ((ClobValue)_values[name]).Value = Encoding.UTF8.GetChars(b);
+                            break;
+                        case PropertyValueType.DateTime:
+                            ((DateTimeValue)_values[name]).Value = Utility.ConvertMgDateTime(reader.GetDateTime(name));
+                            break;
+                        case PropertyValueType.Double:
+                            ((DoubleValue)_values[name]).Value = reader.GetDouble(name);
+                            break;
+                        case PropertyValueType.Feature:
+                            ((FeatureValue)_values[name]).Value = GetFeatureArray(reader, name);
+                            break;
+                        case PropertyValueType.Geometry:
+                            //TODO: See if SWIG issues come into play here
+                            try
+                            {
+                                //TODO: See if SWIG issues come into play here
+                                var geom = agfRw.Read(reader.GetGeometry(name));
+                                var wkt = wktRw.Write(geom);
+                                ((GeometryValue)_values[name]).Value = mgReader.Read(wkt);
+                            }
+                            catch //Invalid geometry fail!
+                            {
+                                ((GeometryValue)_values[name]).SetNull();
+                            }
+                            break;
+                        case PropertyValueType.Int16:
+                            ((Int16Value)_values[name]).Value = reader.GetInt16(name);
+                            break;
+                        case PropertyValueType.Int32:
+                            ((Int32Value)_values[name]).Value = reader.GetInt32(name);
+                            break;
+                        case PropertyValueType.Int64:
+                            ((Int64Value)_values[name]).Value = reader.GetInt64(name);
+                            break;
+                        case PropertyValueType.Single:
+                            ((SingleValue)_values[name]).Value = reader.GetSingle(name);
+                            break;
+                        case PropertyValueType.String:
+                            ((StringValue)_values[name]).Value = reader.GetString(name);
+                            break;
+                    }
+                }
+            }
         }
+
+        private IFeature[] GetFeatureArray(MgFeatureReader reader, string name)
+        {
+            MgFeatureReader nr = reader.GetFeatureObject(name);
+            var lr = new LocalNativeFeatureReader(nr);
+            List<IFeature> features = new List<IFeature>(lr);
+            return features.ToArray();
+        }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureReader.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureReader.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -28,20 +28,34 @@
     public class LocalNativeFeatureReader : FeatureReaderBase
     {
         private MgFeatureReader _reader;
+        private Topology.IO.WKTReader _mgReader;
+        private MgAgfReaderWriter _agfRw;
+        private MgWktReaderWriter _wktRw;
 
         public LocalNativeFeatureReader(MgFeatureReader reader) 
         {
             _reader = reader;
+            _mgReader = new Topology.IO.WKTReader();
+            _agfRw = new MgAgfReaderWriter();
+            _wktRw = new MgWktReaderWriter();
         }
 
         protected override IFeature ReadNextFeature()
         {
             if (_reader.ReadNext())
-                return new LocalNativeFeature(_reader);
+                return new LocalNativeFeature(_reader, _mgReader, _agfRw, _wktRw);
 
             return null;
         }
 
+        public override void Dispose()
+        {
+            _reader.Dispose();
+            _agfRw.Dispose();
+            _wktRw.Dispose();
+            base.Dispose();
+        }
+
         public override void Close()
         {
             _reader.Close();

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeRecord.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeRecord.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeRecord.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -27,7 +27,7 @@
 {
     public class LocalNativeRecord : RecordBase
     {
-        public LocalNativeRecord(MgReader reader)
+        public LocalNativeRecord(MgReader reader, Topology.IO.WKTReader mgReader, MgAgfReaderWriter agfRw, MgWktReaderWriter wktRw)
         {
             for (int i = 0; i < reader.GetPropertyCount(); i++)
             {
@@ -82,6 +82,69 @@
                         break;
                 }
             }
+
+            for (int i = 0; i < reader.GetPropertyCount(); i++)
+            {
+                string name = _ordinalMap[i];
+                GetByteReaderMethod getblob = () => { return reader.GetBLOB(name); };
+                GetByteReaderMethod getclob = () => { return reader.GetCLOB(name); };
+                GetByteReaderMethod getgeom = () => { return reader.GetGeometry(name); };
+                if (!reader.IsNull(name))
+                {
+                    var pt = (PropertyValueType)reader.GetPropertyType(name);
+                    switch (pt)
+                    {
+                        case PropertyValueType.Blob:
+                            ((BlobValue)_values[name]).Value = Utility.StreamAsArray(new MgReadOnlyStream(getblob));
+                            break;
+                        case PropertyValueType.Boolean:
+                            ((BooleanValue)_values[name]).Value = reader.GetBoolean(name);
+                            break;
+                        case PropertyValueType.Byte:
+                            ((ByteValue)_values[name]).Value = reader.GetByte(name);
+                            break;
+                        case PropertyValueType.Clob:
+                            byte [] b = Utility.StreamAsArray(new MgReadOnlyStream(getclob));
+                            ((ClobValue)_values[name]).Value = Encoding.UTF8.GetChars(b);
+                            break;
+                        case PropertyValueType.DateTime:
+                            ((DateTimeValue)_values[name]).Value = Utility.ConvertMgDateTime(reader.GetDateTime(name));
+                            break;
+                        case PropertyValueType.Double:
+                            ((DoubleValue)_values[name]).Value = reader.GetDouble(name);
+                            break;
+                        //case PropertyValueType.Feature:
+                        case PropertyValueType.Geometry:
+                            try
+                            {
+                                //TODO: See if SWIG issues come into play here
+                                var geom = agfRw.Read(reader.GetGeometry(name));
+                                var wkt = wktRw.Write(geom);
+                                ((GeometryValue)_values[name]).Value = mgReader.Read(wkt);
+                            }
+                            catch //Invalid geometry fail!
+                            {
+                                ((GeometryValue)_values[name]).SetNull();
+                            }
+                            break;
+                        case PropertyValueType.Int16:
+                            ((Int16Value)_values[name]).Value = reader.GetInt16(name);
+                            break;
+                        case PropertyValueType.Int32:
+                            ((Int32Value)_values[name]).Value = reader.GetInt32(name);
+                            break;
+                        case PropertyValueType.Int64:
+                            ((Int64Value)_values[name]).Value = reader.GetInt64(name);
+                            break;
+                        case PropertyValueType.Single:
+                            ((SingleValue)_values[name]).Value = reader.GetSingle(name);
+                            break;
+                        case PropertyValueType.String:
+                            ((StringValue)_values[name]).Value = reader.GetString(name);
+                            break;
+                    }
+                }
+            }
         }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeSqlReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeSqlReader.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeSqlReader.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -28,10 +28,16 @@
     public class LocalNativeSqlReader : ReaderBase
     {
         private MgSqlDataReader _reader;
+        private Topology.IO.WKTReader _mgReader;
+        private MgAgfReaderWriter _agfRw;
+        private MgWktReaderWriter _wktRw;
 
         public LocalNativeSqlReader(MgSqlDataReader reader) 
         {
             _reader = reader;
+            _mgReader = new Topology.IO.WKTReader();
+            _agfRw = new MgAgfReaderWriter();
+            _wktRw = new MgWktReaderWriter();
         }
 
         public override ReaderType ReaderType
@@ -39,10 +45,18 @@
             get { return ReaderType.Sql; }
         }
 
+        public override void Dispose()
+        {
+            _reader.Dispose();
+            _agfRw.Dispose();
+            _wktRw.Dispose();
+            base.Dispose();
+        }
+
         protected override IRecord ReadNextRecord()
         {
             if (_reader.ReadNext())
-                return new LocalNativeRecord(_reader);
+                return new LocalNativeRecord(_reader, _mgReader, _agfRw, _wktRw);
 
             return null;
         }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Utility.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Utility.cs	2011-01-27 08:08:08 UTC (rev 5507)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Utility.cs	2011-01-27 11:11:10 UTC (rev 5508)
@@ -290,5 +290,10 @@
         {
             throw new NotImplementedException();
         }
+
+        internal static DateTime ConvertMgDateTime(MgDateTime dt)
+        {
+            return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Microsecond * 1000);
+        }
     }
 }



More information about the mapguide-commits mailing list