diff --git a/data/templates/project/VBNet/FormsProject.xpt b/data/templates/project/VBNet/FormsProject.xpt
index 778895746f..e2bac7cde2 100644
--- a/data/templates/project/VBNet/FormsProject.xpt
+++ b/data/templates/project/VBNet/FormsProject.xpt
@@ -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
End Namespace
]]>
+
diff --git a/data/templates/project/VBNet/MySettings.settings b/data/templates/project/VBNet/MySettings.settings
new file mode 100644
index 0000000000..29627bfb9f
--- /dev/null
+++ b/data/templates/project/VBNet/MySettings.settings
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceCodeGeneratorTool.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceCodeGeneratorTool.cs
index a0937d6b5b..0c1140abef 100644
--- a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceCodeGeneratorTool.cs
+++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceCodeGeneratorTool.cs
@@ -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,
diff --git a/src/AddIns/DisplayBindings/SettingsEditor/Project/EmptySettingsFile.xft b/src/AddIns/DisplayBindings/SettingsEditor/Project/EmptySettingsFile.xft
index 6c3bca4d73..3603f7a1cd 100644
--- a/src/AddIns/DisplayBindings/SettingsEditor/Project/EmptySettingsFile.xft
+++ b/src/AddIns/DisplayBindings/SettingsEditor/Project/EmptySettingsFile.xft
@@ -13,8 +13,8 @@
-
-
+
+
]]>
diff --git a/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsCodeGeneratorTool.cs b/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsCodeGeneratorTool.cs
index e53dabdf23..489aff83c3 100644
--- a/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsCodeGeneratorTool.cs
+++ b/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsCodeGeneratorTool.cs
@@ -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
}
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
.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
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
+
+ _
+ 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
diff --git a/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsDocument.cs b/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsDocument.cs
index 47a959c613..d1c41344f6 100644
--- a/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsDocument.cs
+++ b/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsDocument.cs
@@ -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
}
}
+ ///
+ /// VB "My" namespace integration
+ ///
+ public bool UseMySettingsClassName { get; set; }
+
public List Entries {
get { return entries; }
}
@@ -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
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");
diff --git a/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsViewContent.cs b/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsViewContent.cs
index 8c3daf335d..d2d75d9b5e 100644
--- a/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsViewContent.cs
+++ b/src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsViewContent.cs
@@ -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
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 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
}
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")));
diff --git a/src/Main/Base/Project/Src/Project/CompilableProject.cs b/src/Main/Base/Project/Src/Project/CompilableProject.cs
index b22b8d8d6a..511ebf963a 100644
--- a/src/Main/Base/Project/Src/Project/CompilableProject.cs
+++ b/src/Main/Base/Project/Src/Project/CompilableProject.cs
@@ -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
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) {
diff --git a/src/Main/Base/Project/Src/Project/CustomTool.cs b/src/Main/Base/Project/Src/Project/CustomTool.cs
index b28562f90a..9142d32cea 100644
--- a/src/Main/Base/Project/Src/Project/CustomTool.cs
+++ b/src/Main/Base/Project/Src/Project/CustomTool.cs
@@ -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
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) {
diff --git a/src/Setup/Files.wxs b/src/Setup/Files.wxs
index a23f83517e..b58ddd8bb7 100644
--- a/src/Setup/Files.wxs
+++ b/src/Setup/Files.wxs
@@ -816,6 +816,7 @@
+