[mapguide-commits] r6891 - in branches/maestro-4.0.x: Maestro.Base/Editor Maestro.Base/Services Maestro.Editors Maestro.Editors/FeatureSource/Providers Maestro.Editors/FeatureSource/Providers/Rdbms Maestro.Editors/FeatureSource/Providers/Wms Maestro.Editors/Properties Maestro.Editors/SymbolDefinition MaestroAPITests OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/ObjectModels OSGeo.MapGuide.MaestroAPI/Resource

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Wed Jul 11 06:48:29 PDT 2012


Author: jng
Date: 2012-07-11 06:48:29 -0700 (Wed, 11 Jul 2012)
New Revision: 6891

Added:
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.Designer.cs
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.cs
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.resx
   branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/CredentialWriter.cs
Modified:
   branches/maestro-4.0.x/Maestro.Base/Editor/EditorContentBase.cs
   branches/maestro-4.0.x/Maestro.Base/Services/ResourcePreviewerFactory.cs
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.Designer.cs
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.cs
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.resx
   branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Wms/WmsProviderCtrl.cs
   branches/maestro-4.0.x/Maestro.Editors/IEditorService.cs
   branches/maestro-4.0.x/Maestro.Editors/Maestro.Editors.csproj
   branches/maestro-4.0.x/Maestro.Editors/Properties/Resources.Designer.cs
   branches/maestro-4.0.x/Maestro.Editors/Properties/Resources.resx
   branches/maestro-4.0.x/Maestro.Editors/ResourceEditorServiceBase.cs
   branches/maestro-4.0.x/Maestro.Editors/SymbolDefinition/SymbolEditorService.cs
   branches/maestro-4.0.x/MaestroAPITests/HttpConnectionTests.cs
   branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
   branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs
   branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
   branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/Resource/IResource.cs
Log:
#2069, #2071: Backport these crucial changes to 4.0.x

Modified: branches/maestro-4.0.x/Maestro.Base/Editor/EditorContentBase.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Base/Editor/EditorContentBase.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Base/Editor/EditorContentBase.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -270,6 +270,7 @@
         public virtual void Preview()
         {
             var conn = this.Resource.CurrentConnection;
+            _svc.PrePreviewProcess();
             var previewer = ResourcePreviewerFactory.GetPreviewer(conn.ProviderName);
             if (previewer != null)
                 previewer.Preview(this.Resource, this.EditorService);

Modified: branches/maestro-4.0.x/Maestro.Base/Services/ResourcePreviewerFactory.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Base/Services/ResourcePreviewerFactory.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Base/Services/ResourcePreviewerFactory.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -40,19 +40,16 @@
         {
             IServerConnection conn = res.CurrentConnection;
             string mapguideRootUrl = (string)conn.GetCustomProperty("BaseUrl");
-
             //Save the current resource to another session copy
-            string resId = "Session:" + edSvc.SessionID + "//" + Guid.NewGuid() + "." + res.ResourceType.ToString();
-            edSvc.ResourceService.SetResourceXmlData(resId, ResourceTypeRegistry.Serialize(res));
-
-            //Copy any resource data
+            string resId = "Session:" + edSvc.SessionID + "//" + res.ResourceType.ToString() + "Preview" + Guid.NewGuid() + "." + res.ResourceType.ToString();
+            
+            edSvc.ResourceService.SaveResourceAs(res, resId);
+            edSvc.ResourceService.CopyResource(res.ResourceID, resId, true);
             var previewCopy = edSvc.ResourceService.GetResource(resId);
-            res.CopyResourceDataTo(previewCopy);
 
             //Now feed it to the preview engine
             var url = new ResourcePreviewEngine(mapguideRootUrl, edSvc).GeneratePreviewUrl(previewCopy);
             var launcher = ServiceRegistry.GetService<UrlLauncherService>();
-
             launcher.OpenUrl(url);
         }
 

Modified: branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -47,6 +47,7 @@
             this.pickAnAliasedFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.pickAnAliasedDirectoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.mGDATAFILEPATHToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.lnkSetCredentials = new System.Windows.Forms.LinkLabel();
             this.contentPanel.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)(this.grdConnectionParameters)).BeginInit();
             this.ctxEnumerable.SuspendLayout();
@@ -55,6 +56,7 @@
             // 
             // contentPanel
             // 
+            this.contentPanel.Controls.Add(this.lnkSetCredentials);
             this.contentPanel.Controls.Add(this.txtTestResult);
             this.contentPanel.Controls.Add(this.btnTest);
             this.contentPanel.Controls.Add(this.cmbLongTransaction);
@@ -86,10 +88,10 @@
             this.grdConnectionParameters.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
             this.grdConnectionParameters.Name = "grdConnectionParameters";
             this.grdConnectionParameters.RowHeadersVisible = false;
+            this.grdConnectionParameters.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.grdConnectionParameters_CellPainting);
             this.grdConnectionParameters.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.grdConnectionParameters_CellValueChanged);
+            this.grdConnectionParameters.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(this.grdConnectionParameters_EditingControlShowing);
             this.grdConnectionParameters.MouseClick += new System.Windows.Forms.MouseEventHandler(this.grdConnectionParameters_MouseClick);
-            this.grdConnectionParameters.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.grdConnectionParameters_CellPainting);
-            this.grdConnectionParameters.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(this.grdConnectionParameters_EditingControlShowing);
             // 
             // label2
             // 
@@ -180,12 +182,18 @@
             resources.ApplyResources(this.mGDATAFILEPATHToolStripMenuItem, "mGDATAFILEPATHToolStripMenuItem");
             this.mGDATAFILEPATHToolStripMenuItem.Click += new System.EventHandler(this.useActiveResourceDataFile_Click);
             // 
+            // lnkSetCredentials
+            // 
+            resources.ApplyResources(this.lnkSetCredentials, "lnkSetCredentials");
+            this.lnkSetCredentials.Name = "lnkSetCredentials";
+            this.lnkSetCredentials.TabStop = true;
+            this.lnkSetCredentials.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkSetCredentials_LinkClicked);
+            // 
             // GenericCtrl
             // 
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
-            this.HeaderText = "Feature Source (using Generic Editor)";
+            resources.ApplyResources(this, "$this");
             this.Name = "GenericCtrl";
-            resources.ApplyResources(this, "$this");
             this.Controls.SetChildIndex(this.contentPanel, 0);
             this.contentPanel.ResumeLayout(false);
             this.contentPanel.PerformLayout();
@@ -215,5 +223,6 @@
         private System.Windows.Forms.ToolStripMenuItem pickAnAliasedDirectoryToolStripMenuItem;
         private System.Windows.Forms.ToolStripMenuItem mGDATAFILEPATHToolStripMenuItem;
         private System.Windows.Forms.ToolStripMenuItem pickADataStoreFromListToolStripMenuItem;
+        private System.Windows.Forms.LinkLabel lnkSetCredentials;
     }
 }

Modified: branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -78,6 +78,8 @@
 
         private void InitGrid()
         {
+            grdConnectionParameters.Rows.Clear();
+            grdConnectionParameters.Columns.Clear();
             var prov = _service.FeatureService.GetFeatureProvider(_fs.Provider);
 
             var colName = new DataGridViewColumn();
@@ -374,5 +376,28 @@
                 _fs.SetConnectionProperty(name, value == null ? string.Empty : value.ToString());
             }
         }
+
+        private void lnkSetCredentials_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            var prov = _service.FeatureService.GetFeatureProvider(_fs.Provider);
+            var connProps = new List<string>();
+            foreach (var p in prov.ConnectionProperties)
+            {
+                if (!p.Enumerable)
+                    connProps.Add(p.Name);
+            }
+            using (var diag = new SetCredentialsDialog(connProps.ToArray()))
+            {
+                if (diag.ShowDialog() == DialogResult.OK)
+                {
+                    _fs.SetConnectionProperty(diag.UserProperty, "%MG_USERNAME%");
+                    _fs.SetConnectionProperty(diag.PasswordProperty, "%MG_PASSWORD%");
+                    _fs.SetEncryptedCredentials(diag.Username, diag.Password);
+                    _service.SyncSessionCopy();
+                    InitGrid();
+                    resDataCtrl.Init(_service);
+                }
+            }
+        }
     }
 }

Modified: branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx	2012-07-11 13:48:29 UTC (rev 6891)
@@ -112,20 +112,47 @@
     <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>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.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>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.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" />
+  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="lnkSetCredentials.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="lnkSetCredentials.Location" type="System.Drawing.Point, System.Drawing">
+    <value>137, 46</value>
+  </data>
+  <data name="lnkSetCredentials.Size" type="System.Drawing.Size, System.Drawing">
+    <value>78, 13</value>
+  </data>
+  <data name="lnkSetCredentials.TabIndex" type="System.Int32, mscorlib">
+    <value>11</value>
+  </data>
+  <data name="lnkSetCredentials.Text" xml:space="preserve">
+    <value>Set Credentials</value>
+  </data>
+  <data name=">>lnkSetCredentials.Name" xml:space="preserve">
+    <value>lnkSetCredentials</value>
+  </data>
+  <data name=">>lnkSetCredentials.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>lnkSetCredentials.Parent" xml:space="preserve">
+    <value>contentPanel</value>
+  </data>
+  <data name=">>lnkSetCredentials.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="txtTestResult.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Bottom, Left, Right</value>
   </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="txtTestResult.Location" type="System.Drawing.Point, System.Drawing">
     <value>154, 326</value>
   </data>
-  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="txtTestResult.Multiline" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
@@ -142,13 +169,13 @@
     <value>txtTestResult</value>
   </data>
   <data name=">>txtTestResult.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>txtTestResult.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>txtTestResult.ZOrder" xml:space="preserve">
-    <value>0</value>
+    <value>1</value>
   </data>
   <data name="btnTest.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Bottom, Left</value>
