From 8b7cbb4286f2aae2a0bfc5e5a090c8d529c05108 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 17 Sep 2011 15:58:20 +0200 Subject: [PATCH] move ImageResourceEditorDialog into the Designer AppDomain --- .../FormsDesigner.AddIn.csproj | 9 +- .../FormsDesignerViewContent.cs | 6 +- .../ImageResourceEditorDialog.cs | 627 ------------------ .../ImageResourceEditorDialogWrapper.cs | 179 +++++ .../Services/FormsMessageService.cs | 12 +- .../Services/ProjectResourceService.cs | 15 +- .../Services/ResourceStore.cs | 45 +- .../Project/FormsDesigner.csproj | 8 + .../Project/FormsDesignerAppDomainHost.cs | 16 +- .../Project/Src/IFormsDesigner.cs | 1 + .../ImageResourceEditorDialog.Designer.cs | 8 - .../Project/Src/ImageResourceEditorDialog.cs | 398 +++++++++++ .../Src}/ImageResourceEditorDialog.resx | 0 .../Src/Services/IProjectResourceService.cs | 4 +- .../Project/Src/Services/ITypeLocator.cs | 65 +- .../Src/Services/ImageResourceEditor.cs | 52 +- .../Src/Services/MenuCommandService.cs | 2 +- .../Src}/Services/ProjectResourceInfo.cs | 58 +- ...jectResourcesComponentCodeDomSerializer.cs | 4 +- .../Src/Services/TypeResolutionService.cs | 2 +- .../Project/Src/Services/UIService.cs | 4 +- 21 files changed, 769 insertions(+), 746 deletions(-) delete mode 100644 src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs create mode 100644 src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialogWrapper.cs rename src/AddIns/DisplayBindings/FormsDesigner/{FormsDesigner.AddIn => Project/Src}/ImageResourceEditorDialog.Designer.cs (94%) create mode 100644 src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.cs rename src/AddIns/DisplayBindings/FormsDesigner/{FormsDesigner.AddIn => Project/Src}/ImageResourceEditorDialog.resx (100%) rename src/AddIns/DisplayBindings/FormsDesigner/{FormsDesigner.AddIn => Project/Src}/Services/ProjectResourceInfo.cs (69%) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj index 7de520af03..fe6d190e5e 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj @@ -91,10 +91,7 @@ - - - ImageResourceEditorDialog.cs - + @@ -103,7 +100,6 @@ - @@ -173,9 +169,6 @@ - - ImageResourceEditorDialog.cs - LocalizationModelOptionsPanel.cs diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs index dbcaa8d6f7..13bedd23fb 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs @@ -379,13 +379,13 @@ namespace ICSharpCode.FormsDesigner { LoggingService.Info("Form Designer: BEGIN INITIALIZE"); - appDomainHost.AddService(typeof(IMessageService), new FormsMessageService()); + appDomainHost.AddService(typeof(ISharpDevelopIDEService), new FormsMessageService()); appDomainHost.AddService(typeof(System.Windows.Forms.Design.IUIService), new UIService(this, appDomainHost)); appDomainHost.AddService(typeof(IHelpService), new HelpService()); appDomainHost.AddService(typeof(IProjectResourceService), CreateProjectResourceService()); - appDomainHost.AddService(typeof(IImageResourceEditorDialogWrapper), new ImageResourceEditorDialogWrapper(ParserService.GetParseInformation(this.DesignerCodeFile.FileName).CompilationUnit.ProjectContent.Project as IProject, value => appDomainHost.CreateStream(value))); + appDomainHost.AddService(typeof(IImageResourceEditorDialogWrapper), new ImageResourceEditorDialogWrapper(ParserService.GetParseInformation(this.DesignerCodeFile.FileName).CompilationUnit.ProjectContent.Project as IProject)); appDomainHost.DesignSurfaceLoading += new EventHandlerProxy(DesignerLoading); appDomainHost.DesignSurfaceLoaded += new LoadedEventHandlerProxy(DesignerLoaded); @@ -422,7 +422,7 @@ namespace ICSharpCode.FormsDesigner ProjectResourceService CreateProjectResourceService() { IProjectContent projectContent = GetProjectContentForFile(); - return new ProjectResourceService(projectContent); + return new ProjectResourceService(appDomainHost, projectContent); } IProjectContent GetProjectContentForFile() diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs deleted file mode 100644 index 7ec82c687b..0000000000 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs +++ /dev/null @@ -1,627 +0,0 @@ -// 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 System.ComponentModel; -using System.ComponentModel.Design; -using System.Drawing; -using System.Drawing.Design; -using System.Drawing.Imaging; -using System.IO; -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; - -namespace ICSharpCode.FormsDesigner.Gui -{ - /// - /// Allows the user to select a resource for an image or icon property. - /// - public sealed partial class ImageResourceEditorDialog : Form - { - readonly IProject project; - readonly Type requiredResourceType; - Stream originalImage; - bool selectedImageIsProjectResource; - Stream selectedImage; - - #region Constructors - - ImageResourceEditorDialog(IProject project, Type requiredResourceType, bool designerSupportsProjectResources) - : base() - { - if (requiredResourceType == null) - throw new ArgumentNullException("requiredResourceType"); - this.requiredResourceType = requiredResourceType; - this.project = project; - - // - // The InitializeComponent() call is required for Windows Forms designer support. - // - InitializeComponent(); - Translate(this); - - this.projectResourcesTreeView.Nodes.Add(ResourceService.GetString("Global.PleaseWait")); - - this.importLocalResourceButton.DataBindings.Add("Enabled", this.localResourceRadioButton, "Checked"); - this.projectResourcesTreeView.DataBindings.Add("Enabled", this.projectResourceRadioButton, "Checked"); - - this.projectResourceRadioButton.Visible = designerSupportsProjectResources; - this.projectResourcesTreeView.Visible = designerSupportsProjectResources; - } - - public ImageResourceEditorDialog(IProject project, Type requiredResourceType, IProjectResourceInfoWrapper projectResource) - : this(project, requiredResourceType, true) - { - if (projectResource == null) - throw new ArgumentNullException("projectResource"); - - this.projectResourceRadioButton.Checked = true; - this.originalImage = this.selectedImage = projectResource.CreateStream(); - - this.selectedImageIsProjectResource = true; - this.SetPreviewImage(new Bitmap(selectedImage)); - this.projectTreeScanningBackgroundWorker.RunWorkerAsync(projectResource); - } - - public ImageResourceEditorDialog(IProject project, Stream localResource, bool isIcon, bool designerSupportsProjectResources) - : this(project, isIcon ? typeof(Icon) : typeof(Image), designerSupportsProjectResources) - { - if (localResource != null) { - this.localResourceRadioButton.Checked = true; - this.originalImage = this.selectedImage = localResource; - this.SetPreviewImage(new Bitmap(localResource)); - } else { - this.noResourceRadioButton.Checked = true; - } - this.projectTreeScanningBackgroundWorker.RunWorkerAsync(); - } - - Stream CreateStream(object value) - { - MemoryStream stream = new MemoryStream(); - - if (value is Image) - ((Image)value).Save(stream, ImageFormat.Png); - else if (value is Icon) - ((Icon)value).Save(stream); - else - return null; - - return stream; - } - - static void Translate(Control c) - { - c.Text = StringParser.Parse(c.Text); - foreach (Control child in c.Controls) { - Translate(child); - } - } - - #endregion - - #region Properties - - /// - /// Gets the for the selected project resource, - /// or null if the selected resource is not a project resource. - /// - public ProjectResourceInfo SelectedProjectResource { - get { - if (this.selectedImageIsProjectResource && this.projectResourceRadioButton.Checked) { - - TreeNode node = this.projectResourcesTreeView.SelectedNode; - if (node == null) return null; - - return new ProjectResourceInfo(((FileProjectItem)node.Parent.Tag).FileName, node.Text); - - } else { - return null; - } - } - } - - /// - /// Gets the selected image. - /// This can be an Image or an Icon (matching the type that was passed to the constructor) or null. - /// - public Stream SelectedResourceValue { - get { - return this.selectedImage; - } - } - - #endregion - - void SetPreviewImage(Image image) - { - this.previewPictureBox.Image = image; - if (image != null) { - if (image.Width > this.previewPictureBox.ClientSize.Width || - image.Height > this.previewPictureBox.ClientSize.Height) { - this.previewPictureBox.SizeMode = PictureBoxSizeMode.Zoom; - } else { - this.previewPictureBox.SizeMode = PictureBoxSizeMode.CenterImage; - } - } - } - - void DisposeImageIfNotOriginal(object image) - { - if (!Object.ReferenceEquals(image, this.originalImage)) { - IDisposable d = image as IDisposable; - if (d != null) { - d.Dispose(); - } - } - } - - void SetSelectedImage(Stream image, bool isIcon, bool isProjectResource) - { - if (!Object.ReferenceEquals(this.selectedImage, this.previewPictureBox.Image)) { - Image temp = this.previewPictureBox.Image; - this.previewPictureBox.Image = null; - this.DisposeImageIfNotOriginal(temp); - } else { - this.previewPictureBox.Image = null; - } - - if (!this.selectedImageIsProjectResource) { - this.DisposeImageIfNotOriginal(this.selectedImage); - } - - if (image == null) { - this.selectedImageIsProjectResource = false; - this.selectedImage = null; - return; - } - - if (isIcon) { - this.selectedImage = image; - this.selectedImageIsProjectResource = isProjectResource; - this.SetPreviewImage(new Bitmap(image)); - } else { - this.selectedImage = image; - this.selectedImageIsProjectResource = isProjectResource; - this.SetPreviewImage(new Bitmap(image)); - } - } - - #region Project tree filling - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] - void ProjectTreeScanningBackgroundWorkerDoWork(object sender, DoWorkEventArgs e) - { - if (this.project == null) { - return; - } - - IProjectResourceInfo selectedProjectResource = e.Argument as IProjectResourceInfo; - - IProjectContent projectContent = ParserService.GetProjectContent(this.project); - - TreeNode root = new TreeNode(this.project.Name, 0, 0); - TreeNode preSelection = null; - TreeNode lastFileNode = null; - int fileNodesCount = 0; - - foreach (FileProjectItem item in this.project.GetItemsOfType(ItemType.EmbeddedResource).OfType().OrderBy(fpi => Path.GetFileName(fpi.VirtualName))) { - - if (this.projectTreeScanningBackgroundWorker.CancellationPending) { - e.Cancel = true; - break; - } - - // Skip files where the generated class name - // would conflict with an existing class. - string namespaceName = item.GetEvaluatedMetadata("CustomToolNamespace"); - if (string.IsNullOrEmpty(namespaceName)) { - namespaceName = CustomToolsService.GetDefaultNamespace(item.Project, item.FileName); - } - IClass existingClass = projectContent.GetClass(namespaceName + "." + StronglyTypedResourceBuilder.VerifyResourceName(Path.GetFileNameWithoutExtension(item.FileName), projectContent.Language.CodeDomProvider), 0); - if (existingClass != null) { - if (!ProjectResourceService.IsGeneratedResourceClass(existingClass)) { - continue; - } - } - - bool selectedFile = (selectedProjectResource != null) && FileUtility.IsEqualFileName(selectedProjectResource.ResourceFile, item.FileName); - TreeNode file = null; - - try { - - foreach (KeyValuePair r in this.GetResources(item.FileName).OrderBy(pair => pair.Key)) { - if (this.projectTreeScanningBackgroundWorker.CancellationPending) { - e.Cancel = true; - break; - } - - if (file == null) { - file = CreateAndAddFileNode(root, item); - } - - TreeNode resNode = new TreeNode(r.Key, 3, 3); - resNode.Tag = r.Value; - file.Nodes.Add(resNode); - - if (selectedFile) { - if (String.Equals(r.Key, selectedProjectResource.ResourceKey, StringComparison.Ordinal)) { - preSelection = resNode; - } - } - } - - if (file != null) { - lastFileNode = file; - ++fileNodesCount; - } - - } catch (Exception ex) { - if (file == null) { - file = CreateAndAddFileNode(root, item); - } - TreeNode error = new TreeNode(ex.Message, 4, 4); - file.Nodes.Add(error); - } - } - - if (e.Cancel) { - DisposeNodeImages(root); - } else { - // Preselect the file node if there is only one - if (preSelection == null && fileNodesCount == 1) { - preSelection = lastFileNode; - } - e.Result = new TreeScanResult(root, preSelection); - } - } - - sealed class TreeScanResult { - readonly TreeNode root; - readonly TreeNode preSelection; - - public TreeNode Root { - get { return root; } - } - - public TreeNode PreSelection { - get { return preSelection; } - } - - public TreeScanResult(TreeNode root, TreeNode preSelection) - { - this.root = root; - this.preSelection = preSelection; - } - } - - static TreeNode CreateAndAddFileNode(TreeNode root, FileProjectItem item) - { - string directory = Path.GetDirectoryName(item.VirtualName); - TreeNode dir; - - if (String.IsNullOrEmpty(directory)) { - dir = root; - } else { - dir = GetOrCreateDirectoryNode(root, directory); - } - - TreeNode file = new TreeNode(Path.GetFileName(item.VirtualName), 2, 2); - file.Tag = item; - dir.Nodes.Add(file); - return file; - } - - static TreeNode GetOrCreateDirectoryNode(TreeNode root, string directory) - { - int index = directory.IndexOfAny(new [] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}); - string searchDir; - - if (index == -1) { - searchDir = directory; - } else { - searchDir = directory.Substring(0, index); - } - - TreeNode node = null; - foreach (TreeNode n in root.Nodes) { - if (n.Text == searchDir) { - node = n; - break; - } - } - - if (node == null) { - node = new TreeNode(searchDir, 1, 1); - int insertIndex; - for (insertIndex = 0; insertIndex < root.Nodes.Count; insertIndex++) { - TreeNode n = root.Nodes[insertIndex]; - if (n.ImageIndex != 1 || StringComparer.CurrentCulture.Compare(searchDir, n.Text) < 0) { - break; - } - } - root.Nodes.Insert(insertIndex, node); - } - - if (index == -1) { - return node; - } else { - return GetOrCreateDirectoryNode(node, directory.Substring(index + 1)); - } - } - - Dictionary GetResources(string fileName) - { - Stream s = null; - WorkbenchSingleton.SafeThreadCall( - delegate { - OpenedFile file = FileService.GetOpenedFile(fileName); - if (file != null) { - s = file.OpenRead(); - } - }); - if (s == null) { - s = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); - } - using(s) { - using(IResourceReader reader = ResourceStore.CreateResourceReader(s, ResourceStore.GetResourceType(fileName))) { - ResXResourceReader resXReader = reader as ResXResourceReader; - if (resXReader != null) { - resXReader.BasePath = Path.GetDirectoryName(fileName); - } - - var resources = new Dictionary(); - foreach (System.Collections.DictionaryEntry entry in reader) { - if (entry.Value == null) continue; - if (this.requiredResourceType.IsAssignableFrom(entry.Value.GetType())) { - resources.Add((string)entry.Key, entry.Value); - } - } - return resources; - } - } - } - - void ProjectTreeScanningBackgroundWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - if (this.IsDisposed || this.projectResourcesTreeView.IsDisposed) { - // This can happen when the dialog is closed before - // the scan has finished - if (!e.Cancelled && e.Error == null) { - TreeScanResult r = e.Result as TreeScanResult; - if (r != null) { - DisposeNodeImages(r.Root); - } - } - return; - } - - this.projectResourcesTreeView.Nodes.Clear(); - - if (e.Cancelled) { - return; - } - - if (e.Error != null) { - MessageService.ShowException(e.Error, "Error in project tree scanning thread"); - } - - TreeScanResult result = e.Result as TreeScanResult; - if (result == null) { - return; - } - - this.projectResourcesTreeView.BeginUpdate(); - - ImageList imageList = new ImageList(); - imageList.ColorDepth = ColorDepth.Depth32Bit; - imageList.Images.Add(IconService.GetBitmap(IconService.GetImageForProjectType(this.project.Language))); - imageList.Images.Add(WinFormsResourceService.GetBitmap("ProjectBrowser.Folder.Closed")); - imageList.Images.Add(IconService.GetBitmap(IconService.GetImageForFile("a.resx"))); - imageList.Images.Add(WinFormsResourceService.GetBitmap("Icons.16x16.Field")); - imageList.Images.Add(WinFormsResourceService.GetBitmap("Icons.16x16.Error")); - this.projectResourcesTreeView.ImageList = imageList; - - this.projectResourcesTreeView.Nodes.Add(result.Root); - - if (result.PreSelection != null) { - result.PreSelection.EnsureVisible(); - this.projectResourcesTreeView.SelectedNode = result.PreSelection; - result.PreSelection.Expand(); - } else { - result.Root.Expand(); - } - - this.projectResourcesTreeView.EndUpdate(); - - if (result.PreSelection != null) { - this.projectResourcesTreeView.Focus(); - } - } - - #endregion - - void NoResourceRadioButtonCheckedChanged(object sender, EventArgs e) - { - if (this.noResourceRadioButton.Checked) { - this.SetSelectedImage(null, false, false); - this.okButton.Enabled = true; - } - } - - void LocalResourceRadioButtonCheckedChanged(object sender, EventArgs e) - { - if (this.localResourceRadioButton.Checked) { - this.okButton.Enabled = true; - } - } - - void ProjectResourceRadioButtonCheckedChanged(object sender, EventArgs e) - { - if (this.projectResourceRadioButton.Checked) { - this.UpdateOnProjectResourceSelection(); - this.projectResourcesTreeView.Focus(); - } - } - - void ProjectResourcesTreeViewAfterSelect(object sender, TreeViewEventArgs e) - { - if (this.projectResourceRadioButton.Checked) { - this.UpdateOnProjectResourceSelection(); - } - } - - void UpdateOnProjectResourceSelection() - { - TreeNode node = this.projectResourcesTreeView.SelectedNode; - if (node != null && node.Tag != null && this.requiredResourceType.IsAssignableFrom(node.Tag.GetType())) { - this.SetSelectedImage(CreateStream(node.Tag), false, true); - this.okButton.Enabled = true; - } else { - this.SetSelectedImage(null, false, false); - this.okButton.Enabled = false; - } - } - - void ImageResourceEditorDialogFormClosed(object sender, FormClosedEventArgs e) - { - this.projectTreeScanningBackgroundWorker.CancelAsync(); - if (this.projectResourcesTreeView.Nodes.Count > 0) { - DisposeNodeImages(this.projectResourcesTreeView.Nodes[0]); - } - } - - static void DisposeNodeImages(TreeNode root) - { - if (root.Nodes.Count == 0) { - IDisposable d = root.Tag as IDisposable; - if (d != null) { - d.Dispose(); - } - root.Tag = null; - } else { - foreach (TreeNode node in root.Nodes) { - DisposeNodeImages(node); - } - } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] - void ImportLocalResourceButtonClick(object sender, EventArgs e) - { - bool isIcon = typeof(Icon).IsAssignableFrom(this.requiredResourceType); - using(OpenFileDialog dialog = new OpenFileDialog()) { - dialog.Filter = (isIcon ? DummyIconEditor.FileFilterEntry : DummyImageEditor.FileFilterEntry); - dialog.RestoreDirectory = true; - dialog.Title = StringParser.Parse("${res:ICSharpCode.SharpDevelop.FormDesigner.Gui.ImageResourceEditor.Title}"); - if (dialog.ShowDialog(this) == DialogResult.OK && !String.IsNullOrEmpty(dialog.FileName)) { - try { - this.SetSelectedImage(new FileStream(dialog.FileName, FileMode.Open, FileAccess.Read, FileShare.Read), isIcon, false); - } catch (Exception ex) { - MessageService.ShowError(ex.Message); - } - } - } - } - - #region Dummy editors for getting the file filter from the framework - - sealed class DummyImageEditor : ImageEditor - { - DummyImageEditor() - { - } - - internal static string FileFilterEntry { - get { return CreateFilterEntry(new ImageEditor()); } - } - } - - sealed class DummyIconEditor : IconEditor - { - DummyIconEditor() - { - } - - internal static string FileFilterEntry { - get { return CreateFilterEntry(new IconEditor()); } - } - } - - #endregion - } - - public class ImageResourceEditorDialogWrapper : MarshalByRefObject, IImageResourceEditorDialogWrapper - { - IProject project; - Func createStream; - - public ImageResourceEditorDialogWrapper(IProject project, Func createStream) - { - if (project == null) - throw new ArgumentNullException("project"); - this.project = project; - this.createStream = createStream; - } - - public object GetValue(IProjectResourceInfo projectResource, object value, IProjectResourceService prs, Type propertyType, string propertyName, IWindowsFormsEditorService edsvc, IDictionaryService dictService) - { - ImageResourceEditorDialog dialog; - - if (projectResource != null && object.ReferenceEquals(projectResource.OriginalValue, value) && prs.DesignerSupportsProjectResources) { - dialog = new ImageResourceEditorDialog(project, propertyType, (IProjectResourceInfoWrapper)projectResource); - } else { - if (propertyType == typeof(Image)) { - dialog = new ImageResourceEditorDialog(project, createStream(value), false, prs.DesignerSupportsProjectResources); - } else if (propertyType == typeof(Icon)) { - dialog = new ImageResourceEditorDialog(project, createStream(value), true, prs.DesignerSupportsProjectResources); - } else { - throw new InvalidOperationException("ImageResourceEditor called on unsupported property type: " + propertyType.ToString()); - } - } - - using(dialog) { - if (edsvc.ShowDialog(dialog) == DialogResult.OK) { - projectResource = dialog.SelectedProjectResource; - if (projectResource != null) { - dictService.SetValue(prs.ProjectResourceKey + propertyName, projectResource); - - // Ensure the resource generator is turned on for the selected resource file. - if (project != null) { - FileProjectItem fpi = project.FindFile(projectResource.ResourceFile); - if (fpi == null) { - throw new InvalidOperationException("The selected resource file '" + projectResource.ResourceFile + "' was not found in the project."); - } - const string resourceGeneratorToolName = "ResXFileCodeGenerator"; - const string publicResourceGeneratorToolName = "PublicResXFileCodeGenerator"; - if (!String.Equals(resourceGeneratorToolName, fpi.CustomTool, StringComparison.Ordinal) && - !String.Equals(publicResourceGeneratorToolName, fpi.CustomTool, StringComparison.Ordinal)) { - fpi.CustomTool = resourceGeneratorToolName; - } - CustomToolsService.RunCustomTool(fpi, true); - } - - return projectResource.OriginalValue; - } else { - dictService.SetValue(prs.ProjectResourceKey + propertyName, null); - return dialog.SelectedResourceValue; - } - } - } - - return null; - } - } -} diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialogWrapper.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialogWrapper.cs new file mode 100644 index 0000000000..3b2fbd13c5 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialogWrapper.cs @@ -0,0 +1,179 @@ +// 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 System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Drawing.Design; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Resources; +using System.Resources.Tools; +using System.Threading; +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; + +namespace ICSharpCode.FormsDesigner.Gui +{ + public class ImageResourceEditorDialogWrapper : MarshalByRefObject, IImageResourceEditorDialogWrapper + { + IProject project; + Type requiredResourceType; + + public ImageResourceEditorDialogWrapper(IProject project) + { + if (project == null) + throw new ArgumentNullException("project"); + this.project = project; + } + + TreeScanResult ProduceTreeNodes(IProjectResourceInfo selectedProjectResource, CancellationToken ct) + { + IProjectContent projectContent = ParserService.GetProjectContent(this.project); + + TreeScanResult root = new TreeScanResult(project.Name, 0, 0); + TreeScanResult preSelection = null; + TreeScanResult lastFileNode = null; + int fileNodesCount = 0; + foreach (FileProjectItem item in this.project.GetItemsOfType(ItemType.EmbeddedResource) + .OfType().OrderBy(fpi => Path.GetFileName(fpi.VirtualName))) { + ct.ThrowIfCancellationRequested(); + + // Skip files where the generated class name + // would conflict with an existing class. + string namespaceName = item.GetEvaluatedMetadata("CustomToolNamespace"); + if (string.IsNullOrEmpty(namespaceName)) { + namespaceName = CustomToolsService.GetDefaultNamespace(item.Project, item.FileName); + } + IClass existingClass = projectContent.GetClass(namespaceName + "." + StronglyTypedResourceBuilder.VerifyResourceName(Path.GetFileNameWithoutExtension(item.FileName), projectContent.Language.CodeDomProvider), 0); + if (existingClass != null) { + if (!ProjectResourceService.IsGeneratedResourceClass(existingClass)) { + continue; + } + } + + bool selectedFile = (selectedProjectResource != null) && FileUtility.IsEqualFileName(selectedProjectResource.ResourceFile, item.FileName); + TreeScanResult file = CreateAndAddFileNode(root, item); + + if (file != null) { + lastFileNode = file; + ++fileNodesCount; + } + } + + // Preselect the file node if there is only one + if (preSelection == null && fileNodesCount == 1) { + preSelection = lastFileNode; + lastFileNode.IsSelected = true; + } + return root; + } + + static TreeScanResult CreateAndAddFileNode(TreeScanResult root, FileProjectItem item) + { + string directory = Path.GetDirectoryName(item.VirtualName); + TreeScanResult dir; + + if (String.IsNullOrEmpty(directory)) { + dir = root; + } else { + dir = GetOrCreateDirectoryNode(root, directory); + } + + TreeScanResult file = new TreeScanResult(Path.GetFileName(item.VirtualName), 2, 2); + dir.Children.Add(file); + file.FileName = item.FileName; + return file; + } + + static TreeScanResult GetOrCreateDirectoryNode(TreeScanResult root, string directory) + { + int index = directory.IndexOfAny(new [] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}); + string searchDir; + + if (index == -1) { + searchDir = directory; + } else { + searchDir = directory.Substring(0, index); + } + + TreeScanResult node = null; + foreach (TreeScanResult n in root.Children) { + if (n.Text == searchDir) { + node = n; + break; + } + } + + if (node == null) { + node = new TreeScanResult(searchDir, 1, 1); + int insertIndex; + for (insertIndex = 0; insertIndex < root.Children.Count; insertIndex++) { + TreeScanResult n = root.Children[insertIndex]; + if (n.ImageIndex != 1 || StringComparer.CurrentCulture.Compare(searchDir, n.Text) < 0) { + break; + } + } + root.Children.Insert(insertIndex, node); + } + + if (index == -1) { + return node; + } else { + return GetOrCreateDirectoryNode(node, directory.Substring(index + 1)); + } + } + + public ImageList CreateImageList() + { + ImageList imageList = new ImageList(); + imageList.ColorDepth = ColorDepth.Depth32Bit; + imageList.Images.Add(IconService.GetBitmap(IconService.GetImageForProjectType(this.project.Language))); + imageList.Images.Add(WinFormsResourceService.GetBitmap("ProjectBrowser.Folder.Closed")); + imageList.Images.Add(IconService.GetBitmap(IconService.GetImageForFile("a.resx"))); + imageList.Images.Add(WinFormsResourceService.GetBitmap("Icons.16x16.Field")); + imageList.Images.Add(WinFormsResourceService.GetBitmap("Icons.16x16.Error")); + return imageList; + } + + public void ProduceTreeNodesAsync(IProjectResourceInfo projectResource, Type requiredResourceType, Action finishedAction) + { + var ct = new CancellationTokenSource().Token; + this.requiredResourceType = requiredResourceType; + var task = new System.Threading.Tasks.Task(() => ProduceTreeNodes(projectResource, ct)); + task.ContinueWith(t => finishedAction(t.IsCanceled, t.Exception, t.Result)) + .ContinueWith(t => WorkbenchSingleton.SafeThreadAsyncCall((Action)delegate { if (t.Exception != null) MessageService.ShowException(t.Exception); })); + task.Start(); + } + + public void UpdateProjectResource(IProjectResourceInfo projectResource) + { + // Ensure the resource generator is turned on for the selected resource file. + if (project != null) { + FileProjectItem fpi = project.FindFile(projectResource.ResourceFile); + if (fpi == null) { + throw new InvalidOperationException("The selected resource file '" + projectResource.ResourceFile + "' was not found in the project."); + } + const string resourceGeneratorToolName = "ResXFileCodeGenerator"; + const string publicResourceGeneratorToolName = "PublicResXFileCodeGenerator"; + if (!String.Equals(resourceGeneratorToolName, fpi.CustomTool, StringComparison.Ordinal) && + !String.Equals(publicResourceGeneratorToolName, fpi.CustomTool, StringComparison.Ordinal)) { + fpi.CustomTool = resourceGeneratorToolName; + } + CustomToolsService.RunCustomTool(fpi, true); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs index 7af5cca4ee..236c5783f4 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs @@ -13,7 +13,7 @@ namespace ICSharpCode.FormsDesigner.Services /// /// Description of MessageService. /// - public class FormsMessageService : MarshalByRefObject, IMessageService + public class FormsMessageService : MarshalByRefObject, ISharpDevelopIDEService { public void ShowOutputPad() { @@ -48,5 +48,15 @@ namespace ICSharpCode.FormsDesigner.Services { MessageService.ShowError(message); } + + public string Parse(string input) + { + return StringParser.Parse(input); + } + + public string GetResourceString(string name) + { + return ResourceService.GetString(name); + } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs index 09f9996618..336c46331c 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs @@ -22,13 +22,17 @@ namespace ICSharpCode.FormsDesigner.Services public sealed class ProjectResourceService : MarshalByRefObject, IProjectResourceService { IProjectContent projectContent; + FormsDesignerAppDomainHost host; string stringLiteralDelimiter; bool designerSupportsProjectResources = true; - public ProjectResourceService(IProjectContent projectContent) + public ProjectResourceService(FormsDesignerAppDomainHost host, IProjectContent projectContent) { + if (host == null) + throw new ArgumentNullException("host"); if (projectContent == null) throw new ArgumentNullException("projectContent"); + this.host = host; this.projectContent = projectContent; } @@ -71,7 +75,7 @@ namespace ICSharpCode.FormsDesigner.Services /// /// Gets the project resource from the specified expression. /// - public ProjectResourceInfo GetProjectResource(CodePropertyReferenceExpression propRef) + public IProjectResourceInfo GetProjectResource(CodePropertyReferenceExpression propRef) { CodeTypeReferenceExpression typeRef = propRef.TargetObject as CodeTypeReferenceExpression; if (typeRef == null) { @@ -157,7 +161,7 @@ namespace ICSharpCode.FormsDesigner.Services string resourceKey = code.Substring(index, endIndex - index); LoggingService.Debug("-> Decoded resource: In: " + resourceFileName + ". Key: " + resourceKey); - return new ProjectResourceInfo(resourceFileName, resourceKey); + return host.CreateProjectResourceInfo(resourceFileName, resourceKey); } /// @@ -175,11 +179,6 @@ namespace ICSharpCode.FormsDesigner.Services 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; diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ResourceStore.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ResourceStore.cs index 9c2258c104..30a674d5d7 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ResourceStore.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ResourceStore.cs @@ -18,7 +18,7 @@ namespace ICSharpCode.FormsDesigner.Services /// /// Manages the resource files that belong to an open forms designer view. /// - internal sealed class ResourceStore : MarshalByRefObject, IResourceStore, IDisposable + public sealed class ResourceStore : MarshalByRefObject, IResourceStore, IDisposable { readonly FormsDesignerViewContent viewContent; @@ -106,7 +106,7 @@ namespace ICSharpCode.FormsDesigner.Services } public ResourceType Type { - get { return GetResourceType(OpenedFile.FileName); } + get { return ResourceHelpers.GetResourceType(OpenedFile.FileName); } } public void Dispose() @@ -306,32 +306,6 @@ namespace ICSharpCode.FormsDesigner.Services return resourceFileName.ToString(); } - internal static IResourceReader CreateResourceReader(Stream stream, ResourceType type) - { - if (stream.Length == 0) - return null; - if (type == ResourceType.Resources) { - return new ResourceReader(stream); - } - return new ResXResourceReader(stream); - } - - internal static IResourceWriter CreateResourceWriter(Stream stream, ResourceType type) - { - if (type == ResourceType.Resources) { - return new ResourceWriter(stream); - } - return new ResXResourceWriter(stream); - } - - internal static ResourceType GetResourceType(string fileName) - { - if (Path.GetExtension(fileName).ToLowerInvariant() == ".resx") { - return ResourceType.Resx; - } - return ResourceType.Resources; - } - public Stream GetResourceAsStreamForReading(CultureInfo info, out ResourceType type) { ResourceStorage storage = GetResourceStorage(info); @@ -345,5 +319,20 @@ namespace ICSharpCode.FormsDesigner.Services type = storage.Type; return storage.GetWritingStream(); } + + public Stream OpenFile(string fileName) + { + Stream s = null; + WorkbenchSingleton.SafeThreadCall(delegate { + OpenedFile file = FileService.GetOpenedFile(fileName); + if (file != null) { + s = file.OpenRead(); + } + }); + if (s == null) { + s = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + } + return s; + } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj index aba1b2f77a..96d6c269cc 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj @@ -74,6 +74,10 @@ + + + ImageResourceEditorDialog.cs + @@ -84,6 +88,7 @@ + @@ -101,6 +106,9 @@ + + ImageResourceEditorDialog.cs + diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs index 4145c9f1bc..848c29cd24 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs @@ -107,6 +107,7 @@ namespace ICSharpCode.FormsDesigner container.AddService(typeof(System.ComponentModel.Design.IEventBindingService), eventBindingService); container.AddService(typeof(System.ComponentModel.Design.IMenuCommandService), menuCommandService.Proxy); container.AddService(typeof(IToolboxService), new SharpDevelopToolboxService(this)); + container.AddService(typeof(IResourceStore), properties.ResourceStore); container.AddService(typeof(System.ComponentModel.Design.IResourceService), new DesignerResourceService(properties.ResourceStore, this)); // Provide the ImageResourceEditor for all Image and Icon properties @@ -458,9 +459,9 @@ namespace ICSharpCode.FormsDesigner } } - public IMessageService MessageService { + public ISharpDevelopIDEService MessageService { get { - return GetService(typeof(IMessageService)) as IMessageService; + return GetService(typeof(ISharpDevelopIDEService)) as ISharpDevelopIDEService; } } @@ -538,19 +539,22 @@ namespace ICSharpCode.FormsDesigner addedTypeDescriptionProviders.Clear(); } - public Stream CreateStream(object value) + public object CreateStream(object value) { MemoryStream stream = new MemoryStream(); if (value is Image) ((Image)value).Save(stream, ImageFormat.Png); - else if (value is Icon) - ((Icon)value).Save(stream); else - return null; + return value; return stream; } + + public IProjectResourceInfo CreateProjectResourceInfo(string resourceFile, string resourceKey) + { + return ProjectResourceInfo.Create((IResourceStore)GetService(typeof(IResourceStore)), resourceFile, resourceKey); + } } public class FormsDesignerAppDomainCreationProperties : MarshalByRefObject diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IFormsDesigner.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IFormsDesigner.cs index 00d2d13e04..44079b1e89 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IFormsDesigner.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IFormsDesigner.cs @@ -45,5 +45,6 @@ namespace ICSharpCode.FormsDesigner { Stream GetResourceAsStreamForReading(CultureInfo info, out ResourceType type); Stream GetResourceAsStreamForWriting(CultureInfo info, out ResourceType type); + Stream OpenFile(string fileName); } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.Designer.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.Designer.cs similarity index 94% rename from src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.Designer.cs rename to src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.Designer.cs index 888959ac73..0aac4e7cb4 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.Designer.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.Designer.cs @@ -42,7 +42,6 @@ namespace ICSharpCode.FormsDesigner.Gui this.localResourceRadioButton = new System.Windows.Forms.RadioButton(); this.previewPictureBox = new System.Windows.Forms.PictureBox(); this.okButton = new System.Windows.Forms.Button(); - this.projectTreeScanningBackgroundWorker = new System.ComponentModel.BackgroundWorker(); cancelButton = new System.Windows.Forms.Button(); splitContainer = new System.Windows.Forms.SplitContainer(); resourceSelectionGroup = new System.Windows.Forms.GroupBox(); @@ -199,12 +198,6 @@ namespace ICSharpCode.FormsDesigner.Gui this.okButton.Text = "${res:Global.OKButtonText}"; this.okButton.UseVisualStyleBackColor = true; // - // projectTreeScanningBackgroundWorker - // - this.projectTreeScanningBackgroundWorker.WorkerSupportsCancellation = true; - this.projectTreeScanningBackgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.ProjectTreeScanningBackgroundWorkerDoWork); - this.projectTreeScanningBackgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.ProjectTreeScanningBackgroundWorkerRunWorkerCompleted); - // // ImageResourceEditorDialog // this.AcceptButton = this.okButton; @@ -231,7 +224,6 @@ namespace ICSharpCode.FormsDesigner.Gui ((System.ComponentModel.ISupportInitialize)(this.previewPictureBox)).EndInit(); this.ResumeLayout(false); } - private System.ComponentModel.BackgroundWorker projectTreeScanningBackgroundWorker; private System.Windows.Forms.RadioButton noResourceRadioButton; private System.Windows.Forms.Button importLocalResourceButton; private System.Windows.Forms.RadioButton projectResourceRadioButton; diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.cs new file mode 100644 index 0000000000..812086d61e --- /dev/null +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.cs @@ -0,0 +1,398 @@ +// 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 System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Drawing.Design; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Resources; +using System.Resources.Tools; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using ICSharpCode.FormsDesigner.Services; + +//using ICSharpCode.Core; +//using ICSharpCode.Core.WinForms; +//using ICSharpCode.SharpDevelop; +//using ICSharpCode.SharpDevelop.Dom; +//using ICSharpCode.SharpDevelop.Editor; +//using ICSharpCode.SharpDevelop.Gui; +//using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.FormsDesigner.Gui +{ + /// + /// Allows the user to select a resource for an image or icon property. + /// + public sealed partial class ImageResourceEditorDialog : Form + { + readonly Type requiredResourceType; + object originalImage; + bool selectedImageIsProjectResource; + object selectedImage; + IImageResourceEditorDialogWrapper dialogProxy; + CancellationTokenSource cts; + IServiceProvider provider; + ISharpDevelopIDEService messageService; + IResourceStore resourceStore; + + #region Constructors + + ImageResourceEditorDialog(IServiceProvider provider, IImageResourceEditorDialogWrapper dialogProxy, Type requiredResourceType, bool designerSupportsProjectResources) + : base() + { + if (requiredResourceType == null) + throw new ArgumentNullException("requiredResourceType"); + this.requiredResourceType = requiredResourceType; + this.dialogProxy = dialogProxy; + InitializeComponent(); + + cts = new CancellationTokenSource(); + this.provider = provider; + this.messageService = (ISharpDevelopIDEService)provider.GetService(typeof(ISharpDevelopIDEService)); + this.resourceStore = (IResourceStore)provider.GetService(typeof(IResourceStore)); + + Translate(this); + this.projectResourcesTreeView.Nodes.Add(messageService.GetResourceString("Global.PleaseWait")); + + this.importLocalResourceButton.DataBindings.Add("Enabled", this.localResourceRadioButton, "Checked"); + this.projectResourcesTreeView.DataBindings.Add("Enabled", this.projectResourceRadioButton, "Checked"); + + this.projectResourceRadioButton.Visible = designerSupportsProjectResources; + this.projectResourcesTreeView.Visible = designerSupportsProjectResources; + } + + public ImageResourceEditorDialog(IServiceProvider provider, IImageResourceEditorDialogWrapper dialogProxy, Type requiredResourceType, IProjectResourceInfo projectResource) + : this(provider, dialogProxy, requiredResourceType, true) + { + if (projectResource == null) + throw new ArgumentNullException("projectResource"); + + this.projectResourceRadioButton.Checked = true; + this.originalImage = this.selectedImage = projectResource.OriginalValue; + + this.selectedImageIsProjectResource = true; + if (selectedImage is Stream) + this.SetPreviewImage(new Bitmap(selectedImage as Stream)); + else if (selectedImage is Icon) + this.SetPreviewImage((selectedImage as Icon).ToBitmap()); + dialogProxy.ProduceTreeNodesAsync(projectResource, requiredResourceType, ProduceNodesFinished); + } + + public ImageResourceEditorDialog(IServiceProvider provider, IImageResourceEditorDialogWrapper dialogProxy, object localResource, bool isIcon, bool designerSupportsProjectResources) + : this(provider, dialogProxy, isIcon ? typeof(Icon) : typeof(Image), designerSupportsProjectResources) + { + if (selectedImage is Stream) { + this.localResourceRadioButton.Checked = true; + this.originalImage = this.selectedImage = localResource; + this.SetPreviewImage(new Bitmap(localResource as Stream)); + } else if (selectedImage is Icon) { + this.localResourceRadioButton.Checked = true; + this.originalImage = this.selectedImage = localResource; + this.SetPreviewImage((localResource as Icon).ToBitmap()); + } else { + this.noResourceRadioButton.Checked = true; + } + dialogProxy.ProduceTreeNodesAsync(null, requiredResourceType, ProduceNodesFinished); + } + + void Translate(Control control) + { + control.Text = messageService.Parse(control.Text); + foreach (Control child in control.Controls) { + Translate(child); + } + } + + object CreateStream(object value) + { + MemoryStream stream = new MemoryStream(); + + if (value is Image) + ((Image)value).Save(stream, ImageFormat.Png); + else + return value; + + return stream; + } + #endregion + + #region Properties + + /// + /// Gets the for the selected project resource, + /// or null if the selected resource is not a project resource. + /// + public IProjectResourceInfo SelectedProjectResource { + get { + if (this.selectedImageIsProjectResource && this.projectResourceRadioButton.Checked) { + + TreeNode node = this.projectResourcesTreeView.SelectedNode; + if (node == null) return null; + + return ProjectResourceInfo.Create(resourceStore, (string)node.Parent.Tag, node.Text); + + } else { + return null; + } + } + } + + /// + /// Gets the selected image. + /// This can be an Image or an Icon (matching the type that was passed to the constructor) or null. + /// + public object SelectedResourceValue { + get { + return this.selectedImage; + } + } + + #endregion + + void ProduceNodesFinished(bool isCancelled, Exception exception, TreeScanResult result) + { + projectResourcesTreeView.Invoke( + (Action)delegate { + if (this.IsDisposed || this.projectResourcesTreeView.IsDisposed) { + // This can happen when the dialog is closed before + // the scan has finished + return; + } + + this.projectResourcesTreeView.Nodes.Clear(); + + if (isCancelled) { + return; + } + + if (exception != null) { + messageService.ShowException(exception, "Error in project tree scanning thread"); + } + + if (result == null) { + return; + } + + this.projectResourcesTreeView.BeginUpdate(); + + this.projectResourcesTreeView.ImageList = dialogProxy.CreateImageList(); + TreeNode selection = null; + GenerateTreeNodes(result, this.projectResourcesTreeView.Nodes, ref selection); + + if (selection != null) { + selection.EnsureVisible(); + this.projectResourcesTreeView.SelectedNode = selection; + selection.Expand(); + } else { + this.projectResourcesTreeView.Nodes[0].Expand(); + } + + this.projectResourcesTreeView.EndUpdate(); + + if (selection != null) { + this.projectResourcesTreeView.Focus(); + } + } + ); + } + + void GenerateTreeNodes(TreeScanResult parent, TreeNodeCollection nodes, ref TreeNode selection) + { + var treeNode = new TreeNode(parent.Text, parent.ImageIndex, parent.SelectedImageIndex); + treeNode.Tag = parent.FileName; + + foreach (var res in GetResources(parent.FileName)) { + var resNode = new TreeNode(res.Key, 3, 3); + resNode.Tag = res.Value; + treeNode.Nodes.Add(resNode); + } + + if (parent.IsSelected) + selection = treeNode; + nodes.Add(treeNode); + foreach (var node in parent.Children) { + GenerateTreeNodes(node, treeNode.Nodes, ref selection); + } + } + + IEnumerable> GetResources(string fileName) + { + if (fileName == null) + yield break; + + Stream s = resourceStore.OpenFile(fileName); + using(s) { + using(IResourceReader reader = ResourceHelpers.CreateResourceReader(s, ResourceHelpers.GetResourceType(fileName))) { + ResXResourceReader resXReader = reader as ResXResourceReader; + if (resXReader != null) { + resXReader.BasePath = Path.GetDirectoryName(fileName); + } + + foreach (System.Collections.DictionaryEntry entry in reader) { + if (entry.Value == null) continue; + if (this.requiredResourceType.IsAssignableFrom(entry.Value.GetType())) { + yield return new KeyValuePair((string)entry.Key, entry.Value); + } + } + } + } + } + + void SetPreviewImage(Image image) + { + this.previewPictureBox.Image = image; + if (image != null) { + if (image.Width > this.previewPictureBox.ClientSize.Width || + image.Height > this.previewPictureBox.ClientSize.Height) { + this.previewPictureBox.SizeMode = PictureBoxSizeMode.Zoom; + } else { + this.previewPictureBox.SizeMode = PictureBoxSizeMode.CenterImage; + } + } + } + + void DisposeImageIfNotOriginal(object image) + { + if (!Object.ReferenceEquals(image, this.originalImage)) { + IDisposable d = image as IDisposable; + if (d != null) { + d.Dispose(); + } + } + } + + void SetSelectedImage(object image, bool isIcon, bool isProjectResource) + { + if (!Object.ReferenceEquals(this.selectedImage, this.previewPictureBox.Image)) { + Image temp = this.previewPictureBox.Image; + this.previewPictureBox.Image = null; + this.DisposeImageIfNotOriginal(temp); + } else { + this.previewPictureBox.Image = null; + } + + if (!this.selectedImageIsProjectResource) { + this.DisposeImageIfNotOriginal(this.selectedImage); + } + + if (image == null) { + this.selectedImageIsProjectResource = false; + this.selectedImage = null; + return; + } + + if (isIcon) { + this.selectedImage = image; + this.selectedImageIsProjectResource = isProjectResource; + this.SetPreviewImage((image as Icon).ToBitmap()); + } else { + this.selectedImage = image; + this.selectedImageIsProjectResource = isProjectResource; + this.SetPreviewImage(image as Image); + } + } + + void NoResourceRadioButtonCheckedChanged(object sender, EventArgs e) + { + if (this.noResourceRadioButton.Checked) { + this.SetSelectedImage(null, false, false); + this.okButton.Enabled = true; + } + } + + void LocalResourceRadioButtonCheckedChanged(object sender, EventArgs e) + { + if (this.localResourceRadioButton.Checked) { + this.okButton.Enabled = true; + } + } + + void ProjectResourceRadioButtonCheckedChanged(object sender, EventArgs e) + { + if (this.projectResourceRadioButton.Checked) { + this.UpdateOnProjectResourceSelection(); + this.projectResourcesTreeView.Focus(); + } + } + + void ProjectResourcesTreeViewAfterSelect(object sender, TreeViewEventArgs e) + { + if (this.projectResourceRadioButton.Checked) { + this.UpdateOnProjectResourceSelection(); + } + } + + void UpdateOnProjectResourceSelection() + { + TreeNode node = this.projectResourcesTreeView.SelectedNode; + if (node != null && node.Tag != null && this.requiredResourceType.IsAssignableFrom(node.Tag.GetType())) { + this.SetSelectedImage(node.Tag, false, true); + this.okButton.Enabled = true; + } else { + this.SetSelectedImage(null, false, false); + this.okButton.Enabled = false; + } + } + + void ImageResourceEditorDialogFormClosed(object sender, FormClosedEventArgs e) + { + cts.Cancel(); + } + + void ImportLocalResourceButtonClick(object sender, EventArgs e) + { + bool isIcon = typeof(Icon).IsAssignableFrom(this.requiredResourceType); + using(OpenFileDialog dialog = new OpenFileDialog()) { + dialog.Filter = (isIcon ? DummyIconEditor.FileFilterEntry : DummyImageEditor.FileFilterEntry); + dialog.RestoreDirectory = true; + dialog.Title = messageService.Parse("${res:ICSharpCode.SharpDevelop.FormDesigner.Gui.ImageResourceEditor.Title}"); + if (dialog.ShowDialog(this) == DialogResult.OK && !String.IsNullOrEmpty(dialog.FileName)) { + try { + object data = null; + if (isIcon) + data = new Icon(dialog.FileName); + else + data = new Bitmap(dialog.FileName); + this.SetSelectedImage(data, isIcon, false); + } catch (Exception ex) { + messageService.ShowException(ex, null); + } + } + } + } + + #region Dummy editors for getting the file filter from the framework + + sealed class DummyImageEditor : ImageEditor + { + DummyImageEditor() + { + } + + internal static string FileFilterEntry { + get { return CreateFilterEntry(new ImageEditor()); } + } + } + + sealed class DummyIconEditor : IconEditor + { + DummyIconEditor() + { + } + + internal static string FileFilterEntry { + get { return CreateFilterEntry(new IconEditor()); } + } + } + + #endregion + } +} diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.resx b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.resx similarity index 100% rename from src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.resx rename to src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.resx diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs index 61b8df5e8e..25e1d4ca01 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs @@ -19,7 +19,7 @@ namespace ICSharpCode.FormsDesigner.Services bool FindResourceClassNames(IProjectResourceInfo resourceInfo, out string resourceClassFullyQualifiedName, out string resourcePropertyName); } - public interface IMessageService + public interface ISharpDevelopIDEService { void ShowOutputPad(); void ShowPropertiesPad(); @@ -27,6 +27,8 @@ namespace ICSharpCode.FormsDesigner.Services void ShowError(string message); void ShowException(Exception ex, string message); string CodeStatementToString(CodeStatement statement); + string Parse(string input); + string GetResourceString(string name); } public interface IProjectResourceInfo diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs index ebfddc1a6c..7ac0626b6e 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs @@ -2,8 +2,14 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; +using System.IO; +using System.Resources; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; using System.Windows.Forms.Design; namespace ICSharpCode.FormsDesigner.Services @@ -22,6 +28,63 @@ namespace ICSharpCode.FormsDesigner.Services public interface IImageResourceEditorDialogWrapper { - object GetValue(IProjectResourceInfo projectResource, object value, IProjectResourceService prs, Type propertyType, string propertyName, IWindowsFormsEditorService edsvc, IDictionaryService dictService); + void ProduceTreeNodesAsync(IProjectResourceInfo projectResource, Type requiredResourceType, Action finishedAction); + ImageList CreateImageList(); + void UpdateProjectResource(IProjectResourceInfo projectResource); + } + + public sealed class TreeScanResult : MarshalByRefObject + { + public string Text { get; private set; } + public string FileName { get; set; } + public bool IsSelected { get; set; } + public int ImageIndex { get; private set; } + public int SelectedImageIndex { get; private set; } + + IList children; + + public IList Children { + get { + if (children == null) + children = new List(); + return children; + } + } + + public TreeScanResult(string text, int imageIndex, int selectedImageIndex) + { + this.Text = text; + this.ImageIndex = imageIndex; + this.SelectedImageIndex = selectedImageIndex; + } + } + + public static class ResourceHelpers + { + public static IResourceReader CreateResourceReader(Stream stream, ResourceType type) + { + if (stream.Length == 0) + return null; + if (type == ResourceType.Resources) { + return new ResourceReader(stream); + } + return new ResXResourceReader(stream); + } + + public static IResourceWriter CreateResourceWriter(Stream stream, ResourceType type) + { + if (type == ResourceType.Resources) { + return new ResourceWriter(stream); + } + return new ResXResourceWriter(stream); + } + + public static ResourceType GetResourceType(string fileName) + { + if (Path.GetExtension(fileName).ToLowerInvariant() == ".resx") { + return ResourceType.Resx; + } + return ResourceType.Resources; + } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs index 36ace450e0..151ed515b8 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs @@ -4,8 +4,10 @@ using System; using System.ComponentModel; using System.ComponentModel.Design; +using System.Diagnostics; using System.Drawing; using System.Drawing.Design; +using System.Drawing.Imaging; using System.IO; using System.Security.Permissions; using System.Windows.Forms; @@ -22,11 +24,14 @@ namespace ICSharpCode.FormsDesigner.Services { public ImageResourceEditor() { + Debug.Assert(DesignerAppDomainManager.IsDesignerDomain); } [PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")] public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { + Debug.Assert(DesignerAppDomainManager.IsDesignerDomain); + if (context == null || context.PropertyDescriptor == null) return UITypeEditorEditStyle.None; @@ -45,6 +50,8 @@ namespace ICSharpCode.FormsDesigner.Services [PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")] public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { + Debug.Assert(DesignerAppDomainManager.IsDesignerDomain); + if (context == null || context.PropertyDescriptor == null || context.Instance == null || provider == null) { return value; } @@ -80,22 +87,47 @@ namespace ICSharpCode.FormsDesigner.Services var imageDialogWrapper = provider.GetService(typeof(IImageResourceEditorDialogWrapper)) as IImageResourceEditorDialogWrapper; - var imageData = imageDialogWrapper.GetValue(projectResource, value, prs, context.PropertyDescriptor.PropertyType, context.PropertyDescriptor.Name, edsvc, new DictServiceProxy(dictService)) ?? value; + ImageResourceEditorDialog dialog; + + if (projectResource != null && object.ReferenceEquals(projectResource.OriginalValue, value) && prs.DesignerSupportsProjectResources) { + dialog = new ImageResourceEditorDialog(provider, imageDialogWrapper, context.PropertyDescriptor.PropertyType, projectResource); + } else { + if (context.PropertyDescriptor.PropertyType == typeof(Image)) { + dialog = new ImageResourceEditorDialog(provider, imageDialogWrapper, value, false, prs.DesignerSupportsProjectResources); + } else if (context.PropertyDescriptor.PropertyType == typeof(Icon)) { + dialog = new ImageResourceEditorDialog(provider, imageDialogWrapper, value, true, prs.DesignerSupportsProjectResources); + } else { + throw new InvalidOperationException("ImageResourceEditor called on unsupported property type: " + context.PropertyDescriptor.PropertyType.ToString()); + } + } + + object imageData = null; - if (imageData is Stream) { - if (context.PropertyDescriptor.PropertyType == typeof(Image)) - return new Bitmap(imageData as Stream); - if (context.PropertyDescriptor.PropertyType == typeof(Bitmap)) - return new Bitmap(imageData as Stream); - if (context.PropertyDescriptor.PropertyType == typeof(Icon)) - return new Icon(imageData as Stream); + using(dialog) { + if (edsvc.ShowDialog(dialog) == DialogResult.OK) { + projectResource = dialog.SelectedProjectResource; + if (projectResource != null) { + dictService.SetValue(prs.ProjectResourceKey + context.PropertyDescriptor.Name, projectResource); + + // Ensure the resource generator is turned on for the selected resource file. + imageDialogWrapper.UpdateProjectResource(projectResource); + + imageData = projectResource.OriginalValue; + } else { + dictService.SetValue(prs.ProjectResourceKey + context.PropertyDescriptor.Name, null); + imageData = dialog.SelectedResourceValue; + } + } } - throw new Exception("Invalid datatype in ImageResourceEditor"); + + return imageData ?? value; } [PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")] public override bool GetPaintValueSupported(ITypeDescriptorContext context) { + Debug.Assert(DesignerAppDomainManager.IsDesignerDomain); + if (context != null && context.PropertyDescriptor != null && (context.PropertyDescriptor.PropertyType == typeof(Image) || context.PropertyDescriptor.PropertyType == typeof(Icon))) { @@ -107,6 +139,8 @@ namespace ICSharpCode.FormsDesigner.Services [PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")] public override void PaintValue(PaintValueEventArgs e) { + Debug.Assert(DesignerAppDomainManager.IsDesignerDomain); + Image img = e.Value as Image; if (img != null) { e.Graphics.DrawImage(img, e.Bounds); diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs index ee239c9db6..bac61d79d4 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs @@ -27,7 +27,7 @@ namespace ICSharpCode.FormsDesigner.Services fd.ShowSourceCode(); }, StandardCommands.ViewCode); AddProxyCommand(delegate { - IMessageService ms = serviceProvider.GetService(typeof(IMessageService)) as IMessageService; + ISharpDevelopIDEService ms = serviceProvider.GetService(typeof(ISharpDevelopIDEService)) as ISharpDevelopIDEService; if (ms != null) ms.ShowPropertiesPad(); }, StandardCommands.PropertiesWindow); diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceInfo.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourceInfo.cs similarity index 69% rename from src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceInfo.cs rename to src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourceInfo.cs index b891eb775e..78420f5fa1 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceInfo.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourceInfo.cs @@ -3,23 +3,22 @@ using System; using System.Collections; +using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Resources; -using ICSharpCode.SharpDevelop; - namespace ICSharpCode.FormsDesigner.Services { /// /// Describes a project resource reference. /// - public sealed class ProjectResourceInfo : MarshalByRefObject, IProjectResourceInfoWrapper + public sealed class ProjectResourceInfo : MarshalByRefObject, IProjectResourceInfo { readonly string resourceFile; readonly string resourceKey; - readonly object originalValue; + object originalValue; /// /// Gets the full file name of the resource file that contains the resource. @@ -43,20 +42,16 @@ namespace ICSharpCode.FormsDesigner.Services get { return originalValue; } } - public Stream CreateStream() + ProjectResourceInfo(string resourceFile, string resourceKey) { - MemoryStream stream = new MemoryStream(); - - if (originalValue is Image) - ((Image)originalValue).Save(stream, ImageFormat.Png); - else if (originalValue is Icon) - ((Icon)originalValue).Save(stream); - else - return null; - - return stream; + if (resourceFile == null) + throw new ArgumentNullException("resourceFile"); + if (resourceKey == null) + throw new ArgumentNullException("resourceKey"); + this.resourceFile = resourceFile; + this.resourceKey = resourceKey; } - + /// /// Initializes a new instance of the class /// and stores the resource value in the property @@ -64,27 +59,15 @@ namespace ICSharpCode.FormsDesigner.Services /// /// The full name of the resource file that contains the resource. /// The resource key. - public ProjectResourceInfo(string resourceFile, string resourceKey) + public static ProjectResourceInfo Create(IResourceStore resourceStore, string resourceFile, string resourceKey) { - if (resourceFile == null) - throw new ArgumentNullException("resourceFile"); - if (resourceKey == null) - throw new ArgumentNullException("resourceKey"); - this.resourceFile = resourceFile; - this.resourceKey = resourceKey; - + Debug.Assert(DesignerAppDomainManager.IsDesignerDomain); + ProjectResourceInfo info = new ProjectResourceInfo(resourceFile, resourceKey); if (File.Exists(resourceFile)) { - - OpenedFile openedFile = FileService.GetOpenedFile(resourceFile); - Stream s; - if (openedFile != null) { - s = openedFile.OpenRead(); - } else { - s = new FileStream(resourceFile, FileMode.Open, FileAccess.Read, FileShare.Read); - } + Stream s = resourceStore.OpenFile(resourceFile); using (s) { - using (IResourceReader reader = ResourceStore.CreateResourceReader(s, ResourceStore.GetResourceType(resourceFile))) { + using (IResourceReader reader = ResourceHelpers.CreateResourceReader(s, ResourceHelpers.GetResourceType(resourceFile))) { ResXResourceReader resXReader = reader as ResXResourceReader; if (resXReader != null) { @@ -93,19 +76,14 @@ namespace ICSharpCode.FormsDesigner.Services foreach (DictionaryEntry entry in reader) { if (String.Equals(resourceKey, entry.Key as string, StringComparison.Ordinal)) { - this.originalValue = entry.Value; + info.originalValue = entry.Value; break; } } } } - } + return info; } } - - public interface IProjectResourceInfoWrapper : IProjectResourceInfo - { - Stream CreateStream(); - } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesComponentCodeDomSerializer.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesComponentCodeDomSerializer.cs index 9f836b4061..68fac8055f 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesComponentCodeDomSerializer.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesComponentCodeDomSerializer.cs @@ -96,7 +96,7 @@ namespace ICSharpCode.FormsDesigner.Services return false; } - IMessageService messenger = manager.GetService(typeof(IMessageService)) as IMessageService; + ISharpDevelopIDEService messenger = manager.GetService(typeof(ISharpDevelopIDEService)) as ISharpDevelopIDEService; logger.Debug("Forms designer: deserializing a property assignment:"); logger.Debug("-> " + messenger.CodeStatementToString(assignStatement)); @@ -149,7 +149,7 @@ namespace ICSharpCode.FormsDesigner.Services return false; } - IMessageService messenger = manager.GetService(typeof(IMessageService)) as IMessageService; + ISharpDevelopIDEService messenger = manager.GetService(typeof(ISharpDevelopIDEService)) as ISharpDevelopIDEService; logger.Debug("Forms designer: deserializing a method invocation:"); logger.Debug("-> " + messenger.CodeStatementToString(new CodeExpressionStatement(invokeExpression))); diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs index 5d4bcec96e..c7988f4bec 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs @@ -129,7 +129,7 @@ namespace ICSharpCode.FormsDesigner.Services } } - IMessageService messenger = serviceContainer.GetService(typeof(IMessageService)) as IMessageService; + ISharpDevelopIDEService messenger = serviceContainer.GetService(typeof(ISharpDevelopIDEService)) as ISharpDevelopIDEService; string hash = GetHash(fileName); lock (assemblyDict) { diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/UIService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/UIService.cs index 8bc8fb1a46..4a6070aeed 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/UIService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/UIService.cs @@ -13,7 +13,7 @@ namespace ICSharpCode.FormsDesigner.Services { IFormsDesigner designer; IServiceProvider provider; - IMessageService messenger; + ISharpDevelopIDEService messenger; IDictionary styles = new Hashtable(); public IDictionary Styles { @@ -26,7 +26,7 @@ namespace ICSharpCode.FormsDesigner.Services { this.designer = designer; this.provider = provider; - messenger = (IMessageService)provider.GetService(typeof(IMessageService)); + messenger = (ISharpDevelopIDEService)provider.GetService(typeof(ISharpDevelopIDEService)); styles["DialogFont"] = Control.DefaultFont; styles["HighlightColor"] = Color.LightYellow; }