Browse Source

SettingsEditor: added support for VB.NET "My.Settings"

pull/4/head
Daniel Grunwald 15 years ago
parent
commit
19d03f6b28
  1. 3
      data/templates/project/VBNet/FormsProject.xpt
  2. 4
      data/templates/project/VBNet/MySettings.settings
  3. 7
      src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceCodeGeneratorTool.cs
  4. 4
      src/AddIns/DisplayBindings/SettingsEditor/Project/EmptySettingsFile.xft
  5. 81
      src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsCodeGeneratorTool.cs
  6. 10
      src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsDocument.cs
  7. 29
      src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsViewContent.cs
  8. 10
      src/Main/Base/Project/Src/Project/CompilableProject.cs
  9. 12
      src/Main/Base/Project/Src/Project/CustomTool.cs
  10. 1
      src/Setup/Files.wxs

3
data/templates/project/VBNet/FormsProject.xpt

@ -105,7 +105,7 @@ Namespace My @@ -105,7 +105,7 @@ Namespace My
MyBase.New(AuthenticationMode.Windows)
Me.IsSingleInstance = False
Me.EnableVisualStyles = True
Me.SaveMySettingsOnExit = False ' MySettings are not supported in SharpDevelop.
Me.SaveMySettingsOnExit = True
Me.ShutDownStyle = ShutdownMode.AfterMainFormCloses
End Sub
@ -116,6 +116,7 @@ Namespace My @@ -116,6 +116,7 @@ Namespace My
End Namespace
]]></File>
<File name="Properties\AssemblyInfo.vb" src="DefaultAssemblyInfo.vb"/>
<File name="Properties\Settings.settings" src="MySettings.settings" Generator="SettingsSingleFileGenerator"/>
</Files>
</Project>
</Template>

4
data/templates/project/VBNet/MySettings.settings

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="True">
<Profiles />
<Settings />
</SettingsFile>

7
src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceCodeGeneratorTool.cs

@ -57,13 +57,6 @@ namespace ResourceEditor @@ -57,13 +57,6 @@ namespace ResourceEditor
string[] unmatchable = null;
string generatedCodeNamespace = context.OutputNamespace;
if (context.Project.LanguageProperties == ICSharpCode.SharpDevelop.Dom.LanguageProperties.VBNet) {
if (generatedCodeNamespace == context.Project.RootNamespace) {
generatedCodeNamespace = null; // namespace is implicit in VB
} else if (generatedCodeNamespace.StartsWith(context.Project.RootNamespace + ".", StringComparison.OrdinalIgnoreCase)) {
generatedCodeNamespace = generatedCodeNamespace.Substring(context.Project.RootNamespace.Length + 1);
}
}
context.WriteCodeDomToFile(
item,

4
src/AddIns/DisplayBindings/SettingsEditor/Project/EmptySettingsFile.xft

@ -13,8 +13,8 @@ @@ -13,8 +13,8 @@
<Files>
<File name="${FullName}" language="ResourceFiles" Generator="SettingsSingleFileGenerator"><![CDATA[<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="${StandardNamespace}" GeneratedClassName="${ClassName}">
<Profiles />
<Settings />
<Profiles />
<Settings />
</SettingsFile>
]]> </File>
</Files>

81
src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsCodeGeneratorTool.cs

@ -3,12 +3,14 @@ @@ -3,12 +3,14 @@
using System;
using System.CodeDom;
using System.ComponentModel;
using System.Configuration;
using System.Diagnostics;
using System.Reflection;
using System.Xml;
using ICSharpCode.EasyCodeDom;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SettingsEditor
@ -26,7 +28,11 @@ namespace ICSharpCode.SettingsEditor @@ -26,7 +28,11 @@ namespace ICSharpCode.SettingsEditor
}
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.AddNamespace(setDoc.GeneratedClassNamespace).Types.Add(CreateClass(setDoc));
var ns = ccu.AddNamespace(setDoc.GeneratedClassNamespace);
ns.Types.Add(CreateClass(setDoc));
if (setDoc.UseMySettingsClassName) {
ns.Types.Add(CreateMySettingsProperty(setDoc));
}
context.WriteCodeDomToFile(item, context.GetOutputFileName(item, ".Designer"), ccu);
}
@ -47,7 +53,12 @@ namespace ICSharpCode.SettingsEditor @@ -47,7 +53,12 @@ namespace ICSharpCode.SettingsEditor
.InvokeMethod("Synchronized", Easy.New(Easy.TypeRef(c)))
.CastTo(Easy.TypeRef(c));
c.AddProperty(f, "Default");
var defaultProperty = c.AddProperty(f, "Default");
if (setDoc.UseMySettingsClassName) {
c.AddAttribute(typeof(EditorBrowsableAttribute), Easy.Prim(EditorBrowsableState.Advanced));
AddAutoSaveLogic(c, defaultProperty);
}
foreach (SettingsEntry entry in setDoc.Entries) {
Type entryType = entry.Type ?? typeof(string);
@ -99,6 +110,72 @@ namespace ICSharpCode.SettingsEditor @@ -99,6 +110,72 @@ namespace ICSharpCode.SettingsEditor
return c;
}
void AddAutoSaveLogic(CodeTypeDeclaration c, CodeMemberProperty defaultProperty)
{
// VB auto-safe logic:
c.Members.Add(new CodeSnippetTypeMember(
@" #Region ""Support for My.Application.SaveMySettingsOnExit""
#If _MyType = ""WindowsForms"" Then
Private Shared addedHandler As Boolean
Private Shared addedHandlerLockObject As New Object
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
If My.Application.SaveMySettingsOnExit Then
My.Settings.Save()
End If
End Sub
#End If
#End Region".Replace("\t", EditorControlService.GlobalOptions.IndentationString)
));
defaultProperty.GetStatements.Insert(0, new CodeSnippetStatement(
@" #If _MyType = ""WindowsForms"" Then
If Not addedHandler Then
SyncLock addedHandlerLockObject
If Not addedHandler Then
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
addedHandler = True
End If
End SyncLock
End If
#End If".Replace("\t", EditorControlService.GlobalOptions.IndentationString)
));
}
class CodeLiteralDirective : CodeDirective
{
string text;
public CodeLiteralDirective(string text)
{
this.text = text;
}
public override string ToString()
{
return text;
}
}
CodeTypeDeclaration CreateMySettingsProperty(SettingsDocument setDoc)
{
CodeTypeDeclaration c = new CodeTypeDeclaration("MySettingsProperty");
c.UserData["Module"] = true;
c.AddAttribute(new CodeTypeReference("Microsoft.VisualBasic.HideModuleNameAttribute"));
c.AddAttribute(typeof(DebuggerNonUserCodeAttribute));
c.AddAttribute(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute));
c.TypeAttributes = TypeAttributes.NotPublic;
CodeTypeReference r = new CodeTypeReference(setDoc.GeneratedFullClassName);
var p = c.AddProperty(r, "Settings");
p.Attributes = MemberAttributes.Assembly | MemberAttributes.Static;
p.Getter.Return(Easy.Type(r).Property("Default"));
p.AddAttribute(typeof(System.ComponentModel.Design.HelpKeywordAttribute), Easy.Prim("My.Settings"));
return c;
}
}
public class PublicSettingsCodeGeneratorTool : SettingsCodeGeneratorTool