@@ -169,13 +196,13 @@
     <value>btnTest</value>
   </data>
   <data name=">>btnTest.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>btnTest.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>btnTest.ZOrder" xml:space="preserve">
-    <value>1</value>
+    <value>2</value>
   </data>
   <data name="cmbLongTransaction.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Bottom, Left, Right</value>
@@ -193,13 +220,13 @@
     <value>cmbLongTransaction</value>
   </data>
   <data name=">>cmbLongTransaction.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>cmbLongTransaction.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>cmbLongTransaction.ZOrder" xml:space="preserve">
-    <value>2</value>
+    <value>3</value>
   </data>
   <data name="label4.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Bottom, Left</value>
@@ -223,13 +250,13 @@
     <value>label4</value>
   </data>
   <data name=">>label4.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>label4.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>label4.ZOrder" xml:space="preserve">
-    <value>3</value>
+    <value>4</value>
   </data>
   <data name="resDataCtrl.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Bottom, Left, Right</value>
@@ -247,13 +274,13 @@
     <value>resDataCtrl</value>
   </data>
   <data name=">>resDataCtrl.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.ResourceDataCtrl, Maestro.Editors, Version=3.0.0.5676, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.Common.ResourceDataCtrl, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
   </data>
   <data name=">>resDataCtrl.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>resDataCtrl.ZOrder" xml:space="preserve">
-    <value>4</value>
+    <value>5</value>
   </data>
   <data name="label3.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -274,13 +301,13 @@
     <value>label3</value>
   </data>
   <data name=">>label3.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>label3.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>label3.ZOrder" xml:space="preserve">
-    <value>5</value>
+    <value>6</value>
   </data>
   <data name="label2.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -301,13 +328,13 @@
     <value>label2</value>
   </data>
   <data name=">>label2.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>label2.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>label2.ZOrder" xml:space="preserve">
-    <value>6</value>
+    <value>7</value>
   </data>
   <data name="grdConnectionParameters.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Bottom, Left</value>
@@ -325,13 +352,13 @@
     <value>grdConnectionParameters</value>
   </data>
   <data name=">>grdConnectionParameters.Type" xml:space="preserve">
-    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>grdConnectionParameters.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>grdConnectionParameters.ZOrder" xml:space="preserve">
-    <value>7</value>
+    <value>8</value>
   </data>
   <data name="txtProvider.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
@@ -349,13 +376,13 @@
     <value>txtProvider</value>
   </data>
   <data name=">>txtProvider.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>txtProvider.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>txtProvider.ZOrder" xml:space="preserve">
-    <value>8</value>
+    <value>9</value>
   </data>
   <data name="label1.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -376,13 +403,13 @@
     <value>label1</value>
   </data>
   <data name=">>label1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>label1.Parent" xml:space="preserve">
     <value>contentPanel</value>
   </data>
   <data name=">>label1.ZOrder" xml:space="preserve">
-    <value>9</value>
+    <value>10</value>
   </data>
   <data name="contentPanel.Size" type="System.Drawing.Size, System.Drawing">
     <value>683, 372</value>
@@ -391,26 +418,17 @@
     <value>contentPanel</value>
   </data>
   <data name=">>contentPanel.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>contentPanel.Parent" xml:space="preserve">
     <value>$this</value>
   </data>
   <data name=">>contentPanel.ZOrder" xml:space="preserve">
-    <value>2</value>
+    <value>0</value>
   </data>
-  <metadata name="ctxEnumerable.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="ctxEnumerable.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
-  <data name="ctxEnumerable.Size" type="System.Drawing.Size, System.Drawing">
-    <value>208, 48</value>
-  </data>
-  <data name=">>ctxEnumerable.Name" xml:space="preserve">
-    <value>ctxEnumerable</value>
-  </data>
-  <data name=">>ctxEnumerable.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
   <data name="pickAValueToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
     <value>207, 22</value>
   </data>
@@ -423,18 +441,18 @@
   <data name="pickADataStoreFromListToolStripMenuItem.Text" xml:space="preserve">
     <value>Pick a data store from list</value>
   </data>
-  <metadata name="ctxProperty.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>149, 17</value>
-  </metadata>
-  <data name="ctxProperty.Size" type="System.Drawing.Size, System.Drawing">
-    <value>221, 70</value>
+  <data name="ctxEnumerable.Size" type="System.Drawing.Size, System.Drawing">
+    <value>208, 48</value>
   </data>
-  <data name=">>ctxProperty.Name" xml:space="preserve">
-    <value>ctxProperty</value>
+  <data name=">>ctxEnumerable.Name" xml:space="preserve">
+    <value>ctxEnumerable</value>
   </data>
-  <data name=">>ctxProperty.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name=">>ctxEnumerable.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
+  <metadata name="ctxProperty.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>149, 17</value>
+  </metadata>
   <data name="pickAnAliasedFileToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
     <value>220, 22</value>
   </data>
@@ -453,9 +471,21 @@
   <data name="mGDATAFILEPATHToolStripMenuItem.Text" xml:space="preserve">
     <value>Use active resource data file</value>
   </data>
-  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="ctxProperty.Size" type="System.Drawing.Size, System.Drawing">
+    <value>221, 70</value>
+  </data>
+  <data name=">>ctxProperty.Name" xml:space="preserve">
+    <value>ctxProperty</value>
+  </data>
+  <data name=">>ctxProperty.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </metadata>
+  <data name="$this.HeaderText" xml:space="preserve">
+    <value>Feature Source (using Generic Editor)</value>
+  </data>
   <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
     <value>683, 399</value>
   </data>
@@ -463,36 +493,36 @@
     <value>pickAValueToolStripMenuItem</value>
   </data>
   <data name=">>pickAValueToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>pickADataStoreFromListToolStripMenuItem.Name" xml:space="preserve">
     <value>pickADataStoreFromListToolStripMenuItem</value>
   </data>
   <data name=">>pickADataStoreFromListToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>pickAnAliasedFileToolStripMenuItem.Name" xml:space="preserve">
     <value>pickAnAliasedFileToolStripMenuItem</value>
   </data>
   <data name=">>pickAnAliasedFileToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>pickAnAliasedDirectoryToolStripMenuItem.Name" xml:space="preserve">
     <value>pickAnAliasedDirectoryToolStripMenuItem</value>
   </data>
   <data name=">>pickAnAliasedDirectoryToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>mGDATAFILEPATHToolStripMenuItem.Name" xml:space="preserve">
     <value>mGDATAFILEPATHToolStripMenuItem</value>
   </data>
   <data name=">>mGDATAFILEPATHToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>$this.Name" xml:space="preserve">
     <value>GenericCtrl</value>
   </data>
   <data name=">>$this.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.EditorBindableCollapsiblePanel, Maestro.Editors, Version=3.0.0.5676, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.Common.EditorBindableCollapsiblePanel, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
   </data>
 </root>
\ No newline at end of file

Modified: branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.Designer.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.Designer.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.Designer.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -36,9 +36,9 @@
             this.txtPassword = new System.Windows.Forms.TextBox();
             this.label3 = new System.Windows.Forms.Label();
             this.groupBox1 = new System.Windows.Forms.GroupBox();
-            this.btnConnect = new System.Windows.Forms.Button();
             this.groupBox2 = new System.Windows.Forms.GroupBox();
-            this.cmbDataStore = new System.Windows.Forms.ComboBox();
+            this.btnBrowseDataStore = new System.Windows.Forms.Button();
+            this.txtDataStore = new System.Windows.Forms.TextBox();
             this.label4 = new System.Windows.Forms.Label();
             this.txtStatus = new System.Windows.Forms.TextBox();
             this.btnTest = new System.Windows.Forms.Button();
@@ -88,7 +88,6 @@
             // groupBox1
             // 
             resources.ApplyResources(this.groupBox1, "groupBox1");
-            this.groupBox1.Controls.Add(this.btnConnect);
             this.groupBox1.Controls.Add(this.txtService);
             this.groupBox1.Controls.Add(this.txtPassword);
             this.groupBox1.Controls.Add(this.label1);
@@ -98,28 +97,28 @@
             this.groupBox1.Name = "groupBox1";
             this.groupBox1.TabStop = false;
             // 
-            // btnConnect
-            // 
-            resources.ApplyResources(this.btnConnect, "btnConnect");
-            this.btnConnect.Name = "btnConnect";
-            this.btnConnect.UseVisualStyleBackColor = true;
-            this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
-            // 
             // groupBox2
             // 
             resources.ApplyResources(this.groupBox2, "groupBox2");
-            this.groupBox2.Controls.Add(this.cmbDataStore);
+            this.groupBox2.Controls.Add(this.btnBrowseDataStore);
+            this.groupBox2.Controls.Add(this.txtDataStore);
             this.groupBox2.Controls.Add(this.label4);
             this.groupBox2.Name = "groupBox2";
             this.groupBox2.TabStop = false;
             // 
-            // cmbDataStore
+            // btnBrowseDataStore
             // 
-            resources.ApplyResources(this.cmbDataStore, "cmbDataStore");
-            this.cmbDataStore.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-            this.cmbDataStore.FormattingEnabled = true;
-            this.cmbDataStore.Name = "cmbDataStore";
+            resources.ApplyResources(this.btnBrowseDataStore, "btnBrowseDataStore");
+            this.btnBrowseDataStore.Name = "btnBrowseDataStore";
+            this.btnBrowseDataStore.UseVisualStyleBackColor = true;
+            this.btnBrowseDataStore.Click += new System.EventHandler(this.btnBrowseDataStore_Click);
             // 
+            // txtDataStore
+            // 
+            resources.ApplyResources(this.txtDataStore, "txtDataStore");
+            this.txtDataStore.Name = "txtDataStore";
+            this.txtDataStore.ReadOnly = true;
+            // 
             // label4
             // 
             resources.ApplyResources(this.label4, "label4");
