|
From: <mcu...@us...> - 2009-04-16 23:38:05
|
Revision: 1379
http://orm.svn.sourceforge.net/orm/?rev=1379&view=rev
Author: mcurland
Date: 2009-04-16 23:37:54 +0000 (Thu, 16 Apr 2009)
Log Message:
-----------
Enable multiple designer settings files to simplify external importer specifications. fixes #391
Modified Paths:
--------------
trunk/ORMModel/Shell/ORMDesignerSettings.cs
trunk/ORMModel/Shell/ORMPackage.cs
trunk/Setup/Components.wxs
trunk/install.bat
Modified: trunk/ORMModel/Shell/ORMDesignerSettings.cs
===================================================================
--- trunk/ORMModel/Shell/ORMDesignerSettings.cs 2009-04-16 01:21:20 UTC (rev 1378)
+++ trunk/ORMModel/Shell/ORMDesignerSettings.cs 2009-04-16 23:37:54 UTC (rev 1379)
@@ -27,6 +27,7 @@
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio;
+using Microsoft.Win32;
using ORMSolutions.ORMArchitect.Core.ObjectModel;
using System.ComponentModel;
@@ -36,6 +37,7 @@
/// A class used to read XmlConverters section of the designer settings file
/// and run transforms between registered converter types.
/// </summary>
+ [CLSCompliant(false)]
public partial class ORMDesignerSettings
{
#region Schema definition classes
@@ -169,46 +171,32 @@
}
#endregion // ORMDesignerNameTable class
#endregion // Schema definition classes
+ #region Constants
+ private const string REGISTRYKEY_CORESETTINGS = "Core";
+ private const string REGISTRYVALUE_SETTINGSFILE = "SettingsFile";
+ private const string REGISTRYVALUE_CONVERTERSDIR = "ConvertersDir";
+ #endregion // Constraints
#region Member Variables
- private IServiceProvider myServiceProvider;
+ private Package myPackage;
+ private string myRootRegistryKey; // Relative to the package application root
private bool myIsLoaded;
private Dictionary<XmlElementIdentifier, LinkedList<TransformNode>> myXmlConverters;
#endregion // Member Variables
#region Static Variables
- private static string mySettingsPath;
- private static string myXmlConvertersDirectory;
private static readonly object LockObject = new object();
#endregion // Static Variables
#region Constructors
/// <summary>
/// Construct new designer settings
/// </summary>
- /// <param name="serviceProvider">The service provider to use</param>
- /// <param name="settingsPath">The full path to the settings file.</param>
- /// <param name="xmlConvertersDirectory">The directory where the XML converters are located.</param>
- public ORMDesignerSettings(IServiceProvider serviceProvider, string settingsPath, string xmlConvertersDirectory)
+ /// <param name="package">The context package</param>
+ /// <param name="rootKey">The root key for designer settings, relative to the package registry root.</param>
+ public ORMDesignerSettings(Package package, string rootKey)
{
- myServiceProvider = serviceProvider;
- mySettingsPath = settingsPath;
- myXmlConvertersDirectory = xmlConvertersDirectory;
+ myPackage = package;
+ myRootRegistryKey = rootKey;
}
#endregion // Constructors
- #region SettingsDirectory property
- private string SettingsPath
- {
- get
- {
- return mySettingsPath;
- }
- }
- private string XmlConvertersDirectory
- {
- get
- {
- return myXmlConvertersDirectory;
- }
- }
- #endregion // SettingsDirectory property
#region ConvertStream method
/// <summary>
/// Convert the given stream to a new stream with converted contents.
@@ -316,6 +304,103 @@
}
#endregion // ConvertStream method
#region Global Settings Loader
+ /// <summary>
+ /// Structure representing a single settings file
+ /// </summary>
+ private struct SettingsLocation
+ {
+ /// <summary>
+ /// The settings file to load
+ /// </summary>
+ public readonly string SettingsFile;
+ /// <summary>
+ /// The directory for converter transforms
+ /// </summary>
+ public readonly string ConvertersDirectory;
+ private SettingsLocation(string settingsFile, string convertersDirectory)
+ {
+ SettingsFile = settingsFile;
+ ConvertersDirectory = convertersDirectory;
+ }
+ /// <summary>
+ /// Enumerate all registered settings files
+ /// </summary>
+ /// <param name="package">The context package, provides a starting key for registry information</param>
+ /// <param name="registryRoot">The root key relative to the package root</param>
+ /// <returns>Enumeration of settings files</returns>
+ public static IEnumerable<SettingsLocation> SettingsLocations(Package package, string registryRoot)
+ {
+ RegistryKey applicationRegistryRoot = null;
+ RegistryKey settingsRegistryRoot = null;
+ try
+ {
+ applicationRegistryRoot = package.ApplicationRegistryRoot;
+ settingsRegistryRoot = applicationRegistryRoot.OpenSubKey(registryRoot, RegistryKeyPermissionCheck.ReadSubTree);
+ if (settingsRegistryRoot != null)
+ {
+ string[] settingsKeyNames = settingsRegistryRoot.GetSubKeyNames();
+ int settingsCount = (settingsKeyNames == null) ? 0 : settingsKeyNames.Length;
+ if (settingsCount > 1)
+ {
+ // Treat the Core key specially to get a default converters directory
+ int coreIndex = Array.IndexOf<string>(settingsKeyNames, REGISTRYKEY_CORESETTINGS);
+ if (coreIndex > 0)
+ {
+ string swap = settingsKeyNames[0];
+ settingsKeyNames[0] = settingsKeyNames[coreIndex];
+ settingsKeyNames[coreIndex] = swap;
+ }
+ }
+ if (settingsCount != 0 && settingsKeyNames[0] == REGISTRYKEY_CORESETTINGS)
+ {
+ string defaultConvertersDirectory = null;
+ for (int i = 0; i < settingsCount; ++i)
+ {
+ using (RegistryKey settingsKey = settingsRegistryRoot.OpenSubKey(settingsKeyNames[i], RegistryKeyPermissionCheck.ReadSubTree))
+ {
+ string settingsFile = settingsKey.GetValue(REGISTRYVALUE_SETTINGSFILE, "", RegistryValueOptions.None) as string;
+ if (settingsFile != null && File.Exists(settingsFile))
+ {
+ string convertersDirectory = settingsKey.GetValue(REGISTRYVALUE_CONVERTERSDIR, "", RegistryValueOptions.None) as string;
+ if (string.IsNullOrEmpty(convertersDirectory))
+ {
+ if (i == 0)
+ {
+ break; // Invalid registration, Core information required
+ }
+ convertersDirectory = defaultConvertersDirectory;
+ }
+ if (Directory.Exists(convertersDirectory))
+ {
+ if (i == 0)
+ {
+ defaultConvertersDirectory = convertersDirectory;
+ }
+ yield return new SettingsLocation(settingsFile, convertersDirectory);
+ }
+ else if (i == 0)
+ {
+ break; // Invalid registration, Core information required
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ finally
+ {
+ if (applicationRegistryRoot != null)
+ {
+ applicationRegistryRoot.Close();
+ }
+ if (settingsRegistryRoot != null)
+ {
+ settingsRegistryRoot.Close();
+ }
+ }
+ }
+ }
private void EnsureGlobalSettingsLoaded()
{
if (myIsLoaded)
@@ -323,11 +408,11 @@
return;
}
myIsLoaded = true;
- string settingsFile = SettingsPath;
- if (File.Exists(settingsFile))
+ ORMDesignerNameTable names = ORMDesignerSchema.Names;
+ foreach (SettingsLocation location in SettingsLocation.SettingsLocations(myPackage, myRootRegistryKey))
{
- ORMDesignerNameTable names = ORMDesignerSchema.Names;
- using (FileStream designerSettingsStream = new FileStream(settingsFile, FileMode.Open, FileAccess.Read))
+ string convertersDirectory = location.ConvertersDirectory;
+ using (FileStream designerSettingsStream = new FileStream(location.SettingsFile, FileMode.Open, FileAccess.Read))
{
using (XmlTextReader settingsReader = new XmlTextReader(new StreamReader(designerSettingsStream), names))
{
@@ -344,7 +429,7 @@
{
if (TestElementName(reader.LocalName, names.XmlConvertersElement))
{
- ProcessXmlConverters(reader, names);
+ ProcessXmlConverters(reader, names, convertersDirectory);
}
else
{
@@ -364,7 +449,7 @@
}
}
}
- private void ProcessXmlConverters(XmlReader reader, ORMDesignerNameTable names)
+ private void ProcessXmlConverters(XmlReader reader, ORMDesignerNameTable names, string convertersDirectory)
{
if (reader.IsEmptyElement)
{
@@ -378,7 +463,7 @@
if (TestElementName(reader.LocalName, names.XmlConverterElement) ||
TestElementName(reader.LocalName, names.XmlExtensionConverterElement))
{
- ProcessXmlConverter(reader, names);
+ ProcessXmlConverter(reader, names, convertersDirectory);
}
else
{
@@ -964,7 +1049,7 @@
}
#endregion // TransformNode Class
#endregion // Helper Classes
- private void ProcessXmlConverter(XmlReader reader, ORMDesignerNameTable names)
+ private void ProcessXmlConverter(XmlReader reader, ORMDesignerNameTable names, string convertersDirectory)
{
if (myXmlConverters == null)
{
@@ -1060,7 +1145,7 @@
}
}
}
- TransformNode transformNode = new TransformNode(targetIdentifier, description, Path.Combine(XmlConvertersDirectory, transformFile), arguments, dynamicParameters, runsWithSourceIdentifier);
+ TransformNode transformNode = new TransformNode(targetIdentifier, description, Path.Combine(convertersDirectory, transformFile), arguments, dynamicParameters, runsWithSourceIdentifier);
LinkedList<TransformNode> nodes;
if (myXmlConverters.TryGetValue(sourceIdentifier, out nodes))
{
Modified: trunk/ORMModel/Shell/ORMPackage.cs
===================================================================
--- trunk/ORMModel/Shell/ORMPackage.cs 2009-04-16 01:21:20 UTC (rev 1378)
+++ trunk/ORMModel/Shell/ORMPackage.cs 2009-04-16 23:37:54 UTC (rev 1379)
@@ -110,8 +110,7 @@
#region Constants
private const string REGISTRYROOT_PACKAGE = @"ORM Solutions\Natural ORM Architect";
private const string REGISTRYROOT_EXTENSIONS = REGISTRYROOT_PACKAGE + @"\Extensions\";
- private const string REGISTRYVALUE_SETTINGSPATH = "SettingsPath";
- private const string REGISTRYVALUE_CONVERTERSDIR = "ConvertersDir";
+ private const string REGISTRYROOT_DESIGNERSETTINGS = REGISTRYROOT_PACKAGE + @"\DesignerSettings\";
private const string REGISTRYVALUE_VERBALIZATIONDIR = "VerbalizationDir";
private const string REGISTRYVALUE_TOOLBOXREVISION_OBSOLETESINGLEVALUE = "ToolboxRevision";
private const string REGISTRYKEY_TOOLBOXREVISIONS = "ToolboxRevisions";
@@ -197,28 +196,7 @@
ORMDesignerSettings retVal = package.myDesignerSettings;
if (retVal == null)
{
- RegistryKey applicationRegistryRoot = null;
- RegistryKey normaRegistryRoot = null;
- try
- {
- applicationRegistryRoot = package.ApplicationRegistryRoot;
- normaRegistryRoot = applicationRegistryRoot.OpenSubKey(REGISTRYROOT_PACKAGE, RegistryKeyPermissionCheck.ReadSubTree);
- string settingsPath = (string)normaRegistryRoot.GetValue(REGISTRYVALUE_SETTINGSPATH, String.Empty);
- string xmlConvertersDir = (string)normaRegistryRoot.GetValue(REGISTRYVALUE_CONVERTERSDIR, String.Empty);
- retVal = new ORMDesignerSettings(package, settingsPath, xmlConvertersDir);
- package.myDesignerSettings = retVal;
- }
- finally
- {
- if (applicationRegistryRoot != null)
- {
- applicationRegistryRoot.Close();
- }
- if (normaRegistryRoot != null)
- {
- normaRegistryRoot.Close();
- }
- }
+ package.myDesignerSettings = retVal = new ORMDesignerSettings(package, REGISTRYROOT_DESIGNERSETTINGS);
}
return retVal;
}
@@ -244,7 +222,6 @@
{
applicationRegistryRoot = package.ApplicationRegistryRoot;
normaRegistryRoot = applicationRegistryRoot.OpenSubKey(REGISTRYROOT_PACKAGE, RegistryKeyPermissionCheck.ReadSubTree);
- string settingsPath = (string)normaRegistryRoot.GetValue(REGISTRYVALUE_SETTINGSPATH, String.Empty);
retVal = (string)normaRegistryRoot.GetValue(REGISTRYVALUE_VERBALIZATIONDIR, String.Empty);
package.myVerbalizationDirectory = retVal;
}
Modified: trunk/Setup/Components.wxs
===================================================================
--- trunk/Setup/Components.wxs 2009-04-16 01:21:20 UTC (rev 1378)
+++ trunk/Setup/Components.wxs 2009-04-16 23:37:54 UTC (rev 1379)
@@ -446,7 +446,7 @@
DefaultLanguage="0" CompanionFile="ORMSolutions.ORMArchitect.Core$(var.VSExt).dll"/>
<File Id="RemoveOIAL2006_01.xslt" ShortName="ROil0601.xsl" Name="RemoveOIAL2006-01.xslt" Source="..\ORMModel\Shell\Converters\RemoveOIAL2006-01.xslt"
DefaultLanguage="0" CompanionFile="ORMSolutions.ORMArchitect.Core$(var.VSExt).dll"/>
- <RegistryValue Root="HKLM" Key="$(var.NORMAVSRegRoot)" Type="string" Name="ConvertersDir" Value="[Converters]"/>
+ <RegistryValue Root="HKLM" Key="$(var.NORMAVSRegRoot)\DesignerSettings\Core" Type="string" Name="ConvertersDir" Value="[Converters]"/>
</Component>
</Directory>
</Directory>
@@ -487,14 +487,12 @@
</Component>
</Directory>
</Directory>
+ <Component Id="NORMAVSSettingsComponent" Guid="956063F7-13D9-4083-$(var.VersionGuidSuffix)" DiskId="1" Win64="$(var.Win64)">
+ <File Id="ORMDesignerSettings.xml" ShortName="DsgnrStg.xml" Name="ORMDesignerSettings.xml" Source="..\ORMModel\Shell\ORMDesignerSettings.xml"
+ DefaultLanguage="0" KeyPath="yes"/>
+ <RegistryValue Root="HKLM" Key="$(var.NORMAVSRegRoot)\DesignerSettings\Core" Type="string" Name="SettingsFile" Value="[#ORMDesignerSettings.xml]"/>
+ </Component>
</Directory>
-
- <Component Id="NORMAVSSettingsComponent" Guid="956063F7-13D9-4083-$(var.VersionGuidSuffix)" DiskId="1" Win64="$(var.Win64)">
- <File Id="ORMDesignerSettings.xml" ShortName="DsgnrStg.xml" Name="ORMDesignerSettings.xml" Source="..\ORMModel\Shell\ORMDesignerSettings.xml"
- DefaultLanguage="0" KeyPath="yes"/>
- <RegistryValue Root="HKLM" Key="$(var.NORMAVSRegRoot)" Type="string" Name="SettingsPath" Value="[#ORMDesignerSettings.xml]"/>
- </Component>
-
</Directory>
</Directory>
</Directory>
Modified: trunk/install.bat
===================================================================
--- trunk/install.bat 2009-04-16 01:21:20 UTC (rev 1378)
+++ trunk/install.bat 2009-04-16 23:37:54 UTC (rev 1379)
@@ -65,7 +65,8 @@
XCOPY /Y /D /V /Q "%RootDir%\AlternateViews\BarkerERView\BarkerERView.xsd" "%NORMADir%\Xml\Schemas\"
XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Framework\Shell\DiagramDisplay.xsd" "%NORMADir%\Xml\Schemas\"
XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Shell\catalog.xml" "%NORMADir%\Xml\Schemas\"
-XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Shell\ORMDesignerSettings.xml" "%NORMADir%\"
+CALL:_CleanupFile "%NORMADir%\ORMDesignerSettings.xml"
+XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Shell\ORMDesignerSettings.xml" "%NORMADir%\Xml\"
XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Shell\Converters\*.xslt" "%NORMADir%\Xml\Transforms\Converters\"
XCOPY /Y /D /V /Q "%RootDir%\ORMModel\ObjectModel\VerbalizationUntypedSnippets.xsd" "%NORMADir%\Xml\Verbalization\"
XCOPY /Y /D /V /Q "%RootDir%\ORMModel\ObjectModel\VerbalizationCoreSnippets\*.x??" "%NORMADir%\Xml\Verbalization\Core\"
@@ -110,8 +111,12 @@
REG DELETE "HKLM\%VSRegistryRoot%\Projects\{A2FE74E1-B743-11d0-AE1A-00A0C90FFFC3}\AddItemTemplates\TemplateDirs\{EFDDC549-1646-4451-8A51-E5A5E94D647C}" /f 1>NUL 2>&1
REG DELETE "HKLM\%VSRegistryRoot%\Projects\{D1DCDB85-C5E8-11d2-BFCA-00C04F990235}\AddItemTemplates\TemplateDirs\{EFDDC549-1646-4451-8A51-E5A5E94D647C}" /f 1>NUL 2>&1
- REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "SettingsPath" /d "%NORMADir%\ORMDesignerSettings.xml" /f 1>NUL
- REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "ConvertersDir" /d "%NORMADir%\Xml\Transforms\Converters\\" /f 1>NUL
+ :: Get rid of single-settings-file-only values
+ REG DELETE "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "SettingsPath" /f 1>NUL 2>&1
+ REG DELETE "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "ConvertersDir" /f 1>NUL 2>&1
+
+ REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect\DesignerSettings\Core" /v "SettingsFile" /d "%NORMADir%\Xml\ORMDesignerSettings.xml" /f 1>NUL
+ REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect\DesignerSettings\Core" /v "ConvertersDir" /d "%NORMADir%\Xml\Transforms\Converters\\" /f 1>NUL
REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "VerbalizationDir" /d "%NORMADir%\Xml\Verbalization\\" /f 1>NUL
REG ADD "HKLM\%VSRegistryRoot%\FontAndColors\Orm Designer" /v "Category" /d "{663DE24F-8E3A-4C0F-A307-53053ED6C59B}" /f 1>NUL
REG ADD "HKLM\%VSRegistryRoot%\FontAndColors\Orm Designer" /v "Package" /d "{C5AA80F8-F730-4809-AAB1-8D925E36F9F5}" /f 1>NUL
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|