[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¤cy_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=">>pictureBox1.Name" xml:space="preserve">
+ <value>pictureBox1</value>
+ </data>
+ <data name=">>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=">>pictureBox1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>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=">>linkLabel.Name" xml:space="preserve">
+ <value>linkLabel</value>
+ </data>
+ <data name=">>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=">>linkLabel.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>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=">>label1.Name" xml:space="preserve">
+ <value>label1</value>
+ </data>
+ <data name=">>label1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>label1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>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=">>License.Name" xml:space="preserve">
+ <value>License</value>
+ </data>
+ <data name=">>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=">>License.Parent" xml:space="preserve">
+ <value>licenseTab</value>
+ </data>
+ <data name=">>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=">>Version.Name" xml:space="preserve">
+ <value>Version</value>
+ </data>
+ <data name=">>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=">>Version.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>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=">>PayPalImage.Name" xml:space="preserve">
+ <value>PayPalImage</value>
+ </data>
+ <data name=">>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=">>PayPalImage.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>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=">>Localization.Name" xml:space="preserve">
+ <value>Localization</value>
+ </data>
+ <data name=">>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=">>Localization.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>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=">>licenseTab.Name" xml:space="preserve">
+ <value>licenseTab</value>
+ </data>
+ <data name=">>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=">>licenseTab.Parent" xml:space="preserve">
+ <value>tabControl</value>
+ </data>
+ <data name=">>licenseTab.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name=">>Credits.Name" xml:space="preserve">
+ <value>Credits</value>
+ </data>
+ <data name=">>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=">>Credits.Parent" xml:space="preserve">
+ <value>creditsTab</value>
+ </data>
+ <data name=">>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=">>creditsTab.Name" xml:space="preserve">
+ <value>creditsTab</value>
+ </data>
+ <data name=">>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=">>creditsTab.Parent" xml:space="preserve">
+ <value>tabControl</value>
+ </data>
+ <data name=">>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=">>linkLabel1.Name" xml:space="preserve">
+ <value>linkLabel1</value>
+ </data>
+ <data name=">>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=">>linkLabel1.Parent" xml:space="preserve">
+ <value>thirdPartyTab</value>
+ </data>
+ <data name=">>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=">>lnkSharpDevelop.Name" xml:space="preserve">
+ <value>lnkSharpDevelop</value>
+ </data>
+ <data name=">>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=">>lnkSharpDevelop.Parent" xml:space="preserve">
+ <value>thirdPartyTab</value>
+ </data>
+ <data name=">>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=">>colorBrewerlinkLabel.Name" xml:space="preserve">
+ <value>colorBrewerlinkLabel</value>
+ </data>
+ <data name=">>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=">>colorBrewerlinkLabel.Parent" xml:space="preserve">
+ <value>thirdPartyTab</value>
+ </data>
+ <data name=">>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=">>ziplibLinkLabel.Name" xml:space="preserve">
+ <value>ziplibLinkLabel</value>
+ </data>
+ <data name=">>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=">>ziplibLinkLabel.Parent" xml:space="preserve">
+ <value>thirdPartyTab</value>
+ </data>
+ <data name=">>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=">>tfnetLinkLabel.Name" xml:space="preserve">
+ <value>tfnetLinkLabel</value>
+ </data>
+ <data name=">>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=">>tfnetLinkLabel.Parent" xml:space="preserve">
+ <value>thirdPartyTab</value>
+ </data>
+ <data name=">>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=">>label2.Name" xml:space="preserve">
+ <value>label2</value>
+ </data>
+ <data name=">>label2.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>label2.Parent" xml:space="preserve">
+ <value>thirdPartyTab</value>
+ </data>
+ <data name=">>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=">>thirdPartyTab.Name" xml:space="preserve">
+ <value>thirdPartyTab</value>
+ </data>
+ <data name=">>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=">>thirdPartyTab.Parent" xml:space="preserve">
+ <value>tabControl</value>
+ </data>
+ <data name=">>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=">>tabControl.Name" xml:space="preserve">
+ <value>tabControl</value>
+ </data>
+ <data name=">>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=">>tabControl.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>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=">>Credits.Name" xml:space="preserve">
+ <value>Credits</value>
+ </data>
+ <data name=">>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=">>Credits.Parent" xml:space="preserve">
+ <value>creditsTab</value>
+ </data>
+ <data name=">>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=">>ServerVersion.Name" xml:space="preserve">
+ <value>ServerVersion</value>
+ </data>
+ <data name=">>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=">>ServerVersion.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>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=">>ToolTip.Name" xml:space="preserve">
+ <value>ToolTip</value>
+ </data>
+ <data name=">>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=">>$this.Name" xml:space="preserve">
+ <value>AboutDialog</value>
+ </data>
+ <data name=">>$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