@@ -157,7 +156,6 @@
 
         private System.Windows.Forms.Label label1;
         private System.Windows.Forms.GroupBox groupBox2;
-        private System.Windows.Forms.ComboBox cmbDataStore;
         private System.Windows.Forms.Label label4;
         private System.Windows.Forms.GroupBox groupBox1;
         private System.Windows.Forms.TextBox txtService;
@@ -165,8 +163,9 @@
         private System.Windows.Forms.Label label3;
         private System.Windows.Forms.Label label2;
         private System.Windows.Forms.TextBox txtUsername;
-        private System.Windows.Forms.Button btnConnect;
         private System.Windows.Forms.TextBox txtStatus;
         private System.Windows.Forms.Button btnTest;
+        private System.Windows.Forms.Button btnBrowseDataStore;
+        private System.Windows.Forms.TextBox txtDataStore;
     }
 }

Modified: branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -28,6 +28,7 @@
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using Maestro.Shared.UI;
 using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Resource;
 using Maestro.Editors.FeatureSource.Providers.Odbc;
 
 namespace Maestro.Editors.FeatureSource.Providers.Rdbms
@@ -45,30 +46,38 @@
             this.HeaderText = this.Title;
         }
 
+        protected override void UnsubscribeEventHandlers()
+        {
+            _service.BeforeSave -= OnBeforeSave;
+            _service.BeforePreview -= OnBeforePreview;
+        }
+
         private IEditorService _service;
         private IFeatureSource _fs;
 
         public override void Bind(IEditorService service)
         {
             _service = service;
+            _service.BeforeSave += OnBeforeSave;
+            _service.BeforePreview += OnBeforePreview;
             _service.RegisterCustomNotifier(this);
             _fs = _service.GetEditedResource() as IFeatureSource;
 
             //Set the field values
             txtService.Text = _fs.GetConnectionProperty("Service");
-            txtUsername.Text = _fs.GetConnectionProperty("Username");
-            txtPassword.Text = _fs.GetConnectionProperty("Password");
 
-            UpdateDataStoreValues(true);
+            //We're gonna follow MG Studio behaviour here which is: Never load the password
+            //and auto trigger dirty state.
+            if (!_service.IsNew)
+            {
+                txtUsername.Text = _fs.GetEncryptedUsername() ?? _fs.GetConnectionProperty("Username");
+                //txtPassword.Text = _fs.GetConnectionProperty("Password");
+                OnResourceChanged();
+            }
 
             //Set initial value of data store if possible
             var dstore = _fs.GetConnectionProperty("DataStore");
-            if (!string.IsNullOrEmpty(dstore) && cmbDataStore.Items.Count > 0)
-            {
-                var idx = cmbDataStore.Items.IndexOf(dstore);
-                if (idx >= 0)
-                    cmbDataStore.SelectedIndex = idx;
-            }
+            txtDataStore.Text = dstore;
 
             //As our connection properties are not CLR properties, 
             //"manually" bind these fields
@@ -79,21 +88,65 @@
 
             txtUsername.TextChanged += (s, e) =>
             {
-                _fs.SetConnectionProperty("Username", txtUsername.Text);
+                if (string.IsNullOrEmpty(txtUsername.Text))
+                    _fs.SetConnectionProperty("Username", null);
+                else
+                    _fs.SetConnectionProperty("Username", txtUsername.Text);
             };
             
             txtPassword.TextChanged += (s, e) =>
             {
-                _fs.SetConnectionProperty("Password", txtPassword.Text);
+                if (string.IsNullOrEmpty(txtPassword.Text))
+                    _fs.SetConnectionProperty("Password", null);
+                else
+                    _fs.SetConnectionProperty("Password", txtPassword.Text);
             };
 
-            cmbDataStore.SelectedIndexChanged += (s, e) =>
+            txtDataStore.TextChanged += (s, e) =>
             {
-                if (cmbDataStore.SelectedItem != null)
-                    _fs.SetConnectionProperty("DataStore", cmbDataStore.SelectedItem.ToString());
+                _fs.SetConnectionProperty("DataStore", txtDataStore.Text);
             };
+
         }
 
+        void OnBeforePreview(object sender, EventArgs e)
+        {
+            WriteEncryptedCredentials();
+        }
+
+        void OnBeforeSave(object sender, CancelEventArgs e)
+        {
+            WriteEncryptedCredentials();
+        }
+
+        private void WriteEncryptedCredentials()
+        {
+            string username = txtUsername.Text;
+            string password = txtPassword.Text;
+
+            if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
+            {
+                if (username != "%MG_USERNAME%" && password != "%MG_PASSWORD%")
+                {
+                    _fs.SetConnectionProperty("Username", "%MG_USERNAME%");
+                    _fs.SetConnectionProperty("Password", "%MG_PASSWORD%");
+                    _fs.SetEncryptedCredentials(username, password);
+                    _service.SyncSessionCopy();
+                }
+            }
+            else if (string.IsNullOrEmpty(username) && string.IsNullOrEmpty(password))
+            {
+                _fs.SetConnectionProperty("Username", null);
+                _fs.SetConnectionProperty("Password", null);
+                try
+                {
+                    _fs.DeleteResourceData("MG_USER_CREDENTIALS");
+                }
+                catch { }
+                _service.SyncSessionCopy();
+            }
+        }
+
         public virtual string Title
         {
             get { return Properties.Resources.RdbmsFeatureSource; }
@@ -105,46 +158,20 @@
             get { throw new NotImplementedException(); }
         }
 
-        private string GetPartialConnectionString()
+        private string GetPartialConnectionStringForDataStoreEnumeration()
         {
             var builder = new System.Data.Common.DbConnectionStringBuilder();
             builder["Service"] = _fs.GetConnectionProperty("Service");
-            builder["Username"] = _fs.GetConnectionProperty("Username");
-            builder["Password"] = _fs.GetConnectionProperty("Password");
+            builder["Username"] = txtUsername.Text; //_fs.GetConnectionProperty("Username");
+            builder["Password"] = txtPassword.Text; //_fs.GetConnectionProperty("Password");
             return builder.ToString();
         }
 
         private void btnConnect_Click(object sender, EventArgs e)
         {
-            UpdateDataStoreValues(false);
+            WriteEncryptedCredentials();
         }
 
-        private void UpdateDataStoreValues(bool silent)
-        {
-            using (new WaitCursor(this))
-            {
-                string[] values = null;
-                string reason = string.Empty;
-                try
-                {
-                    var dstore = _service.FeatureService.EnumerateDataStores(this.Provider, GetPartialConnectionString());
-                    values = ConvertToArray(dstore);
-                }
-                catch (Exception ex) { reason = ex.ToString(); }
-                if (values != null && values.Length > 0)
-                {
-                    cmbDataStore.DataSource = values;
-                }
-                else
-                {
-                    if (!silent)
-                        MessageBox.Show(string.Format(Properties.Resources.FailEnumDataStores, reason));
-
-                    cmbDataStore.DataSource = null;
-                }
-            }
-        }
-
         private static string[] ConvertToArray(OSGeo.MapGuide.ObjectModels.Common.DataStoreList dstore)
         {
             List<string> values = new List<string>();
@@ -160,9 +187,27 @@
             txtStatus.Text = string.Empty;
             using (new WaitCursor(this))
             {
-                _service.SyncSessionCopy();
+                WriteEncryptedCredentials();
                 txtStatus.Text = string.Format(Properties.Resources.FdoConnectionStatus, _fs.TestConnection());
             }
         }
+
+        private void btnBrowseDataStore_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                var dstore = _service.FeatureService.EnumerateDataStores(this.Provider, GetPartialConnectionStringForDataStoreEnumeration());
+                var values = ConvertToArray(dstore);
+                string item = GenericItemSelectionDialog.SelectItem(Properties.Resources.TextSelectDataStore, Properties.Resources.TextSelectDataStore, values);
+                if (item != null)
+                {
+                    txtDataStore.Text = item;
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(string.Format(Properties.Resources.FailEnumDataStores, ex.Message));
+            }
+        }
     }
 }

Modified: branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.resx
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.resx	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Rdbms/RdbmsBaseCtrl.resx	2012-07-11 13:48:29 UTC (rev 6891)
@@ -112,20 +112,20 @@
     <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>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.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>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.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" />
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="txtStatus.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="txtStatus.Location" type="System.Drawing.Point, System.Drawing">
-    <value>130, 202</value>
+    <value>130, 178</value>
   </data>
-  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="txtStatus.Multiline" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
@@ -133,7 +133,7 @@
     <value>Vertical</value>
   </data>
   <data name="txtStatus.Size" type="System.Drawing.Size, System.Drawing">
-    <value>303, 38</value>
+    <value>303, 62</value>
   </data>
   <data name="txtStatus.TabIndex" type="System.Int32, mscorlib">
     <value>12</value>
@@ -142,7 +142,7 @@
     <value>txtStatus</value>
   </data>
   <data name=">>txtStatus.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>txtStatus.Parent" xml:space="preserve">
     <value>contentPanel</value>
@@ -154,7 +154,7 @@
     <value>NoControl</value>
   </data>
   <data name="btnTest.Location" type="System.Drawing.Point, System.Drawing">
-    <value>17, 202</value>
+    <value>17, 178</value>
   </data>
   <data name="btnTest.Size" type="System.Drawing.Size, System.Drawing">
     <value>105, 23</value>
@@ -169,7 +169,7 @@
     <value>btnTest</value>
   </data>
   <data name=">>btnTest.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>btnTest.Parent" xml:space="preserve">
     <value>contentPanel</value>
@@ -180,32 +180,86 @@
   <data name="groupBox2.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
-  <data name=">>cmbDataStore.Name" xml:space="preserve">
-    <value>cmbDataStore</value>
+  <data name="btnBrowseDataStore.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Right</value>
   </data>
