diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj index 54f899fade..60d0cf27c7 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj @@ -134,6 +134,11 @@ NRefactory False + + {53840EAB-984D-419F-A2A2-6D13C3F3D5B4} + FormsDesigner.AddIn + False + {DBCF20A1-BA13-4582-BFA9-74DE4D987B73} NRefactoryToBooConverter @@ -150,11 +155,6 @@ Always - - {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} - FormsDesigner - False - diff --git a/src/AddIns/BackendBindings/Scripting/Project/ICSharpCode.Scripting.csproj b/src/AddIns/BackendBindings/Scripting/Project/ICSharpCode.Scripting.csproj index 3f4e163dbe..8ee4c63d13 100644 --- a/src/AddIns/BackendBindings/Scripting/Project/ICSharpCode.Scripting.csproj +++ b/src/AddIns/BackendBindings/Scripting/Project/ICSharpCode.Scripting.csproj @@ -136,9 +136,9 @@ UnitTesting False - - {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} - FormsDesigner + + {53840EAB-984D-419F-A2A2-6D13C3F3D5B4} + FormsDesigner.AddIn False diff --git a/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj index 24c783bec3..3b7dd9844b 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj +++ b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj @@ -223,11 +223,6 @@ AvalonEdit.AddIn False - - {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} - FormsDesigner - False - Always @@ -256,6 +251,11 @@ ICSharpCode.SharpDevelop.Widgets False + + {53840EAB-984D-419F-A2A2-6D13C3F3D5B4} + FormsDesigner.AddIn + False + diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerGenerator/AbstractDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerGenerator/AbstractDesignerGenerator.cs index c956185330..e0055d773d 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerGenerator/AbstractDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerGenerator/AbstractDesignerGenerator.cs @@ -20,7 +20,7 @@ using ReflectionLayer = ICSharpCode.SharpDevelop.Dom.ReflectionLayer; namespace ICSharpCode.FormsDesigner { - public abstract class AbstractDesignerGenerator : IDesignerGenerator + public abstract class AbstractDesignerGenerator : IDesignerGenerator, IDesignerSourceProvider { /// The currently open part of the class being designed. IClass currentClassPart; @@ -582,4 +582,8 @@ namespace ICSharpCode.FormsDesigner return null; } } + + + + } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerGenerator/IDesignerSourceProvider.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerGenerator/IDesignerSourceProvider.cs new file mode 100644 index 0000000000..222cd9efe5 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerGenerator/IDesignerSourceProvider.cs @@ -0,0 +1,25 @@ +// 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; +using System.Collections.Generic; +using ICSharpCode.SharpDevelop; + +namespace ICSharpCode.FormsDesigner +{ + public interface IDesignerSourceProvider + { + void Attach(FormsDesignerViewContent viewContent); + void Detach(); + FormsDesignerViewContent ViewContent { get; } + + /// + /// Gets the collection of OpenedFiles that contain code which belongs + /// to the designed form, not including resource files. + /// + /// Receives the file which contains the code to be modified by the forms designer. + /// A collection of OpenedFiles that contain code which belongs to the designed form. + /// The returned collection must include the . + IEnumerable GetSourceFiles(out OpenedFile designerCodeFile); + } +} diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/AbstractCodeDomDesignerLoader.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/AbstractCodeDomDesignerLoader.cs index 9ac0e39a68..f932d01a7a 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/AbstractCodeDomDesignerLoader.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/AbstractCodeDomDesignerLoader.cs @@ -2,14 +2,22 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.ComponentModel.Design.Serialization; namespace ICSharpCode.FormsDesigner { /// /// Description of AbstractCodeDomDesignerLoader. /// - public class AbstractCodeDomDesignerLoader : IDesignerLoader + public abstract class AbstractCodeDomDesignerLoader : IDesignerLoader { + protected AbstractCodeDomDesignerLoader(IDesignerGenerator generator) + { + this.Generator = generator; + } + + public IDesignerGenerator Generator { get; set; } + /// /// When overridden in derived classes, this method should return the current /// localization model of the designed file or None, if it cannot be determined. @@ -20,15 +28,9 @@ namespace ICSharpCode.FormsDesigner return CodeDomLocalizationModel.None; } - System.CodeDom.CodeCompileUnit IDesignerLoader.Parse() - { - throw new NotImplementedException(); - } + public abstract System.CodeDom.CodeCompileUnit Parse(); - void IDesignerLoader.Write(System.CodeDom.CodeCompileUnit unit) - { - throw new NotImplementedException(); - } + public abstract void Write(System.CodeDom.CodeCompileUnit unit); CodeDomLocalizationModel IDesignerLoader.GetLocalizationModel() { @@ -38,15 +40,20 @@ namespace ICSharpCode.FormsDesigner // Try to find out the current localization model of the designed form CodeDomLocalizationModel existingModel = this.GetCurrentLocalizationModelFromDesignedFile(); if (existingModel != CodeDomLocalizationModel.None) { - LoggingService.Debug("Determined existing localization model, using that: " + existingModel.ToString()); + Core.LoggingService.Debug("Determined existing localization model, using that: " + existingModel.ToString()); model = existingModel; } else { - LoggingService.Debug("Could not determine existing localization model, using default: " + model.ToString()); + Core.LoggingService.Debug("Could not determine existing localization model, using default: " + model.ToString()); } } else { - LoggingService.Debug("Using default localization model: " + model.ToString()); + Core.LoggingService.Debug("Using default localization model: " + model.ToString()); } return model; } + + public virtual bool IsReloadNeeded(bool value) + { + return value; + } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/DesignerLoaderProvider.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/DesignerLoaderProvider.cs similarity index 63% rename from src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/DesignerLoaderProvider.cs rename to src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/DesignerLoaderProvider.cs index be6b1cdadc..e14739e206 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/DesignerLoaderProvider.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/DesignerLoaderProvider.cs @@ -3,29 +3,32 @@ using System; using System.ComponentModel.Design.Serialization; -/* + using ICSharpCode.NRefactory; namespace ICSharpCode.FormsDesigner { public interface IDesignerLoaderProvider { - DesignerLoader CreateLoader(IDesignerGenerator generator); + IDesignerLoader CreateLoader(IDesignerGenerator generator); + FormsDesignerViewContent ViewContent { get; set; } } public class NRefactoryDesignerLoaderProvider : IDesignerLoaderProvider { readonly SupportedLanguage language; + FormsDesignerViewContent viewContent; + + public FormsDesignerViewContent ViewContent { get; set; } public NRefactoryDesignerLoaderProvider(SupportedLanguage language) { this.language = language; } - public DesignerLoader CreateLoader(IDesignerGenerator generator) + public IDesignerLoader CreateLoader(IDesignerGenerator generator) { - return new NRefactoryDesignerLoader(language, generator); + return new NRefactoryDesignerLoader(language, generator, ViewContent); } } -} -*/ +} \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/NRefactoryDesignerLoader.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/NRefactoryDesignerLoader.cs index 6ee3cd3247..a7bbb594c5 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/NRefactoryDesignerLoader.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerLoader/NRefactoryDesignerLoader.cs @@ -3,12 +3,12 @@ using System; using System.CodeDom; +using System.CodeDom.Compiler; using System.Collections.Generic; using System.ComponentModel.Design.Serialization; using System.IO; using System.Linq; using System.Windows.Forms; - using ICSharpCode.Core; using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.Ast; @@ -22,16 +22,18 @@ namespace ICSharpCode.FormsDesigner public class NRefactoryDesignerLoader : AbstractCodeDomDesignerLoader { SupportedLanguage language; + FormsDesignerViewContent viewContent; - protected override bool IsReloadNeeded() + public override bool IsReloadNeeded(bool value) { - return base.IsReloadNeeded() || this.Generator.ViewContent.DesignerCodeFileContent != lastTextContent; + return base.IsReloadNeeded(value) || viewContent.DesignerCodeFileContent != lastTextContent; } - public NRefactoryDesignerLoader(SupportedLanguage language, IDesignerGenerator generator) + public NRefactoryDesignerLoader(SupportedLanguage language, IDesignerGenerator generator, FormsDesignerViewContent viewContent) : base(generator) { this.language = language; + this.viewContent = viewContent; } string lastTextContent; @@ -72,13 +74,13 @@ namespace ICSharpCode.FormsDesigner // - Create CodeDom objects for fields and InitializeComponents statements // - If debug build and Ctrl pressed, output CodeDom to console // - Return CodeDom objects to the .NET designer - protected override CodeCompileUnit Parse() + public override CodeCompileUnit Parse() { LoggingService.Debug("NRefactoryDesignerLoader.Parse()"); - lastTextContent = this.Generator.ViewContent.DesignerCodeFileContent; + lastTextContent = viewContent.DesignerCodeFileContent; - ParseInformation parseInfo = ParserService.GetParseInformation(this.Generator.ViewContent.DesignerCodeFile.FileName); + ParseInformation parseInfo = ParserService.GetParseInformation(viewContent.DesignerCodeFile.FileName); IClass formClass; bool isFirstClassInFile; @@ -114,10 +116,10 @@ namespace ICSharpCode.FormsDesigner if (found) continue; ITextBuffer fileContent; - if (FileUtility.IsEqualFileName(fileName, this.Generator.ViewContent.PrimaryFileName)) { - fileContent = this.Generator.ViewContent.PrimaryFileContent; - } else if (FileUtility.IsEqualFileName(fileName, this.Generator.ViewContent.DesignerCodeFile.FileName)) { - fileContent = new StringTextBuffer(this.Generator.ViewContent.DesignerCodeFileContent); + if (FileUtility.IsEqualFileName(fileName, viewContent.PrimaryFileName)) { + fileContent = viewContent.PrimaryFileContent; + } else if (FileUtility.IsEqualFileName(fileName, viewContent.DesignerCodeFile.FileName)) { + fileContent = new StringTextBuffer(viewContent.DesignerCodeFileContent); } else { fileContent = ParserService.GetParseableFileContent(fileName); } @@ -172,7 +174,7 @@ namespace ICSharpCode.FormsDesigner if ((Control.ModifierKeys & Keys.Control) == Keys.Control) { CodeDomVerboseOutputGenerator outputGenerator = new CodeDomVerboseOutputGenerator(); outputGenerator.GenerateCodeFromMember(visitor.codeCompileUnit.Namespaces[0].Types[0], Console.Out, null); - this.CodeDomProvider.GenerateCodeFromCompileUnit(visitor.codeCompileUnit, Console.Out, null); + this.Generator.CodeDomProvider.GenerateCodeFromCompileUnit(visitor.codeCompileUnit, Console.Out, null); } #endif @@ -262,13 +264,13 @@ namespace ICSharpCode.FormsDesigner } } - protected override void Write(CodeCompileUnit unit) + public override void Write(CodeCompileUnit unit) { LoggingService.Info("DesignerLoader.Write called"); // output generated CodeDOM to the console : #if DEBUG if ((Control.ModifierKeys & Keys.Control) == Keys.Control) { - this.CodeDomProvider.GenerateCodeFromCompileUnit(unit, Console.Out, null); + this.Generator.CodeDomProvider.GenerateCodeFromCompileUnit(unit, Console.Out, null); } #endif try { @@ -280,7 +282,7 @@ namespace ICSharpCode.FormsDesigner protected override CodeDomLocalizationModel GetCurrentLocalizationModelFromDesignedFile() { - ParseInformation parseInfo = ParserService.ParseFile(this.Generator.ViewContent.DesignerCodeFile.FileName, new StringTextBuffer(this.Generator.ViewContent.DesignerCodeFileContent)); + ParseInformation parseInfo = ParserService.ParseFile(viewContent.DesignerCodeFile.FileName, new StringTextBuffer(viewContent.DesignerCodeFileContent)); IClass formClass; bool isFirstClassInFile; diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj index 3575e38ea7..575dcf4810 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj @@ -41,6 +41,7 @@ + @@ -64,11 +65,13 @@ + + - + @@ -79,6 +82,7 @@ + @@ -101,6 +105,11 @@ + + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} + ICSharpCode.AvalonEdit + False + {3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} NRefactory @@ -115,11 +124,21 @@ ICSharpCode.Core False + + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} + ICSharpCode.Core.WinForms + False + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3} ICSharpCode.SharpDevelop.Dom False + + {8035765F-D51F-4A0C-A746-2FD100E19419} + ICSharpCode.SharpDevelop.Widgets + False + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} FormsDesigner diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerViewContent.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs similarity index 92% rename from src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerViewContent.cs rename to src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs index f23f0c465b..d3261debb4 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/DesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs @@ -12,17 +12,19 @@ using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; - using ICSharpCode.Core; +using ICSharpCode.FormsDesigner.Gui; +using ICSharpCode.FormsDesigner.Gui.OptionPanels; using ICSharpCode.FormsDesigner.Services; using ICSharpCode.FormsDesigner.UndoRedo; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.FormsDesigner { - public class FormsDesignerViewContent : AbstractViewContentHandlingLoadErrors, IClipboardHandler, IUndoHandler, IHasPropertyContainer, IContextHelpProvider, IToolsHost, IFileDocumentProvider + public class FormsDesignerViewContent : AbstractViewContentHandlingLoadErrors, IClipboardHandler, IUndoHandler, IHasPropertyContainer, IContextHelpProvider, IToolsHost, IFileDocumentProvider, IFormsDesigner { readonly Control pleaseWaitLabel = new Label() {Text=StringParser.Parse("${res:Global.PleaseWait}"), TextAlign=ContentAlignment.MiddleCenter}; DesignSurface designSurface; @@ -32,6 +34,7 @@ namespace ICSharpCode.FormsDesigner readonly IDesignerLoaderProvider loaderProvider; DesignerLoader loader; readonly IDesignerGenerator generator; + readonly IDesignerSourceProvider sourceProvider; readonly ResourceStore resourceStore; FormsDesignerUndoEngine undoEngine; TypeResolutionService typeResolutionService; @@ -124,7 +127,7 @@ namespace ICSharpCode.FormsDesigner ICSharpCode.SharpDevelop.Debugging.DebuggerService.DebugStarting += this.DebugStarting; } - public FormsDesignerViewContent(IViewContent primaryViewContent, IDesignerLoaderProvider loaderProvider, IDesignerGenerator generator) + public FormsDesignerViewContent(IViewContent primaryViewContent, IDesignerLoaderProvider loaderProvider, IDesignerGenerator generator, IDesignerSourceProvider sourceProvider) : this(primaryViewContent) { if (loaderProvider == null) @@ -133,8 +136,10 @@ namespace ICSharpCode.FormsDesigner throw new ArgumentNullException("generator"); this.loaderProvider = loaderProvider; + this.loaderProvider.ViewContent = this; this.generator = generator; - this.generator.Attach(this); + this.sourceProvider = sourceProvider; + this.sourceProvider.Attach(this); this.Files.Add(this.primaryViewContent.PrimaryFile); } @@ -184,7 +189,7 @@ namespace ICSharpCode.FormsDesigner LoggingService.Debug("Forms designer: Determining designer source files for " + file.FileName); OpenedFile newDesignerCodeFile; - IEnumerable sourceFiles = this.generator.GetSourceFiles(out newDesignerCodeFile); + IEnumerable sourceFiles = this.sourceProvider.GetSourceFiles(out newDesignerCodeFile); if (sourceFiles == null || newDesignerCodeFile == null) { throw new FormsDesignerLoadException("The designer source files could not be determined."); } @@ -262,9 +267,11 @@ namespace ICSharpCode.FormsDesigner { LoggingService.Info("Form Designer: BEGIN INITIALIZE"); + options = LoadOptions(); + DefaultServiceContainer serviceContainer = new DefaultServiceContainer(); serviceContainer.AddService(typeof(IMessageService), new FormsMessageService()); - serviceContainer.AddService(typeof(System.Windows.Forms.Design.IUIService), new UIService()); + serviceContainer.AddService(typeof(System.Windows.Forms.Design.IUIService), new UIService(this)); serviceContainer.AddService(typeof(System.Drawing.Design.IToolboxService), ToolboxProvider.ToolboxService); serviceContainer.AddService(typeof(IHelpService), new HelpService()); @@ -275,10 +282,11 @@ namespace ICSharpCode.FormsDesigner serviceContainer.AddService(typeof(AmbientProperties), ambientProperties); this.typeResolutionService = new TypeResolutionService(this.PrimaryFileName, serviceContainer, new DomTypeLocator(this.PrimaryFileName)); serviceContainer.AddService(typeof(ITypeResolutionService), this.typeResolutionService); - serviceContainer.AddService(typeof(DesignerOptionService), new SharpDevelopDesignerOptionService()); + serviceContainer.AddService(typeof(DesignerOptionService), new SharpDevelopDesignerOptionService(options)); serviceContainer.AddService(typeof(ITypeDiscoveryService), new TypeDiscoveryService(new DomGacWrapper())); serviceContainer.AddService(typeof(MemberRelationshipService), new DefaultMemberRelationshipService()); serviceContainer.AddService(typeof(IProjectResourceService), new ProjectResourceService(ParserService.GetParseInformation(this.DesignerCodeFile.FileName).CompilationUnit.ProjectContent)); + serviceContainer.AddService(typeof(IImageResourceEditorDialogWrapper), new ImageResourceEditorDialogWrapper(ParserService.GetParseInformation(this.DesignerCodeFile.FileName).CompilationUnit.ProjectContent.Project as IProject)); // Provide the ImageResourceEditor for all Image and Icon properties this.addedTypeDescriptionProviders.Add(typeof(Image), TypeDescriptor.AddAttributes(typeof(Image), new EditorAttribute(typeof(ImageResourceEditor), typeof(System.Drawing.Design.UITypeEditor)))); @@ -294,11 +302,11 @@ namespace ICSharpCode.FormsDesigner designSurface.Flushed += this.DesignerFlushed; designSurface.Unloading += this.DesignerUnloading; - serviceContainer.AddService(typeof(System.ComponentModel.Design.IMenuCommandService), new ICSharpCode.FormsDesigner.Services.MenuCommandService(this, designSurface)); + serviceContainer.AddService(typeof(System.ComponentModel.Design.IMenuCommandService), new ICSharpCode.FormsDesigner.Services.MenuCommandService(new SharpDevelopCommandProvider(this), designSurface)); ICSharpCode.FormsDesigner.Services.EventBindingService eventBindingService = new ICSharpCode.FormsDesigner.Services.EventBindingService(this, designSurface); serviceContainer.AddService(typeof(System.ComponentModel.Design.IEventBindingService), eventBindingService); - this.loader = loaderProvider.CreateLoader(generator); + this.loader = new SharpDevelopDesignerLoader(generator, loaderProvider.CreateLoader(generator)); designSurface.BeginLoad(this.loader); if (!designSurface.IsLoaded) { @@ -330,6 +338,28 @@ namespace ICSharpCode.FormsDesigner LoggingService.Info("Form Designer: END INITIALIZE"); } + SharpDevelopDesignerOptions LoadOptions() + { + int w = PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeWidth", 8); + int h = PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeHeight", 8); + + SharpDevelopDesignerOptions options = new SharpDevelopDesignerOptions(); + + options.GridSize = new Size(w, h); + + options.ShowGrid = PropertyService.Get("FormsDesigner.DesignerOptions.ShowGrid", true); + options.SnapToGrid = PropertyService.Get("FormsDesigner.DesignerOptions.SnapToGrid", true); + + options.UseSmartTags = GeneralOptionsPanel.UseSmartTags; + options.UseSnapLines = PropertyService.Get("FormsDesigner.DesignerOptions.UseSnapLines", true); + + options.EnableInSituEditing = PropertyService.Get("FormsDesigner.DesignerOptions.EnableInSituEditing", true); + options.ObjectBoundSmartTagAutoShow = GeneralOptionsPanel.SmartTagAutoShow; + options.UseOptimizedCodeGeneration = PropertyService.Get("FormsDesigner.DesignerOptions.UseOptimizedCodeGeneration", true); + + return options; + } + bool hasUnmergedChanges; void MakeDirty() @@ -660,7 +690,7 @@ namespace ICSharpCode.FormsDesigner } if (this.generator != null) { - this.generator.Detach(); + this.sourceProvider.Detach(); } this.resourceStore.Dispose(); @@ -941,5 +971,24 @@ namespace ICSharpCode.FormsDesigner } #endregion + + public IDesignerGenerator Generator { + get { + return generator; + } + } + + SharpDevelopDesignerOptions options; + + public SharpDevelopDesignerOptions DesignerOptions { + get { + return options; + } + } + + public IntPtr GetDialogOwnerWindowHandle() + { + return WorkbenchSingleton.MainWin32Window.Handle; + } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs index 107a506d0b..0f75437e25 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.ComponentModel.Design; using System.Drawing; using System.Drawing.Design; using System.IO; @@ -11,12 +12,13 @@ using System.Linq; using System.Resources; using System.Resources.Tools; using System.Windows.Forms; - +using System.Windows.Forms.Design; using ICSharpCode.Core; using ICSharpCode.Core.WinForms; using ICSharpCode.FormsDesigner.Services; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; @@ -58,7 +60,7 @@ namespace ICSharpCode.FormsDesigner.Gui this.projectResourcesTreeView.Visible = designerSupportsProjectResources; } - public ImageResourceEditorDialog(IProject project, Type requiredResourceType, ProjectResourceInfo projectResource) + public ImageResourceEditorDialog(IProject project, Type requiredResourceType, IProjectResourceInfo projectResource) : this(project, requiredResourceType, true) { if (projectResource == null) @@ -214,7 +216,7 @@ namespace ICSharpCode.FormsDesigner.Gui return; } - ProjectResourceInfo selectedProjectResource = e.Argument as ProjectResourceInfo; + IProjectResourceInfo selectedProjectResource = e.Argument as IProjectResourceInfo; IProjectContent projectContent = ParserService.GetProjectContent(this.project); @@ -575,11 +577,19 @@ namespace ICSharpCode.FormsDesigner.Gui #endregion } - public class ImageResourceEditorDialogWrapper + public class ImageResourceEditorDialogWrapper : IImageResourceEditorDialogWrapper { - public object GetValue(IProjectResourceInfo projectResource, ) + IProject project; + + public ImageResourceEditorDialogWrapper(IProject project) + { + if (project == null) + throw new ArgumentNullException("project"); + this.project = project; + } + + public object GetValue(IProjectResourceInfo projectResource, object value, IProjectResourceService prs, ITypeDescriptorContext context, IWindowsFormsEditorService edsvc, IDictionaryService dictService) { - IProject project = prs.ProjectContent.Project as IProject; ImageResourceEditorDialog dialog; if (projectResource != null && object.ReferenceEquals(projectResource.OriginalValue, value) && prs.DesignerSupportsProjectResources) { diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/SecondaryDisplayBinding.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/SecondaryDisplayBinding.cs index 9227444b00..70bf60f298 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/SecondaryDisplayBinding.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/SecondaryDisplayBinding.cs @@ -115,6 +115,7 @@ namespace ICSharpCode.FormsDesigner IDesignerLoaderProvider loader; IDesignerGenerator generator; + IDesignerSourceProvider sourceProvider; switch (fileExtension) { case ".cs": @@ -128,7 +129,10 @@ namespace ICSharpCode.FormsDesigner default: throw new ApplicationException("Cannot create content for " + fileExtension); } - return new IViewContent[] { new FormsDesignerViewContent(viewContent, loader, generator) }; + + sourceProvider = (IDesignerSourceProvider)generator; + + return new IViewContent[] { new FormsDesignerViewContent(viewContent, loader, generator, sourceProvider) }; } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/DesignerResourceService.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/DesignerResourceService.cs index 9d78251097..60303a3889 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/DesignerResourceService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/DesignerResourceService.cs @@ -3,6 +3,7 @@ using System; using System.Globalization; +using ICSharpCode.Core; namespace ICSharpCode.FormsDesigner.Services { diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/DomTypeLocator.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/DomTypeLocator.cs index 08c4640991..6f612a90b4 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/DomTypeLocator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/DomTypeLocator.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Project; @@ -13,8 +14,6 @@ namespace ICSharpCode.FormsDesigner.Services string formSourceFileName; IProjectContent callingProject; - public System.ComponentModel.Design.ITypeResolutionService ParentService { get; set; } - /// /// Gets the project content of the project that created this TypeResolutionService. /// Returns null when no calling project was specified. @@ -41,7 +40,7 @@ namespace ICSharpCode.FormsDesigner.Services static readonly Dictionary projectContentsCurrentlyLoadingAssembly = new Dictionary(); - public string LocateType(string name, out string[] referencedAssemblies) + public AssemblyInfo LocateType(string name, out AssemblyInfo[] referencedAssemblies) { IProjectContent pc = CallingProject; @@ -56,30 +55,30 @@ namespace ICSharpCode.FormsDesigner.Services foundClass = pc.GetClass(name.Replace('+', '.'), 0); } if (foundClass != null) { - string path = GetPathToAssembly(pc); + AssemblyInfo assembly = GetPathToAssembly(pc); - if (string.IsNullOrEmpty(path)) { - referencedAssemblies = new string[0]; - return ""; + if (assembly == AssemblyInfo.Empty) { + referencedAssemblies = new AssemblyInfo[0]; + return AssemblyInfo.Empty; } - List assemblies = new List(); + List assemblies = new List(); FindReferencedAssemblies(assemblies, pc); - if (assemblies.Contains(path)) - assemblies.Remove(path); + if (assemblies.Contains(assembly)) + assemblies.Remove(assembly); referencedAssemblies = assemblies.ToArray(); - return path; + return assembly; } } - referencedAssemblies = new string[0]; - return ""; + referencedAssemblies = new AssemblyInfo[0]; + return AssemblyInfo.Empty; } - void FindReferencedAssemblies(List assemblies, IProjectContent pc) + void FindReferencedAssemblies(List assemblies, IProjectContent pc) { // prevent StackOverflow when project contents have cyclic dependencies // Very popular example of cyclic dependency: System <-> System.Xml (yes, really!) @@ -87,10 +86,10 @@ namespace ICSharpCode.FormsDesigner.Services return; projectContentsCurrentlyLoadingAssembly.Add(pc, null); - string path = GetPathToAssembly(assemblies, pc); + AssemblyInfo assembly = GetPathToAssembly(pc); - if (!string.IsNullOrEmpty(path) && !assemblies.Contains(path)) - assemblies.Add(path); + if (!assemblies.Contains(assembly)) + assemblies.Add(assembly); try { // load dependencies of current assembly @@ -108,14 +107,17 @@ namespace ICSharpCode.FormsDesigner.Services } } - string GetPathToAssembly(IProjectContent pc) + AssemblyInfo GetPathToAssembly(IProjectContent pc) { + bool isInGac = pc.Project == null && pc is ReflectionProjectContent; + string path = ""; + if (pc.Project != null) - return ((IProject)pc.Project).OutputAssemblyFullPath; + path = ((IProject)pc.Project).OutputAssemblyFullPath; else if (pc is ReflectionProjectContent) - return ((ReflectionProjectContent)pc).AssemblyLocation; + path = ((ReflectionProjectContent)pc).AssemblyLocation; - return null; + return new AssemblyInfo(path, isInGac); } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs index 98c8caba45..f34f33a140 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs @@ -5,6 +5,8 @@ using System; using System.IO; using ICSharpCode.Core; using ICSharpCode.NRefactory.Visitors; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.FormsDesigner.Services { diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs index 1a49e53757..abedebce46 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs @@ -1,15 +1,18 @@ // 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 ICSharpCode.NRefactory; using System; using System.CodeDom; using System.IO; using System.Linq; +using System.Resources.Tools; + using ICSharpCode.Core; +using ICSharpCode.NRefactory; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.FormsDesigner.Services { @@ -171,5 +174,57 @@ namespace ICSharpCode.FormsDesigner.Services IReturnType generatedCodeAttribute = generatedCodeAttributeClass.DefaultReturnType; return @class.Attributes.Any(att => att.AttributeType.Equals(generatedCodeAttribute) && att.PositionalArguments.Count == 2 && String.Equals("System.Resources.Tools.StronglyTypedResourceBuilder", att.PositionalArguments[0] as string, StringComparison.Ordinal)); } + + IProjectResourceInfo IProjectResourceService.GetProjectResource(CodePropertyReferenceExpression propRef) + { + throw new NotImplementedException(); + } + + public bool FindResourceClassNames(IProjectResourceInfo resourceInfo, out string resourceClassFullyQualifiedName, out string resourcePropertyName) + { + IProject project = ProjectContent.Project as IProject; + + resourceClassFullyQualifiedName = null; + resourcePropertyName = null; + + if (project == null) { + LoggingService.Warn("Serializer cannot proceed because project is not an IProject"); + return false; + } + + string resourceFileDirectory = Path.GetDirectoryName(resourceInfo.ResourceFile); + string resourceFileName = Path.GetFileName(resourceInfo.ResourceFile); + var items = project.Items + .OfType() + .Where( + fpi => + FileUtility.IsEqualFileName(Path.GetDirectoryName(fpi.FileName), resourceFileDirectory) && + FileUtility.IsEqualFileName(fpi.DependentUpon, resourceFileName) && + fpi.ItemType == ItemType.Compile && + fpi.VirtualName.ToUpperInvariant().Contains("DESIGNER") + ); + + if (items.Count() != 1) { + LoggingService.Info("Did not find exactly one possible file that contains the generated class for the resource file '" + resourceInfo.ResourceFile + "'. Ignoring this resource."); + return false; + } + + string resourceCodeFile = items.Single().FileName; + + // We expect a single class to be in this file. + IClass resourceClass = ParserService.GetParseInformation(resourceCodeFile).CompilationUnit.Classes.Single(); + // Here we assume that VerifyResourceName is the same name transform that + // was used when generating the resource code file. + // This should be true as long as the code is generated using the + // custom tool in SharpDevelop or Visual Studio. + resourceClassFullyQualifiedName = resourceClass.FullyQualifiedName; + resourcePropertyName = StronglyTypedResourceBuilder.VerifyResourceName(resourceInfo.ResourceKey, ProjectContent.Language.CodeDomProvider ?? LanguageProperties.CSharp.CodeDomProvider); + + if (resourcePropertyName == null) { + throw new InvalidOperationException("The resource name '" + resourceInfo.ResourceKey + "' could not be transformed to a name that is valid in the current programming language."); + } + + return true; + } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/SharpDevelopCommandProvider.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/SharpDevelopCommandProvider.cs new file mode 100644 index 0000000000..ca8add998a --- /dev/null +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/SharpDevelopCommandProvider.cs @@ -0,0 +1,65 @@ +// 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; +using System.ComponentModel.Design; +using System.Drawing; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +using ICSharpCode.Core.WinForms; +using ICSharpCode.FormsDesigner.Commands; + +namespace ICSharpCode.FormsDesigner.Services +{ + public class SharpDevelopCommandProvider : ICommandProvider + { + FormsDesignerViewContent vc; + + public SharpDevelopCommandProvider(FormsDesignerViewContent vc) + { + this.vc = vc; + } + + public void InitializeGlobalCommands(IMenuCommandService service) + { + // Most commands like Delete, Cut, Copy and paste are all added to the MenuCommandService + // by the other services like the DesignerHost. Commands like ViewCode and ShowProperties + // need to be added by the IDE because only the IDE would know how to perform those actions. + // This allows people to call MenuCommandSerice.GlobalInvoke( StandardCommands.ViewCode ); + // from designers and what not. .Net Control Designers like the TableLayoutPanelDesigner + // build up their own context menus instead of letting the MenuCommandService build it. + // The context menus they build up are in the format that Visual studio expects and invokes + // the ViewCode and Properties commands by using GlobalInvoke. + + AbstractFormsDesignerCommand viewCodeCommand = new ViewCode(); + AbstractFormsDesignerCommand propertiesCodeCommand = new ShowProperties(); + service.AddCommand(new System.ComponentModel.Design.MenuCommand(viewCodeCommand.CommandCallBack, viewCodeCommand.CommandID)); + service.AddCommand(new System.ComponentModel.Design.MenuCommand(propertiesCodeCommand.CommandCallBack, propertiesCodeCommand.CommandID)); + } + + public void ShowContextMenu(CommandID menuID, int x, int y) + { + string contextMenuPath = "/SharpDevelop/FormsDesigner/ContextMenus/"; + + if (menuID == MenuCommands.ComponentTrayMenu) { + contextMenuPath += "ComponentTrayMenu"; + } else if (menuID == MenuCommands.ContainerMenu) { + contextMenuPath += "ContainerMenu"; + } else if (menuID == MenuCommands.SelectionMenu) { + contextMenuPath += "SelectionMenu"; + } else if (menuID == MenuCommands.TraySelectionMenu) { + contextMenuPath += "TraySelectionMenu"; + } else { + throw new Exception(); + } + + Control panel = vc.UserContent; + if (panel != null) { + Point p = panel.PointToClient(new Point(x, y)); + + MenuService.ShowContextMenu(this, contextMenuPath, panel, p.X, p.Y); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/UIService.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/UIService.cs index 2af9b038ff..828e21e2fa 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/UIService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/UIService.cs @@ -7,6 +7,8 @@ using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.Design; +using ICSharpCode.Core; + namespace ICSharpCode.FormsDesigner.Services { public class UIService : IUIService diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Toolbox/CustomComponentsSideTab.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Toolbox/CustomComponentsSideTab.cs index d0f7b82e92..effc2b95ee 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Toolbox/CustomComponentsSideTab.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Toolbox/CustomComponentsSideTab.cs @@ -113,53 +113,9 @@ namespace ICSharpCode.FormsDesigner.Gui // is not a design component continue; isDesignComponent: - this.Items.Add(new SideTabItemDesigner(c.Name, new CustomComponentToolBoxItem(c))); + this.Items.Add(new SideTabItemDesigner(c.Name, new CustomComponentToolBoxItem(c.CompilationUnit.FileName, c.FullyQualifiedName))); } } } } - - public class CustomComponentToolBoxItem : ToolboxItem - { - string className; - IProjectContent assemblyLocation; - Assembly usedAssembly = null; - - public CustomComponentToolBoxItem(IClass c) - { - className = c.FullyQualifiedName; - assemblyLocation = c.ProjectContent; - this.Bitmap = new ToolboxItem(typeof(Component)).Bitmap; - this.IsTransient = true; - } - - void Init(IDesignerHost host) - { - LoggingService.Debug("Initializing MyToolBoxItem: " + className); - if (host == null) throw new ArgumentNullException("host"); - if (assemblyLocation != null) { - TypeResolutionService typeResolutionService = host.GetService(typeof(ITypeResolutionService)) as TypeResolutionService; - if (typeResolutionService == null) { - throw new InvalidOperationException("Cannot initialize CustomComponentToolBoxItem because the designer host does not provide a SharpDevelop TypeResolutionService."); - } - Assembly asm = typeResolutionService.LoadAssembly(assemblyLocation); - if (asm != null && usedAssembly != asm) { - Initialize(asm.GetType(className)); - usedAssembly = asm; - } - } - } - - protected override IComponent[] CreateComponentsCore(IDesignerHost host) - { - Init(host); - return base.CreateComponentsCore(host); - } - - protected override IComponent[] CreateComponentsCore(IDesignerHost host, System.Collections.IDictionary defaultValues) - { - Init(host); - return base.CreateComponentsCore(host, defaultValues); - } - } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj index 6f0c4f018a..a2c3a8bbbb 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj @@ -35,13 +35,14 @@ False None false + FORMSDESIGNER_DLL False True - DEBUG Full true + DEBUG, FORMSDESIGNER_DLL @@ -53,6 +54,9 @@ + + EasyCodeDom.cs + @@ -62,9 +66,11 @@ + + @@ -80,7 +86,6 @@ - diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/IDesignerLoader.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/IDesignerLoader.cs index 87ed5030e1..7036c3615f 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/IDesignerLoader.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/IDesignerLoader.cs @@ -10,9 +10,8 @@ namespace ICSharpCode.FormsDesigner public interface IDesignerLoader { CodeCompileUnit Parse(); - void Write(CodeCompileUnit unit); - CodeDomLocalizationModel GetLocalizationModel(); + bool IsReloadNeeded(bool value); } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/SharpDevelopDesignerLoader.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/SharpDevelopDesignerLoader.cs index 53071370e3..35b830bda5 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/SharpDevelopDesignerLoader.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/SharpDevelopDesignerLoader.cs @@ -44,12 +44,16 @@ namespace ICSharpCode.FormsDesigner get { return this.generator; } } - protected SharpDevelopDesignerLoader(IDesignerGenerator generator) + public SharpDevelopDesignerLoader(IDesignerGenerator generator, IDesignerLoader loader) { if (generator == null) { throw new ArgumentNullException("generator", "Generator cannot be null"); } + if (loader == null) + throw new ArgumentNullException("loader"); + this.generator = generator; + this.loader = loader; } public override void Dispose() @@ -148,5 +152,10 @@ namespace ICSharpCode.FormsDesigner { return loader.Parse(); } + + protected override bool IsReloadNeeded() + { + return loader.IsReloadNeeded(base.IsReloadNeeded()); + } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/CustomComponentToolBoxItem.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/CustomComponentToolBoxItem.cs new file mode 100644 index 0000000000..cf721fea8e --- /dev/null +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/CustomComponentToolBoxItem.cs @@ -0,0 +1,56 @@ +using System; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing.Design; + +using ICSharpCode.FormsDesigner.Services; + +// 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) + +namespace ICSharpCode.FormsDesigner.Gui +{ + public class CustomComponentToolBoxItem : ToolboxItem + { + string sourceFileName; + string className; + bool initialized; + + public CustomComponentToolBoxItem(string sourceFileName, string className) + { + this.sourceFileName = sourceFileName; + this.className = className; + this.Bitmap = new ToolboxItem(typeof(Component)).Bitmap; + this.IsTransient = true; + } + + void Init(IDesignerHost host) + { + LoggingService.Debug("Initializing MyToolBoxItem: " + className); + if (host == null) throw new ArgumentNullException("host"); + if (sourceFileName != null) { + TypeResolutionService typeResolutionService = host.GetService(typeof(ITypeResolutionService)) as TypeResolutionService; + if (typeResolutionService == null) { + throw new InvalidOperationException("Cannot initialize CustomComponentToolBoxItem because the designer host does not provide a SharpDevelop TypeResolutionService."); + } + + if (!initialized) { + Initialize(typeResolutionService.GetType(className)); + initialized = true; + } + } + } + + protected override IComponent[] CreateComponentsCore(IDesignerHost host) + { + Init(host); + return base.CreateComponentsCore(host); + } + + protected override IComponent[] CreateComponentsCore(IDesignerHost host, System.Collections.IDictionary defaultValues) + { + Init(host); + return base.CreateComponentsCore(host, defaultValues); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IDesignerGenerator.cs index 4a9f516fbd..369e67d474 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IDesignerGenerator.cs @@ -12,22 +12,6 @@ namespace ICSharpCode.FormsDesigner { public interface IDesignerGenerator { - //CodeDomProvider CodeDomProvider { get; } - //void Attach(FormsDesignerViewContent viewContent); - //void Detach(); - //FormsDesignerViewContent ViewContent { get; } - - /* - /// - /// Gets the collection of OpenedFiles that contain code which belongs - /// to the designed form, not including resource files. - /// - /// Receives the file which contains the code to be modified by the forms designer. - /// A collection of OpenedFiles that contain code which belongs to the designed form. - /// The returned collection must include the . - IEnumerable GetSourceFiles(out OpenedFile designerCodeFile); - */ - void MergeFormChanges(CodeCompileUnit unit); bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out string file, out int position); ICollection GetCompatibleMethods(EventDescriptor edesc); diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/AssemblyInfo.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/AssemblyInfo.cs new file mode 100644 index 0000000000..5bd477d0ff --- /dev/null +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/AssemblyInfo.cs @@ -0,0 +1,55 @@ +// 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; + +namespace ICSharpCode.FormsDesigner.Services +{ + public struct AssemblyInfo : IEquatable + { + public static readonly AssemblyInfo Empty = new AssemblyInfo("", false); + + public readonly string FullNameOrPath; + public readonly bool IsInGac; + + public AssemblyInfo(string fullNameOrPath, bool isInGac) + { + this.FullNameOrPath = fullNameOrPath; + this.IsInGac = isInGac; + } + + #region Equals and GetHashCode implementation + public override bool Equals(object obj) + { + return (obj is AssemblyInfo) && Equals((AssemblyInfo)obj); + } + + public bool Equals(AssemblyInfo other) + { + return this.FullNameOrPath == other.FullNameOrPath && this.IsInGac == other.IsInGac; + } + + public override int GetHashCode() + { + int hashCode = 0; + unchecked { + if (FullNameOrPath != null) + hashCode += 1000000007 * FullNameOrPath.GetHashCode(); + hashCode += 1000000009 * IsInGac.GetHashCode(); + } + return hashCode; + } + + public static bool operator ==(AssemblyInfo lhs, AssemblyInfo rhs) + { + return lhs.Equals(rhs); + } + + public static bool operator !=(AssemblyInfo lhs, AssemblyInfo rhs) + { + return !(lhs == rhs); + } + #endregion + + } +} diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/DesignerOptionService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/DesignerOptionService.cs index b027c13742..7906a797c2 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/DesignerOptionService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/DesignerOptionService.cs @@ -36,25 +36,6 @@ namespace ICSharpCode.FormsDesigner.Services // Whether to include an underscore in the event handler name public string EventHandlerNameFormat { get; set; } - - /* - public SharpDevelopDesignerOptions() - { - int w = PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeWidth", 8); - int h = PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeHeight", 8); - this.gridSize = new Size(w, h); - - this.showGrid = PropertyService.Get("FormsDesigner.DesignerOptions.ShowGrid", true); - this.snapToGrid = PropertyService.Get("FormsDesigner.DesignerOptions.SnapToGrid", true); - - this.useSmartTags = GeneralOptionsPanel.UseSmartTags; - this.useSnapLines = PropertyService.Get("FormsDesigner.DesignerOptions.UseSnapLines", true); - - this.enableInSituEditing = PropertyService.Get("FormsDesigner.DesignerOptions.EnableInSituEditing", true); - this.objectBoundSmartTagAutoShow = GeneralOptionsPanel.SmartTagAutoShow; - this.useOptimizedCodeGeneration = PropertyService.Get("FormsDesigner.DesignerOptions.UseOptimizedCodeGeneration", true); - } - */ } public class SharpDevelopDesignerOptionService : WindowsFormsDesignerOptionService diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs index da32500c44..edbfa51e83 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs @@ -3,6 +3,7 @@ using System; using System.CodeDom; +using System.ComponentModel.Design; using System.IO; using System.Linq; @@ -12,7 +13,8 @@ namespace ICSharpCode.FormsDesigner.Services { IProjectResourceInfo GetProjectResource(CodePropertyReferenceExpression propRef); bool DesignerSupportsProjectResources { get; set; } - string ProjectResourceKey { get; set; } + string ProjectResourceKey { get; } + bool FindResourceClassNames(IProjectResourceInfo resourceInfo, out string resourceClassFullyQualifiedName, out string resourcePropertyName); } public interface IMessageService @@ -29,4 +31,10 @@ namespace ICSharpCode.FormsDesigner.Services string ResourceKey { get; } object OriginalValue { get; } } + + public interface ICommandProvider + { + void InitializeGlobalCommands(IMenuCommandService service); + void ShowContextMenu(CommandID menuID, int x, int y); + } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs index 06d22a39b7..3007d85b13 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs @@ -2,20 +2,13 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Windows.Forms.Design; namespace ICSharpCode.FormsDesigner.Services { - public struct AssemblyInfo - { - public readonly string FullNameOrPath; - public readonly bool IsInGac; - - public AssemblyInfo(string fullNameOrPath, bool isInGac) - { - this.FullNameOrPath = fullNameOrPath; - this.IsInGac = isInGac; - } - } + public interface ITypeLocator { @@ -26,4 +19,9 @@ namespace ICSharpCode.FormsDesigner.Services { bool IsGacAssembly(string path); } + + public interface IImageResourceEditorDialogWrapper + { + object GetValue(IProjectResourceInfo projectResource, object value, IProjectResourceService prs, ITypeDescriptorContext context, IWindowsFormsEditorService edsvc, IDictionaryService dictService); + } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs index 4f7f5dbed9..631e16f437 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs @@ -76,9 +76,9 @@ namespace ICSharpCode.FormsDesigner.Services var projectResource = dictService.GetValue(prs.ProjectResourceKey + context.PropertyDescriptor.Name) as IProjectResourceInfo; + var imageDialogWrapper = provider.GetService(typeof(IImageResourceEditorDialogWrapper)) as IImageResourceEditorDialogWrapper; - - return value; + return imageDialogWrapper.GetValue(projectResource, value, prs, context, edsvc, dictService) ?? value; } [PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")] diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs index 3e40bdf4a2..9a21830e74 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs @@ -11,55 +11,19 @@ using MenuCommand = System.ComponentModel.Design.MenuCommand; namespace ICSharpCode.FormsDesigner.Services { - class MenuCommandService : System.ComponentModel.Design.MenuCommandService + public class MenuCommandService : System.ComponentModel.Design.MenuCommandService { - IFormsDesigner vc; + ICommandProvider commandProvider; - public MenuCommandService(IFormsDesigner vc, IServiceProvider serviceProvider) : base(serviceProvider) + public MenuCommandService(ICommandProvider commandProvider, IServiceProvider serviceProvider) : base(serviceProvider) { - this.vc = vc; - this.InitializeGlobalCommands(); - } - - private void InitializeGlobalCommands() - { - //Most commands like Delete, Cut, Copy and paste are all added to the MenuCommandService - // by the other services like the DesignerHost. Commands like ViewCode and ShowProperties - // need to be added by the IDE because only the IDE would know how to perform those actions. - // This allows people to call MenuCommandSerice.GlobalInvoke( StandardCommands.ViewCode ); - // from designers and what not. .Net Control Designers like the TableLayoutPanelDesigner - // build up their own context menus instead of letting the MenuCommandService build it. - // The context menus they build up are in the format that Visual studio expects and invokes - // the ViewCode and Properties commands by using GlobalInvoke. - - AbstractFormsDesignerCommand viewCodeCommand = new ViewCode(); - AbstractFormsDesignerCommand propertiesCodeCommand = new ShowProperties(); - this.AddCommand( new MenuCommand(viewCodeCommand.CommandCallBack, viewCodeCommand.CommandID)); - this.AddCommand( new MenuCommand(propertiesCodeCommand.CommandCallBack, propertiesCodeCommand.CommandID)); + this.commandProvider = commandProvider; + commandProvider.InitializeGlobalCommands(this); } public override void ShowContextMenu(CommandID menuID, int x, int y) { - string contextMenuPath = "/SharpDevelop/FormsDesigner/ContextMenus/"; - - if (menuID == MenuCommands.ComponentTrayMenu) { - contextMenuPath += "ComponentTrayMenu"; - } else if (menuID == MenuCommands.ContainerMenu) { - contextMenuPath += "ContainerMenu"; - } else if (menuID == MenuCommands.SelectionMenu) { - contextMenuPath += "SelectionMenu"; - } else if (menuID == MenuCommands.TraySelectionMenu) { - contextMenuPath += "TraySelectionMenu"; - } else { - throw new Exception(); - } - - Control panel = vc.UserContent; - if (panel != null) { - Point p = panel.PointToClient(new Point(x, y)); - - MenuService.ShowContextMenu(this, contextMenuPath, panel, p.X, p.Y); - } + commandProvider.ShowContextMenu(menuID, x, y); } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesMemberCodeDomSerializer.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesMemberCodeDomSerializer.cs index cac735443e..d98ece94a4 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesMemberCodeDomSerializer.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesMemberCodeDomSerializer.cs @@ -10,6 +10,8 @@ using System.IO; using System.Linq; using System.Resources.Tools; +using ICSharpCode.EasyCodeDom; + namespace ICSharpCode.FormsDesigner.Services { /// @@ -47,7 +49,6 @@ namespace ICSharpCode.FormsDesigner.Services var dictService = component.Site.GetService(typeof(IDictionaryService)) as IDictionaryService; if (dictService == null) return false; - var prs = manager.GetService(typeof(IProjectResourceService)) as IProjectResourceService; if (prs == null) { @@ -64,47 +65,14 @@ namespace ICSharpCode.FormsDesigner.Services } // Find the generated file with the resource accessing class. - - IProject project = prs.ProjectContent.Project as IProject; - if (project == null) { - LoggingService.Warn("Serializer cannot proceed because project is not an IProject"); + string resourceClassFullyQualifiedName; + string resourcePropertyName; + if (!prs.FindResourceClassNames(resourceInfo, out resourceClassFullyQualifiedName, out resourcePropertyName)) return false; - } - - string resourceFileDirectory = Path.GetDirectoryName(resourceInfo.ResourceFile); - string resourceFileName = Path.GetFileName(resourceInfo.ResourceFile); - var items = project.Items - .OfType() - .Where( - fpi => - FileUtility.IsEqualFileName(Path.GetDirectoryName(fpi.FileName), resourceFileDirectory) && - FileUtility.IsEqualFileName(fpi.DependentUpon, resourceFileName) && - fpi.ItemType == ItemType.Compile && - fpi.VirtualName.ToUpperInvariant().Contains("DESIGNER") - ); - - if (items.Count() != 1) { - LoggingService.Info("Did not find exactly one possible file that contains the generated class for the resource file '" + resourceInfo.ResourceFile + "'. Ignoring this resource."); - return false; - } - - string resourceCodeFile = items.Single().FileName; - - // We expect a single class to be in this file. - IClass resourceClass = ParserService.GetParseInformation(resourceCodeFile).CompilationUnit.Classes.Single(); - // Here we assume that VerifyResourceName is the same name transform that - // was used when generating the resource code file. - // This should be true as long as the code is generated using the - // custom tool in SharpDevelop or Visual Studio. - string resourcePropertyName = StronglyTypedResourceBuilder.VerifyResourceName(resourceInfo.ResourceKey, prs.ProjectContent.Language.CodeDomProvider ?? LanguageProperties.CSharp.CodeDomProvider); - if (resourcePropertyName == null) { - throw new InvalidOperationException("The resource name '" + resourceInfo.ResourceKey + "' could not be transformed to a name that is valid in the current programming language."); - } - // Now do the actual serialization. - LoggingService.Debug("Serializing project resource: Component '" + component.ToString() + "', Property: '" + propDesc.Name + "', Resource class: '" + resourceClass.FullyQualifiedName + "', Resource property: '" + resourcePropertyName + "'"); + LoggingService.Debug("Serializing project resource: Component '" + component.ToString() + "', Property: '" + propDesc.Name + "', Resource class: '" + resourceClassFullyQualifiedName + "', Resource property: '" + resourcePropertyName + "'"); var targetObjectExpr = base.SerializeToExpression(manager, value); if (targetObjectExpr == null) { @@ -119,7 +87,7 @@ namespace ICSharpCode.FormsDesigner.Services var propRefSource = Easy.Type( - new CodeTypeReference(resourceClass.FullyQualifiedName, CodeTypeReferenceOptions.GlobalReference) + new CodeTypeReference(resourceClassFullyQualifiedName, CodeTypeReferenceOptions.GlobalReference) ).Property(resourcePropertyName); var extAttr = propDesc.Attributes[typeof(ExtenderProvidedPropertyAttribute)] as ExtenderProvidedPropertyAttribute; diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj index ecaabadaa3..1875fe1434 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj @@ -128,9 +128,9 @@ ICSharpCode.SharpDevelop.Widgets False - - {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} - FormsDesigner + + {53840EAB-984D-419F-A2A2-6D13C3F3D5B4} + FormsDesigner.AddIn False diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/CSharpMethodExtractor.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/CSharpMethodExtractor.cs index fca8ea6f17..8b3585620a 100644 --- a/src/AddIns/Misc/SharpRefactoring/Project/Src/CSharpMethodExtractor.cs +++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/CSharpMethodExtractor.cs @@ -103,7 +103,7 @@ namespace SharpRefactoring var variablesList = (from list in ltv.Variables.Values from item in list select new Variable(item)) .Where(v => !(v.StartPos > end || v.EndPos < start) && - (HasReferencesInSelection(newMethod, v) || + (HasReferencesInSelection(newMethod, v) || HasOccurrencesAfter(CSharpNameComparer, this.parentNode, end, v.Name, v.StartPos, v.EndPos))) .Union(FromParameters(newMethod)) .Select(va => ResolveVariable(va)); @@ -194,7 +194,10 @@ namespace SharpRefactoring if (variable.Type.Type == "var") variable.Type = Dom.Refactoring.CodeGenerator.ConvertType(type, finder); - variable.IsReferenceType = type.IsReferenceType == true; + if (type == null) + variable.IsReferenceType = false; + else + variable.IsReferenceType = type.IsReferenceType == true; return variable; } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/EasyCodeDom.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/EasyCodeDom.cs index fcdaedbd0f..44e0a78815 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/EasyCodeDom.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/EasyCodeDom.cs @@ -6,377 +6,404 @@ using System.CodeDom; namespace ICSharpCode.EasyCodeDom { - public static class Easy + #if FORMSDESIGNER_DLL + internal + #else + public + #endif + static class Easy +{ + public static CodeTypeReference TypeRef(Type type) { - public static CodeTypeReference TypeRef(Type type) - { - return new CodeTypeReference(type, CodeTypeReferenceOptions.GlobalReference); - } - public static CodeTypeReference TypeRef(CodeTypeDeclaration type) - { - return new CodeTypeReference(type.Name); - } - public static CodeTypeReference TypeRef(string typeName, params string[] typeArguments) - { - CodeTypeReference tr = new CodeTypeReference(typeName); - foreach (string ta in typeArguments) { - tr.TypeArguments.Add(ta); - } - return tr; - } - - /// - /// Gets the CodeExpression for any primitive value that can be expressed as literal. - /// Also works for enumeration values. - /// - public static CodeExpression Prim(object literalValue) - { - if (literalValue is Enum) { - return Type(literalValue.GetType()).Field(literalValue.ToString()); - } else { - return new CodePrimitiveExpression(literalValue); - } - } - - public static CodeTypeReferenceExpression Type(Type type) - { - return Type(TypeRef(type)); - } - public static CodeTypeReferenceExpression Type(CodeTypeReference type) - { - return new CodeTypeReferenceExpression(type); - } - public static CodeTypeReferenceExpression Type(string type) - { - return Type(new CodeTypeReference(type)); - } - - public static CodeTypeOfExpression TypeOf(Type type) - { - return TypeOf(TypeRef(type)); - } - public static CodeTypeOfExpression TypeOf(CodeTypeReference type) - { - return new CodeTypeOfExpression(type); - } - - public static CodeObjectCreateExpression New(Type type, params CodeExpression[] arguments) - { - return New(TypeRef(type), arguments); - } - public static CodeObjectCreateExpression New(CodeTypeReference type, params CodeExpression[] arguments) - { - return new CodeObjectCreateExpression(type, arguments); - } - - public static CodeVariableReferenceExpression Var(string name) - { - return new CodeVariableReferenceExpression(name); - } - - public static CodeBinaryOperatorExpression Binary(CodeExpression left, - CodeBinaryOperatorType op, - CodeExpression right) - { - return new CodeBinaryOperatorExpression(left, op, right); - } - - public static CodeThisReferenceExpression This { - get { - return new CodeThisReferenceExpression(); - } - } - - public static CodeBaseReferenceExpression Base { - get { - return new CodeBaseReferenceExpression(); - } - } - - public static CodePropertySetValueReferenceExpression Value { - get { - return new CodePropertySetValueReferenceExpression(); - } - } - - public static CodePrimitiveExpression Null { - get { - return new CodePrimitiveExpression(null); - } - } - - public static void AddSummary(CodeTypeMember member, string summary) - { - member.Comments.Add(new CodeCommentStatement("", true)); - member.Comments.Add(new CodeCommentStatement(summary, true)); - member.Comments.Add(new CodeCommentStatement("", true)); - } - - internal static CodeAttributeDeclaration AddAttribute(CodeAttributeDeclarationCollection col, - CodeTypeReference type, - CodeExpression[] arguments) - { - CodeAttributeArgument[] attributeArguments = new CodeAttributeArgument[arguments.Length]; - for (int i = 0; i < arguments.Length; i++) { - attributeArguments[i] = new CodeAttributeArgument(arguments[i]); - } - CodeAttributeDeclaration cad = new CodeAttributeDeclaration(type, attributeArguments); - col.Add(cad); - return cad; + return new CodeTypeReference(type, CodeTypeReferenceOptions.GlobalReference); + } + public static CodeTypeReference TypeRef(CodeTypeDeclaration type) + { + return new CodeTypeReference(type.Name); + } + public static CodeTypeReference TypeRef(string typeName, params string[] typeArguments) + { + CodeTypeReference tr = new CodeTypeReference(typeName); + foreach (string ta in typeArguments) { + tr.TypeArguments.Add(ta); } + return tr; } - public static class ExtensionMethods + /// + /// Gets the CodeExpression for any primitive value that can be expressed as literal. + /// Also works for enumeration values. + /// + public static CodeExpression Prim(object literalValue) { - public static CodeMethodInvokeExpression InvokeMethod(this CodeExpression expr, string name, params CodeExpression[] arguments) - { - return new CodeMethodInvokeExpression(expr, name, arguments); - } - - public static CodeCastExpression CastTo(this CodeExpression expr, Type type) - { - return expr.CastTo(Easy.TypeRef(type)); - } - public static CodeCastExpression CastTo(this CodeExpression expr, CodeTypeReference type) - { - return new CodeCastExpression(type, expr); - } - - public static CodeIndexerExpression Index(this CodeExpression expr, params CodeExpression[] indices) - { - return new CodeIndexerExpression(expr, indices); - } - - public static CodeFieldReferenceExpression Field(this CodeExpression expr, string name) - { - return new CodeFieldReferenceExpression(expr, name); - } - - public static CodePropertyReferenceExpression Property(this CodeExpression expr, string name) - { - return new CodePropertyReferenceExpression(expr, name); - } - - public static CodeNamespace AddNamespace(this CodeCompileUnit ccu, string name) - { - CodeNamespace n = new CodeNamespace(name); - ccu.Namespaces.Add(n); - return n; - } - - public static CodeTypeDeclaration AddType(this CodeNamespace ns, string name) - { - CodeTypeDeclaration n = new CodeTypeDeclaration(name); - ns.Types.Add(n); - return n; - } - - public static CodeNamespaceImport AddImport(this CodeNamespace ns, string nameSpace) - { - CodeNamespaceImport cni = new CodeNamespaceImport(nameSpace); - ns.Imports.Add(cni); - return cni; - } - - public static CodeMemberField AddField(this CodeTypeDeclaration typeDecl, Type type, string name) - { - return typeDecl.AddField(Easy.TypeRef(type), name); - } - public static CodeMemberField AddField(this CodeTypeDeclaration typeDecl, CodeTypeReference type, string name) - { - CodeMemberField f = new CodeMemberField(type, name); - typeDecl.Members.Add(f); - return f; - } - - public static EasyProperty AddProperty(this CodeTypeDeclaration typeDecl, Type type, string name) - { - return AddProperty(typeDecl, Easy.TypeRef(type), name); - } - public static EasyProperty AddProperty(this CodeTypeDeclaration typeDecl, CodeTypeReference type, string name) - { - EasyProperty p = new EasyProperty(type, name); - typeDecl.Members.Add(p); - if (typeDecl.IsInterface == false) { - p.Attributes = MemberAttributes.Public | MemberAttributes.Final; - } - return p; - } - - public static EasyProperty AddProperty(this CodeTypeDeclaration typeDecl, CodeMemberField field, string name) - { - EasyProperty p = AddProperty(typeDecl, field.Type, name); - p.Getter.Return(new CodeVariableReferenceExpression(field.Name)); - p.Attributes |= field.Attributes & MemberAttributes.Static; // copy static flag - return p; - } - - /// - /// Adds a method with return type void and attributes=Public|Final to this type. - /// - public static EasyMethod AddMethod(this CodeTypeDeclaration typeDecl, string name) - { - return AddMethod(typeDecl, Easy.TypeRef(typeof(void)), name); - } - /// - /// Adds a method with return type and attributes=Public|Final to this type. - /// - public static EasyMethod AddMethod(this CodeTypeDeclaration typeDecl, Type type, string name) - { - return AddMethod(typeDecl, Easy.TypeRef(type), name); - } - /// - /// Adds a method with return type and attributes=Public|Final to this type. - /// - public static EasyMethod AddMethod(this CodeTypeDeclaration typeDecl, CodeTypeReference type, string name) - { - EasyMethod p = new EasyMethod(type, name); - typeDecl.Members.Add(p); - if (typeDecl.IsInterface == false) { - p.Attributes = MemberAttributes.Public | MemberAttributes.Final; - } - return p; - } - - public static CodeAttributeDeclaration AddAttribute(this CodeTypeMember typeMember, Type type, params CodeExpression[] arguments) - { - return Easy.AddAttribute(typeMember.CustomAttributes, Easy.TypeRef(type), arguments); - } - public static CodeAttributeDeclaration AddAttribute(this CodeTypeMember typeMember, CodeTypeReference type, params CodeExpression[] arguments) - { - return Easy.AddAttribute(typeMember.CustomAttributes, type, arguments); + if (literalValue is Enum) { + return Type(literalValue.GetType()).Field(literalValue.ToString()); + } else { + return new CodePrimitiveExpression(literalValue); } } - public class EasyProperty : CodeMemberProperty + public static CodeTypeReferenceExpression Type(Type type) { - EasyBlock getter, setter; - - public EasyProperty() - { - getter = new EasyBlock(this.GetStatements); - setter = new EasyBlock(this.SetStatements); - } - - public EasyProperty(CodeTypeReference type, string name) : this() - { - this.Type = type; - this.Name = name; - } - - public EasyBlock Getter { - get { return getter; } - } - - public EasyBlock Setter { - get { return setter; } - } + return Type(TypeRef(type)); } - public class EasyMethod : CodeMemberMethod + public static CodeTypeReferenceExpression Type(CodeTypeReference type) { - EasyBlock body; - - public EasyMethod() - { - body = new EasyBlock(this.Statements); - } - - public EasyMethod(CodeTypeReference type, string name) : this() - { - this.ReturnType = type; - this.Name = name; - } - - public CodeParameterDeclarationExpression AddParameter(Type type, string name) - { - return AddParameter(Easy.TypeRef(type), name); - } - public CodeParameterDeclarationExpression AddParameter(CodeTypeReference type, string name) - { - CodeParameterDeclarationExpression cpde; - cpde = new CodeParameterDeclarationExpression(type, name); - this.Parameters.Add(cpde); - return cpde; - } - - public EasyBlock Body { - get { return body; } - } + return new CodeTypeReferenceExpression(type); } - public sealed class EasyBlock + public static CodeTypeReferenceExpression Type(string type) { - readonly CodeStatementCollection csc; - - public EasyBlock(CodeStatementCollection csc) - { - this.csc = csc; - } - - public CodeMethodReturnStatement Return(CodeExpression expr) - { - CodeMethodReturnStatement st = new CodeMethodReturnStatement(expr); - csc.Add(st); - return st; - } - - public CodeThrowExceptionStatement Throw(CodeExpression expr) - { - CodeThrowExceptionStatement st = new CodeThrowExceptionStatement(expr); - csc.Add(st); - return st; + return Type(new CodeTypeReference(type)); + } + + public static CodeTypeOfExpression TypeOf(Type type) + { + return TypeOf(TypeRef(type)); + } + public static CodeTypeOfExpression TypeOf(CodeTypeReference type) + { + return new CodeTypeOfExpression(type); + } + + public static CodeObjectCreateExpression New(Type type, params CodeExpression[] arguments) + { + return New(TypeRef(type), arguments); + } + public static CodeObjectCreateExpression New(CodeTypeReference type, params CodeExpression[] arguments) + { + return new CodeObjectCreateExpression(type, arguments); + } + + public static CodeVariableReferenceExpression Var(string name) + { + return new CodeVariableReferenceExpression(name); + } + + public static CodeBinaryOperatorExpression Binary(CodeExpression left, + CodeBinaryOperatorType op, + CodeExpression right) + { + return new CodeBinaryOperatorExpression(left, op, right); + } + + public static CodeThisReferenceExpression This { + get { + return new CodeThisReferenceExpression(); } - - public CodeAssignStatement Assign(CodeExpression lhs, CodeExpression rhs) - { - CodeAssignStatement st = new CodeAssignStatement(lhs, rhs); - csc.Add(st); - return st; + } + + public static CodeBaseReferenceExpression Base { + get { + return new CodeBaseReferenceExpression(); } - - /// - /// Execute one expression as statement. - /// - public CodeExpressionStatement Add(CodeExpression expr) - { - CodeExpressionStatement st = new CodeExpressionStatement(expr); - csc.Add(st); - return st; + } + + public static CodePropertySetValueReferenceExpression Value { + get { + return new CodePropertySetValueReferenceExpression(); } - - /// - /// Adds the statement. - /// - public CodeStatement Add(CodeStatement st) - { - csc.Add(st); - return st; + } + + public static CodePrimitiveExpression Null { + get { + return new CodePrimitiveExpression(null); } - - /// - /// Invoke a method on target as statement. - /// - public CodeExpressionStatement InvokeMethod(CodeExpression target, string name, params CodeExpression[] arguments) - { - return Add(new CodeMethodInvokeExpression(target, name, arguments)); + } + + public static void AddSummary(CodeTypeMember member, string summary) + { + member.Comments.Add(new CodeCommentStatement("", true)); + member.Comments.Add(new CodeCommentStatement(summary, true)); + member.Comments.Add(new CodeCommentStatement("", true)); + } + + internal static CodeAttributeDeclaration AddAttribute(CodeAttributeDeclarationCollection col, + CodeTypeReference type, + CodeExpression[] arguments) + { + CodeAttributeArgument[] attributeArguments = new CodeAttributeArgument[arguments.Length]; + for (int i = 0; i < arguments.Length; i++) { + attributeArguments[i] = new CodeAttributeArgument(arguments[i]); } - - /// - /// Declares a local variable. - /// - public CodeVariableDeclarationStatement DeclareVariable(Type type, string name) - { - return DeclareVariable(Easy.TypeRef(type), name); + CodeAttributeDeclaration cad = new CodeAttributeDeclaration(type, attributeArguments); + col.Add(cad); + return cad; + } +} + + #if FORMSDESIGNER_DLL + internal + #else + public + #endif + static class ExtensionMethods +{ + public static CodeMethodInvokeExpression InvokeMethod(this CodeExpression expr, string name, params CodeExpression[] arguments) + { + return new CodeMethodInvokeExpression(expr, name, arguments); + } + + public static CodeCastExpression CastTo(this CodeExpression expr, Type type) + { + return expr.CastTo(Easy.TypeRef(type)); + } + public static CodeCastExpression CastTo(this CodeExpression expr, CodeTypeReference type) + { + return new CodeCastExpression(type, expr); + } + + public static CodeIndexerExpression Index(this CodeExpression expr, params CodeExpression[] indices) + { + return new CodeIndexerExpression(expr, indices); + } + + public static CodeFieldReferenceExpression Field(this CodeExpression expr, string name) + { + return new CodeFieldReferenceExpression(expr, name); + } + + public static CodePropertyReferenceExpression Property(this CodeExpression expr, string name) + { + return new CodePropertyReferenceExpression(expr, name); + } + + public static CodeNamespace AddNamespace(this CodeCompileUnit ccu, string name) + { + CodeNamespace n = new CodeNamespace(name); + ccu.Namespaces.Add(n); + return n; + } + + public static CodeTypeDeclaration AddType(this CodeNamespace ns, string name) + { + CodeTypeDeclaration n = new CodeTypeDeclaration(name); + ns.Types.Add(n); + return n; + } + + public static CodeNamespaceImport AddImport(this CodeNamespace ns, string nameSpace) + { + CodeNamespaceImport cni = new CodeNamespaceImport(nameSpace); + ns.Imports.Add(cni); + return cni; + } + + public static CodeMemberField AddField(this CodeTypeDeclaration typeDecl, Type type, string name) + { + return typeDecl.AddField(Easy.TypeRef(type), name); + } + public static CodeMemberField AddField(this CodeTypeDeclaration typeDecl, CodeTypeReference type, string name) + { + CodeMemberField f = new CodeMemberField(type, name); + typeDecl.Members.Add(f); + return f; + } + + public static EasyProperty AddProperty(this CodeTypeDeclaration typeDecl, Type type, string name) + { + return AddProperty(typeDecl, Easy.TypeRef(type), name); + } + public static EasyProperty AddProperty(this CodeTypeDeclaration typeDecl, CodeTypeReference type, string name) + { + EasyProperty p = new EasyProperty(type, name); + typeDecl.Members.Add(p); + if (typeDecl.IsInterface == false) { + p.Attributes = MemberAttributes.Public | MemberAttributes.Final; } - /// - /// Declares a local variable. - /// - public CodeVariableDeclarationStatement DeclareVariable(CodeTypeReference type, string name) - { - CodeVariableDeclarationStatement st = new CodeVariableDeclarationStatement(type, name); - csc.Add(st); - return st; + return p; + } + + public static EasyProperty AddProperty(this CodeTypeDeclaration typeDecl, CodeMemberField field, string name) + { + EasyProperty p = AddProperty(typeDecl, field.Type, name); + p.Getter.Return(new CodeVariableReferenceExpression(field.Name)); + p.Attributes |= field.Attributes & MemberAttributes.Static; // copy static flag + return p; + } + + /// + /// Adds a method with return type void and attributes=Public|Final to this type. + /// + public static EasyMethod AddMethod(this CodeTypeDeclaration typeDecl, string name) + { + return AddMethod(typeDecl, Easy.TypeRef(typeof(void)), name); + } + /// + /// Adds a method with return type and attributes=Public|Final to this type. + /// + public static EasyMethod AddMethod(this CodeTypeDeclaration typeDecl, Type type, string name) + { + return AddMethod(typeDecl, Easy.TypeRef(type), name); + } + /// + /// Adds a method with return type and attributes=Public|Final to this type. + /// + public static EasyMethod AddMethod(this CodeTypeDeclaration typeDecl, CodeTypeReference type, string name) + { + EasyMethod p = new EasyMethod(type, name); + typeDecl.Members.Add(p); + if (typeDecl.IsInterface == false) { + p.Attributes = MemberAttributes.Public | MemberAttributes.Final; } + return p; + } + + public static CodeAttributeDeclaration AddAttribute(this CodeTypeMember typeMember, Type type, params CodeExpression[] arguments) + { + return Easy.AddAttribute(typeMember.CustomAttributes, Easy.TypeRef(type), arguments); + } + public static CodeAttributeDeclaration AddAttribute(this CodeTypeMember typeMember, CodeTypeReference type, params CodeExpression[] arguments) + { + return Easy.AddAttribute(typeMember.CustomAttributes, type, arguments); + } +} + + #if FORMSDESIGNER_DLL + internal + #else + public + #endif + class EasyProperty : CodeMemberProperty +{ + EasyBlock getter, setter; + + public EasyProperty() + { + getter = new EasyBlock(this.GetStatements); + setter = new EasyBlock(this.SetStatements); + } + + public EasyProperty(CodeTypeReference type, string name) : this() + { + this.Type = type; + this.Name = name; + } + + public EasyBlock Getter { + get { return getter; } } + + public EasyBlock Setter { + get { return setter; } + } +} + + #if FORMSDESIGNER_DLL + internal + #else + public + #endif + class EasyMethod : CodeMemberMethod +{ + EasyBlock body; + + public EasyMethod() + { + body = new EasyBlock(this.Statements); + } + + public EasyMethod(CodeTypeReference type, string name) : this() + { + this.ReturnType = type; + this.Name = name; + } + + public CodeParameterDeclarationExpression AddParameter(Type type, string name) + { + return AddParameter(Easy.TypeRef(type), name); + } + public CodeParameterDeclarationExpression AddParameter(CodeTypeReference type, string name) + { + CodeParameterDeclarationExpression cpde; + cpde = new CodeParameterDeclarationExpression(type, name); + this.Parameters.Add(cpde); + return cpde; + } + + public EasyBlock Body { + get { return body; } + } +} + + #if FORMSDESIGNER_DLL + internal + #else + public + #endif + sealed class EasyBlock +{ + readonly CodeStatementCollection csc; + + public EasyBlock(CodeStatementCollection csc) + { + this.csc = csc; + } + + public CodeMethodReturnStatement Return(CodeExpression expr) + { + CodeMethodReturnStatement st = new CodeMethodReturnStatement(expr); + csc.Add(st); + return st; + } + + public CodeThrowExceptionStatement Throw(CodeExpression expr) + { + CodeThrowExceptionStatement st = new CodeThrowExceptionStatement(expr); + csc.Add(st); + return st; + } + + public CodeAssignStatement Assign(CodeExpression lhs, CodeExpression rhs) + { + CodeAssignStatement st = new CodeAssignStatement(lhs, rhs); + csc.Add(st); + return st; + } + + /// + /// Execute one expression as statement. + /// + public CodeExpressionStatement Add(CodeExpression expr) + { + CodeExpressionStatement st = new CodeExpressionStatement(expr); + csc.Add(st); + return st; + } + + /// + /// Adds the statement. + /// + public CodeStatement Add(CodeStatement st) + { + csc.Add(st); + return st; + } + + /// + /// Invoke a method on target as statement. + /// + public CodeExpressionStatement InvokeMethod(CodeExpression target, string name, params CodeExpression[] arguments) + { + return Add(new CodeMethodInvokeExpression(target, name, arguments)); + } + + /// + /// Declares a local variable. + /// + public CodeVariableDeclarationStatement DeclareVariable(Type type, string name) + { + return DeclareVariable(Easy.TypeRef(type), name); + } + /// + /// Declares a local variable. + /// + public CodeVariableDeclarationStatement DeclareVariable(CodeTypeReference type, string name) + { + CodeVariableDeclarationStatement st = new CodeVariableDeclarationStatement(type, name); + csc.Add(st); + return st; + } +} }