[mapguide-commits] r4860 - in sandbox/maestro-2.5: . Maestro Maestro.AddIn.ResourceEditors Maestro.AddIn.ResourceEditors/Properties Maestro.Base Maestro.Base/Commands Maestro.Base/Events Maestro.Base/Properties Maestro.Base/Resources Maestro.Base/Services Maestro.Base/UI Maestro.Editors Maestro.Editors/Properties Maestro.Login Maestro.Login/Properties Maestro.Login/Strings Maestro.Shared.UI Maestro.Shared.UI/Properties Maestro.Shared.UI/Resources MaestroAPITests OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/Exceptions OSGeo.MapGuide.MaestroAPI.Http

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Wed May 12 15:59:00 EDT 2010


Author: jng
Date: 2010-05-12 15:58:59 -0400 (Wed, 12 May 2010)
New Revision: 4860

Added:
   sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/
   sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/Maestro.AddIn.ResourceEditors.csproj
   sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/Properties/
   sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/Properties/AssemblyInfo.cs
   sandbox/maestro-2.5/Maestro.Base/Events/
   sandbox/maestro-2.5/Maestro.Base/Events/EventWatcher.cs
   sandbox/maestro-2.5/Maestro.Base/Resources/arrow-180.png
   sandbox/maestro-2.5/Maestro.Base/Resources/arrow.png
   sandbox/maestro-2.5/Maestro.Base/Resources/cross-circle.png
   sandbox/maestro-2.5/Maestro.Base/Resources/loading.gif
   sandbox/maestro-2.5/Maestro.Base/Resources/navigation-000-white.png
   sandbox/maestro-2.5/Maestro.Base/Resources/navigation-180-white.png
   sandbox/maestro-2.5/Maestro.Base/Resources/navigation-180.png
   sandbox/maestro-2.5/Maestro.Base/Resources/navigation.png
   sandbox/maestro-2.5/Maestro.Base/Services/ServerConnectionManager.cs
   sandbox/maestro-2.5/Maestro.Base/Services/ServiceBase.cs
   sandbox/maestro-2.5/Maestro.Base/Services/ServiceRegistry.cs
   sandbox/maestro-2.5/Maestro.Base/Services/UrlLauncher.cs
   sandbox/maestro-2.5/Maestro.Base/UI/AboutDialog.cs
   sandbox/maestro-2.5/Maestro.Base/UI/AboutDialog.resx
   sandbox/maestro-2.5/Maestro.Base/UI/EmbeddedWebBrowser.Designer.cs
   sandbox/maestro-2.5/Maestro.Base/UI/EmbeddedWebBrowser.cs
   sandbox/maestro-2.5/Maestro.Base/UI/EmbeddedWebBrowser.resx
   sandbox/maestro-2.5/Maestro.Base/UI/ISiteExplorer.cs
   sandbox/maestro-2.5/Maestro.Editors/
   sandbox/maestro-2.5/Maestro.Editors/FeatureSource/
   sandbox/maestro-2.5/Maestro.Editors/Generic/
   sandbox/maestro-2.5/Maestro.Editors/LayerDefinition/
   sandbox/maestro-2.5/Maestro.Editors/Maestro.Editors.csproj
   sandbox/maestro-2.5/Maestro.Editors/PrintLayout/
   sandbox/maestro-2.5/Maestro.Editors/Properties/
   sandbox/maestro-2.5/Maestro.Editors/Properties/AssemblyInfo.cs
   sandbox/maestro-2.5/Maestro.Editors/WebLayout/
   sandbox/maestro-2.5/Maestro.Login/
   sandbox/maestro-2.5/Maestro.Login/HttpLoginCtrl.cs
   sandbox/maestro-2.5/Maestro.Login/HttpLoginCtrl.designer.cs
   sandbox/maestro-2.5/Maestro.Login/HttpLoginCtrl.resx
   sandbox/maestro-2.5/Maestro.Login/ILoginCtrl.cs
   sandbox/maestro-2.5/Maestro.Login/LocalNativeLoginCtrl.cs
   sandbox/maestro-2.5/Maestro.Login/LocalNativeLoginCtrl.designer.cs
   sandbox/maestro-2.5/Maestro.Login/LocalNativeLoginCtrl.resx
   sandbox/maestro-2.5/Maestro.Login/LoginDialog.cs
   sandbox/maestro-2.5/Maestro.Login/LoginDialog.designer.cs
   sandbox/maestro-2.5/Maestro.Login/LoginDialog.resx
   sandbox/maestro-2.5/Maestro.Login/Maestro.Login.csproj
   sandbox/maestro-2.5/Maestro.Login/PreferedSite.cs
   sandbox/maestro-2.5/Maestro.Login/Properties/
   sandbox/maestro-2.5/Maestro.Login/Properties/AssemblyInfo.cs
   sandbox/maestro-2.5/Maestro.Login/Strings/
   sandbox/maestro-2.5/Maestro.Login/Strings/FormLogin.Designer.cs
   sandbox/maestro-2.5/Maestro.Login/Strings/FormLogin.resx
   sandbox/maestro-2.5/Maestro.Login/WaitCursor.cs
   sandbox/maestro-2.5/Maestro.Shared.UI/
   sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.cs
   sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.designer.cs
   sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.resx
   sandbox/maestro-2.5/Maestro.Shared.UI/Maestro.Shared.UI.csproj
   sandbox/maestro-2.5/Maestro.Shared.UI/Properties/
   sandbox/maestro-2.5/Maestro.Shared.UI/Properties/AssemblyInfo.cs
   sandbox/maestro-2.5/Maestro.Shared.UI/Properties/Resources.Designer.cs
   sandbox/maestro-2.5/Maestro.Shared.UI/Properties/Resources.resx
   sandbox/maestro-2.5/Maestro.Shared.UI/Resources/
   sandbox/maestro-2.5/Maestro.Shared.UI/Resources/minus-white.png
   sandbox/maestro-2.5/Maestro.Shared.UI/Resources/plus-white.png
   sandbox/maestro-2.5/Maestro.Shared.UI/ToolStripSpringTextBox.cs
   sandbox/maestro-2.5/MaestroAPITests/HttpConnectionTests.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Exceptions/CustomPropertyNotFoundException.cs
Modified:
   sandbox/maestro-2.5/Maestro.Base/Commands/AboutCommand.cs
   sandbox/maestro-2.5/Maestro.Base/Commands/LoginCommand.cs
   sandbox/maestro-2.5/Maestro.Base/Commands/StartupCommand.cs
   sandbox/maestro-2.5/Maestro.Base/IViewContent.cs
   sandbox/maestro-2.5/Maestro.Base/Maestro.Base.addin
   sandbox/maestro-2.5/Maestro.Base/Maestro.Base.csproj
   sandbox/maestro-2.5/Maestro.Base/Properties/Resources.Designer.cs
   sandbox/maestro-2.5/Maestro.Base/Properties/Resources.resx
   sandbox/maestro-2.5/Maestro.Base/UI/SiteExplorer.cs
   sandbox/maestro-2.5/Maestro.Base/ViewContentBase.cs
   sandbox/maestro-2.5/Maestro.Base/Workbench.cs
   sandbox/maestro-2.5/Maestro.Base/ZonedContainer.cs
   sandbox/maestro-2.5/Maestro/Maestro.csproj
   sandbox/maestro-2.5/Maestro/Maestro.sln
   sandbox/maestro-2.5/MaestroAPITests/MaestroAPITests.csproj
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ConnectionProviders.xml
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
Log:
This submission includes the following changes:

 - Add unit tests to test custom connection properties
 - Add embedded web browser component
 - Add a URL launcher service allowing for the launching of urls via an external process or by the embedded web browser
 - Make added IViewContent instances the active tab in its parent container.
 - Migrate existing Login and About dialogs
 - Make login command invoke the Login dialog and launch the login command on startup

Modified: sandbox/maestro-2.5/Maestro/Maestro.csproj
===================================================================
--- sandbox/maestro-2.5/Maestro/Maestro.csproj	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro/Maestro.csproj	2010-05-12 19:58:59 UTC (rev 4860)
@@ -78,6 +78,14 @@
       <Project>{F1E2F468-5030-4DBA-968C-9620284AFAA1}</Project>
       <Name>Maestro.Base</Name>
     </ProjectReference>
+    <ProjectReference Include="..\OSGeo.MapGuide.MaestroAPI.Http\OSGeo.MapGuide.MaestroAPI.Http.csproj">
+      <Project>{6EF1E775-444B-4E5F-87FB-D687C43A68D7}</Project>
+      <Name>OSGeo.MapGuide.MaestroAPI.Http</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\OSGeo.MapGuide.MaestroAPI\OSGeo.MapGuide.MaestroAPI.csproj">
+      <Project>{80FA3158-8B5F-48D1-A393-0378AFE48A7E}</Project>
+      <Name>OSGeo.MapGuide.MaestroAPI</Name>
+    </ProjectReference>
     <ProjectReference Include="..\Thirdparty\SharpDevelop\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj">
       <Project>{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}</Project>
       <Name>ICSharpCode.Core.WinForms</Name>