-  <data name=">>cmbDataStore.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name="btnBrowseDataStore.Location" type="System.Drawing.Point, System.Drawing">
+    <value>363, 22</value>
   </data>
-  <data name=">>cmbDataStore.Parent" xml:space="preserve">
+  <data name="btnBrowseDataStore.Size" type="System.Drawing.Size, System.Drawing">
+    <value>27, 23</value>
+  </data>
+  <data name="btnBrowseDataStore.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="btnBrowseDataStore.Text" xml:space="preserve">
+    <value>...</value>
+  </data>
+  <data name=">>btnBrowseDataStore.Name" xml:space="preserve">
+    <value>btnBrowseDataStore</value>
+  </data>
+  <data name=">>btnBrowseDataStore.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>btnBrowseDataStore.Parent" xml:space="preserve">
     <value>groupBox2</value>
   </data>
-  <data name=">>cmbDataStore.ZOrder" xml:space="preserve">
+  <data name=">>btnBrowseDataStore.ZOrder" xml:space="preserve">
     <value>0</value>
   </data>
+  <data name="txtDataStore.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtDataStore.Location" type="System.Drawing.Point, System.Drawing">
+    <value>80, 24</value>
+  </data>
+  <data name="txtDataStore.Size" type="System.Drawing.Size, System.Drawing">
+    <value>277, 20</value>
+  </data>
+  <data name="txtDataStore.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name=">>txtDataStore.Name" xml:space="preserve">
+    <value>txtDataStore</value>
+  </data>
+  <data name=">>txtDataStore.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>txtDataStore.Parent" xml:space="preserve">
+    <value>groupBox2</value>
+  </data>
+  <data name=">>txtDataStore.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="label4.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label4.Location" type="System.Drawing.Point, System.Drawing">
+    <value>13, 27</value>
+  </data>
+  <data name="label4.Size" type="System.Drawing.Size, System.Drawing">
+    <value>58, 13</value>
+  </data>
+  <data name="label4.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="label4.Text" xml:space="preserve">
+    <value>Data Store</value>
+  </data>
   <data name=">>label4.Name" xml:space="preserve">
     <value>label4</value>
   </data>
   <data name=">>label4.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>label4.Parent" xml:space="preserve">
     <value>groupBox2</value>
   </data>
   <data name=">>label4.ZOrder" xml:space="preserve">
-    <value>1</value>
+    <value>2</value>
   </data>
   <data name="groupBox2.Location" type="System.Drawing.Point, System.Drawing">
-    <value>17, 140</value>
+    <value>17, 116</value>
   </data>
   <data name="groupBox2.Size" type="System.Drawing.Size, System.Drawing">
     <value>416, 56</value>
@@ -220,7 +274,7 @@
     <value>groupBox2</value>
   </data>
   <data name=">>groupBox2.Type" xml:space="preserve">
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>groupBox2.Parent" xml:space="preserve">
     <value>contentPanel</value>
@@ -231,129 +285,57 @@
   <data name="groupBox1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
-  <data name=">>btnConnect.Name" xml:space="preserve">
-    <value>btnConnect</value>
+  <data name="txtService.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
   </data>
-  <data name=">>btnConnect.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name="txtService.Location" type="System.Drawing.Point, System.Drawing">
+    <value>80, 19</value>
   </data>
-  <data name=">>btnConnect.Parent" xml:space="preserve">
-    <value>groupBox1</value>
+  <data name="txtService.Size" type="System.Drawing.Size, System.Drawing">
+    <value>310, 20</value>
   </data>
-  <data name=">>btnConnect.ZOrder" xml:space="preserve">
-    <value>0</value>
+  <data name="txtService.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
   </data>
   <data name=">>txtService.Name" xml:space="preserve">
     <value>txtService</value>
   </data>
   <data name=">>txtService.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>txtService.Parent" xml:space="preserve">
     <value>groupBox1</value>
   </data>
   <data name=">>txtService.ZOrder" xml:space="preserve">
-    <value>1</value>
+    <value>0</value>
   </data>
-  <data name=">>txtPassword.Name" xml:space="preserve">
-    <value>txtPassword</value>
+  <data name="txtPassword.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
   </data>
-  <data name=">>txtPassword.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name="txtPassword.Location" type="System.Drawing.Point, System.Drawing">
+    <value>80, 71</value>
   </data>
-  <data name=">>txtPassword.Parent" xml:space="preserve">
-    <value>groupBox1</value>
+  <data name="txtPassword.PasswordChar" type="System.Char, mscorlib" xml:space="preserve">
+    <value>*</value>
   </data>
-  <data name=">>txtPassword.ZOrder" xml:space="preserve">
-    <value>2</value>
+  <data name="txtPassword.Size" type="System.Drawing.Size, System.Drawing">
+    <value>310, 20</value>
   </data>
-  <data name=">>label1.Name" xml:space="preserve">
-    <value>label1</value>
-  </data>
-  <data name=">>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=">>label1.Parent" xml:space="preserve">
-    <value>groupBox1</value>
-  </data>
-  <data name=">>label1.ZOrder" xml:space="preserve">
-    <value>3</value>
-  </data>
-  <data name=">>label3.Name" xml:space="preserve">
-    <value>label3</value>
-  </data>
-  <data name=">>label3.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name=">>label3.Parent" xml:space="preserve">
-    <value>groupBox1</value>
-  </data>
-  <data name=">>label3.ZOrder" xml:space="preserve">
-    <value>4</value>
-  </data>
-  <data name=">>label2.Name" xml:space="preserve">
-    <value>label2</value>
-  </data>
-  <data name=">>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=">>label2.Parent" xml:space="preserve">
-    <value>groupBox1</value>
-  </data>
-  <data name=">>label2.ZOrder" xml:space="preserve">
+  <data name="txtPassword.TabIndex" type="System.Int32, mscorlib">
     <value>5</value>
   </data>
-  <data name=">>txtUsername.Name" xml:space="preserve">
-    <value>txtUsername</value>
+  <data name=">>txtPassword.Name" xml:space="preserve">
+    <value>txtPassword</value>
   </data>
-  <data name=">>txtUsername.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name=">>txtPassword.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name=">>txtUsername.Parent" xml:space="preserve">
+  <data name=">>txtPassword.Parent" xml:space="preserve">
     <value>groupBox1</value>
   </data>
-  <data name=">>txtUsername.ZOrder" xml:space="preserve">
-    <value>6</value>
+  <data name=">>txtPassword.ZOrder" xml:space="preserve">
+    <value>1</value>
   </data>
-  <data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
-    <value>17, 6</value>
-  </data>
-  <data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
-    <value>416, 128</value>
-  </data>
-  <data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
-    <value>6</value>
-  </data>
-  <data name="groupBox1.Text" xml:space="preserve">
-    <value>Connection Properties</value>
-  </data>
-  <data name=">>groupBox1.Name" xml:space="preserve">
-    <value>groupBox1</value>
-  </data>
-  <data name=">>groupBox1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name=">>groupBox1.Parent" xml:space="preserve">
-    <value>contentPanel</value>
-  </data>
-  <data name=">>groupBox1.ZOrder" xml:space="preserve">
-    <value>3</value>
-  </data>
-  <data name="contentPanel.Size" type="System.Drawing.Size, System.Drawing">
-    <value>449, 255</value>
-  </data>
-  <data name=">>contentPanel.Name" xml:space="preserve">
-    <value>contentPanel</value>
-  </data>
-  <data name=">>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=">>contentPanel.Parent" xml:space="preserve">
-    <value>$this</value>
-  </data>
-  <data name=">>contentPanel.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
   <data name="label1.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
@@ -373,62 +355,41 @@
     <value>label1</value>
   </data>
   <data name=">>label1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>label1.Parent" xml:space="preserve">
     <value>groupBox1</value>
   </data>
   <data name=">>label1.ZOrder" xml:space="preserve">
-    <value>3</value>
+    <value>2</value>
   </data>
-  <data name="txtService.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Top, Left, Right</value>
+  <data name="label3.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
   </data>
-  <data name="txtService.Location" type="System.Drawing.Point, System.Drawing">
-    <value>80, 19</value>
+  <data name="label3.Location" type="System.Drawing.Point, System.Drawing">
+    <value>13, 74</value>
   </data>
-  <data name="txtService.Size" type="System.Drawing.Size, System.Drawing">
-    <value>310, 20</value>
+  <data name="label3.Size" type="System.Drawing.Size, System.Drawing">
+    <value>53, 13</value>
   </data>
-  <data name="txtService.TabIndex" type="System.Int32, mscorlib">
-    <value>1</value>
+  <data name="label3.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
   </data>
-  <data name=">>txtService.Name" xml:space="preserve">
-    <value>txtService</value>
+  <data name="label3.Text" xml:space="preserve">
+    <value>Password</value>
   </data>
-  <data name=">>txtService.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name=">>label3.Name" xml:space="preserve">
+    <value>label3</value>
   </data>
-  <data name=">>txtService.Parent" xml:space="preserve">
+  <data name=">>label3.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>label3.Parent" xml:space="preserve">
     <value>groupBox1</value>
   </data>
-  <data name=">>txtService.ZOrder" xml:space="preserve">
-    <value>1</value>
-  </data>
-  <data name="txtUsername.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Top, Left, Right</value>
-  </data>
-  <data name="txtUsername.Location" type="System.Drawing.Point, System.Drawing">
-    <value>80, 45</value>
-  </data>
-  <data name="txtUsername.Size" type="System.Drawing.Size, System.Drawing">
-    <value>310, 20</value>
-  </data>
-  <data name="txtUsername.TabIndex" type="System.Int32, mscorlib">
+  <data name=">>label3.ZOrder" xml:space="preserve">
     <value>3</value>
   </data>