10
src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsDocument.cs

@ -2,8 +2,8 @@ @@ -2,8 +2,8 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Xml;
using System.Collections.Generic;
using System.Xml;
namespace ICSharpCode.SettingsEditor
{
@ -32,6 +32,11 @@ namespace ICSharpCode.SettingsEditor @@ -32,6 +32,11 @@ namespace ICSharpCode.SettingsEditor
}
}
/// <summary>
/// VB "My" namespace integration
/// </summary>
public bool UseMySettingsClassName { get; set; }
public List<SettingsEntry> Entries {
get { return entries; }
}
@ -46,6 +51,7 @@ namespace ICSharpCode.SettingsEditor @@ -46,6 +51,7 @@ namespace ICSharpCode.SettingsEditor
{
generatedClassNamespace = settingsFile.GetAttribute("GeneratedClassNamespace");
generatedClassName = settingsFile.GetAttribute("GeneratedClassName");
this.UseMySettingsClassName = "true".Equals(settingsFile.GetAttribute("UseMySettingsClassName"), StringComparison.OrdinalIgnoreCase);
XmlElement settings = settingsFile["Settings"];
@ -62,6 +68,8 @@ namespace ICSharpCode.SettingsEditor @@ -62,6 +68,8 @@ namespace ICSharpCode.SettingsEditor
writer.WriteAttributeString("CurrentProfile", "(Default)");
writer.WriteAttributeString("GeneratedClassNamespace", generatedClassNamespace);
writer.WriteAttributeString("GeneratedClassName", generatedClassName);
if (this.UseMySettingsClassName)
writer.WriteAttributeString("UseMySettingsClassName", "true");
writer.WriteStartElement("Profiles");
writer.WriteStartElement("Profile");

29
src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsViewContent.cs

@ -5,13 +5,12 @@ using System; @@ -5,13 +5,12 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
@ -127,27 +126,35 @@ namespace ICSharpCode.SettingsEditor @@ -127,27 +126,35 @@ namespace ICSharpCode.SettingsEditor
void UpdateAppConfig(XDocument appConfigDoc)
{
var entries = view.GetAllEntries();
var userEntries = entries.Where(e => e.Scope == SettingScope.User);
var appEntries = entries.Where(e => e.Scope == SettingScope.Application);
XElement configuration = appConfigDoc.Root;
XElement configSections = configuration.Element("configSections");
if (configSections == null) {
configSections = configuration.AddFirstWithIndentation(new XElement("configSections"));
}
RegisterAppConfigSection(configSections, entries);
RegisterAppConfigSection(configSections, userEntries.Any(), appEntries.Any());
XElement userSettings = configuration.Element("userSettings");
if (userSettings == null) {
if (userSettings == null && userEntries.Any()) {
userSettings = configuration.AddWithIndentation(new XElement("userSettings"));
}
UpdateSettings(userSettings, entries.Where(e => e.Scope == SettingScope.User));
if (userSettings != null) {
UpdateSettings(userSettings, userEntries);
}
XElement appSettings = configuration.Element("applicationSettings");
if (appSettings == null) {
if (appSettings == null && appEntries.Any()) {
appSettings = configuration.AddWithIndentation(new XElement("applicationSettings"));
}
UpdateSettings(appSettings, entries.Where(e => e.Scope == SettingScope.Application));
if (appSettings != null) {
UpdateSettings(appSettings, appEntries);
}
}
void RegisterAppConfigSection(XElement configSections, IEnumerable<SettingsEntry> entries)
void RegisterAppConfigSection(XElement configSections, bool hasUserEntries, bool hasAppEntries)
{
if (entries.Any(e => e.Scope == SettingScope.User)) {
if (hasUserEntries) {
XElement userSettings = configSections.Elements("sectionGroup").FirstOrDefault(e => (string)e.Attribute("name") == "userSettings");
if (userSettings == null) {
userSettings = configSections.AddWithIndentation(new XElement("sectionGroup", new XAttribute("name", "userSettings")));
@ -155,7 +162,7 @@ namespace ICSharpCode.SettingsEditor @@ -155,7 +162,7 @@ namespace ICSharpCode.SettingsEditor
}
RegisterAppConfigSectionInGroup(userSettings, SettingScope.User);
}
if (entries.Any(e => e.Scope == SettingScope.Application)) {
if (hasAppEntries) {
XElement appSettings = configSections.Elements("sectionGroup").FirstOrDefault(e => (string)e.Attribute("name") == "applicationSettings");
if (appSettings == null) {
appSettings = configSections.AddWithIndentation(new XElement("sectionGroup", new XAttribute("name", "applicationSettings")));

10
src/Main/Base/Project/Src/Project/CompilableProject.cs

@ -1,18 +1,16 @@ @@ -1,18 +1,16 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System.Xml.Linq;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project.Converter;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Internal.Templates;
using ICSharpCode.SharpDevelop.Project.Converter;
using ICSharpCode.SharpDevelop.Util;
namespace ICSharpCode.SharpDevelop.Project
@ -611,6 +609,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -611,6 +609,8 @@ namespace ICSharpCode.SharpDevelop.Project
bool createAppConfig = newFramework.RequiresAppConfigEntry && (this.OutputType != OutputType.Library && this.OutputType != OutputType.Module);
string appConfigFileName = GetAppConfigFile(this, createAppConfig);
if (appConfigFileName == null)
return;
using (FakeXmlViewContent xml = new FakeXmlViewContent(appConfigFileName)) {
if (xml.Document != null) {

12
src/Main/Base/Project/Src/Project/CustomTool.cs

@ -12,6 +12,7 @@ using System.Text; @@ -12,6 +12,7 @@ using System.Text;
using System.Text.RegularExpressions;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Project
@ -145,6 +146,17 @@ namespace ICSharpCode.SharpDevelop.Project @@ -145,6 +146,17 @@ namespace ICSharpCode.SharpDevelop.Project
CodeDomProvider provider = project.LanguageProperties.CodeDomProvider;
CodeGeneratorOptions options = new CodeDOMGeneratorUtility().CreateCodeGeneratorOptions;
if (project.LanguageProperties == LanguageProperties.VBNet) {
// the root namespace is implicit in VB
foreach (CodeNamespace ns in ccu.Namespaces) {
if (string.Equals(ns.Name, project.RootNamespace, StringComparison.OrdinalIgnoreCase)) {
ns.Name = string.Empty;
} else if (ns.Name.StartsWith(project.RootNamespace + ".", StringComparison.OrdinalIgnoreCase)) {
ns.Name = ns.Name.Substring(project.RootNamespace.Length + 1);
}
}
}
string codeOutput;
using (StringWriter writer = new StringWriter()) {
if (provider == null) {

1
src/Setup/Files.wxs

@ -816,6 +816,7 @@ @@ -816,6 +816,7 @@
<File Source="..\..\data\templates\project\VBNet\Service.xpt" Name="Service.xpt" Id="VBNetService.xpt" />
<File Source="..\..\data\templates\project\VBNet\SharedAddin.xpt" Id="VBNetSharedAddin.xpt" Name="SharedAddin.xpt" />
<File Source="..\..\data\templates\project\VBNet\SharpDevelopAddin.xpt" Id="VBNetSharpDevelopAddin.xpt" Name="SharpDevelopAddin.xpt" />
<File Id="MySettings.settings" Name="MySettings.settings" Source="..\..\data\templates\project\VBNet\MySettings.settings" />
</Component>
</Directory>
<Component Guid="73EAC135-57B6-46C0-9F24-70A347B9AAC8" Id="ExampleProjectTemplate" DiskId="1">

Loading…
Cancel
Save