Modified: sandbox/maestro-2.5/Maestro/Maestro.sln
===================================================================
--- sandbox/maestro-2.5/Maestro/Maestro.sln	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro/Maestro.sln	2010-05-12 19:58:59 UTC (rev 4860)
@@ -45,6 +45,14 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaestroAPITests", "..\MaestroAPITests\MaestroAPITests.csproj", "{351D49A3-2E4A-4EC3-AFC2-D56598F44F51}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maestro.Shared.UI", "..\Maestro.Shared.UI\Maestro.Shared.UI.csproj", "{CFD19053-2172-41D3-8460-0FD2123A1E88}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maestro.Editors", "..\Maestro.Editors\Maestro.Editors.csproj", "{5AD2CDBA-952E-4148-98A1-31D2E0D540D5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maestro.AddIn.ResourceEditors", "..\Maestro.AddIn.ResourceEditors\Maestro.AddIn.ResourceEditors.csproj", "{75D70A8D-03ED-439E-96E6-72A0F717A23B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maestro.Login", "..\Maestro.Login\Maestro.Login.csproj", "{07588440-5F9F-4C30-AA06-9CF30BA6DDE6}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -111,6 +119,22 @@
 		{351D49A3-2E4A-4EC3-AFC2-D56598F44F51}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{351D49A3-2E4A-4EC3-AFC2-D56598F44F51}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{351D49A3-2E4A-4EC3-AFC2-D56598F44F51}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CFD19053-2172-41D3-8460-0FD2123A1E88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CFD19053-2172-41D3-8460-0FD2123A1E88}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CFD19053-2172-41D3-8460-0FD2123A1E88}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CFD19053-2172-41D3-8460-0FD2123A1E88}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5AD2CDBA-952E-4148-98A1-31D2E0D540D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5AD2CDBA-952E-4148-98A1-31D2E0D540D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5AD2CDBA-952E-4148-98A1-31D2E0D540D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5AD2CDBA-952E-4148-98A1-31D2E0D540D5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{75D70A8D-03ED-439E-96E6-72A0F717A23B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{75D70A8D-03ED-439E-96E6-72A0F717A23B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{75D70A8D-03ED-439E-96E6-72A0F717A23B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{75D70A8D-03ED-439E-96E6-72A0F717A23B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{07588440-5F9F-4C30-AA06-9CF30BA6DDE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{07588440-5F9F-4C30-AA06-9CF30BA6DDE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{07588440-5F9F-4C30-AA06-9CF30BA6DDE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{07588440-5F9F-4C30-AA06-9CF30BA6DDE6}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -119,10 +143,14 @@
 		{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {EB18A52E-9245-4D60-8C68-3D6C6EEA38A7}
 		{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} = {EB18A52E-9245-4D60-8C68-3D6C6EEA38A7}
 		{F1E2F468-5030-4DBA-968C-9620284AFAA1} = {7C52C291-B8DC-40DC-9AFB-F4A9CADC442B}
+		{75D70A8D-03ED-439E-96E6-72A0F717A23B} = {7C52C291-B8DC-40DC-9AFB-F4A9CADC442B}
 		{80FA3158-8B5F-48D1-A393-0378AFE48A7E} = {ED1D6D53-C3B5-4FE3-A5B1-CBA8472CE2FE}
 		{6EF1E775-444B-4E5F-87FB-D687C43A68D7} = {ED1D6D53-C3B5-4FE3-A5B1-CBA8472CE2FE}
 		{FCC83861-96C6-43CA-B33B-DB1D0DEC8E79} = {ED1D6D53-C3B5-4FE3-A5B1-CBA8472CE2FE}
 		{81BF310C-0BBC-41F0-ADA5-B201D9769AFC} = {ED1D6D53-C3B5-4FE3-A5B1-CBA8472CE2FE}
+		{CFD19053-2172-41D3-8460-0FD2123A1E88} = {CCF50F7F-DD89-41C1-843C-1BFA2375EEE0}
+		{5AD2CDBA-952E-4148-98A1-31D2E0D540D5} = {CCF50F7F-DD89-41C1-843C-1BFA2375EEE0}
+		{07588440-5F9F-4C30-AA06-9CF30BA6DDE6} = {CCF50F7F-DD89-41C1-843C-1BFA2375EEE0}
 		{E144AD75-50F3-4C23-8978-D5EC9A3A872F} = {FCC83861-96C6-43CA-B33B-DB1D0DEC8E79}
 		{B5EA049C-6AB7-4686-A2F4-4BA2EAC0E585} = {81BF310C-0BBC-41F0-ADA5-B201D9769AFC}
 		{EDDB0F74-6FE7-4969-80B0-817A629722CD} = {81BF310C-0BBC-41F0-ADA5-B201D9769AFC}


Property changes on: sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors
___________________________________________________________________
Added: svn:ignore
   + bin
obj


Added: sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/Maestro.AddIn.ResourceEditors.csproj
===================================================================
--- sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/Maestro.AddIn.ResourceEditors.csproj	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/Maestro.AddIn.ResourceEditors.csproj	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{75D70A8D-03ED-439E-96E6-72A0F717A23B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Maestro.AddIn.ResourceEditors</RootNamespace>
+    <AssemblyName>Maestro.AddIn.ResourceEditors</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

Added: sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/Properties/AssemblyInfo.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/Properties/AssemblyInfo.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.AddIn.ResourceEditors/Properties/AssemblyInfo.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Maestro.AddIn.ResourceEditors")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Maestro.AddIn.ResourceEditors")]
+[assembly: AssemblyCopyright("Copyright ©  2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e6e2a226-85bb-4798-8c02-c97d38fabe48")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

Modified: sandbox/maestro-2.5/Maestro.Base/Commands/AboutCommand.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Commands/AboutCommand.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/Commands/AboutCommand.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -20,10 +20,26 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using ICSharpCode.Core;
+using Maestro.Base.UI;
+using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Base.Services;
 
 namespace Maestro.Base.Commands
 {
-    internal class AboutCommand : NotImplementedCommand
+    internal class AboutCommand : AbstractMenuCommand
     {
+        public override void Run()
+        {
+            IServerConnection conn = null;
+            var mgr = ServiceRegistry.GetService<ServerConnectionManager>();
+            var wb = Workbench.Instance;
+            if (wb.ActiveSiteExplorer != null)
+            {
+                conn = mgr.GetConnection(wb.ActiveSiteExplorer.ConnectionName);
+            }
+            var diag = new AboutDialog(conn);
+            diag.ShowDialog();
+        }
     }
 }

Modified: sandbox/maestro-2.5/Maestro.Base/Commands/LoginCommand.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Commands/LoginCommand.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/Commands/LoginCommand.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -20,10 +20,29 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using ICSharpCode.Core;
+using Maestro.Login;
+using ICSharpCode.Core.Services;
+using Maestro.Base.Services;
+using System.Diagnostics;
 
 namespace Maestro.Base.Commands
 {
-    internal class LoginCommand : NotImplementedCommand
+    internal class LoginCommand : AbstractMenuCommand
     {
+        public override void Run()
+        {
+            var login = new LoginDialog();
+            login.Owner = Workbench.Instance;
+            if (login.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                var conn = login.Connection;
+
+                var mgr = ServiceRegistry.GetService<ServerConnectionManager>();
+                Debug.Assert(mgr != null);
+
+                mgr.AddConnection(conn.DisplayName, conn);
+            }
+        }
     }
 }

Modified: sandbox/maestro-2.5/Maestro.Base/Commands/StartupCommand.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Commands/StartupCommand.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/Commands/StartupCommand.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -22,6 +22,8 @@
 using System.Text;
 using ICSharpCode.Core;
 using System.Reflection;
+using Maestro.Base.Services;
+using Maestro.Base.Events;
 
 namespace Maestro.Base.Commands
 {
@@ -32,13 +34,15 @@
             ResourceService.RegisterNeutralImages(Properties.Resources.ResourceManager);
             ResourceService.RegisterNeutralStrings(Properties.Resources.ResourceManager);
 
+            ServiceRegistry.Initialize();
+            EventWatcher.Initialize();
+
             Workbench.WorkbenchInitialized += (sender, e) =>
             {
                 var wb = Workbench.Instance;
                 wb.Text = "MapGuide Maestro";
 
-                //var exp = new UI.SiteExplorer();
-                //wb.ShowContent(exp, ViewRegion.Left);
+                new LoginCommand().Run();
             };
         }
     }

Added: sandbox/maestro-2.5/Maestro.Base/Events/EventWatcher.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Events/EventWatcher.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Base/Events/EventWatcher.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,57 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Maestro.Base.Services;
+using System.Diagnostics;
+using Maestro.Base.UI;
+
+namespace Maestro.Base.Events
+{
+    public static class EventWatcher
+    {
+        internal static void Initialize()
+        {
+            var svc = ServiceRegistry.GetService<ServerConnectionManager>();
+            Debug.Assert(svc != null);
+
+            svc.ConnectionAdded += new ServerConnectionEventHandler(OnConnectionAdded);
+            svc.ConnectionRemoved += new ServerConnectionEventHandler(OnConnectionRemoved);
+        }
+
+        static void OnConnectionRemoved(object sender, string name)
+        {
+            Workbench wb = Workbench.Instance;
+            Debug.Assert(wb.ActiveSiteExplorer != null);
+            Debug.Assert(wb.ActiveSiteExplorer.ConnectionName == name);
+
+            wb.ActiveSiteExplorer = null;
+        }
+
+        static void OnConnectionAdded(object sender, string name)
+        {
+            var exp = new SiteExplorer(name);
+            var wb = Workbench.Instance;
+            wb.ShowContent(exp, ViewRegion.Left);
+            wb.ActiveSiteExplorer = exp;
+        }
+    }
+}

Modified: sandbox/maestro-2.5/Maestro.Base/IViewContent.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/IViewContent.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/IViewContent.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -40,7 +40,7 @@
         /// <summary>
         /// Detrmines if this view can be closed
         /// </summary>
-        bool CanClose { get; }
+        bool AllowUserClose { get; }
         /// <summary>
         /// Closes the view. This raises the <see cref="ViewContentClosing"/> event
         /// </summary>

Modified: sandbox/maestro-2.5/Maestro.Base/Maestro.Base.addin
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Maestro.Base.addin	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/Maestro.Base.addin	2010-05-12 19:58:59 UTC (rev 4860)
@@ -43,6 +43,12 @@
         <Class id="Startup" class="Maestro.Base.Commands.StartupCommand" />
     </Path>
 
+    <!-- Application-level services -->
+    <Path name="/Maestro/ApplicationServices">
+        <Class id="ServerConnectionManager" class="Maestro.Base.Services.ServerConnectionManager" />
+        <Class id="UrlLauncher" class="Maestro.Base.Services.UrlLauncher" />
+    </Path>
+    
     <!-- Toolbar Definition -->
     <Path name="/Maestro/Shell/Toolbars/Main">
 

Modified: sandbox/maestro-2.5/Maestro.Base/Maestro.Base.csproj
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Maestro.Base.csproj	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/Maestro.Base.csproj	2010-05-12 19:58:59 UTC (rev 4860)
@@ -47,6 +47,7 @@
     <Compile Include="Commands\SiteExplorer\DisconnectCommand.cs" />
     <Compile Include="Commands\SiteExplorer\RefreshCommand.cs" />
     <Compile Include="Commands\StartupCommand.cs" />
+    <Compile Include="Events\EventWatcher.cs" />
     <Compile Include="ISubView.cs" />
     <Compile Include="IViewContent.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -55,6 +56,20 @@
       <DesignTime>True</DesignTime>
       <DependentUpon>Resources.resx</DependentUpon>
     </Compile>
+    <Compile Include="Services\ServerConnectionManager.cs" />
+    <Compile Include="Services\ServiceBase.cs" />
+    <Compile Include="Services\ServiceRegistry.cs" />
+    <Compile Include="Services\UrlLauncher.cs" />
+    <Compile Include="UI\AboutDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="UI\EmbeddedWebBrowser.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="UI\EmbeddedWebBrowser.Designer.cs">
+      <DependentUpon>EmbeddedWebBrowser.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UI\ISiteExplorer.cs" />
     <Compile Include="UI\SiteExplorer.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -84,6 +99,14 @@
   </ItemGroup>
   <ItemGroup>
     <Content Include="Maestro.Base.addin" />
+    <None Include="Resources\loading.gif" />
+    <None Include="Resources\navigation.png" />
+    <None Include="Resources\navigation-180-white.png" />
+    <None Include="Resources\navigation-180.png" />
+    <None Include="Resources\navigation-000-white.png" />
+    <None Include="Resources\cross-circle.png" />
+    <None Include="Resources\arrow-180.png" />
+    <None Include="Resources\arrow.png" />
     <None Include="Resources\arrow-circle-045-left.png" />
     <None Include="Resources\plug--minus.png" />
     <None Include="Resources\server.png" />
@@ -95,6 +118,14 @@
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="UI\AboutDialog.resx">
+      <DependentUpon>AboutDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="UI\EmbeddedWebBrowser.resx">
+      <DependentUpon>EmbeddedWebBrowser.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
     <EmbeddedResource Include="UI\SiteExplorer.resx">
       <DependentUpon>SiteExplorer.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -109,6 +140,14 @@
     </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\Maestro.Login\Maestro.Login.csproj">
+      <Project>{07588440-5F9F-4C30-AA06-9CF30BA6DDE6}</Project>
+      <Name>Maestro.Login</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Maestro.Shared.UI\Maestro.Shared.UI.csproj">
+      <Project>{CFD19053-2172-41D3-8460-0FD2123A1E88}</Project>
+      <Name>Maestro.Shared.UI</Name>
+    </ProjectReference>
     <ProjectReference Include="..\OSGeo.MapGuide.MaestroAPI\OSGeo.MapGuide.MaestroAPI.csproj">
       <Project>{80FA3158-8B5F-48D1-A393-0378AFE48A7E}</Project>
       <Name>OSGeo.MapGuide.MaestroAPI</Name>
@@ -124,9 +163,6 @@
       <Private>False</Private>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup>
-    <Folder Include="Services\" />
-  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.

Modified: sandbox/maestro-2.5/Maestro.Base/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Properties/Resources.Designer.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/Properties/Resources.Designer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -60,6 +60,47 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Selected language: {0}, OS Language: {1}.
+        /// </summary>
+        internal static string About_LanguageLabel {
+            get {
+                return ResourceManager.GetString("About_LanguageLabel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to MapGuide Version: {0} ({1}).
+        /// </summary>
+        internal static string About_ServerVersionLabel {
+            get {
+                return ResourceManager.GetString("About_ServerVersionLabel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Version: {0}.
+        /// </summary>
+        internal static string About_VersionLabel {
+            get {
+                return ResourceManager.GetString("About_VersionLabel", resourceCulture);
+            }
+        }
+        
+        internal static System.Drawing.Bitmap arrow {
+            get {
+                object obj = ResourceManager.GetObject("arrow", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap arrow_180 {
+            get {
+                object obj = ResourceManager.GetObject("arrow-180", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap arrow_circle_045_left {
             get {
                 object obj = ResourceManager.GetObject("arrow-circle-045-left", resourceCulture);
@@ -68,6 +109,24 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Done.
+        /// </summary>
+        internal static string Browser_Complete {
+            get {
+                return ResourceManager.GetString("Browser_Complete", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Loading.
+        /// </summary>
+        internal static string Browser_Loading {
+            get {
+                return ResourceManager.GetString("Browser_Loading", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Site Explorer: {0}.
         /// </summary>
         internal static string Content_SiteExplorer {
@@ -76,6 +135,29 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Web Browser.
+        /// </summary>
+        internal static string Content_WebBrowser {
+            get {
+                return ResourceManager.GetString("Content_WebBrowser", resourceCulture);
+            }
+        }
+        
+        internal static System.Drawing.Bitmap cross_circle {
+            get {
+                object obj = ResourceManager.GetObject("cross-circle", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap loading {
+            get {
+                object obj = ResourceManager.GetObject("loading", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Icon MapGuide_Maestro {
             get {
                 object obj = ResourceManager.GetObject("MapGuide_Maestro", resourceCulture);
@@ -146,6 +228,34 @@
             }
         }
         
+        internal static System.Drawing.Bitmap navigation {
+            get {
+                object obj = ResourceManager.GetObject("navigation", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap navigation_000_white {
+            get {
+                object obj = ResourceManager.GetObject("navigation-000-white", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap navigation_180 {
+            get {
+                object obj = ResourceManager.GetObject("navigation-180", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap navigation_180_white {
+            get {
+                object obj = ResourceManager.GetObject("navigation-180-white", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap plug__minus {
             get {
                 object obj = ResourceManager.GetObject("plug--minus", resourceCulture);
@@ -161,6 +271,24 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Initiailized: Server Connection Manager.
+        /// </summary>
+        internal static string Service_Init_Server_Connection_Manager {
+            get {
+                return ResourceManager.GetString("Service_Init_Server_Connection_Manager", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Initialized: URL Launcher.
+        /// </summary>
+        internal static string Service_Init_Url_Launcher {
+            get {
+                return ResourceManager.GetString("Service_Init_Url_Launcher", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Disconnect.
         /// </summary>
         internal static string SiteExplorer_Disconnect {

Modified: sandbox/maestro-2.5/Maestro.Base/Properties/Resources.resx
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Properties/Resources.resx	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/Properties/Resources.resx	2010-05-12 19:58:59 UTC (rev 4860)
@@ -117,47 +117,98 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <data name="Menu_Tools_Options" xml:space="preserve">
+    <value>Options</value>
+  </data>
+  <data name="SiteExplorer_Refresh" xml:space="preserve">
+    <value>Refresh</value>
+  </data>
   <data name="Menu_Help_About" xml:space="preserve">
     <value>About</value>
   </data>
-  <data name="Content_SiteExplorer" xml:space="preserve">
-    <value>Site Explorer: {0}</value>
+  <data name="Menu_File_Quit" xml:space="preserve">
+    <value>Quit</value>
   </data>
-  <data name="Menu_Help" xml:space="preserve">
-    <value>Help</value>
+  <data name="About_VersionLabel" xml:space="preserve">
+    <value>Version: {0}</value>
+    <comment>A label that displays the current version</comment>
   </data>
-  <data name="Menu_Tools" xml:space="preserve">
-    <value>Tools</value>
-  </data>
   <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="plug--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\plug--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="navigation-180-white" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\navigation-180-white.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="Menu_File" xml:space="preserve">
     <value>File</value>
   </data>
-  <data name="Menu_File_Quit" xml:space="preserve">
-    <value>Quit</value>
+  <data name="navigation" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\navigation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="MapGuide_Maestro" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\MapGuide Maestro.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="Menu_File_Login" xml:space="preserve">
+    <value>Login</value>
   </data>
+  <data name="navigation-180" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\navigation-180.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="About_ServerVersionLabel" xml:space="preserve">
+    <value>MapGuide Version: {0} ({1})</value>
+    <comment>A label that displays the version of the current MapGuide server</comment>
+  </data>
+  <data name="arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="arrow-180" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-180.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="server" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="cross-circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\cross-circle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="MapGuide_Maestro" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\MapGuide Maestro.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="navigation-000-white" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\navigation-000-white.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Service_Init_Server_Connection_Manager" xml:space="preserve">
+    <value>Initiailized: Server Connection Manager</value>
+  </data>
+  <data name="Menu_Tools" xml:space="preserve">
+    <value>Tools</value>
+  </data>
+  <data name="Menu_Help" xml:space="preserve">
+    <value>Help</value>
+  </data>
+  <data name="Content_WebBrowser" xml:space="preserve">
+    <value>Web Browser</value>
+  </data>
+  <data name="plug--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\plug--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Content_SiteExplorer" xml:space="preserve">
+    <value>Site Explorer: {0}</value>
+  </data>
+  <data name="Service_Init_Url_Launcher" xml:space="preserve">
+    <value>Initialized: URL Launcher</value>
+  </data>
+  <data name="About_LanguageLabel" xml:space="preserve">
+    <value>Selected language: {0}, OS Language: {1}</value>
+    <comment>A label that displays the current language settings</comment>
+  </data>
   <data name="arrow-circle-045-left" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\arrow-circle-045-left.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="Menu_File_Login" xml:space="preserve">
-    <value>Login</value>
-  </data>
-  <data name="Menu_Tools_Options" xml:space="preserve">
-    <value>Options</value>
-  </data>
   <data name="SiteExplorer_Disconnect" xml:space="preserve">
     <value>Disconnect</value>
   </data>
-  <data name="SiteExplorer_Refresh" xml:space="preserve">
-    <value>Refresh</value>
+  <data name="loading" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\loading.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="Browser_Complete" xml:space="preserve">
+    <value>Done</value>
+  </data>
+  <data name="Browser_Loading" xml:space="preserve">
+    <value>Loading</value>
+  </data>
 </root>
\ No newline at end of file

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


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

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


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

Added: sandbox/maestro-2.5/Maestro.Base/Resources/cross-circle.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-2.5/Maestro.Base/Resources/cross-circle.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-2.5/Maestro.Base/Resources/loading.gif
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-2.5/Maestro.Base/Resources/loading.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-2.5/Maestro.Base/Resources/navigation-000-white.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-2.5/Maestro.Base/Resources/navigation-000-white.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-2.5/Maestro.Base/Resources/navigation-180-white.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-2.5/Maestro.Base/Resources/navigation-180-white.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-2.5/Maestro.Base/Resources/navigation-180.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-2.5/Maestro.Base/Resources/navigation-180.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-2.5/Maestro.Base/Resources/navigation.png
===================================================================
(Binary files differ)


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

Added: sandbox/maestro-2.5/Maestro.Base/Services/ServerConnectionManager.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Services/ServerConnectionManager.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Base/Services/ServerConnectionManager.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,78 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI;
+using ICSharpCode.Core;
+
+namespace Maestro.Base.Services
+{
+    public delegate void ServerConnectionEventHandler(object sender, string name);
+
+    public class ServerConnectionManager : ServiceBase
+    {
+        public event ServerConnectionEventHandler ConnectionAdded;
+        public event ServerConnectionEventHandler ConnectionRemoved;
+
+        private Dictionary<string, IServerConnection> _connections = new Dictionary<string, IServerConnection>();
+
+        public ICollection<string> GetConnectionNames()
+        {
+            return _connections.Keys;
+        }
+
+        public override void Initialize()
+        {
+            base.Initialize();
+            LoggingService.Info(Properties.Resources.Service_Init_Server_Connection_Manager);
+        }
+
+        public IServerConnection GetConnection(string name)
+        {
+            if (_connections.ContainsKey(name))
+                return _connections[name];
+
+            return null;
+        }
+
+        public void AddConnection(string name, IServerConnection conn)
+        {
+            _connections.Add(name, conn);
+            var handler = this.ConnectionAdded;
+            if (handler != null)
+                handler(this, name);
+        }
+
+        public IServerConnection RemoveConnection(string name)
+        {
+            if (_connections.ContainsKey(name))
+            {
+                IServerConnection conn = _connections[name];
+                _connections.Remove(name);
+                var handler = this.ConnectionRemoved;
+                if (handler != null)
+                    handler(this, name);
+                return conn;
+            }
+            return null;
+        }
+    }
+}

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

Added: sandbox/maestro-2.5/Maestro.Base/Services/ServiceRegistry.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Services/ServiceRegistry.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Base/Services/ServiceRegistry.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,51 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using ICSharpCode.Core;
+
+namespace Maestro.Base.Services
+{
+    public static class ServiceRegistry
+    {
+        private static List<ServiceBase> _services;
+
+        internal static void Initialize()
+        {
+            _services = AddInTree.BuildItems<ServiceBase>("/Maestro/ApplicationServices", null);
+            foreach (var svc in _services)
+            {
+                svc.Initialize();
+                svc.Load();
+            }
+        }
+
+        public static T GetService<T>() where T : ServiceBase
+        {
+            foreach (var svc in _services)
+            {
+                if (typeof(T).IsAssignableFrom(svc.GetType()))
+                    return (T)svc;
+            }
+            return null;
+        }
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Base/Services/UrlLauncher.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Services/UrlLauncher.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Base/Services/UrlLauncher.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,56 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using ICSharpCode.Core;
+using System.Diagnostics;
+using Maestro.Base.UI;
+
+namespace Maestro.Base.Services
+{
+    public class UrlLauncher : ServiceBase
+    {
+        public override void Initialize()
+        {
+            base.Initialize();
+            LoggingService.Info(Properties.Resources.Service_Init_Url_Launcher);
+        }
+
+        public void OpenUrl(string url)
+        {
+            OpenUrl(url, false);
+        }
+
+        public void OpenUrl(string url, bool useBuiltInBrowser)
+        {
+            if (useBuiltInBrowser)
+            {
+                var browser = new EmbeddedWebBrowser(url, false);
+                var wb = Workbench.Instance;
+                wb.ShowContent(browser, ViewRegion.Document);
+            }
+            else
+            {
+                Process.Start(url);
+            }
+        }
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Base/UI/AboutDialog.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/UI/AboutDialog.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Base/UI/AboutDialog.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,352 @@
+#region Disclaimer / License
+// Copyright (C) 2009, Kenneth Skovhede
+// http://www.hexad.dk, opensource at hexad.dk
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Base.Services;
+using System.Diagnostics;
+
+namespace Maestro.Base.UI
+{
+	/// <summary>
+	/// Summary description for FormAbout.
+	/// </summary>
+	public class AboutDialog : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.PictureBox pictureBox1;
+		private System.Windows.Forms.LinkLabel linkLabel;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.TextBox License;
+		private System.Windows.Forms.Label Version;
+		private System.Windows.Forms.ToolTip ToolTip;
+		private System.Windows.Forms.PictureBox PayPalImage;
+		private System.ComponentModel.IContainer components;
+		private System.Windows.Forms.Label Localization;
+		private System.Windows.Forms.TabControl tabControl;
+		private System.Windows.Forms.TabPage licenseTab;
+		private System.Windows.Forms.TabPage creditsTab;
+		private System.Windows.Forms.TextBox Credits;
+        private TabPage thirdPartyTab;
+        private LinkLabel tfnetLinkLabel;
+        private Label label2;
+        private LinkLabel ziplibLinkLabel;
+        private Label ServerVersion;
+        private LinkLabel colorBrewerlinkLabel;
+        private LinkLabel lnkSharpDevelop;
+        private LinkLabel linkLabel1;
+        private IServerConnection m_connection;
+
+		private AboutDialog()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+            this.Icon = Properties.Resources.MapGuide_Maestro;
+        }
+
+        public AboutDialog(IServerConnection connection)
+            : this()
+        {
+            m_connection = connection;
+        }
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutDialog));
+            this.pictureBox1 = new System.Windows.Forms.PictureBox();
+            this.linkLabel = new System.Windows.Forms.LinkLabel();
+            this.label1 = new System.Windows.Forms.Label();
+            this.License = new System.Windows.Forms.TextBox();
+            this.Version = new System.Windows.Forms.Label();
+            this.PayPalImage = new System.Windows.Forms.PictureBox();
+            this.ToolTip = new System.Windows.Forms.ToolTip(this.components);
+            this.Localization = new System.Windows.Forms.Label();
+            this.tabControl = new System.Windows.Forms.TabControl();
+            this.licenseTab = new System.Windows.Forms.TabPage();
+            this.creditsTab = new System.Windows.Forms.TabPage();
+            this.Credits = new System.Windows.Forms.TextBox();
+            this.thirdPartyTab = new System.Windows.Forms.TabPage();
+            this.lnkSharpDevelop = new System.Windows.Forms.LinkLabel();
+            this.colorBrewerlinkLabel = new System.Windows.Forms.LinkLabel();
+            this.ziplibLinkLabel = new System.Windows.Forms.LinkLabel();
+            this.tfnetLinkLabel = new System.Windows.Forms.LinkLabel();
+            this.label2 = new System.Windows.Forms.Label();
+            this.ServerVersion = new System.Windows.Forms.Label();
+            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.PayPalImage)).BeginInit();
+            this.tabControl.SuspendLayout();
+            this.licenseTab.SuspendLayout();
+            this.creditsTab.SuspendLayout();
+            this.thirdPartyTab.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pictureBox1
+            // 
+            resources.ApplyResources(this.pictureBox1, "pictureBox1");
+            this.pictureBox1.Name = "pictureBox1";
+            this.pictureBox1.TabStop = false;
+            // 
+            // linkLabel
+            // 
+            resources.ApplyResources(this.linkLabel, "linkLabel");
+            this.linkLabel.Name = "linkLabel";
+            this.linkLabel.TabStop = true;
+            this.linkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel_LinkClicked);
+            // 
+            // label1
+            // 
+            resources.ApplyResources(this.label1, "label1");
+            this.label1.Name = "label1";
+            // 
+            // License
+            // 
+            resources.ApplyResources(this.License, "License");
+            this.License.Name = "License";
+            this.License.ReadOnly = true;
+            // 
+            // Version
+            // 
+            resources.ApplyResources(this.Version, "Version");
+            this.Version.Name = "Version";
+            // 
+            // PayPalImage
+            // 
+            this.PayPalImage.Cursor = System.Windows.Forms.Cursors.Hand;
+            resources.ApplyResources(this.PayPalImage, "PayPalImage");
+            this.PayPalImage.Name = "PayPalImage";
+            this.PayPalImage.TabStop = false;
+            this.ToolTip.SetToolTip(this.PayPalImage, resources.GetString("PayPalImage.ToolTip"));
+            this.PayPalImage.Click += new System.EventHandler(this.PayPalImage_Click);
+            // 
+            // Localization
+            // 
+            resources.ApplyResources(this.Localization, "Localization");
+            this.Localization.Name = "Localization";
+            // 
+            // tabControl
+            // 
+            this.tabControl.Controls.Add(this.licenseTab);
+            this.tabControl.Controls.Add(this.creditsTab);
+            this.tabControl.Controls.Add(this.thirdPartyTab);
+            resources.ApplyResources(this.tabControl, "tabControl");
+            this.tabControl.Name = "tabControl";
+            this.tabControl.SelectedIndex = 0;
+            // 
+            // licenseTab
+            // 
+            this.licenseTab.Controls.Add(this.License);
+            resources.ApplyResources(this.licenseTab, "licenseTab");
+            this.licenseTab.Name = "licenseTab";
+            this.licenseTab.UseVisualStyleBackColor = true;
+            // 
+            // creditsTab
+            // 
+            this.creditsTab.Controls.Add(this.Credits);
+            resources.ApplyResources(this.creditsTab, "creditsTab");
+            this.creditsTab.Name = "creditsTab";
+            this.creditsTab.UseVisualStyleBackColor = true;
+            // 
+            // Credits
+            // 
+            resources.ApplyResources(this.Credits, "Credits");
+            this.Credits.Name = "Credits";
+            this.Credits.ReadOnly = true;
+            // 
+            // thirdPartyTab
+            // 
+            resources.ApplyResources(this.thirdPartyTab, "thirdPartyTab");
+            this.thirdPartyTab.Controls.Add(this.linkLabel1);
+            this.thirdPartyTab.Controls.Add(this.lnkSharpDevelop);
+            this.thirdPartyTab.Controls.Add(this.colorBrewerlinkLabel);
+            this.thirdPartyTab.Controls.Add(this.ziplibLinkLabel);
+            this.thirdPartyTab.Controls.Add(this.tfnetLinkLabel);
+            this.thirdPartyTab.Controls.Add(this.label2);
+            this.thirdPartyTab.Name = "thirdPartyTab";
+            this.thirdPartyTab.UseVisualStyleBackColor = true;
+            // 
+            // lnkSharpDevelop
+            // 
+            resources.ApplyResources(this.lnkSharpDevelop, "lnkSharpDevelop");
+            this.lnkSharpDevelop.Name = "lnkSharpDevelop";
+            this.lnkSharpDevelop.TabStop = true;
+            this.lnkSharpDevelop.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkSharpDevelop_LinkClicked);
+            // 
+            // colorBrewerlinkLabel
+            // 
+            resources.ApplyResources(this.colorBrewerlinkLabel, "colorBrewerlinkLabel");
+            this.colorBrewerlinkLabel.Name = "colorBrewerlinkLabel";
+            this.colorBrewerlinkLabel.TabStop = true;
+            this.colorBrewerlinkLabel.UseCompatibleTextRendering = true;
+            this.colorBrewerlinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkColorBrewer_Clicked);
+            // 
+            // ziplibLinkLabel
+            // 
+            resources.ApplyResources(this.ziplibLinkLabel, "ziplibLinkLabel");
+            this.ziplibLinkLabel.Name = "ziplibLinkLabel";
+            this.ziplibLinkLabel.TabStop = true;
+            this.ziplibLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.ziplibLinkLabel_LinkClicked);
+            // 
+            // tfnetLinkLabel
+            // 
+            resources.ApplyResources(this.tfnetLinkLabel, "tfnetLinkLabel");
+            this.tfnetLinkLabel.Name = "tfnetLinkLabel";
+            this.tfnetLinkLabel.TabStop = true;
+            this.tfnetLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.tfnetLinkLabel_LinkClicked);
+            // 
+            // label2
+            // 
+            resources.ApplyResources(this.label2, "label2");
+            this.label2.Name = "label2";
+            // 
+            // ServerVersion
+            // 
+            resources.ApplyResources(this.ServerVersion, "ServerVersion");
+            this.ServerVersion.Name = "ServerVersion";
+            // 
+            // linkLabel1
+            // 
+            resources.ApplyResources(this.linkLabel1, "linkLabel1");
+            this.linkLabel1.Name = "linkLabel1";
+            this.linkLabel1.TabStop = true;
+            this.linkLabel1.UseCompatibleTextRendering = true;
+            this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkIcons_Clicked);
+            // 
+            // AboutDialog
+            // 
+            resources.ApplyResources(this, "$this");
+            this.Controls.Add(this.ServerVersion);
+            this.Controls.Add(this.tabControl);
+            this.Controls.Add(this.Localization);
+            this.Controls.Add(this.PayPalImage);
+            this.Controls.Add(this.Version);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.linkLabel);
+            this.Controls.Add(this.pictureBox1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "AboutDialog";
+            this.Load += new System.EventHandler(this.FormAbout_Load);
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.PayPalImage)).EndInit();
+            this.tabControl.ResumeLayout(false);
+            this.licenseTab.ResumeLayout(false);
+            this.licenseTab.PerformLayout();
+            this.creditsTab.ResumeLayout(false);
+            this.creditsTab.PerformLayout();
+            this.thirdPartyTab.ResumeLayout(false);
+            this.thirdPartyTab.PerformLayout();
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+        /// <summary>
+        /// Dummy function used to create a thread to read the default locale from
+        /// </summary>
+        private void dummy_function() { }
+
+        private UrlLauncher _launcher;
+
+		private void FormAbout_Load(object sender, System.EventArgs e)
+		{
+            System.Threading.Thread tmp = new System.Threading.Thread(new System.Threading.ThreadStart(dummy_function));
+
+            _launcher = ServiceRegistry.GetService<UrlLauncher>();
+            Debug.Assert(_launcher != null);
+
+			Version.Text = string.Format(Properties.Resources.About_VersionLabel, Application.ProductVersion);
+            Localization.Text = string.Format(Properties.Resources.About_LanguageLabel, System.Threading.Thread.CurrentThread.CurrentUICulture, tmp.CurrentUICulture);
+
+            string version = "Unknown or Not Connected";
+            string match = "unknown version";
+            if (m_connection != null)
+            {
+                version = m_connection.SiteVersion.ToString();
+                for (int i = 0; i < SiteVersions.SiteVersionNumbers.Length; i++)
+                    if (m_connection.SiteVersion == SiteVersions.SiteVersionNumbers[i])
+                        match = ((KnownSiteVersions)i).ToString();
+            }
+
+            ServerVersion.Text = string.Format(Properties.Resources.About_ServerVersionLabel, version, match);
+		}
+
+		private void PayPalImage_Click(object sender, System.EventArgs e)
+		{
+            _launcher.OpenUrl("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=jumpinjackie%40gmail%2ecom&lc=AU&item_name=MapGuide%20Maestro%20Project&currency_code=AUD&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted");
+		}
+
+		private void linkLabel_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
+		{
+            _launcher.OpenUrl(linkLabel.Text);
+		}
+
+        private void tfnetLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            _launcher.OpenUrl("http://code.google.com/p/tf-net/");
+        }
+
+        private void ziplibLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            _launcher.OpenUrl("http://sharpdevelop.net/OpenSource/SharpZipLib/Default.aspx");
+        }
+
+        private void lnkColorBrewer_Clicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            _launcher.OpenUrl("http://colorbrewer.org/");
+        }
+
+        private void lnkSharpDevelop_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            _launcher.OpenUrl("http://sharpdevelop.net/OpenSource/SD/Default.aspx");
+        }
+
+        private void lnkIcons_Clicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            _launcher.OpenUrl("http://p.yusukekamiyamane.com/");
+        }
+	}
+}

Added: sandbox/maestro-2.5/Maestro.Base/UI/AboutDialog.resx
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/UI/AboutDialog.resx	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Base/UI/AboutDialog.resx	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,1602 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="pictureBox1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>364, 32</value>
+  </data>
+  <data name="pictureBox1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>256, 256</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="pictureBox1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;pictureBox1.Name" xml:space="preserve">
+    <value>pictureBox1</value>
+  </data>
+  <data name="&gt;&gt;pictureBox1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;pictureBox1.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;pictureBox1.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="linkLabel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>16, 294</value>
+  </data>
+  <data name="linkLabel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>328, 16</value>
+  </data>
+  <data name="linkLabel.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="linkLabel.Text" xml:space="preserve">
+    <value>http://trac.osgeo.org/mapguide/wiki/maestro</value>
+  </data>
+  <data name="&gt;&gt;linkLabel.Name" xml:space="preserve">
+    <value>linkLabel</value>
+  </data>
+  <data name="&gt;&gt;linkLabel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;linkLabel.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;linkLabel.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="label1.Font" type="System.Drawing.Font, System.Drawing">
+    <value>Microsoft Sans Serif, 14.25pt</value>
+  </data>
+  <data name="label1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>16, 8</value>
+  </data>
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>328, 24</value>
+  </data>
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="label1.Text" xml:space="preserve">
+    <value>MapGuide Maestro</value>
+  </data>
+  <data name="&gt;&gt;label1.Name" xml:space="preserve">
+    <value>label1</value>
+  </data>
+  <data name="&gt;&gt;label1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label1.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="License.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="License.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="License.Multiline" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="License.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
+    <value>Vertical</value>
+  </data>
+  <data name="License.Size" type="System.Drawing.Size, System.Drawing">
+    <value>320, 142</value>
+  </data>
+  <data name="License.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="License.Text" xml:space="preserve">
+    <value>Copyright (C) 2009, Kenneth Skovhede
+http://www.hexad.dk, opensource at hexad.dk
+
+Copyright (C) 2010, Jackie Ng (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</value>
+  </data>
+  <data name="&gt;&gt;License.Name" xml:space="preserve">
+    <value>License</value>
+  </data>
+  <data name="&gt;&gt;License.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;License.Parent" xml:space="preserve">
+    <value>licenseTab</value>
+  </data>
+  <data name="&gt;&gt;License.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="Version.Location" type="System.Drawing.Point, System.Drawing">
+    <value>16, 32</value>
+  </data>
+  <data name="Version.Size" type="System.Drawing.Size, System.Drawing">
+    <value>328, 16</value>
+  </data>
+  <data name="Version.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="Version.Text" xml:space="preserve">
+    <value>label2</value>
+  </data>
+  <data name="&gt;&gt;Version.Name" xml:space="preserve">
+    <value>Version</value>
+  </data>
+  <data name="&gt;&gt;Version.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;Version.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;Version.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="PayPalImage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="PayPalImage.Location" type="System.Drawing.Point, System.Drawing">
+    <value>352, 8</value>
+  </data>
+  <data name="PayPalImage.Size" type="System.Drawing.Size, System.Drawing">
+    <value>72, 24</value>
+  </data>
+  <data name="PayPalImage.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="PayPalImage.ToolTip" xml:space="preserve">
+    <value>Click here to open the donation page</value>
+  </data>
+  <data name="&gt;&gt;PayPalImage.Name" xml:space="preserve">
+    <value>PayPalImage</value>
+  </data>
+  <data name="&gt;&gt;PayPalImage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;PayPalImage.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;PayPalImage.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="Localization.Location" type="System.Drawing.Point, System.Drawing">
+    <value>16, 64</value>
+  </data>
+  <data name="Localization.Size" type="System.Drawing.Size, System.Drawing">
+    <value>328, 16</value>
+  </data>
+  <data name="Localization.TabIndex" type="System.Int32, mscorlib">
+    <value>6</value>
+  </data>
+  <data name="Localization.Text" xml:space="preserve">
+    <value>label2</value>
+  </data>
+  <data name="&gt;&gt;Localization.Name" xml:space="preserve">
+    <value>Localization</value>
+  </data>
+  <data name="&gt;&gt;Localization.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;Localization.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;Localization.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="licenseTab.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="licenseTab.Size" type="System.Drawing.Size, System.Drawing">
+    <value>320, 142</value>
+  </data>
+  <data name="licenseTab.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="licenseTab.Text" xml:space="preserve">
+    <value>License</value>
+  </data>
+  <data name="&gt;&gt;licenseTab.Name" xml:space="preserve">
+    <value>licenseTab</value>
+  </data>
+  <data name="&gt;&gt;licenseTab.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;licenseTab.Parent" xml:space="preserve">
+    <value>tabControl</value>
+  </data>
+  <data name="&gt;&gt;licenseTab.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;Credits.Name" xml:space="preserve">
+    <value>Credits</value>
+  </data>
+  <data name="&gt;&gt;Credits.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;Credits.Parent" xml:space="preserve">
+    <value>creditsTab</value>
+  </data>
+  <data name="&gt;&gt;Credits.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="creditsTab.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="creditsTab.Size" type="System.Drawing.Size, System.Drawing">
+    <value>320, 142</value>
+  </data>
+  <data name="creditsTab.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="creditsTab.Text" xml:space="preserve">
+    <value>Credits</value>
+  </data>
+  <data name="&gt;&gt;creditsTab.Name" xml:space="preserve">
+    <value>creditsTab</value>
+  </data>
+  <data name="&gt;&gt;creditsTab.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;creditsTab.Parent" xml:space="preserve">
+    <value>tabControl</value>
+  </data>
+  <data name="&gt;&gt;creditsTab.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="thirdPartyTab.AutoScroll" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="linkLabel1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="linkLabel1.LinkArea" type="System.Windows.Forms.LinkArea, System.Windows.Forms">
+    <value>55, 29</value>
+  </data>
+  <data name="linkLabel1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>11, 101</value>
+  </data>
+  <data name="linkLabel1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>304, 45</value>
+  </data>
+  <data name="linkLabel1.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="linkLabel1.Text" xml:space="preserve">
+    <value>This product uses icons produced by Yusuke Kamiyamane (http://p.yusukekamiyamane.com) licensed under Creative Commons 3.0</value>
+  </data>
+  <data name="&gt;&gt;linkLabel1.Name" xml:space="preserve">
+    <value>linkLabel1</value>
+  </data>
+  <data name="&gt;&gt;linkLabel1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;linkLabel1.Parent" xml:space="preserve">
+    <value>thirdPartyTab</value>
+  </data>
+  <data name="&gt;&gt;linkLabel1.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="lnkSharpDevelop.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="lnkSharpDevelop.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="lnkSharpDevelop.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 30</value>
+  </data>
+  <data name="lnkSharpDevelop.Size" type="System.Drawing.Size, System.Drawing">
+    <value>103, 13</value>
+  </data>
+  <data name="lnkSharpDevelop.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="lnkSharpDevelop.Text" xml:space="preserve">
+    <value>Sharp Develop Core</value>
+  </data>
+  <data name="&gt;&gt;lnkSharpDevelop.Name" xml:space="preserve">
+    <value>lnkSharpDevelop</value>
+  </data>
+  <data name="&gt;&gt;lnkSharpDevelop.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;lnkSharpDevelop.Parent" xml:space="preserve">
+    <value>thirdPartyTab</value>
+  </data>
+  <data name="&gt;&gt;lnkSharpDevelop.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="colorBrewerlinkLabel.LinkArea" type="System.Windows.Forms.LinkArea, System.Windows.Forms">
+    <value>84, 23</value>
+  </data>
+  <data name="colorBrewerlinkLabel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>11, 146</value>
+  </data>
+  <data name="colorBrewerlinkLabel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>304, 32</value>
+  </data>
+  <data name="colorBrewerlinkLabel.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="colorBrewerlinkLabel.Text" xml:space="preserve">
+    <value>This product includes color specifications and designs developed by Cynthia Brewer (http://colorbrewer.org/).</value>
+  </data>
+  <data name="&gt;&gt;colorBrewerlinkLabel.Name" xml:space="preserve">
+    <value>colorBrewerlinkLabel</value>
+  </data>
+  <data name="&gt;&gt;colorBrewerlinkLabel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;colorBrewerlinkLabel.Parent" xml:space="preserve">
+    <value>thirdPartyTab</value>
+  </data>
+  <data name="&gt;&gt;colorBrewerlinkLabel.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="ziplibLinkLabel.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="ziplibLinkLabel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 75</value>
+  </data>
+  <data name="ziplibLinkLabel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>80, 13</value>
+  </data>
+  <data name="ziplibLinkLabel.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="ziplibLinkLabel.Text" xml:space="preserve">
+    <value>ICSharp Zip Lib</value>
+  </data>
+  <data name="&gt;&gt;ziplibLinkLabel.Name" xml:space="preserve">
+    <value>ziplibLinkLabel</value>
+  </data>
+  <data name="&gt;&gt;ziplibLinkLabel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ziplibLinkLabel.Parent" xml:space="preserve">
+    <value>thirdPartyTab</value>
+  </data>
+  <data name="&gt;&gt;ziplibLinkLabel.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="tfnetLinkLabel.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="tfnetLinkLabel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 52</value>
+  </data>
+  <data name="tfnetLinkLabel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>181, 13</value>
+  </data>
+  <data name="tfnetLinkLabel.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="tfnetLinkLabel.Text" xml:space="preserve">
+    <value>Topology Framework .NET (TF.NET)</value>
+  </data>
+  <data name="&gt;&gt;tfnetLinkLabel.Name" xml:space="preserve">
+    <value>tfnetLinkLabel</value>
+  </data>
+  <data name="&gt;&gt;tfnetLinkLabel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;tfnetLinkLabel.Parent" xml:space="preserve">
+    <value>thirdPartyTab</value>
+  </data>
+  <data name="&gt;&gt;tfnetLinkLabel.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="label2.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label2.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 8</value>
+  </data>
+  <data name="label2.Size" type="System.Drawing.Size, System.Drawing">
+    <value>239, 13</value>
+  </data>
+  <data name="label2.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="label2.Text" xml:space="preserve">
+    <value>This program uses the following thirdparty libraries</value>
+  </data>
+  <data name="&gt;&gt;label2.Name" xml:space="preserve">
+    <value>label2</value>
+  </data>
+  <data name="&gt;&gt;label2.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label2.Parent" xml:space="preserve">
+    <value>thirdPartyTab</value>
+  </data>
+  <data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="thirdPartyTab.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="thirdPartyTab.Size" type="System.Drawing.Size, System.Drawing">
+    <value>320, 185</value>
+  </data>
+  <data name="thirdPartyTab.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="thirdPartyTab.Text" xml:space="preserve">
+    <value>Thirdparty</value>
+  </data>
+  <data name="&gt;&gt;thirdPartyTab.Name" xml:space="preserve">
+    <value>thirdPartyTab</value>
+  </data>
+  <data name="&gt;&gt;thirdPartyTab.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;thirdPartyTab.Parent" xml:space="preserve">
+    <value>tabControl</value>
+  </data>
+  <data name="&gt;&gt;thirdPartyTab.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="tabControl.Location" type="System.Drawing.Point, System.Drawing">
+    <value>16, 80</value>
+  </data>
+  <data name="tabControl.Size" type="System.Drawing.Size, System.Drawing">
+    <value>328, 211</value>
+  </data>
+  <data name="tabControl.TabIndex" type="System.Int32, mscorlib">
+    <value>7</value>
+  </data>
+  <data name="&gt;&gt;tabControl.Name" xml:space="preserve">
+    <value>tabControl</value>
+  </data>
+  <data name="&gt;&gt;tabControl.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;tabControl.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;tabControl.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="Credits.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="Credits.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="Credits.Multiline" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="Credits.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
+    <value>Vertical</value>
+  </data>
+  <data name="Credits.Size" type="System.Drawing.Size, System.Drawing">
+    <value>320, 142</value>
+  </data>
+  <data name="Credits.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="Credits.Text" xml:space="preserve">
+    <value>Programming:
+  Kenneth Skovhede
+  Jackie NG
+  Crispin, 1Spatial Group Ltd
+Spanish translation:
+  José Manuel Cerrejón González
+French Translation:
+  Pierre Cardinal
+Artwork:
+  Kenneth Skovhede
+English and Danish translation:
+  Kenneth Skovhede</value>
+  </data>
+  <data name="&gt;&gt;Credits.Name" xml:space="preserve">
+    <value>Credits</value>
+  </data>
+  <data name="&gt;&gt;Credits.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;Credits.Parent" xml:space="preserve">
+    <value>creditsTab</value>
+  </data>
+  <data name="&gt;&gt;Credits.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="ServerVersion.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="ServerVersion.Location" type="System.Drawing.Point, System.Drawing">
+    <value>16, 48</value>
+  </data>
+  <data name="ServerVersion.Size" type="System.Drawing.Size, System.Drawing">
+    <value>328, 16</value>
+  </data>
+  <data name="ServerVersion.TabIndex" type="System.Int32, mscorlib">
+    <value>8</value>
+  </data>
+  <data name="ServerVersion.Text" xml:space="preserve">
+    <value>label2</value>
+  </data>
+  <data name="&gt;&gt;ServerVersion.Name" xml:space="preserve">
+    <value>ServerVersion</value>
+  </data>
+  <data name="&gt;&gt;ServerVersion.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ServerVersion.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;ServerVersion.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing">
+    <value>5, 13</value>
+  </data>
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+    <value>632, 319</value>
+  </data>
+  <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
+    <value>CenterParent</value>
+  </data>
+  <data name="$this.Text" xml:space="preserve">
+    <value>About...</value>
+  </data>
+  <data name="&gt;&gt;ToolTip.Name" xml:space="preserve">
+    <value>ToolTip</value>
+  </data>
+  <data name="&gt;&gt;ToolTip.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolTip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>AboutDialog</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+</root>
\ No newline at end of file

Added: sandbox/maestro-2.5/Maestro.Base/UI/EmbeddedWebBrowser.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/UI/EmbeddedWebBrowser.Designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Base/UI/EmbeddedWebBrowser.Designer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,211 @@
+namespace Maestro.Base.UI
+{
+    partial class EmbeddedWebBrowser
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.navToolstrip = new System.Windows.Forms.ToolStrip();
+            this.btnBack = new System.Windows.Forms.ToolStripButton();
+            this.btnForward = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.btnRefresh = new System.Windows.Forms.ToolStripButton();
+            this.btnStop = new System.Windows.Forms.ToolStripButton();
+            this.loadingIndicator = new System.Windows.Forms.ToolStripProgressBar();
+            this.btnGo = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.txtUrl = new Maestro.Shared.UI.ToolStripSpringTextBox();
+            this.lblUrl = new System.Windows.Forms.ToolStripLabel();
+            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+            this.lblStatus = new System.Windows.Forms.ToolStripStatusLabel();
+            this.browser = new System.Windows.Forms.WebBrowser();
+            this.navToolstrip.SuspendLayout();
+            this.statusStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // navToolstrip
+            // 
+            this.navToolstrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnBack,
+            this.btnForward,
+            this.toolStripSeparator1,
+            this.btnRefresh,
+            this.btnStop,
+            this.loadingIndicator,
+            this.btnGo,
+            this.toolStripSeparator2,
+            this.txtUrl,
+            this.lblUrl});
+            this.navToolstrip.Location = new System.Drawing.Point(0, 0);
+            this.navToolstrip.Name = "navToolstrip";
+            this.navToolstrip.Size = new System.Drawing.Size(515, 25);
+            this.navToolstrip.TabIndex = 0;
+            this.navToolstrip.Text = "toolStrip1";
+            // 
+            // btnBack
+            // 
+            this.btnBack.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnBack.Image = global::Maestro.Base.Properties.Resources.arrow_180;
+            this.btnBack.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnBack.Name = "btnBack";
+            this.btnBack.Size = new System.Drawing.Size(23, 22);
+            this.btnBack.Text = "toolStripButton1";
+            this.btnBack.Click += new System.EventHandler(this.btnBack_Click);
+            // 
+            // btnForward
+            // 
+            this.btnForward.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnForward.Image = global::Maestro.Base.Properties.Resources.arrow;
+            this.btnForward.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnForward.Name = "btnForward";
+            this.btnForward.Size = new System.Drawing.Size(23, 22);
+            this.btnForward.Text = "toolStripButton2";
+            this.btnForward.Click += new System.EventHandler(this.btnForward_Click);
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+            // 
+            // btnRefresh
+            // 
+            this.btnRefresh.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnRefresh.Image = global::Maestro.Base.Properties.Resources.arrow_circle_045_left;
+            this.btnRefresh.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnRefresh.Name = "btnRefresh";
+            this.btnRefresh.Size = new System.Drawing.Size(23, 22);
+            this.btnRefresh.Text = "toolStripButton5";
+            this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
+            // 
+            // btnStop
+            // 
+            this.btnStop.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnStop.Image = global::Maestro.Base.Properties.Resources.cross_circle;
+            this.btnStop.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnStop.Name = "btnStop";
+            this.btnStop.Size = new System.Drawing.Size(23, 22);
+            this.btnStop.Text = "toolStripButton3";
+            this.btnStop.Click += new System.EventHandler(this.btnStop_Click);
+            // 
+            // loadingIndicator
+            // 
+            this.loadingIndicator.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+            this.loadingIndicator.Name = "loadingIndicator";
+            this.loadingIndicator.Size = new System.Drawing.Size(50, 22);
+            this.loadingIndicator.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
+            this.loadingIndicator.Visible = false;
+            // 
+            // btnGo
+            // 
+            this.btnGo.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+            this.btnGo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.btnGo.Image = global::Maestro.Base.Properties.Resources.navigation_000_white;
+            this.btnGo.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnGo.Name = "btnGo";
+            this.btnGo.Size = new System.Drawing.Size(23, 22);
+            this.btnGo.Text = "toolStripButton4";
+            this.btnGo.Click += new System.EventHandler(this.btnGo_Click);
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+            // 
+            // txtUrl
+            // 
+            this.txtUrl.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+            this.txtUrl.Name = "txtUrl";
+            this.txtUrl.Size = new System.Drawing.Size(247, 25);
+            // 
+            // lblUrl
+            // 
+            this.lblUrl.Name = "lblUrl";
+            this.lblUrl.Size = new System.Drawing.Size(46, 22);
+            this.lblUrl.Text = "Address";
+            // 
+            // statusStrip1
+            // 
+            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.lblStatus});
+            this.statusStrip1.Location = new System.Drawing.Point(0, 370);
+            this.statusStrip1.Name = "statusStrip1";
+            this.statusStrip1.Size = new System.Drawing.Size(515, 22);
+            this.statusStrip1.TabIndex = 1;
+            this.statusStrip1.Text = "statusStrip1";
+            // 
+            // lblStatus
+            // 
+            this.lblStatus.Name = "lblStatus";
+            this.lblStatus.Size = new System.Drawing.Size(0, 17);
+            // 
+            // browser
+            // 
+            this.browser.AllowWebBrowserDrop = false;
+            this.browser.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.browser.IsWebBrowserContextMenuEnabled = false;
+            this.browser.Location = new System.Drawing.Point(0, 25);
+            this.browser.MinimumSize = new System.Drawing.Size(20, 20);
+            this.browser.Name = "browser";
+            this.browser.ScriptErrorsSuppressed = true;
+            this.browser.Size = new System.Drawing.Size(515, 345);
+            this.browser.TabIndex = 2;
+            // 
+            // EmbeddedWebBrowser
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.browser);
+            this.Controls.Add(this.statusStrip1);
+            this.Controls.Add(this.navToolstrip);
+            this.Name = "EmbeddedWebBrowser";
+            this.Size = new System.Drawing.Size(515, 392);
+            this.navToolstrip.ResumeLayout(false);
+            this.navToolstrip.PerformLayout();
+            this.statusStrip1.ResumeLayout(false);
+            this.statusStrip1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ToolStrip navToolstrip;
+        private System.Windows.Forms.ToolStripButton btnBack;
+        private System.Windows.Forms.ToolStripButton btnForward;
+        private System.Windows.Forms.ToolStripButton btnRefresh;
+        private System.Windows.Forms.ToolStripButton btnStop;
+        private System.Windows.Forms.ToolStripButton btnGo;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+        private Maestro.Shared.UI.ToolStripSpringTextBox txtUrl;
+        private System.Windows.Forms.ToolStripLabel lblUrl;
+        private System.Windows.Forms.ToolStripProgressBar loadingIndicator;
+        private System.Windows.Forms.StatusStrip statusStrip1;
+        private System.Windows.Forms.WebBrowser browser;
+        private System.Windows.Forms.ToolStripStatusLabel lblStatus;
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Base/UI/EmbeddedWebBrowser.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/UI/EmbeddedWebBrowser.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Base/UI/EmbeddedWebBrowser.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,357 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+//TODO: ToolStripSpringTextBox doesn't properly draw in Mono
+
+namespace Maestro.Base.UI
+{
+    public partial class EmbeddedWebBrowser : ViewContentBase, IWebBrowserView
+    {
+        public EmbeddedWebBrowser()
+        {
+            InitializeComponent();
+            this.Title = Properties.Resources.Content_WebBrowser;
+        }
+
+        private WebBrowserPresenter _presenter;
+
+        /// <summary>
+        /// Indicates whether this browser is locked (ie. User cannot navigate to other pages)
+        /// </summary>
+        public bool IsLockedDown
+        {
+            get { return !navToolstrip.Visible; }
+            set { navToolstrip.Visible = !value; }
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            base.OnLoad(e);
+            _presenter = new WebBrowserPresenter(this);
+            if (!string.IsNullOrEmpty(_initUrl))
+            {
+                txtUrl.Text = _initUrl;
+                _presenter.NavigateToUrl(_initUrl);
+            }
+        }
+
+        private string _initUrl = "";
+
+        public string Url
+        {
+            get { return txtUrl.Text; }
+        }
+
+        public EmbeddedWebBrowser(string initialUrl)
+            : this(initialUrl, false)
+        { }
+
+        public EmbeddedWebBrowser(string initialUrl, bool locked) : this()
+        {
+            _initUrl = initialUrl;
+            this.IsLockedDown = locked;
+        }
+
+        private void btnBack_Click(object sender, EventArgs e)
+        {
+            var handler = this.GoBack;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        private void btnForward_Click(object sender, EventArgs e)
+        {
+            var handler = this.GoForward;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        private void btnRefresh_Click(object sender, EventArgs e)
+        {
+            var handler = this.RefreshPage;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        private void btnStop_Click(object sender, EventArgs e)
+        {
+            var handler = this.StopLoading;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        private void btnGo_Click(object sender, EventArgs e)
+        {
+            var handler = this.Navigate;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        bool IWebBrowserView.GoBackEnabled
+        {
+            get
+            {
+                return btnBack.Enabled;
+            }
+            set
+            {
+                btnBack.Enabled = value;
+            }
+        }
+
+        bool IWebBrowserView.GoForwardEnabled
+        {
+            get
+            {
+                return btnForward.Enabled;
+            }
+            set
+            {
+                btnForward.Enabled = value;
+            }
+        }
+
+        bool IWebBrowserView.StopEnabled
+        {
+            get
+            {
+                return btnStop.Enabled;
+            }
+            set
+            {
+                btnStop.Enabled = value;
+            }
+        }
+
+        bool IWebBrowserView.ShowLoadingIndicator
+        {
+            get
+            {
+                return loadingIndicator.Visible;
+            }
+            set
+            {
+                loadingIndicator.Visible = value;
+            }
+        }
+
+        void IWebBrowserView.Back()
+        {
+            browser.GoBack();
+        }
+
+        void IWebBrowserView.Forward()
+        {
+            browser.GoForward();
+        }
+
+        void IWebBrowserView.Refresh()
+        {
+            browser.Refresh(WebBrowserRefreshOption.Completely);
+        }
+
+        void IWebBrowserView.Stop()
+        {
+            browser.Stop();
+        }
+
+        public event EventHandler GoBack;
+
+        public event EventHandler GoForward;
+
+        public event EventHandler RefreshPage;
+
+        public event EventHandler StopLoading;
+
+        public event EventHandler Navigate;
+
+        public event EventHandler BrowserLoading;
+
+        public event EventHandler BrowserLoaded;
+
+        private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
+        {
+            var handler = this.BrowserLoaded;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        private void browser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
+        {
+            var handler = this.BrowserLoading;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        void IWebBrowserView.NavigateToUrl(string url)
+        {
+            browser.Navigate(url);
+        }
+
+        void IWebBrowserView.SetStatusText(string text)
+        {
+            lblStatus.Text = text;
+        }
+    }
+
+    internal interface IWebBrowserView
+    {
+        event EventHandler GoBack;
+        event EventHandler GoForward;
+        event EventHandler RefreshPage;
+        event EventHandler StopLoading;
+        event EventHandler Navigate;
+
+        event EventHandler BrowserLoading;
+        event EventHandler BrowserLoaded;
+
+        string Url { get; }
+
+        bool GoBackEnabled { get; set; }
+        bool GoForwardEnabled { get; set; }
+        bool StopEnabled { get; set; }
+        bool ShowLoadingIndicator { get; set; }
+
+        void Back();
+        void Forward();
+        void Refresh();
+        void Stop();
+        void NavigateToUrl(string url);
+        void SetStatusText(string text);
+    }
+
+    internal class WebBrowserPresenter
+    {
+        private readonly IWebBrowserView _view;
+        private List<string> _urls;
+        private int _position = -1;
+
+        public WebBrowserPresenter(IWebBrowserView view)
+        {
+            _urls = new List<string>();
+
+            _view = view;
+            _view.BrowserLoaded += new EventHandler(OnBrowserLoaded);
+            _view.BrowserLoading += new EventHandler(OnBrowserLoading);
+            _view.GoBack += new EventHandler(OnGoBack);
+            _view.GoForward += new EventHandler(OnGoForward);
+            _view.Navigate += new EventHandler(OnNavigate);
+            _view.RefreshPage += new EventHandler(OnRefreshPage);
+            _view.StopLoading += new EventHandler(OnStopLoading);
+
+            _view.GoBackEnabled = HasHistory();
+            _view.GoForwardEnabled = IsCurrentUrl();
+        }
+
+        void OnStopLoading(object sender, EventArgs e)
+        {
+            _view.Stop();
+            _view.StopEnabled = false;
+            _view.GoBackEnabled = HasHistory();
+            _view.GoForwardEnabled = IsCurrentUrl();
+        }
+
+        private bool IsCurrentUrl()
+        {
+            return _position == _urls.Count - 1;
+        }
+
+        private bool HasHistory()
+        {
+            return _position > 0;
+        }
+
+        private void PruneForwardUrls()
+        {
+            for (int i = _urls.Count; i > _position; i--)
+            {
+                _urls.RemoveAt(i);
+            }
+        }
+
+        void OnRefreshPage(object sender, EventArgs e)
+        {
+            _view.Refresh();
+        }
+
+        void OnNavigate(object sender, EventArgs e)
+        {
+            NavigateToUrl(_view.Url);
+        }
+
+        internal void NavigateToUrl(string url)
+        {
+            //If same url, refresh instead
+            if (_position >= 0)
+            {
+                if (_urls[_position] == url)
+                    _view.Refresh();
+            }
+
+            //Otherwise if we're not at the current url, prune any urls
+            //ahead.
+            if (!IsCurrentUrl())
+                PruneForwardUrls();
+
+            //Now navigate
+            _urls.Add(url);
+            _view.NavigateToUrl(url);
+            _position++;
+
+            _view.GoBackEnabled = HasHistory();
+            _view.GoForwardEnabled = IsCurrentUrl();
+        }
+
+        void OnGoForward(object sender, EventArgs e)
+        {
+            _view.Forward();
+            _view.GoBackEnabled = HasHistory();
+            _view.GoForwardEnabled = IsCurrentUrl();
+        }
+
+        void OnGoBack(object sender, EventArgs e)
+        {
+            _view.Back();
+            _view.GoBackEnabled = HasHistory();
+            _view.GoForwardEnabled = IsCurrentUrl();
+        }
+
+        void OnBrowserLoading(object sender, EventArgs e)
+        {
+            _view.ShowLoadingIndicator = true;
+            _view.StopEnabled = true;
+            _view.SetStatusText(Properties.Resources.Browser_Loading);
+        }
+
+        void OnBrowserLoaded(object sender, EventArgs e)
+        {
+            _view.ShowLoadingIndicator = false;
+            _view.StopEnabled = false;
+            _view.SetStatusText(Properties.Resources.Browser_Complete);
+        }
+    }
+}

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

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

Modified: sandbox/maestro-2.5/Maestro.Base/UI/SiteExplorer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/UI/SiteExplorer.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/UI/SiteExplorer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -28,17 +28,28 @@
 
 namespace Maestro.Base.UI
 {
-    public partial class SiteExplorer : ViewContentBase
+    public partial class SiteExplorer : ViewContentBase, ISiteExplorer
     {
         private ToolStrip toolStrip;
         private TreeView trvResources;
         private ContextMenuStrip trvContextMenu;
 
-        public SiteExplorer()
+        internal SiteExplorer()
         {
             InitializeComponent();
         }
 
+        public string ConnectionName
+        {
+            get;
+            private set;
+        }
+
+        public SiteExplorer(string name) : this()
+        {
+            this.ConnectionName = name;
+        }
+
         protected override void OnLoad(EventArgs e)
         {
             this.Title = string.Format(Properties.Resources.Content_SiteExplorer, "Test");

Modified: sandbox/maestro-2.5/Maestro.Base/ViewContentBase.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/ViewContentBase.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/ViewContentBase.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -61,7 +61,7 @@
 
         public event EventHandler TitleChanged;
 
-        public virtual bool CanClose
+        public virtual bool AllowUserClose
         {
             get { return true; }
         }

Modified: sandbox/maestro-2.5/Maestro.Base/Workbench.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Workbench.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/Workbench.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -27,6 +27,7 @@
 using ICSharpCode.Core.WinForms;
 using ICSharpCode.Core;
 using ICSharpCode.Core.Services;
+using Maestro.Base.UI;
 
 namespace Maestro.Base
 {
@@ -256,6 +257,15 @@
         }
 
         /// <summary>
+        /// Gets the active site explorer
+        /// </summary>
+        public ISiteExplorer ActiveSiteExplorer
+        {
+            get;
+            internal set;
+        }
+
+        /// <summary>
         /// Shows the content.
         /// </summary>
         /// <param name="vc">The vc.</param>

Modified: sandbox/maestro-2.5/Maestro.Base/ZonedContainer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/ZonedContainer.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/Maestro.Base/ZonedContainer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -76,6 +76,7 @@
 
             var page = TabFactory.CreateTab(content, null);
             zone.TabPages.Add(page);
+            zone.SelectedTab = page;
             CheckContainerStatus();
         }
     }


Property changes on: sandbox/maestro-2.5/Maestro.Editors
___________________________________________________________________
Added: svn:ignore
   + bin
obj


Added: sandbox/maestro-2.5/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Maestro.Editors.csproj	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Maestro.Editors.csproj	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5AD2CDBA-952E-4148-98A1-31D2E0D540D5}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Maestro.Editors</RootNamespace>
+    <AssemblyName>Maestro.Editors</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="FeatureSource\" />
+    <Folder Include="Generic\" />
+    <Folder Include="LayerDefinition\" />
+    <Folder Include="PrintLayout\" />
+    <Folder Include="WebLayout\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

Added: sandbox/maestro-2.5/Maestro.Editors/Properties/AssemblyInfo.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Properties/AssemblyInfo.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Properties/AssemblyInfo.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Maestro.Editors")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Maestro.Editors")]
+[assembly: AssemblyCopyright("Copyright ©  2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("298ab7aa-21f0-4540-a89c-75dc26598063")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]


Property changes on: sandbox/maestro-2.5/Maestro.Login
___________________________________________________________________
Added: svn:ignore
   + bin
obj


Added: sandbox/maestro-2.5/Maestro.Login/HttpLoginCtrl.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/HttpLoginCtrl.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/HttpLoginCtrl.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,208 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.Globalization;
+
+namespace Maestro.Login
+{
+    public partial class HttpLoginCtrl : UserControl, ILoginCtrl
+    {
+        private bool _loading = true;
+
+        public HttpLoginCtrl()
+        {
+            InitializeComponent();
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            base.OnLoad(e);
+
+            List<CultureInfo> supported = new List<CultureInfo>();
+            supported.Add(CultureInfo.GetCultureInfo("en-US"));
+
+            //Probe for language bundles and add them as well
+            System.Text.RegularExpressions.Regex cix = new System.Text.RegularExpressions.Regex("[A-z][A-z](\\-[A-z][A-z])?");
+            foreach (string f in System.IO.Directory.GetDirectories(Application.StartupPath))
+            {
+                if (cix.Match(System.IO.Path.GetFileName(f)).Length == System.IO.Path.GetFileName(f).Length)
+                {
+                    try
+                    {
+                        supported.Add(System.Globalization.CultureInfo.GetCultureInfo(System.IO.Path.GetFileName(f)));
+                    }
+                    catch { }
+                }
+            }
+
+            cmbLanguage.DisplayMember = "DisplayName";
+            cmbLanguage.ValueMember = "Name";
+
+            //Set default language based on current thread culture
+            int selected = -1;
+            foreach (var ci in supported)
+            {
+                int index = cmbLanguage.Items.Add(ci);
+                if (string.Compare(ci.Name, System.Threading.Thread.CurrentThread.CurrentUICulture.Name, true) == 0)
+                {
+                    selected = index;
+                }
+            }
+
+            if (selected >= 0)
+                cmbLanguage.SelectedIndex = selected;
+
+            _loading = false;
+            UpdateButtonStatus();
+        }
+
+        public PreferedSite[] GetSites()
+        {
+            List<PreferedSite> items = new List<PreferedSite>();
+            foreach (PreferedSite s in cmbServerUrl.Items)
+            {
+                items.Add(s);
+            }
+            return items.ToArray();
+        }
+
+        public void AddSites(PreferedSite[] sites)
+        {
+            cmbServerUrl.Items.AddRange(sites);
+        }
+
+        public void SetPreferredSite(int index)
+        {
+            cmbServerUrl.SelectedIndex = index;
+        }
+
+        #region ILoginCtrl Members
+
+        public string Username
+        {
+            get { return txtUsername.Text; }
+            set { txtUsername.Text = value; }
+        }
+
+        public string Password
+        {
+            get { return txtPassword.Text; }
+            set { txtPassword.Text = value; }
+        }
+
+        #endregion
+
+        public string Server
+        {
+            get { return cmbServerUrl.Text; }
+            set { cmbServerUrl.Text = value; }
+        }
+
+        public string StartingPoint
+        {
+            get { return txtStartingpoint.Text; }
+            set { txtStartingpoint.Text = value; }
+        }
+
+        public string Language
+        {
+            get 
+            { 
+                var ci = cmbLanguage.SelectedItem as CultureInfo;
+                if (ci != null)
+                {
+                    return ci.TwoLetterISOLanguageName;
+                }
+                return null;
+            }
+        }
+
+        private void txtPassword_TextChanged(object sender, EventArgs e)
+        {
+            UpdateButtonStatus();
+        }
+
+        private void UpdateButtonStatus()
+        {
+            if (this.Username.Trim().Length > 0 && this.Server.Trim().Length > 0)
+                EnableOk(this, EventArgs.Empty);
+            else
+                DisabledOk(this, EventArgs.Empty);
+        }
+
+        public PreferedSiteList SiteList
+        {
+            get;
+            set;
+        }
+
+        public event EventHandler EnableOk = delegate { };
+
+        public event EventHandler DisabledOk = delegate { };
+
+        public event EventHandler CheckSavedPassword = delegate { };
+
+        private void cmbLanguage_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (!_loading)
+            {
+                if (cmbLanguage.SelectedIndex >= 0)
+                {
+                    //System.Threading.Thread.CurrentThread.CurrentCulture = m_supportedLanguages[cmbLanguage.SelectedIndex];
+                    //System.Threading.Thread.CurrentThread.CurrentUICulture = m_supportedLanguages[cmbLanguage.SelectedIndex];
+
+                    if (this.Visible)
+                    {
+                        try
+                        {
+                            this.SiteList.GUILanguage = this.Language;
+                            this.SiteList.Save();
+                        }
+                        catch { }
+
+                        MessageBox.Show(this, Strings.FormLogin.RestartForLanguageChange, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
+                    }
+                }
+            }
+        }
+
+        private void cmbServerUrl_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            PreferedSite site = cmbServerUrl.SelectedItem as PreferedSite;
+            if (site == null)
+                return;
+
+            txtStartingpoint.Text = site.StartingPoint;
+            txtUsername.Text = site.Username;
+            if (site.SavePassword)
+                txtPassword.Text = site.UnscrambledPassword;
+            else
+                txtPassword.Text = "";
+
+            CheckSavedPassword(this, EventArgs.Empty);
+        }
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Login/HttpLoginCtrl.designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/HttpLoginCtrl.designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/HttpLoginCtrl.designer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,183 @@
+namespace Maestro.Login
+{
+    partial class HttpLoginCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.cmbLanguage = new System.Windows.Forms.ComboBox();
+            this.label5 = new System.Windows.Forms.Label();
+            this.txtPassword = new System.Windows.Forms.TextBox();
+            this.txtUsername = new System.Windows.Forms.TextBox();
+            this.txtStartingpoint = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.cmbServerUrl = new System.Windows.Forms.ComboBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // cmbLanguage
+            // 
+            this.cmbLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.cmbLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbLanguage.Location = new System.Drawing.Point(82, 108);
+            this.cmbLanguage.Name = "cmbLanguage";
+            this.cmbLanguage.Size = new System.Drawing.Size(279, 21);
+            this.cmbLanguage.TabIndex = 23;
+            this.cmbLanguage.SelectedIndexChanged += new System.EventHandler(this.cmbLanguage_SelectedIndexChanged);
+            // 
+            // label5
+            // 
+            this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.label5.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label5.Location = new System.Drawing.Point(2, 108);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(64, 16);
+            this.label5.TabIndex = 22;
+            this.label5.Text = "Language";
+            // 
+            // 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(82, 82);
+            this.txtPassword.Name = "txtPassword";
+            this.txtPassword.PasswordChar = '*';
+            this.txtPassword.Size = new System.Drawing.Size(279, 20);
+            this.txtPassword.TabIndex = 21;
+            this.txtPassword.Text = "admin";
+            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(82, 56);
+            this.txtUsername.Name = "txtUsername";
+            this.txtUsername.Size = new System.Drawing.Size(279, 20);
+            this.txtUsername.TabIndex = 20;
+            this.txtUsername.Text = "Administrator";
+            // 
+            // txtStartingpoint
+            // 
+            this.txtStartingpoint.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtStartingpoint.Enabled = false;
+            this.txtStartingpoint.Location = new System.Drawing.Point(82, 30);
+            this.txtStartingpoint.Name = "txtStartingpoint";
+            this.txtStartingpoint.Size = new System.Drawing.Size(279, 20);
+            this.txtStartingpoint.TabIndex = 17;
+            this.txtStartingpoint.Text = "Library://";
+            // 
+            // label4
+            // 
+            this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.label4.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label4.Location = new System.Drawing.Point(2, 82);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(80, 16);
+            this.label4.TabIndex = 19;
+            this.label4.Text = "Password";
+            // 
+            // label3
+            // 
+            this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.label3.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label3.Location = new System.Drawing.Point(2, 56);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(80, 16);
+            this.label3.TabIndex = 18;
+            this.label3.Text = "Username";
+            // 
+            // label2
+            // 
+            this.label2.Enabled = false;
+            this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.label2.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label2.Location = new System.Drawing.Point(2, 30);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(72, 16);
+            this.label2.TabIndex = 16;
+            this.label2.Text = "Startingpoint";
+            // 
+            // cmbServerUrl
+            // 
+            this.cmbServerUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.cmbServerUrl.Location = new System.Drawing.Point(82, 3);
+            this.cmbServerUrl.Name = "cmbServerUrl";
+            this.cmbServerUrl.Size = new System.Drawing.Size(279, 21);
+            this.cmbServerUrl.TabIndex = 15;
+            this.cmbServerUrl.Text = "http://localhost/mapguide/mapagent/mapagent.fcgi";
+            this.cmbServerUrl.SelectedIndexChanged += new System.EventHandler(this.cmbServerUrl_SelectedIndexChanged);
+            // 
+            // label1
+            // 
+            this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.label1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label1.Location = new System.Drawing.Point(2, 3);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(64, 16);
+            this.label1.TabIndex = 14;
+            this.label1.Text = "Server:";
+            // 
+            // HttpLoginCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.cmbLanguage);
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.txtPassword);
+            this.Controls.Add(this.txtUsername);
+            this.Controls.Add(this.txtStartingpoint);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.cmbServerUrl);
+            this.Controls.Add(this.label1);
+            this.Name = "HttpLoginCtrl";
+            this.Size = new System.Drawing.Size(364, 133);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ComboBox cmbLanguage;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.TextBox txtPassword;
+        private System.Windows.Forms.TextBox txtUsername;
+        private System.Windows.Forms.TextBox txtStartingpoint;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.ComboBox cmbServerUrl;
+        private System.Windows.Forms.Label label1;
+    }
+}

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

Added: sandbox/maestro-2.5/Maestro.Login/ILoginCtrl.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/ILoginCtrl.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/ILoginCtrl.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,35 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Maestro.Login
+{
+    public interface ILoginCtrl
+    {
+        string Username { get; }
+        string Password { get; }
+
+        event EventHandler EnableOk;
+        event EventHandler DisabledOk;
+        event EventHandler CheckSavedPassword;
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Login/LocalNativeLoginCtrl.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/LocalNativeLoginCtrl.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/LocalNativeLoginCtrl.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,89 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.IO;
+
+namespace Maestro.Login
+{
+    public partial class LocalNativeLoginCtrl : UserControl, ILoginCtrl
+    {
+        public LocalNativeLoginCtrl()
+        {
+            InitializeComponent();
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            base.OnLoad(e);
+            DisabledOk(this, EventArgs.Empty);
+        }
+
+        #region ILoginCtrl Members
+
+        public string Username
+        {
+            get { return txtUsername.Text; }
+        }
+
+        public string Password
+        {
+            get { return txtPassword.Text; }
+        }
+
+        #endregion
+
+        public string WebConfigPath
+        {
+            get { return txtWebConfig.Text; }
+        }
+
+        public event EventHandler EnableOk = delegate { };
+
+        public event EventHandler DisabledOk = delegate { };
+
+        public event EventHandler CheckSavedPassword = delegate { };
+
+        private void txtWebConfig_TextChanged(object sender, EventArgs e)
+        {
+            if (this.WebConfigPath.Trim().Length > 0 && File.Exists(this.WebConfigPath))
+                EnableOk(this, EventArgs.Empty);
+            else
+                DisabledOk(this, EventArgs.Empty);
+        }
+
+        private void btnBrowse_Click(object sender, EventArgs e)
+        {
+            using (var dlg = new OpenFileDialog())
+            {
+                dlg.Filter = "*.ini|*.ini";
+                if (dlg.ShowDialog() == DialogResult.OK)
+                {
+                    txtWebConfig.Text = dlg.FileName;
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Login/LocalNativeLoginCtrl.designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/LocalNativeLoginCtrl.designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/LocalNativeLoginCtrl.designer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,139 @@
+namespace Maestro.Login
+{
+    partial class LocalNativeLoginCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.txtPassword = new System.Windows.Forms.TextBox();
+            this.txtUsername = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtWebConfig = new System.Windows.Forms.TextBox();
+            this.btnBrowse = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // 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(100, 93);
+            this.txtPassword.Name = "txtPassword";
+            this.txtPassword.PasswordChar = '*';
+            this.txtPassword.Size = new System.Drawing.Size(308, 20);
+            this.txtPassword.TabIndex = 25;
+            this.txtPassword.Text = "admin";
+            // 
+            // 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(100, 67);
+            this.txtUsername.Name = "txtUsername";
+            this.txtUsername.Size = new System.Drawing.Size(308, 20);
+            this.txtUsername.TabIndex = 24;
+            this.txtUsername.Text = "Administrator";
+            // 
+            // label4
+            // 
+            this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.label4.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label4.Location = new System.Drawing.Point(20, 96);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(74, 16);
+            this.label4.TabIndex = 23;
+            this.label4.Text = "Password";
+            // 
+            // label3
+            // 
+            this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.label3.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.label3.Location = new System.Drawing.Point(20, 70);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(74, 16);
+            this.label3.TabIndex = 22;
+            this.label3.Text = "Username";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(20, 12);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(135, 13);
+            this.label1.TabIndex = 26;
+            this.label1.Text = "Web Tier Configuration File";
+            // 
+            // txtWebConfig
+            // 
+            this.txtWebConfig.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtWebConfig.Location = new System.Drawing.Point(23, 29);
+            this.txtWebConfig.Name = "txtWebConfig";
+            this.txtWebConfig.Size = new System.Drawing.Size(385, 20);
+            this.txtWebConfig.TabIndex = 27;
+            this.txtWebConfig.TextChanged += new System.EventHandler(this.txtWebConfig_TextChanged);
+            // 
+            // btnBrowse
+            // 
+            this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnBrowse.Location = new System.Drawing.Point(414, 26);
+            this.btnBrowse.Name = "btnBrowse";
+            this.btnBrowse.Size = new System.Drawing.Size(26, 23);
+            this.btnBrowse.TabIndex = 28;
+            this.btnBrowse.Text = "...";
+            this.btnBrowse.UseVisualStyleBackColor = true;
+            this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
+            // 
+            // LocalNativeLoginCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.btnBrowse);
+            this.Controls.Add(this.txtWebConfig);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.txtPassword);
+            this.Controls.Add(this.txtUsername);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label3);
+            this.Name = "LocalNativeLoginCtrl";
+            this.Size = new System.Drawing.Size(453, 150);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TextBox txtPassword;
+        private System.Windows.Forms.TextBox txtUsername;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox txtWebConfig;
+        private System.Windows.Forms.Button btnBrowse;
+    }
+}

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

Added: sandbox/maestro-2.5/Maestro.Login/LoginDialog.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/LoginDialog.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/LoginDialog.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,233 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.MaestroAPI;
+
+namespace Maestro.Login
+{
+    public partial class LoginDialog : Form
+    {
+        private int _selectedIndex;
+        private ILoginCtrl[] _controls;
+        private IServerConnection _conn;
+
+        private PreferedSiteList _siteList;
+
+        private HttpLoginCtrl _http;
+        private LocalNativeLoginCtrl _local;
+
+        public LoginDialog()
+        {
+            InitializeComponent();
+            _http = new HttpLoginCtrl() { Dock = DockStyle.Fill };
+            _local = new LocalNativeLoginCtrl() { Dock = DockStyle.Fill };
+            _controls = new ILoginCtrl[] 
+            {
+                _http,
+                _local
+            };
+            _controls[0].EnableOk += OnEnableOk;
+            _controls[1].EnableOk += OnEnableOk;
+            _controls[0].CheckSavedPassword += (sender, e) => { chkSavePassword.Checked = true; };
+            _controls[1].CheckSavedPassword += (sender, e) => { chkSavePassword.Checked = true; };
+            _controls[0].DisabledOk += OnDisableOk;
+            _controls[1].DisabledOk += OnDisableOk;
+        }
+
+        public string Username
+        {
+            get { return _controls[_selectedIndex].Username; }
+        }
+
+        public string Password
+        {
+            get { return _controls[_selectedIndex].Password; }
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            _siteList = PreferedSiteList.Load();
+
+            if (_siteList.Sites.Length == 0)
+            {
+                _http.Server = "http://localhost/mapguide/mapagent/mapagent.fcgi";
+                _http.StartingPoint = "Library://";
+                _http.Username = "Administrator";
+                _http.Password = "admin";
+                chkSavePassword.Checked = true;
+                //chkAutoConnect.Checked = false;
+            }
+            else
+            {
+                _http.AddSites(_siteList.Sites);
+                //In case the site was removed...
+                try { _http.SetPreferredSite(_siteList.PreferedSite); }
+                catch { }
+                //chkAutoConnect.Checked = _siteList.AutoConnect;
+            }
+
+            _http.SiteList = _siteList;
+
+            base.OnLoad(e);
+            rdHttp.Checked = true;
+
+            //Mono = No LocalNativeConnection for you (for now...)
+            if (!Platform.IsWindows)
+            {
+                rdTcpIp.Enabled = false;
+            }
+        }
+
+        private void OnEnableOk(object sender, EventArgs e)
+        {
+            btnOK.Enabled = true;
+        }
+
+        private void OnDisableOk(object sender, EventArgs e)
+        {
+            btnOK.Enabled = false;
+        }
+
+        public IServerConnection Connection
+        {
+            get { return _conn; }
+        }
+
+        public void SetLoginControl(Control c)
+        {
+            loginPanel.Controls.Clear();
+            loginPanel.Controls.Add(c);
+        }
+
+        private void rdHttp_CheckedChanged(object sender, EventArgs e)
+        {
+            _selectedIndex = 0;
+            SetLoginControl((Control)_controls[_selectedIndex]);
+        }
+
+        private void rdTcpIp_CheckedChanged(object sender, EventArgs e)
+        {
+            _selectedIndex = 1;
+            SetLoginControl((Control)_controls[_selectedIndex]);
+        }
+
+        private void btnCancel_Click(object sender, EventArgs e)
+        {
+
+        }
+
+        private void btnOK_Click(object sender, EventArgs e)
+        {
+            using (new WaitCursor(this))
+            {
+                try
+				{
+                    PreferedSite ps = null;
+
+                    if (_selectedIndex == 0) //HTTP
+                    {
+                        string format = "Url={0};Username={1};Password={2};Locale={3};AllowUntestedVersion={4}";
+                        string connStr = string.Format(format, _http.Server, _http.Username, _http.Password, _http.Language, true);
+
+                        string agent = "MapGuide Maestro v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
+
+                        _conn = ConnectionProviderRegistry.CreateConnection("Maestro.Http", connStr);
+                        _conn.SetCustomProperty("UserAgent", agent);
+
+                        //Update preferred site entry if it exists
+                        int index = 0;
+                        foreach (PreferedSite s in _http.GetSites())
+                        {
+                            if (s.SiteURL == _http.Server)
+                            {
+                                ps = s;
+                                break;
+                            }
+                            else
+                                index++;
+                        }
+
+                        if (ps == null)
+                            ps = new PreferedSite();
+
+                        if (ps.ApprovedVersion == null)
+                            ps.ApprovedVersion = new Version(0, 0, 0, 0);
+
+                        if (_conn.SiteVersion > _conn.MaxTestedVersion && _conn.SiteVersion > ps.ApprovedVersion)
+                        {
+                            if (MessageBox.Show(this, Strings.FormLogin.UntestedServerVersion, Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning) != DialogResult.Yes)
+                                return;
+                        }
+
+                        try
+                        {
+                            ps.SiteURL = _http.Server;
+                            ps.StartingPoint = _http.StartingPoint;
+                            ps.Username = _http.Username;
+                            ps.SavePassword = chkSavePassword.Checked;
+                            ps.ApprovedVersion = ps.ApprovedVersion > _conn.SiteVersion ? ps.ApprovedVersion : _conn.SiteVersion;
+                            if (ps.SavePassword)
+                                ps.UnscrambledPassword = _http.Password;
+                            else
+                                ps.ScrambledPassword = "";
+
+                            if (index >= _siteList.Sites.Length)
+                                _siteList.AddSite(ps);
+
+                            //_siteList.AutoConnect = chkAutoConnect.Checked;
+                            _siteList.PreferedSite = index;
+                            _siteList.GUILanguage = _http.Language;
+
+                            _siteList.Save();
+                        }
+                        catch (Exception ex)
+                        {
+                            string s = ex.Message;
+                        }
+                    }
+                    else //Native
+                    {
+                        string format = "WebConfig={0};Username={1};Password={2};Locale={3}";
+                        string connStr = string.Format(format, _local.WebConfigPath, _local.Username, _local.Password, System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName);
+                        _conn = ConnectionProviderRegistry.CreateConnection("Maestro.LocalNative", connStr);
+                    }
+
+                    _conn.AutoRestartSession = true;
+
+                    
+					
+					this.DialogResult = DialogResult.OK;
+					this.Close();
+
+				}
+				catch (Exception ex)
+				{
+					MessageBox.Show(this, string.Format(Strings.FormLogin.ConnectionFailedError, ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+				}
+            }
+        }
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Login/LoginDialog.designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/LoginDialog.designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/LoginDialog.designer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,135 @@
+namespace Maestro.Login
+{
+    partial class LoginDialog
+    {
+        /// <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.chkSavePassword = new System.Windows.Forms.CheckBox();
+            this.btnCancel = new System.Windows.Forms.Button();
+            this.btnOK = new System.Windows.Forms.Button();
+            this.rdHttp = new System.Windows.Forms.RadioButton();
+            this.rdTcpIp = new System.Windows.Forms.RadioButton();
+            this.loginPanel = new System.Windows.Forms.Panel();
+            this.SuspendLayout();
+            // 
+            // chkSavePassword
+            // 
+            this.chkSavePassword.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.chkSavePassword.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.chkSavePassword.Location = new System.Drawing.Point(206, 178);
+            this.chkSavePassword.Name = "chkSavePassword";
+            this.chkSavePassword.Size = new System.Drawing.Size(161, 16);
+            this.chkSavePassword.TabIndex = 15;
+            this.chkSavePassword.Text = "Save password on computer";
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.btnCancel.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.btnCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.btnCancel.Location = new System.Drawing.Point(206, 233);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(96, 32);
+            this.btnCancel.TabIndex = 13;
+            this.btnCancel.Text = "Cancel";
+            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+            // 
+            // btnOK
+            // 
+            this.btnOK.Enabled = false;
+            this.btnOK.FlatStyle = System.Windows.Forms.FlatStyle.System;
+            this.btnOK.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+            this.btnOK.Location = new System.Drawing.Point(94, 233);
+            this.btnOK.Name = "btnOK";
+            this.btnOK.Size = new System.Drawing.Size(96, 32);
+            this.btnOK.TabIndex = 12;
+            this.btnOK.Text = "OK";
+            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+            // 
+            // rdHttp
+            // 
+            this.rdHttp.AutoSize = true;
+            this.rdHttp.Location = new System.Drawing.Point(61, 178);
+            this.rdHttp.Name = "rdHttp";
+            this.rdHttp.Size = new System.Drawing.Size(114, 17);
+            this.rdHttp.TabIndex = 16;
+            this.rdHttp.TabStop = true;
+            this.rdHttp.Text = "Connect via HTTP";
+            this.rdHttp.UseVisualStyleBackColor = true;
+            this.rdHttp.CheckedChanged += new System.EventHandler(this.rdHttp_CheckedChanged);
+            // 
+            // rdTcpIp
+            // 
+            this.rdTcpIp.AutoSize = true;
+            this.rdTcpIp.Location = new System.Drawing.Point(61, 202);
+            this.rdTcpIp.Name = "rdTcpIp";
+            this.rdTcpIp.Size = new System.Drawing.Size(121, 17);
+            this.rdTcpIp.TabIndex = 17;
+            this.rdTcpIp.TabStop = true;
+            this.rdTcpIp.Text = "Connect via TCP/IP";
+            this.rdTcpIp.UseVisualStyleBackColor = true;
+            this.rdTcpIp.CheckedChanged += new System.EventHandler(this.rdTcpIp_CheckedChanged);
+            // 
+            // loginPanel
+            // 
+            this.loginPanel.Location = new System.Drawing.Point(12, 12);
+            this.loginPanel.Name = "loginPanel";
+            this.loginPanel.Size = new System.Drawing.Size(374, 160);
+            this.loginPanel.TabIndex = 18;
+            // 
+            // FormLogin
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(398, 277);
+            this.Controls.Add(this.loginPanel);
+            this.Controls.Add(this.rdTcpIp);
+            this.Controls.Add(this.rdHttp);
+            this.Controls.Add(this.chkSavePassword);
+            this.Controls.Add(this.btnCancel);
+            this.Controls.Add(this.btnOK);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "FormLogin";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Log on to a MapGuide Server";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.CheckBox chkSavePassword;
+        private System.Windows.Forms.Button btnCancel;
+        private System.Windows.Forms.Button btnOK;
+        private System.Windows.Forms.RadioButton rdHttp;
+        private System.Windows.Forms.RadioButton rdTcpIp;
+        private System.Windows.Forms.Panel loginPanel;
+    }
+}
\ No newline at end of file

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

Added: sandbox/maestro-2.5/Maestro.Login/Maestro.Login.csproj
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/Maestro.Login.csproj	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/Maestro.Login.csproj	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{07588440-5F9F-4C30-AA06-9CF30BA6DDE6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Maestro.Login</RootNamespace>
+    <AssemblyName>Maestro.Login</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="LoginDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="LoginDialog.designer.cs">
+      <DependentUpon>LoginDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HttpLoginCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HttpLoginCtrl.designer.cs">
+      <DependentUpon>HttpLoginCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ILoginCtrl.cs" />
+    <Compile Include="LocalNativeLoginCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LocalNativeLoginCtrl.designer.cs">
+      <DependentUpon>LocalNativeLoginCtrl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PreferedSite.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Strings\FormLogin.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>FormLogin.resx</DependentUpon>
+    </Compile>
+    <Compile Include="WaitCursor.cs" />
+    <Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="LoginDialog.resx">
+      <DependentUpon>LoginDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="HttpLoginCtrl.resx">
+      <DependentUpon>HttpLoginCtrl.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="LocalNativeLoginCtrl.resx">
+      <DependentUpon>LocalNativeLoginCtrl.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Strings\FormLogin.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>FormLogin.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\OSGeo.MapGuide.MaestroAPI\OSGeo.MapGuide.MaestroAPI.csproj">
+      <Project>{80FA3158-8B5F-48D1-A393-0378AFE48A7E}</Project>
+      <Name>OSGeo.MapGuide.MaestroAPI</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

Added: sandbox/maestro-2.5/Maestro.Login/PreferedSite.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/PreferedSite.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/PreferedSite.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,272 @@
+#region Disclaimer / License
+// Copyright (C) 2009, Kenneth Skovhede
+// http://www.hexad.dk, opensource at hexad.dk
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Windows.Forms;
+
+namespace Maestro.Login
+{
+
+	/// <summary>
+	/// Simple list style container for sites
+	/// </summary>
+	public class PreferedSiteList
+	{
+		private PreferedSite[] m_sites;
+        private string m_systemBrowser;
+		private int m_initialSite;
+		private bool m_autoconnect;
+        private bool m_useFusionPreview;
+        private bool m_maximizedWindow;
+        private int m_windowLeft;
+        private int m_windowTop;
+        private int m_windowWidth;
+        private int m_windowHeight;
+        private string m_guiLanguage;
+
+		public PreferedSite[] Sites
+		{
+			get 
+			{ 
+				if (m_sites == null)
+					m_sites = new PreferedSite[0];
+				return m_sites; 
+			}
+			set { m_sites = value; }
+		}
+
+        [System.Xml.Serialization.XmlAttribute()]
+        public string GUILanguage
+        {
+            get { return m_guiLanguage; }
+            set { m_guiLanguage = value; }
+        }
+
+        [System.Xml.Serialization.XmlAttribute()]
+        public bool UseFusionPreview
+        {
+            get { return m_useFusionPreview; }
+            set { m_useFusionPreview = value; }
+        }
+
+        [System.Xml.Serialization.XmlAttribute()]
+        public string SystemBrowser
+        {
+            get 
+            {
+                if (string.IsNullOrEmpty(m_systemBrowser))
+                {
+                    //Windows, use system default by url handler
+                    if (System.IO.Path.DirectorySeparatorChar == '\\')
+                        m_systemBrowser = "";
+                    //Linux, assume firefox
+                    else
+                        m_systemBrowser = "firefox";
+                }
+
+                return m_systemBrowser; 
+            }
+            set { m_systemBrowser = value; }
+        }
+
+
+		[System.Xml.Serialization.XmlAttribute()]
+		public int PreferedSite
+		{
+			get { return m_initialSite; }
+			set { m_initialSite = value; }
+		}
+
+		[System.Xml.Serialization.XmlAttribute()]
+		public bool AutoConnect
+		{
+			get { return m_autoconnect; }
+			set { m_autoconnect = value; }
+		}
+
+        [System.Xml.Serialization.XmlAttribute()]
+        public bool MaximizedWindow
+        {
+            get { return m_maximizedWindow; }
+            set { m_maximizedWindow = value; }
+        }
+
+        [System.Xml.Serialization.XmlAttribute()]
+        public int WindowLeft
+        {
+            get { return m_windowLeft; }
+            set { m_windowLeft = value; }
+        }
+
+        [System.Xml.Serialization.XmlAttribute()]
+        public int WindowTop
+        {
+            get { return m_windowTop; }
+            set { m_windowTop = value; }
+        }
+
+        [System.Xml.Serialization.XmlAttribute()]
+        public int WindowWidth
+        {
+            get { return m_windowWidth; }
+            set { m_windowWidth = value; }
+        }
+
+        [System.Xml.Serialization.XmlAttribute()]
+        public int WindowHeight
+        {
+            get { return m_windowHeight; }
+            set { m_windowHeight = value; }
+        }
+
+		public void AddSite(PreferedSite site)
+		{
+			//A generic collection would be nice :/
+			PreferedSite[] n = new PreferedSite[m_sites.Length + 1];
+			Array.Copy(m_sites, 0, n, 0, m_sites.Length);
+			n[n.Length-1] = site;
+			m_sites = n;
+		}
+
+        private static string AppSettingFile
+        {
+            get
+            {
+                string path = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), Application.ProductName);
+                if (!System.IO.Directory.Exists(path))
+                    System.IO.Directory.CreateDirectory(path);
+                path = System.IO.Path.Combine(path, "sitelist.xml");
+
+                string oldPath = System.IO.Path.Combine(System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), "Maestro"), "sitelist.xml");
+                if (System.IO.File.Exists(oldPath) && !System.IO.File.Exists(path))
+                    try { System.IO.File.Move(oldPath, path); }
+                    catch { }
+
+                return path;
+            }
+        }
+
+        public static PreferedSiteList Load()
+        {
+            try
+            {
+                if (System.IO.File.Exists(AppSettingFile))
+                {
+                    System.Xml.Serialization.XmlSerializer sz = new System.Xml.Serialization.XmlSerializer(typeof(PreferedSiteList));
+                    using (System.IO.FileStream fs = System.IO.File.Open(AppSettingFile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None))
+                        return (PreferedSiteList)sz.Deserialize(fs);
+                }
+            }
+            catch
+            {
+            }
+
+            return new PreferedSiteList();
+        }
+
+        public void Save()
+        {
+            System.Xml.Serialization.XmlSerializer sz = new System.Xml.Serialization.XmlSerializer(typeof(PreferedSiteList));
+            using (System.IO.FileStream fs = System.IO.File.Open(AppSettingFile, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write, System.IO.FileShare.None))
+            {
+                fs.SetLength(0);
+                sz.Serialize(fs, this);
+            }
+        }
+	}
+
+	/// <summary>
+	/// Simple container class for sites
+	/// </summary>
+	public class PreferedSite
+	{
+		private string m_siteURL;
+		private string m_startingPoint;
+		private string m_username;
+		private string m_scrambledPassword;
+		private bool m_savePassword;
+		private Version m_approvedVersion;
+
+		public PreferedSite()
+		{
+		}
+
+		public string SiteURL
+		{
+			get { return m_siteURL; }
+			set { m_siteURL = value; }
+		}
+
+		public string StartingPoint
+		{
+			get { return m_startingPoint; }
+			set { m_startingPoint = value; }
+		}
+
+		public string Username
+		{
+			get { return m_username; }
+			set { m_username = value; }
+		}
+
+		public string ScrambledPassword
+		{
+			get { return m_scrambledPassword; }
+			set { m_scrambledPassword = value; }
+		}
+
+		public bool SavePassword
+		{
+			get { return m_savePassword; }
+			set { m_savePassword = value; }
+		}
+
+		public string ApprovedVersionString
+		{
+			get { return ApprovedVersion.ToString(); }
+			set { ApprovedVersion = new Version(value); }
+		}
+
+		[System.Xml.Serialization.XmlIgnore()]
+		public Version ApprovedVersion
+		{
+			get 
+			{
+				if (m_approvedVersion == null)
+					m_approvedVersion = new Version(0, 0, 0, 0);
+				return m_approvedVersion; 
+			}
+			set { m_approvedVersion = value; }
+		}
+
+		[System.Xml.Serialization.XmlIgnore()]
+		public string UnscrambledPassword
+		{
+			get { return System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(m_scrambledPassword == null ? "" : m_scrambledPassword)); }
+			set { m_scrambledPassword = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(value)); }
+		}
+
+
+		public override string ToString()
+		{
+			return m_siteURL;
+		}
+
+	}
+}

Added: sandbox/maestro-2.5/Maestro.Login/Properties/AssemblyInfo.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/Properties/AssemblyInfo.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/Properties/AssemblyInfo.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Maestro.Login")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Maestro.Login")]
+[assembly: AssemblyCopyright("Copyright ©  2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("5853fa01-8986-4c63-9fef-3e74437fb1eb")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

Added: sandbox/maestro-2.5/Maestro.Login/Strings/FormLogin.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/Strings/FormLogin.Designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/Strings/FormLogin.Designer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,91 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.3053
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Maestro.Login.Strings {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class FormLogin {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal FormLogin() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Maestro.Login.Strings.FormLogin", typeof(FormLogin).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to log on because: {0}.
+        /// </summary>
+        internal static string ConnectionFailedError {
+            get {
+                return ResourceManager.GetString("ConnectionFailedError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Please restart the application for the language change to take effect.
+        /// </summary>
+        internal static string RestartForLanguageChange {
+            get {
+                return ResourceManager.GetString("RestartForLanguageChange", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The current site version is newer than the version Maestro was tested against.
+        ///Do you want to connect anyway?.
+        /// </summary>
+        internal static string UntestedServerVersion {
+            get {
+                return ResourceManager.GetString("UntestedServerVersion", resourceCulture);
+            }
+        }
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Login/Strings/FormLogin.resx
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/Strings/FormLogin.resx	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/Strings/FormLogin.resx	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="ConnectionFailedError" xml:space="preserve">
+    <value>Failed to log on because: {0}</value>
+    <comment>An error message that is displayed when then connection failed</comment>
+  </data>
+  <data name="RestartForLanguageChange" xml:space="preserve">
+    <value>Please restart the application for the language change to take effect</value>
+    <comment>A message that is displayed if the user changes the language</comment>
+  </data>
+  <data name="UntestedServerVersion" xml:space="preserve">
+    <value>The current site version is newer than the version Maestro was tested against.
+Do you want to connect anyway?</value>
+    <comment>A message that is displayed when the server version is newer than Maestro</comment>
+  </data>
+</root>
\ No newline at end of file

Added: sandbox/maestro-2.5/Maestro.Login/WaitCursor.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Login/WaitCursor.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Login/WaitCursor.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,60 @@
+#region Disclaimer / License
+// Copyright (C) 2009, Kenneth Skovhede
+// http://www.hexad.dk, opensource at hexad.dk
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Windows.Forms;
+
+namespace Maestro.Login
+{
+	/// <summary>
+	/// A class that wraps the wait cursor into a disposable class, for use with deterministic disposal
+	/// </summary>
+	public class WaitCursor 
+		: IDisposable
+	{
+		private Form m_owner = null;
+		private Cursor m_oldcursor;
+
+		public WaitCursor(Form owner)
+		{
+			//This ensures that nested WaitCursors behave as expected.
+			//If we are the outermost WaitCursor, set the cursor
+			if (owner.Cursor != Cursors.WaitCursor)
+			{
+				m_oldcursor = owner.Cursor;
+				m_owner = owner;
+				m_owner.Cursor = Cursors.WaitCursor;
+			}
+		}
+
+		#region IDisposable Members
+
+		public void Dispose()
+		{
+			//If we are the the outermost WaitCursor, reset the cursor
+			if (m_owner != null && m_owner.Cursor == Cursors.WaitCursor)
+			{
+				m_owner.Cursor = m_oldcursor;
+				m_owner = null;
+			}
+		}
+
+		#endregion
+	}
+}


Property changes on: sandbox/maestro-2.5/Maestro.Shared.UI
___________________________________________________________________
Added: svn:ignore
   + bin
obj


Added: sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,132 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing.Design;
+
+namespace Maestro.Shared.UI
+{
+    /// <summary>
+    /// A simple collapsible panel with basic properties for configuring header color/font
+    /// and content color. 
+    /// 
+    /// This control works best when Dock = Top and any content below is also Dock = Top and this
+    /// control was built with these assumptions in place.
+    /// 
+    /// Note that there is no designer support for this control (ie. Drag and drop does not do what
+    /// you would hope it would do). The way to use this control is to derive from this class and add your custom 
+    /// content there. Also this class does not appear in the VS Toolbox, thus you must apply ToolboxItemAttribute(true)
+    /// on your derived classes if you want to make the control available for design.
+    /// </summary>
+    [ToolboxItem(false)]
+    public partial class CollapsiblePanel : UserControl
+    {
+        protected CollapsiblePanel()
+        {
+            InitializeComponent();
+        }
+
+        [Category("Collapsible Panel Header")]
+        public Color HeaderBackgroundColor
+        {
+            get { return headerPanel.BackColor; }
+            set { headerPanel.BackColor = value; }
+        }
+
+        [Category("Collapsible Panel Header")]
+        public string HeaderText
+        {
+            get { return lblHeaderText.Text; }
+            set { lblHeaderText.Text = value; }
+        }
+
+        [Category("Collapsible Panel Header")]
+        public Font HeaderFont
+        {
+            get { return lblHeaderText.Font; }
+            set { lblHeaderText.Font = value; }
+        }
+
+        [Category("Collapsible Panel Content")]
+        public Color ContentBackgroundColor
+        {
+            get { return contentPanel.BackColor; }
+            set { contentPanel.BackColor = value; }
+        }
+
+        [DefaultValue(true)]
+        [Category("Collapsible Panel")]
+        public bool CanCollapse
+        {
+            get { return btnCollapse.Enabled; }
+            set { btnCollapse.Enabled = value; }
+        }
+
+        private bool _collapsed;
+
+        [DefaultValue(false)]
+        [Category("Collapsible Panel")]
+        public bool Collapsed
+        {
+            get
+            {
+                return _collapsed;
+            }
+            set
+            {
+                _collapsed = value;
+                if (value)
+                {
+                    if (contentPanel.Height > 0)
+                    {
+                        restoreHeight = contentPanel.Height;
+                        this.Height -= restoreHeight;
+                    }
+                }
+                else
+                {
+                    if (contentPanel.Height < restoreHeight)
+                    {
+                        this.Height += restoreHeight;
+                    }
+                }
+                btnCollapse.Enabled = !_collapsed;
+                btnExpand.Enabled = _collapsed;
+            }
+        }
+
+        private int restoreHeight;
+
+        private void btnCollapse_Click(object sender, EventArgs e)
+        {
+            this.Collapsed = true;
+        }
+
+        private void btnExpand_Click(object sender, EventArgs e)
+        {
+            this.Collapsed = false;
+        }
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.designer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,115 @@
+namespace Maestro.Shared.UI
+{
+    partial class CollapsiblePanel
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.headerPanel = new System.Windows.Forms.Panel();
+            this.btnExpand = new System.Windows.Forms.Button();
+            this.btnCollapse = new System.Windows.Forms.Button();
+            this.lblHeaderText = new System.Windows.Forms.Label();
+            this.contentPanel = new System.Windows.Forms.Panel();
+            this.headerPanel.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // headerPanel
+            // 
+            this.headerPanel.Controls.Add(this.btnExpand);
+            this.headerPanel.Controls.Add(this.btnCollapse);
+            this.headerPanel.Controls.Add(this.lblHeaderText);
+            this.headerPanel.Dock = System.Windows.Forms.DockStyle.Top;
+            this.headerPanel.Location = new System.Drawing.Point(0, 0);
+            this.headerPanel.Name = "headerPanel";
+            this.headerPanel.Size = new System.Drawing.Size(449, 27);
+            this.headerPanel.TabIndex = 0;
+            // 
+            // btnExpand
+            // 
+            this.btnExpand.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnExpand.BackgroundImage = global::Maestro.Shared.UI.Properties.Resources.plus_white;
+            this.btnExpand.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+            this.btnExpand.Location = new System.Drawing.Point(430, 5);
+            this.btnExpand.Name = "btnExpand";
+            this.btnExpand.Size = new System.Drawing.Size(16, 16);
+            this.btnExpand.TabIndex = 2;
+            this.btnExpand.UseVisualStyleBackColor = true;
+            this.btnExpand.Click += new System.EventHandler(this.btnExpand_Click);
+            // 
+            // btnCollapse
+            // 
+            this.btnCollapse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnCollapse.BackgroundImage = global::Maestro.Shared.UI.Properties.Resources.minus_white;
+            this.btnCollapse.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
+            this.btnCollapse.Location = new System.Drawing.Point(408, 5);
+            this.btnCollapse.Name = "btnCollapse";
+            this.btnCollapse.Size = new System.Drawing.Size(16, 16);
+            this.btnCollapse.TabIndex = 1;
+            this.btnCollapse.UseVisualStyleBackColor = true;
+            this.btnCollapse.Click += new System.EventHandler(this.btnCollapse_Click);
+            // 
+            // lblHeaderText
+            // 
+            this.lblHeaderText.BackColor = System.Drawing.Color.Transparent;
+            this.lblHeaderText.Dock = System.Windows.Forms.DockStyle.Left;
+            this.lblHeaderText.Location = new System.Drawing.Point(0, 0);
+            this.lblHeaderText.Name = "lblHeaderText";
+            this.lblHeaderText.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0);
+            this.lblHeaderText.Size = new System.Drawing.Size(388, 27);
+            this.lblHeaderText.TabIndex = 0;
+            this.lblHeaderText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // contentPanel
+            // 
+            this.contentPanel.BackColor = System.Drawing.SystemColors.Control;
+            this.contentPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.contentPanel.Location = new System.Drawing.Point(0, 27);
+            this.contentPanel.Name = "contentPanel";
+            this.contentPanel.Size = new System.Drawing.Size(449, 292);
+            this.contentPanel.TabIndex = 1;
+            // 
+            // CollapsiblePanel
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.contentPanel);
+            this.Controls.Add(this.headerPanel);
+            this.Name = "CollapsiblePanel";
+            this.Size = new System.Drawing.Size(449, 319);
+            this.headerPanel.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Panel headerPanel;
+        private System.Windows.Forms.Label lblHeaderText;
+        private System.Windows.Forms.Button btnExpand;
+        private System.Windows.Forms.Button btnCollapse;
+        public System.Windows.Forms.Panel contentPanel;
+    }
+}

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

Added: sandbox/maestro-2.5/Maestro.Shared.UI/Maestro.Shared.UI.csproj
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/Maestro.Shared.UI.csproj	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/Maestro.Shared.UI.csproj	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{CFD19053-2172-41D3-8460-0FD2123A1E88}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Maestro.Shared.UI</RootNamespace>
+    <AssemblyName>Maestro.Shared.UI</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CollapsiblePanel.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CollapsiblePanel.designer.cs">
+      <DependentUpon>CollapsiblePanel.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="ToolStripSpringTextBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="CollapsiblePanel.resx">
+      <DependentUpon>CollapsiblePanel.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\minus-white.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\plus-white.png" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

Added: sandbox/maestro-2.5/Maestro.Shared.UI/Properties/AssemblyInfo.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/Properties/AssemblyInfo.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/Properties/AssemblyInfo.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Maestro.Shared.UI")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Maestro.Shared.UI")]
+[assembly: AssemblyCopyright("Copyright ©  2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1e838ede-5a69-45ce-8581-97dd3afd69fa")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

Added: sandbox/maestro-2.5/Maestro.Shared.UI/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/Properties/Resources.Designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/Properties/Resources.Designer.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,77 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.3053
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Maestro.Shared.UI.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Maestro.Shared.UI.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Bitmap minus_white {
+            get {
+                object obj = ResourceManager.GetObject("minus-white", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap plus_white {
+            get {
+                object obj = ResourceManager.GetObject("plus-white", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}

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

Added: sandbox/maestro-2.5/Maestro.Shared.UI/Resources/minus-white.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-2.5/Maestro.Shared.UI/Resources/minus-white.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-2.5/Maestro.Shared.UI/Resources/plus-white.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-2.5/Maestro.Shared.UI/Resources/plus-white.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-2.5/Maestro.Shared.UI/ToolStripSpringTextBox.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/ToolStripSpringTextBox.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/ToolStripSpringTextBox.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,90 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+
+namespace Maestro.Shared.UI
+{
+    public class ToolStripSpringTextBox : ToolStripTextBox
+    {
+        public override Size GetPreferredSize(Size constrainingSize)
+        {
+            // Use the default size if the text box is on the overflow menu
+            // or is on a vertical ToolStrip.
+            if (IsOnOverflow || Owner.Orientation == Orientation.Vertical)
+            {
+                return DefaultSize;
+            }
+
+            // Declare a variable to store the total available width as 
+            // it is calculated, starting with the display width of the 
+            // owning ToolStrip.
+            Int32 width = Owner.DisplayRectangle.Width;
+
+            // Subtract the width of the overflow button if it is displayed. 
+            if (Owner.OverflowButton.Visible)
+            {
+                width = width - Owner.OverflowButton.Width -
+                    Owner.OverflowButton.Margin.Horizontal;
+            }
+
+            // Declare a variable to maintain a count of ToolStripSpringTextBox 
+            // items currently displayed in the owning ToolStrip. 
+            Int32 springBoxCount = 0;
+
+            foreach (ToolStripItem item in Owner.Items)
+            {
+                // Ignore items on the overflow menu.
+                if (item.IsOnOverflow) continue;
+
+                if (item is ToolStripSpringTextBox)
+                {
+                    // For ToolStripSpringTextBox items, increment the count and 
+                    // subtract the margin width from the total available width.
+                    springBoxCount++;
+                    width -= item.Margin.Horizontal;
+                }
+                else
+                {
+                    // For all other items, subtract the full width from the total
+                    // available width.
+                    width = width - item.Width - item.Margin.Horizontal;
+                }
+            }
+
+            // If there are multiple ToolStripSpringTextBox items in the owning
+            // ToolStrip, divide the total available width between them. 
+            if (springBoxCount > 1) width /= springBoxCount;
+
+            // If the available width is less than the default width, use the
+            // default width, forcing one or more items onto the overflow menu.
+            if (width < DefaultSize.Width) width = DefaultSize.Width;
+
+            // Retrieve the preferred size from the base class, but change the
+            // width to the calculated width. 
+            Size size = base.GetPreferredSize(constrainingSize);
+            size.Width = width;
+            return size;
+        }
+    }
+}

Added: sandbox/maestro-2.5/MaestroAPITests/HttpConnectionTests.cs
===================================================================
--- sandbox/maestro-2.5/MaestroAPITests/HttpConnectionTests.cs	                        (rev 0)
+++ sandbox/maestro-2.5/MaestroAPITests/HttpConnectionTests.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,57 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using OSGeo.MapGuide.MaestroAPI;
+
+namespace MaestroAPITests
+{
+    [TestFixture]
+    public class HttpConnectionTests
+    {
+        [Test]
+        public void TestCustomProperties()
+        {
+            var builder = new RequestBuilder(new Uri("http://tempuri.org"), "en");
+            var conn = new HttpServerConnection(builder);
+
+            //Work through the interface 
+            IServerConnection isvc = (IServerConnection)conn;
+
+            //UserAgent is exposed as a custom property
+            var props = isvc.GetCustomPropertyNames();
+
+            Assert.IsNotNull(props);
+            Assert.AreEqual(props.Length, 1);
+            Assert.IsTrue(Array.IndexOf<string>(props, "UserAgent") >= 0);
+
+            //It is of type string
+            var type = isvc.GetCustomPropertyType("UserAgent");
+            Assert.AreEqual(type, typeof(string));
+
+            //We can set and get it
+            isvc.SetCustomProperty("UserAgent", "MapGuide Maestro API Unit Test Fixture");
+            var agent = (string)isvc.GetCustomProperty("UserAgent");
+            Assert.AreEqual(agent, "MapGuide Maestro API Unit Test Fixture");
+        }
+    }
+}

Modified: sandbox/maestro-2.5/MaestroAPITests/MaestroAPITests.csproj
===================================================================
--- sandbox/maestro-2.5/MaestroAPITests/MaestroAPITests.csproj	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/MaestroAPITests/MaestroAPITests.csproj	2010-05-12 19:58:59 UTC (rev 4860)
@@ -46,6 +46,7 @@
   <ItemGroup>
     <Compile Include="CapabilityTests.cs" />
     <Compile Include="FeatureReaderTests.cs" />
+    <Compile Include="HttpConnectionTests.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="ResourceTests.cs" />
     <Compile Include="RuntimeMapTests.cs" />

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -74,11 +74,18 @@
                 string dll = prov["Assembly"].InnerText;
                 string type = prov["Type"].InnerText;
 
-                Assembly asm = Assembly.LoadFrom(dll);
-                Type t = asm.GetType(type);
+                try
+                {
+                    Assembly asm = Assembly.LoadFrom(dll);
+                    Type t = asm.GetType(type);
 
-                _ctors[name] = t;
-                _providers.Add(new ConnectionProviderEntry(name, desc));
+                    _ctors[name] = t;
+                    _providers.Add(new ConnectionProviderEntry(name, desc));
+                }
+                catch
+                {
+
+                }
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ConnectionProviders.xml
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ConnectionProviders.xml	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ConnectionProviders.xml	2010-05-12 19:58:59 UTC (rev 4860)
@@ -3,13 +3,13 @@
     <ConnectionProvider>
         <Name>Maestro.Http</Name>
         <Description>Connection using the mapagent http API</Description>
-        <Assembly>OSGeo.MapGuide.MaestroAPI.dll</Assembly>
+        <Assembly>OSGeo.MapGuide.MaestroAPI.Http.dll</Assembly>
         <Type>OSGeo.MapGuide.MaestroAPI.HttpServerConnection</Type>
     </ConnectionProvider>
     <ConnectionProvider>
         <Name>Maestro.LocalNative</Name>
         <Description>Connection using the MapGuide Web API</Description>
-        <Assembly>OSGeo.MapGuide.MaestroAPI.dll</Assembly>
+        <Assembly>OSGeo.MapGuide.MaestroAPI.Native.dll</Assembly>
         <Type>OSGeo.MapGuide.MaestroAPI.LocalNativeConnection</Type>
     </ConnectionProvider>
 </ConnectionProviderRegistry>

Added: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Exceptions/CustomPropertyNotFoundException.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Exceptions/CustomPropertyNotFoundException.cs	                        (rev 0)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Exceptions/CustomPropertyNotFoundException.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -0,0 +1,44 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace OSGeo.MapGuide.MaestroAPI.Exceptions
+{
+    [global::System.Serializable]
+    public class CustomPropertyNotFoundException : MaestroException
+    {
+        //
+        // For guidelines regarding the creation of new exception types, see
+        //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
+        // and
+        //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
+        //
+
+        public CustomPropertyNotFoundException() { }
+        public CustomPropertyNotFoundException(string message) : base(message) { }
+        public CustomPropertyNotFoundException(string message, Exception inner) : base(message, inner) { }
+        protected CustomPropertyNotFoundException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+    }
+}

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -117,6 +117,31 @@
         /// <returns>A list of resource IDs that were created or updated from the execution of this load procedure</returns>
         string[] ExecuteLoadProcedure(string resourceID, bool ignoreUnsupportedFeatures, LengthyOperationProgressCallBack callback);
 
-        
+        /// <summary>
+        /// Enumerates the names of all custom properties for this connection
+        /// </summary>
+        /// <returns></returns>
+        string[] GetCustomPropertyNames();
+
+        /// <summary>
+        /// Gets the type of the specified property name
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        Type GetCustomPropertyType(string name);
+
+        /// <summary>
+        /// Sets the value of the specified property name
+        /// </summary>
+        /// <param name="name"></param>
+        /// <param name="value"></param>
+        void SetCustomProperty(string name, object value);
+
+        /// <summary>
+        /// Gets the value of the specified property name
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        object GetCustomProperty(string name);
     }
 }

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-05-12 19:58:59 UTC (rev 4860)
@@ -167,6 +167,7 @@
     <Compile Include="Commands\ExecuteLoadProcedure.cs" />
     <Compile Include="Commands\GetCapabilities.cs" />
     <Compile Include="Commands\ICommand.cs" />
+    <Compile Include="Exceptions\CustomPropertyNotFoundException.cs" />
     <Compile Include="Exceptions\MaestroException.cs" />
     <Compile Include="Exceptions\ResourceConversionException.cs" />
     <Compile Include="IConnectionCapabilities.cs" />

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -1700,6 +1700,12 @@
             }
         }
 
-        
+        public abstract string[] GetCustomPropertyNames();
+
+        public abstract Type GetCustomPropertyType(string name);
+
+        public abstract void SetCustomProperty(string name, object value);
+
+        public abstract object GetCustomProperty(string name);
     }
 }

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-05-12 16:55:36 UTC (rev 4859)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-05-12 19:58:59 UTC (rev 4860)
@@ -32,6 +32,7 @@
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using OSGeo.MapGuide.MaestroAPI.CoordinateSystem;
 using OSGeo.MapGuide.MaestroAPI.Serialization;
+using OSGeo.MapGuide.MaestroAPI.Exceptions;
 
 namespace OSGeo.MapGuide.MaestroAPI
 {
@@ -61,9 +62,14 @@
 		{
 			m_wc = new WebClient();
 			m_cachedProviderCapabilities = new Hashtable();
-
 		}
 
+        internal HttpServerConnection(RequestBuilder builder)
+            : this()
+        {
+            m_reqBuilder = builder;
+        }
+
         /// <summary>
         /// Gets whether this connection was initialised with an Anonymous login. If it was, it will return true. 
         /// If this was not, or it was initialised from an existing session id, then it will return false.
@@ -1483,8 +1489,17 @@
         /// </summary>
         public string UserAgent
         {
-            get { return m_reqBuilder.UserAgent; }
-            set { m_reqBuilder.UserAgent = value; }
+            get 
+            {
+                if (m_reqBuilder != null)
+                    return m_reqBuilder.UserAgent;
+                return string.Empty;
+            }
+            set 
+            { 
+                if (m_reqBuilder != null)
+                    m_reqBuilder.UserAgent = value; 
+            }
         }
 
         public bool SupportsResourcePreviews
@@ -1537,5 +1552,36 @@
         {
             get { throw new NotImplementedException(); }
         }
+
+        const string PROP_USER_AGENT = "UserAgent";
+
+        public override string[] GetCustomPropertyNames()
+        {
+            return new string[] { PROP_USER_AGENT };
+        }
+
+        public override Type GetCustomPropertyType(string name)
+        {
+            if (name == PROP_USER_AGENT)
+                return typeof(string);
+            else
+                throw new CustomPropertyNotFoundException();
+        }
+
+        public override void SetCustomProperty(string name, object value)
+        {
+            if (name == PROP_USER_AGENT)
+                this.UserAgent = value.ToString();
+            else
+                throw new CustomPropertyNotFoundException();
+        }
+
+        public override object GetCustomProperty(string name)
+        {
+            if (name == PROP_USER_AGENT)
+                return this.UserAgent;
+            else
+                throw new CustomPropertyNotFoundException();
+        }
     }
 }



More information about the mapguide-commits mailing list