-  <data name=">>txtUsername.Name" xml:space="preserve">
-    <value>txtUsername</value>
-  </data>
-  <data name=">>txtUsername.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=">>txtUsername.Parent" xml:space="preserve">
-    <value>groupBox1</value>
-  </data>
-  <data name=">>txtUsername.ZOrder" xml:space="preserve">
-    <value>6</value>
-  </data>
   <data name="label2.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
@@ -448,145 +409,79 @@
     <value>label2</value>
   </data>
   <data name=">>label2.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>label2.Parent" xml:space="preserve">
     <value>groupBox1</value>
   </data>
   <data name=">>label2.ZOrder" xml:space="preserve">
-    <value>5</value>
+    <value>4</value>
   </data>
-  <data name="txtPassword.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+  <data name="txtUsername.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
-  <data name="txtPassword.Location" type="System.Drawing.Point, System.Drawing">
-    <value>80, 71</value>
+  <data name="txtUsername.Location" type="System.Drawing.Point, System.Drawing">
+    <value>80, 45</value>
   </data>
-  <data name="txtPassword.Size" type="System.Drawing.Size, System.Drawing">
+  <data name="txtUsername.Size" type="System.Drawing.Size, System.Drawing">
     <value>310, 20</value>
   </data>
-  <data name="txtPassword.TabIndex" type="System.Int32, mscorlib">
-    <value>5</value>
+  <data name="txtUsername.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
   </data>
-  <data name=">>txtPassword.Name" xml:space="preserve">
-    <value>txtPassword</value>
+  <data name=">>txtUsername.Name" xml:space="preserve">
+    <value>txtUsername</value>
   </data>
-  <data name=">>txtPassword.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name=">>txtUsername.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name=">>txtPassword.Parent" xml:space="preserve">
+  <data name=">>txtUsername.Parent" xml:space="preserve">
     <value>groupBox1</value>
   </data>
-  <data name=">>txtPassword.ZOrder" xml:space="preserve">
-    <value>2</value>
+  <data name=">>txtUsername.ZOrder" xml:space="preserve">
+    <value>5</value>
   </data>
-  <data name="label3.AutoSize" type="System.Boolean, mscorlib">
-    <value>True</value>
+  <data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>17, 6</value>
   </data>
-  <data name="label3.Location" type="System.Drawing.Point, System.Drawing">
-    <value>13, 74</value>
+  <data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>416, 104</value>
   </data>
-  <data name="label3.Size" type="System.Drawing.Size, System.Drawing">
-    <value>53, 13</value>
-  </data>
-  <data name="label3.TabIndex" type="System.Int32, mscorlib">
-    <value>4</value>
-  </data>
-  <data name="label3.Text" xml:space="preserve">
-    <value>Password</value>
-  </data>
-  <data name=">>label3.Name" xml:space="preserve">
-    <value>label3</value>
-  </data>
-  <data name=">>label3.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name=">>label3.Parent" xml:space="preserve">
-    <value>groupBox1</value>
-  </data>
-  <data name=">>label3.ZOrder" xml:space="preserve">
-    <value>4</value>
-  </data>
-  <data name="btnConnect.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Bottom, Right</value>
-  </data>
-  <data name="btnConnect.Location" type="System.Drawing.Point, System.Drawing">
-    <value>315, 97</value>
-  </data>
-  <data name="btnConnect.Size" type="System.Drawing.Size, System.Drawing">
-    <value>75, 23</value>
-  </data>
-  <data name="btnConnect.TabIndex" type="System.Int32, mscorlib">
+  <data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
     <value>6</value>
   </data>
-  <data name="btnConnect.Text" xml:space="preserve">
-    <value>Connect</value>
+  <data name="groupBox1.Text" xml:space="preserve">
+    <value>Connection Properties</value>
   </data>
-  <data name=">>btnConnect.Name" xml:space="preserve">
-    <value>btnConnect</value>
-  </data>
-  <data name=">>btnConnect.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=">>btnConnect.Parent" xml:space="preserve">
+  <data name=">>groupBox1.Name" xml:space="preserve">
     <value>groupBox1</value>
   </data>
-  <data name=">>btnConnect.ZOrder" xml:space="preserve">
-    <value>0</value>
+  <data name=">>groupBox1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="cmbDataStore.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Top, Left, Right</value>
+  <data name=">>groupBox1.Parent" xml:space="preserve">
+    <value>contentPanel</value>
   </data>
-  <data name="cmbDataStore.Location" type="System.Drawing.Point, System.Drawing">
-    <value>80, 24</value>
+  <data name=">>groupBox1.ZOrder" xml:space="preserve">
+    <value>3</value>
   </data>
-  <data name="cmbDataStore.Size" type="System.Drawing.Size, System.Drawing">
-    <value>310, 21</value>
+  <data name="contentPanel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>449, 255</value>
   </data>
-  <data name="cmbDataStore.TabIndex" type="System.Int32, mscorlib">
-    <value>1</value>
+  <data name=">>contentPanel.Name" xml:space="preserve">
+    <value>contentPanel</value>
   </data>
-  <data name=">>cmbDataStore.Name" xml:space="preserve">
-    <value>cmbDataStore</value>
+  <data name=">>contentPanel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name=">>cmbDataStore.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name=">>contentPanel.Parent" xml:space="preserve">
+    <value>$this</value>
   </data>
-  <data name=">>cmbDataStore.Parent" xml:space="preserve">
-    <value>groupBox2</value>
-  </data>
-  <data name=">>cmbDataStore.ZOrder" xml:space="preserve">
+  <data name=">>contentPanel.ZOrder" xml:space="preserve">
     <value>0</value>
   </data>
-  <data name="label4.AutoSize" type="System.Boolean, mscorlib">
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
-  </data>
-  <data name="label4.Location" type="System.Drawing.Point, System.Drawing">
-    <value>13, 27</value>
-  </data>
-  <data name="label4.Size" type="System.Drawing.Size, System.Drawing">
-    <value>58, 13</value>
-  </data>
-  <data name="label4.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="label4.Text" xml:space="preserve">
-    <value>Data Store</value>
-  </data>
-  <data name=">>label4.Name" xml:space="preserve">
-    <value>label4</value>
-  </data>
-  <data name=">>label4.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name=">>label4.Parent" xml:space="preserve">
-    <value>groupBox2</value>
-  </data>
-  <data name=">>label4.ZOrder" xml:space="preserve">
-    <value>1</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>449, 282</value>
@@ -595,6 +490,6 @@
     <value>RdbmsBaseCtrl</value>
   </data>
   <data name=">>$this.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.EditorBindableCollapsiblePanel, Maestro.Editors, Version=3.0.0.5610, Culture=neutral, PublicKeyToken=null</value>
+    <value>Maestro.Editors.Common.EditorBindableCollapsiblePanel, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
   </data>
 </root>
\ No newline at end of file

Copied: branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.Designer.cs (from rev 6890, trunk/Tools/Maestro/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.Designer.cs)
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.Designer.cs	                        (rev 0)
+++ branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.Designer.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -0,0 +1,190 @@
+namespace Maestro.Editors.FeatureSource.Providers
+{
+    partial class SetCredentialsDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.txtUserProperty = new System.Windows.Forms.TextBox();
+            this.txtPasswordProperty = new System.Windows.Forms.TextBox();
+            this.txtPassword = new System.Windows.Forms.TextBox();
+            this.txtUsername = new System.Windows.Forms.TextBox();
+            this.btnUserProperty = new System.Windows.Forms.Button();
+            this.btnPasswordProperty = new System.Windows.Forms.Button();
+            this.btnOK = new System.Windows.Forms.Button();
+            this.btnCancel = new System.Windows.Forms.Button();
+            this.label3 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(13, 13);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(55, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Username";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(13, 87);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(53, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Password";
+            // 
+            // txtUserProperty
+            // 
+            this.txtUserProperty.Location = new System.Drawing.Point(92, 10);
+            this.txtUserProperty.Name = "txtUserProperty";
+            this.txtUserProperty.ReadOnly = true;
+            this.txtUserProperty.Size = new System.Drawing.Size(132, 20);
+            this.txtUserProperty.TabIndex = 2;
+            // 
+            // txtPasswordProperty
+            // 
+            this.txtPasswordProperty.Location = new System.Drawing.Point(92, 84);
+            this.txtPasswordProperty.Name = "txtPasswordProperty";
+            this.txtPasswordProperty.ReadOnly = true;
+            this.txtPasswordProperty.Size = new System.Drawing.Size(132, 20);
+            this.txtPasswordProperty.TabIndex = 3;
+            // 
+            // txtPassword
+            // 
+            this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtPassword.Location = new System.Drawing.Point(92, 110);
+            this.txtPassword.Name = "txtPassword";
+            this.txtPassword.PasswordChar = '*';
+            this.txtPassword.Size = new System.Drawing.Size(351, 20);
+            this.txtPassword.TabIndex = 5;
+            this.txtPassword.TextChanged += new System.EventHandler(this.txtPassword_TextChanged);
+            // 
+            // txtUsername
+            // 
+            this.txtUsername.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtUsername.Location = new System.Drawing.Point(92, 36);
+            this.txtUsername.Name = "txtUsername";
+            this.txtUsername.Size = new System.Drawing.Size(351, 20);
+            this.txtUsername.TabIndex = 4;
+            this.txtUsername.TextChanged += new System.EventHandler(this.txtUsername_TextChanged);
+            // 
+            // btnUserProperty
+            // 
+            this.btnUserProperty.Location = new System.Drawing.Point(230, 8);
+            this.btnUserProperty.Name = "btnUserProperty";
+            this.btnUserProperty.Size = new System.Drawing.Size(32, 23);
+            this.btnUserProperty.TabIndex = 6;
+            this.btnUserProperty.Text = "...";
+            this.btnUserProperty.UseVisualStyleBackColor = true;
+            this.btnUserProperty.Click += new System.EventHandler(this.btnUserProperty_Click);
+            // 
+            // btnPasswordProperty
+            // 
+            this.btnPasswordProperty.Location = new System.Drawing.Point(230, 82);
+            this.btnPasswordProperty.Name = "btnPasswordProperty";
+            this.btnPasswordProperty.Size = new System.Drawing.Size(32, 23);
+            this.btnPasswordProperty.TabIndex = 7;
+            this.btnPasswordProperty.Text = "...";
+            this.btnPasswordProperty.UseVisualStyleBackColor = true;
+            this.btnPasswordProperty.Click += new System.EventHandler(this.btnPasswordProperty_Click);
+            // 
+            // btnOK
+            // 
+            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnOK.Enabled = false;
+            this.btnOK.Location = new System.Drawing.Point(287, 155);
+            this.btnOK.Name = "btnOK";
+            this.btnOK.Size = new System.Drawing.Size(75, 23);
+            this.btnOK.TabIndex = 8;
+            this.btnOK.Text = "OK";
+            this.btnOK.UseVisualStyleBackColor = true;
+            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnCancel.Location = new System.Drawing.Point(368, 155);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(75, 23);
+            this.btnCancel.TabIndex = 9;
+            this.btnCancel.Text = "Cancel";
+            this.btnCancel.UseVisualStyleBackColor = true;
+            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+            // 
+            // label3
+            // 
+            this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.label3.Location = new System.Drawing.Point(16, 143);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(263, 40);
+            this.label3.TabIndex = 10;
+            this.label3.Text = "Select the username and password properties and specify their values";
+            // 
+            // SetCredentialsDialog
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(455, 190);
+            this.ControlBox = false;
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.btnCancel);
+            this.Controls.Add(this.btnOK);
+            this.Controls.Add(this.btnPasswordProperty);
+            this.Controls.Add(this.btnUserProperty);
+            this.Controls.Add(this.txtPassword);
+            this.Controls.Add(this.txtUsername);
+            this.Controls.Add(this.txtPasswordProperty);
+            this.Controls.Add(this.txtUserProperty);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Name = "SetCredentialsDialog";
+            this.Text = "User Credentials";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox txtUserProperty;
+        private System.Windows.Forms.TextBox txtPasswordProperty;
+        private System.Windows.Forms.TextBox txtPassword;
+        private System.Windows.Forms.TextBox txtUsername;
+        private System.Windows.Forms.Button btnUserProperty;
+        private System.Windows.Forms.Button btnPasswordProperty;
+        private System.Windows.Forms.Button btnOK;
+        private System.Windows.Forms.Button btnCancel;
+        private System.Windows.Forms.Label label3;
+    }
+}
\ No newline at end of file

