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 @@ +