Copied: branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.cs (from rev 6890, trunk/Tools/Maestro/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.cs)
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.cs	                        (rev 0)
+++ branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/SetCredentialsDialog.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -0,0 +1,104 @@
+#region Disclaimer / License
+// Copyright (C) 2012, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using Maestro.Editors.Common;
+
+namespace Maestro.Editors.FeatureSource.Providers
+{
+    internal partial class SetCredentialsDialog : Form
+    {
+        private string[] _propertyNames;
+
+        public SetCredentialsDialog(string [] propertyNames)
+        {
+            InitializeComponent();
+            _propertyNames = propertyNames;
+        }
+
+        public string UserProperty { get { return txtUserProperty.Text; } }
+
+        public string PasswordProperty { get { return txtPasswordProperty.Text; } }
+
+        public string Username { get { return txtUsername.Text; } }
+
+        public string Password { get { return txtPassword.Text; } }
+
+        private void btnUserProperty_Click(object sender, EventArgs e)
+        {
+            var list = new List<string>(_propertyNames);
+            list.Remove(txtPasswordProperty.Text);
+
+            string item = GenericItemSelectionDialog.SelectItem(null, null, list.ToArray());
+            if (item != null)
+            {
+                txtUserProperty.Text = item;
+                CheckSubmissionState();
+            }
+        }
+
+        private void btnPasswordProperty_Click(object sender, EventArgs e)
+        {
+            var list = new List<string>(_propertyNames);
+            list.Remove(txtUserProperty.Text);
+
+            string item = GenericItemSelectionDialog.SelectItem(null, null, list.ToArray());
+            if (item != null)
+            {
+                txtPasswordProperty.Text = item;
+                CheckSubmissionState();
+            }
+        }
+
+        private void CheckSubmissionState()
+        {
+            btnOK.Enabled = !string.IsNullOrEmpty(txtUserProperty.Text) && 
+                            !string.IsNullOrEmpty(txtPasswordProperty.Text) && 
+                            !string.IsNullOrEmpty(txtUsername.Text) && 
+                            !string.IsNullOrEmpty(txtPassword.Text) && 
+                            txtUserProperty.Text != txtPasswordProperty.Text;
+        }
+
+        private void btnCancel_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+        }
+
+        private void btnOK_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = System.Windows.Forms.DialogResult.OK;
+        }
+
+        private void txtUsername_TextChanged(object sender, EventArgs e)
+        {
+            CheckSubmissionState();
+        }
+
+        private void txtPassword_TextChanged(object sender, EventArgs e)
+        {
+            CheckSubmissionState();
+        }
+    }
+}

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

Modified: branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Wms/WmsProviderCtrl.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Wms/WmsProviderCtrl.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/FeatureSource/Providers/Wms/WmsProviderCtrl.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -25,6 +25,8 @@
 using System.Text;
 using System.Windows.Forms;
 using Maestro.Editors.Common;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Resource;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using Maestro.Shared.UI;
 
@@ -72,14 +74,20 @@
         {
             if (_init)
                 return;
-            _fs.SetConnectionProperty("Username", txtUsername.Text);
+            if (string.IsNullOrEmpty(txtUsername.Text))
+                _fs.SetConnectionProperty("Username", null);
+            else
+                _fs.SetConnectionProperty("Username", txtUsername.Text);
         }
 
         private void txtPassword_TextChanged(object sender, EventArgs e)
         {
             if (_init)
                 return;
-            _fs.SetConnectionProperty("Password", txtPassword.Text);
+            if (string.IsNullOrEmpty(txtPassword.Text))
+                _fs.SetConnectionProperty("Password", null);
+            else
+                _fs.SetConnectionProperty("Password", txtPassword.Text);
         }
 
         private void btnTest_Click(object sender, EventArgs e)
@@ -87,14 +95,42 @@
             txtStatus.Text = string.Empty;
             using (new WaitCursor(this))
             {
-                _service.SyncSessionCopy();
+                WriteEncryptedCredentials();
                 txtStatus.Text = string.Format(Properties.Resources.FdoConnectionStatus, _fs.TestConnection());
             }
         }
 
+        private void WriteEncryptedCredentials()
+        {
+            string username = txtUsername.Text;
+            string password = txtPassword.Text;
+
+            if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
+            {
+                if (username != "%MG_USERNAME%" && password != "%MG_PASSWORD%")
+                {
+                    _fs.SetConnectionProperty("Username", "%MG_USERNAME%");
+                    _fs.SetConnectionProperty("Password", "%MG_PASSWORD%");
+                    _fs.SetEncryptedCredentials(username, password);
+                    _service.SyncSessionCopy();
+                }
+            }
+            else
+            {
+                _fs.SetConnectionProperty("Username", null);
+                _fs.SetConnectionProperty("Password", null);
+                try
+                {
+                    _fs.DeleteResourceData("MG_USER_CREDENTIALS");
+                }
+                catch { }
+                _service.SyncSessionCopy();
+            }
+        }
+
         private void btnAdvanced_Click(object sender, EventArgs e)
         {
-            _service.SyncSessionCopy();
+            WriteEncryptedCredentials();
             var diag = new WmsAdvancedConfigurationDialog(_service);
             if (diag.ShowDialog() == DialogResult.OK)
             {

Modified: branches/maestro-4.0.x/Maestro.Editors/IEditorService.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/IEditorService.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/IEditorService.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -139,6 +139,17 @@
         IResource GetEditedResource();
 
         /// <summary>
+        /// Raises the <see cref="E:Maestro.Editors.IEditorService.BeforePreview"/> event and performs any other pre-preview
+        /// processing tasks
+        /// </summary>
+        void PrePreviewProcess();
+
+        /// <summary>
+        /// Raised before a preview occurs
+        /// </summary>
+        event EventHandler BeforePreview;
+
+        /// <summary>
         /// Raised before a save operation commences
         /// </summary>
         event CancelEventHandler BeforeSave;

Modified: branches/maestro-4.0.x/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/Maestro.Editors.csproj	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/Maestro.Editors.csproj	2012-07-11 13:48:29 UTC (rev 6891)
@@ -348,6 +348,12 @@
     <Compile Include="FeatureSource\Providers\Sdf\SdfFileCtrl.Designer.cs">
       <DependentUpon>SdfFileCtrl.cs</DependentUpon>
     </Compile>
+    <Compile Include="FeatureSource\Providers\SetCredentialsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="FeatureSource\Providers\SetCredentialsDialog.Designer.cs">
+      <DependentUpon>SetCredentialsDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="FeatureSource\Providers\Shp\ShpFileCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -1340,6 +1346,9 @@
       <DependentUpon>SdfFileCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="FeatureSource\Providers\SetCredentialsDialog.resx">
+      <DependentUpon>SetCredentialsDialog.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="FeatureSource\Providers\Shp\ShpFileCtrl.resx">
       <DependentUpon>ShpFileCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>

Modified: branches/maestro-4.0.x/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/Properties/Resources.Designer.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/Properties/Resources.Designer.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -2925,6 +2925,15 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Select Data Store.
+        /// </summary>
+        internal static string TextSelectDataStore {
+            get {
+                return ResourceManager.GetString("TextSelectDataStore", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Bitmap tick {
             get {
                 object obj = ResourceManager.GetObject("tick", resourceCulture);

Modified: branches/maestro-4.0.x/Maestro.Editors/Properties/Resources.resx
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/Properties/Resources.resx	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/Properties/Resources.resx	2012-07-11 13:48:29 UTC (rev 6891)
@@ -1331,4 +1331,7 @@
   <data name="BaseLayerGroupConvertedToLayerGroup" xml:space="preserve">
     <value>Base Layer Group ({0}) converted to Regular Group ({1})</value>
   </data>
+  <data name="TextSelectDataStore" xml:space="preserve">
+    <value>Select Data Store</value>
+  </data>
 </root>
\ No newline at end of file

Modified: branches/maestro-4.0.x/Maestro.Editors/ResourceEditorServiceBase.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/ResourceEditorServiceBase.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/ResourceEditorServiceBase.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -242,9 +242,8 @@
 
             if (!OnBeforeSave())
             {
-                _conn.ResourceService.SaveResourceAs(_editCopy, resourceID);
-                //Don't forget to copy attached resource data!
-                _editCopy.CopyResourceDataTo(resourceID);
+                //_conn.ResourceService.SaveResourceAs(_editCopy, resourceID);
+                _conn.ResourceService.CopyResource(_editCopy.ResourceID, resourceID, true);
                 this.ResourceID = resourceID;
                 this.IsNew = false;
                 this.IsDirty = false;
@@ -483,5 +482,15 @@
         }
 
         public abstract void RunProcess(string processName, params string[] args);
+
+        public void PrePreviewProcess()
+        {
+            SyncSessionCopy();
+            var handler = this.BeforePreview;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public event EventHandler BeforePreview;
     }
 }

Modified: branches/maestro-4.0.x/Maestro.Editors/SymbolDefinition/SymbolEditorService.cs
===================================================================
--- branches/maestro-4.0.x/Maestro.Editors/SymbolDefinition/SymbolEditorService.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/Maestro.Editors/SymbolDefinition/SymbolEditorService.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -225,5 +225,14 @@
         {
             throw new NotImplementedException();
         }
+
+        public void PrePreviewProcess()
+        {
+            var handler = this.BeforePreview;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public event EventHandler BeforePreview;
     }
 }

Modified: branches/maestro-4.0.x/MaestroAPITests/HttpConnectionTests.cs
===================================================================
--- branches/maestro-4.0.x/MaestroAPITests/HttpConnectionTests.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/MaestroAPITests/HttpConnectionTests.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -25,12 +25,101 @@
 using OSGeo.MapGuide.MaestroAPI.Services;
 using System.IO;
 using OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.ObjectModels;
 
 namespace MaestroAPITests
 {
     [TestFixture(Ignore = TestControl.IgnoreHttpConnectionTests)]
     public class HttpConnectionTests
     {
+        //[Test]
+        public void TestEncryptedFeatureSourceCredentials()
+        {
+            //Sensitive data redacted, nevertheless you can test and verify this by filling in the
+            //blanks here and uncommenting the above [Test] attribute. If the test passes, credential encryption is working
+            string server       = "";
+            string database     = "";
+            string actualUser   = "";
+            string actualPass   = "";
+            string bogusUser    = "foo";
+            string bogusPass    = "bar";
+
+            var conn = ConnectionUtil.CreateTestHttpConnection();
+            string fsId = "Library://UnitTests/EncryptedCredentials.FeatureSource";
+            var fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SQLServerSpatial");
+            fs.SetConnectionProperty("Username", "%MG_USERNAME%");
+            fs.SetConnectionProperty("Password", "%MG_PASSWORD%");
+            fs.SetConnectionProperty("Service", server);
+            fs.SetConnectionProperty("DataStore", database);
+            fs.ResourceID = fsId;
+            conn.ResourceService.SaveResource(fs);
+
+            using (var ms = CredentialWriter.Write(actualUser, actualPass))
+            {
+                conn.ResourceService.SetResourceData(fsId, "MG_USER_CREDENTIALS", ResourceDataType.String, ms);
+            }
+
+            string result = conn.FeatureService.TestConnection(fsId);
+            Assert.AreEqual("TRUE", result.ToUpper());
+
+            //Test convenience method
+            fsId = "Library://UnitTests/EncryptedCredentials2.FeatureSource";
+            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SQLServerSpatial");
+            fs.SetConnectionProperty("Username", "%MG_USERNAME%");
+            fs.SetConnectionProperty("Password", "%MG_PASSWORD%");
+            fs.SetConnectionProperty("Service", server);
+            fs.SetConnectionProperty("DataStore", database);
+            fs.ResourceID = fsId;
+            conn.ResourceService.SaveResource(fs);
+            fs.SetEncryptedCredentials(actualUser, actualPass);
+
+            result = conn.FeatureService.TestConnection(fsId);
+            Assert.AreEqual("TRUE", result.ToUpper());
+            Assert.AreEqual(actualUser, fs.GetEncryptedUsername());
+
+            //Do not set encrypted credentials
+            fsId = "Library://UnitTests/EncryptedCredentials3.FeatureSource";
+            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SQLServerSpatial");
+            fs.SetConnectionProperty("Username", "%MG_USERNAME%");
+            fs.SetConnectionProperty("Password", "%MG_PASSWORD%");
+            fs.SetConnectionProperty("Service", server);
+            fs.SetConnectionProperty("DataStore", database);
+            fs.ResourceID = fsId;
+            conn.ResourceService.SaveResource(fs);
+
+            try
+            {
+                result = conn.FeatureService.TestConnection(fsId);
+                Assert.AreEqual("FALSE", result.ToUpper());
+            }
+            catch //Exception or false I can't remember, as long as the result is not "true"
+            {
+
+            }
+
+            //Encrypt credentials, but use bogus username/password
+            fsId = "Library://UnitTests/EncryptedCredentials4.FeatureSource";
+            fs = ObjectFactory.CreateFeatureSource(conn, "OSGeo.SQLServerSpatial");
+            fs.SetConnectionProperty("Username", "%MG_USERNAME%");
+            fs.SetConnectionProperty("Password", "%MG_PASSWORD%");
+            fs.SetConnectionProperty("Service", server);
+            fs.SetConnectionProperty("DataStore", database);
+            fs.ResourceID = fsId;
+            conn.ResourceService.SaveResource(fs);
+            fs.SetEncryptedCredentials(bogusUser, bogusPass);
+
+            try
+            {
+                result = conn.FeatureService.TestConnection(fsId);
+                Assert.AreEqual("FALSE", result.ToUpper());
+            }
+            catch
+            {
+                //Exception or false I can't remember, as long as the result is not "true"
+            }
+            Assert.AreEqual(bogusUser, fs.GetEncryptedUsername());
+        }
+
         [Test]
         public void TestConnectionString()
         {

Copied: branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/CredentialWriter.cs (from rev 6890, trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/CredentialWriter.cs)
===================================================================
--- branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/CredentialWriter.cs	                        (rev 0)
+++ branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/CredentialWriter.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -0,0 +1,240 @@
+#region Disclaimer / License
+// Copyright (C) 2012, 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.Linq;
+using System.Text;
+using System.Diagnostics;
+using System.IO;
+using OSGeo.MapGuide.ObjectModels.FeatureSource;
+
+namespace OSGeo.MapGuide.MaestroAPI
+{
+    using Resource;
+
+    public static class FeatureSourceCredentialExtensions
+    {
+        /// <summary>
+        /// Sets the encrypted credentials for this Feature Source, the credentials are referenced with the %MG_USERNAME%
+        /// and %MG_PASSWORD% placeholder tokens in the Feature Source content.
+        /// </summary>
+        /// <param name="fs"></param>
+        /// <param name="username"></param>
+        /// <param name="password"></param>
+        public static void SetEncryptedCredentials(this IFeatureSource fs, string username, string password)
+        {
+            Check.NotNull(fs, "fs");
+            if (string.IsNullOrEmpty(fs.ResourceID))
+                throw new ArgumentException("Feature Source has no resource ID attached"); //LOCALIZEME
+            using (var stream = CredentialWriter.Write(username, password))
+            {
+                fs.SetResourceData("MG_USER_CREDENTIALS", ObjectModels.Common.ResourceDataType.String, stream);
+            }
+        }
+
+        /// <summary>
+        /// Gets the encrypted username referenced by the %MG_USERNAME% placeholder token in the Feature Source content
+        /// </summary>
+        /// <param name="fs"></param>
+        /// <returns></returns>
+        public static string GetEncryptedUsername(this IFeatureSource fs)
+        {
+            Check.NotNull(fs, "fs");
+            var resData = fs.EnumerateResourceData();
+            foreach (var rd in resData)
+            {
+                if (rd.Name.ToUpper() == "MG_USER_CREDENTIALS")
+                {
+                    using (var sr = new StreamReader(fs.GetResourceData("MG_USER_CREDENTIALS")))
+                    {
+                        return sr.ReadToEnd();
+                    }
+                }
+            }
+            return null;
+        }
+    }
+
+    /// <summary>
+    /// Utility class to create encrypted Feature Source credentials
+    /// </summary>
+    public class CredentialWriter
+    {
+        //NOTE: This is a verbatim copy of MgCryptographyUtil in MgDev\Common\Security to the best I can do in .net
+        //Only the encryption bits are implemented. Maestro has no need to decrypt MG_USER_CREDENTIALS
+
+        //I'm sure this particular key isn't meant to be made public, but being able to correctly
+        //write MG_USER_CREDENTIALS trumps this concern. Besides, if this key were to be truly private, it wouldn't be publicly visible
+        //in the source code of a publicly accessible repository now would it?
+        const string MG_CRYPTOGRAPHY_PRIVATE_KEY         = "WutsokeedbA";
+
+        static readonly char[] MG_CRYPTOGRAPHY_DEC_CHARS = { '0','1','2','3','4','5','6','7','8','9' };
+        static readonly char[] MG_CRYPTOGRAPHY_HEX_CHARS = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
+        const int MG_CRYPTOGRAPHY_MAGIC_NUMBER_1         = 42;
+        const int MG_CRYPTOGRAPHY_MAGIC_NUMBER_2         = 3;
+        const int MG_CRYPTOGRAPHY_MIN_COLUMN_NUMBER      = 5;
+
+        const int MIN_CIPHER_TEXT_LENGTH = 34;
+        const int MIN_KEY_LENGTH = 14;
+        const int MAX_KEY_LENGTH = 32;
+        const string STRING_DELIMITER = "\v";
+        const string RESERVED_CHARACTERS_STRINGS = "\v\f";
+        const string RESERVED_CHARACTERS_CREDENTIALS = "\t\r\n\v\f";
+
+        /// <summary>
+        /// Encrypts the specified credentials. For a feature source that uses %MG_USERNAME% and %MG_PASSWORD% placeholder tokens to
+        /// properly use these encrypted credentials, the encrypted string must be set as the MG_USER_CREDENTIALS resource data item
+        /// for that feature source
+        /// </summary>
+        /// <param name="username"></param>
+        /// <param name="password"></param>
+        /// <returns>A <see cref="T:System.IO.Stream"/> containing the encrypted credentials</returns>
+        public static Stream Write(string username, string password)
+        {
+            string credentials;
+            EncryptStrings(username, password, out credentials, RESERVED_CHARACTERS_CREDENTIALS);
+            return new MemoryStream(ASCIIEncoding.Default.GetBytes(credentials));
+        }
+
+        static void EncryptStrings(string plainText1, string plainText2, out string cipherText, string reservedCharacters)
+        {
+            var reservedChars = reservedCharacters.ToCharArray();
+            if (plainText1.IndexOfAny(reservedChars) >= 0)
+            {
+                throw new ArgumentException("plainText1 contains reserved characters");
+            }
+            if (plainText2.IndexOfAny(reservedChars) >= 0)
+            {
+                throw new ArgumentException("plainText2 contains reserved characters");
+            }
+
+            string publicKey;
+            GenerateCryptographKey(out publicKey);
+
+            string tmpStr1, tmpStr2;
+            CombineStrings(plainText1, plainText2, out tmpStr1);
+            EncryptStringWithKey(tmpStr1, out tmpStr2, publicKey);
+
+            CombineStrings(tmpStr2, publicKey, out tmpStr1);
+            EncryptStringWithKey(tmpStr1, out tmpStr2, MG_CRYPTOGRAPHY_PRIVATE_KEY);
+
+            EncryptStringByTransposition(tmpStr2, out cipherText);
+        }
+
+        static void EncryptStringByTransposition(string inStr, out string outStr)
+        {
+            string tmpStr;
+            int inStrLength = inStr.Length;
+
+            int numOfColumn = MG_CRYPTOGRAPHY_MIN_COLUMN_NUMBER;
+            EncryptStringByTransposition(inStr, out tmpStr, numOfColumn);
+
+            numOfColumn += inStrLength % 6;
+            EncryptStringByTransposition(tmpStr, out outStr, numOfColumn);
+            Debug.Assert(inStrLength == outStr.Length);
+        }
+
+        static void EncryptStringByTransposition(string inStr, out string outStr, int numOfColumn)
+        {
+            int inStrLen = inStr.Length;
+            int numOfRow = (int)Math.Ceiling((double)inStrLen / (double)numOfColumn);
+
+            StringBuilder sb = new StringBuilder();
+
+            for (int currColumn = 0; currColumn < numOfColumn; ++currColumn)
+            {
+                for (int currRow = 0; currRow < numOfRow; ++currRow)
+                {
+                    int inIdx = currColumn + currRow * numOfColumn;
+
+                    if (inIdx < inStrLen)
+                    {
+                        sb.Append(inStr[inIdx]);
+                    }
+                }
+            }
+
+            outStr = sb.ToString();
+        }
+
+        static void GenerateCryptographKey(out string publicKey)
+        {
+            DateTime dt = DateTime.UtcNow;
+            publicKey = dt.ToString("yyyymmddHHmmss");
+        }
+
+        static void CombineStrings(string str1, string str2, out string outStr)
+        {
+            outStr = str1;
+            outStr += STRING_DELIMITER;
+            outStr += str2;
+        }
+
+        static void EncryptStringWithKey(string inStr, out string outStr, string key)
+        {
+            char prevChar = Convert.ToChar(MG_CRYPTOGRAPHY_MAGIC_NUMBER_1);
+            char currChar;
+            int keyIdx = 0;
+            int keyLen = key.Length;
+            int outStrLen = inStr.Length;
+            StringBuilder tmpStr = new StringBuilder();
+
+            for (int i = 0; i < outStrLen; ++i)
+            {
+                currChar = inStr[i];
+                char c = Convert.ToChar(currChar ^ key[keyIdx] ^ prevChar ^ ((i / MG_CRYPTOGRAPHY_MAGIC_NUMBER_2) % 255));
+                tmpStr.Append(c);
+                prevChar = currChar;
+
+                ++keyIdx;
+
+                if (keyIdx >= keyLen)
+                {
+                   keyIdx = 0;
+                }
+            }
+
+            BinToHex(tmpStr.ToString(), out outStr);
+            Debug.Assert((inStr.Length * 2) == outStr.Length); 
+        }
+
+        static void BinToHex(string binStr, out string hexStr)
+        {
+            int binStrLen = binStr.Length;
+
+            hexStr = "";
+
+            StringBuilder sb = new StringBuilder();
+
+            for (int i = 0; i < binStrLen; ++i)
+            {
+                int num = binStr[i];
+
+                for (int j = 1; j >= 0; --j)
+                {
+                    char c = MG_CRYPTOGRAPHY_HEX_CHARS[(num >> j * 4) & 0xF];
+                    sb.Append(c);
+                }
+            }
+
+            hexStr = sb.ToString();
+        }
+    }
+}

Modified: branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
===================================================================
--- branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2012-07-11 13:48:29 UTC (rev 6891)
@@ -190,6 +190,7 @@
     <Compile Include="CoordinateSystem\ISimpleTransform.cs" />
     <Compile Include="CoordinateSystem\MeterBasedCoordinateSystem.cs" />
     <Compile Include="CoordinateSystem\NsDoc.cs" />
+    <Compile Include="CredentialWriter.cs" />
     <Compile Include="CrossConnection\NsDoc.cs" />
     <Compile Include="CrossConnection\ResourceRebaser.cs" />
     <Compile Include="Exceptions\CustomPropertyNotFoundException.cs" />

Modified: branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs
===================================================================
--- branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -147,15 +147,26 @@
                 }
             }
 
+            bool bRaise = false;
             if (pr != null)
             {
-                pr.Value = value;
+                if (value != null)
+                    pr.Value = value;
+                else
+                    this.Parameter.Remove(pr);
+                bRaise = true;
             }
             else
             {
-                this.Parameter.Add(new NameValuePairType() { Name = name, Value = value });
+                if (value != null)
+                {
+                    this.Parameter.Add(new NameValuePairType() { Name = name, Value = value });
+                    bRaise = true;
+                }
             }
-            OnPropertyChanged("Parameter");
+
+            if (bRaise)
+                OnPropertyChanged("Parameter");
         }
 
         protected void DetachChangeListeners()

Modified: branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
===================================================================
--- branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -62,7 +62,7 @@
         /// Sets the connection property.
         /// </summary>
         /// <param name="name">The name.</param>
-        /// <param name="value">The value.</param>
+        /// <param name="value">The value. If null, the matching parameter is removed from the feature source</param>
         void SetConnectionProperty(string name, string value);
 
         /// <summary>

Modified: branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/Resource/IResource.cs
===================================================================
--- branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/Resource/IResource.cs	2012-07-11 13:28:37 UTC (rev 6890)
+++ branches/maestro-4.0.x/OSGeo.MapGuide.MaestroAPI/Resource/IResource.cs	2012-07-11 13:48:29 UTC (rev 6891)
@@ -102,6 +102,12 @@
         /// <summary>
         /// Copies the resource data to the specified resource
         /// </summary>
+        /// <remarks>
+        /// Avoid using this method if you are copying a IFeatureSource with MG_USER_CREDENTIALS resource data, as MapGuide will automatically return
+        /// the decrypted username for MG_USER_CREDENTIALS, rendering the resource data invalid for the target resource. Instead use the
+        /// <see cref="M:OSGeo.MapGuide.MaestroAPI.Services.IResourceService.CopyResource"/> method, which will copy the resource and its resource
+        /// data and keep any MG_USER_CREDENTIALS items intact
+        /// </remarks>
         /// <param name="source">The source.</param>
         /// <param name="target">The target.</param>
         public static void CopyResourceDataTo(this IResource source, IResource target)
@@ -125,6 +131,12 @@
         /// <summary>
         /// Copies the resource data to the specified resource
         /// </summary>
+        /// <remarks>
+        /// Avoid using this method if you are copying a IFeatureSource with MG_USER_CREDENTIALS resource data, as MapGuide will automatically return
+        /// the decrypted username for MG_USER_CREDENTIALS, rendering the resource data invalid for the target resource. Instead use the
+        /// <see cref="M:OSGeo.MapGuide.MaestroAPI.Services.IResourceService.CopyResource"/> method, which will copy the resource and its resource
+        /// data and keep any MG_USER_CREDENTIALS items intact
+        /// </remarks>
         /// <param name="source">The source.</param>
         /// <param name="targetID">The target ID.</param>
         public static void CopyResourceDataTo(this IResource source, string targetID)



More information about the mapguide-commits mailing list