Browse Source

move ImageResourceEditorDialog into the Designer AppDomain

formsdesignerappdomain
Siegfried Pammer 14 years ago
parent
commit
8b7cbb4286
  1. 9
      src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj
  2. 6
      src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs
  3. 627
      src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs
  4. 179
      src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialogWrapper.cs
  5. 12
      src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs
  6. 15
      src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs
  7. 45
      src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ResourceStore.cs
  8. 8
      src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj
  9. 16
      src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs
  10. 1
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IFormsDesigner.cs
  11. 8
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.Designer.cs
  12. 398
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.cs
  13. 0
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.resx
  14. 4
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs
  15. 65
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs
  16. 52
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs
  17. 2
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs
  18. 58
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourceInfo.cs
  19. 4
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesComponentCodeDomSerializer.cs
  20. 2
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs
  21. 4
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/UIService.cs

9
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj

@ -91,10 +91,7 @@ @@ -91,10 +91,7 @@
<Compile Include="FormKeyHandler.cs" />
<Compile Include="FormsDesignerLoggingServiceImpl.cs" />
<Compile Include="FormsDesignerViewContent.cs" />
<Compile Include="ImageResourceEditorDialog.cs" />
<Compile Include="ImageResourceEditorDialog.Designer.cs">
<DependentUpon>ImageResourceEditorDialog.cs</DependentUpon>
</Compile>
<Compile Include="ImageResourceEditorDialogWrapper.cs" />
<Compile Include="OptionPanels\GeneralOptions.cs" />
<Compile Include="OptionPanels\GridOptions.cs" />
<Compile Include="OptionPanels\LocalizationModelOptionsPanel.cs" />
@ -103,7 +100,6 @@ @@ -103,7 +100,6 @@
<Compile Include="Services\DomTypeLocator.cs" />
<Compile Include="Services\HelpService.cs" />
<Compile Include="Services\FormsMessageService.cs" />
<Compile Include="Services\ProjectResourceInfo.cs" />
<Compile Include="Services\ProjectResourceService.cs" />
<Compile Include="Services\ResourceStore.cs" />
<Compile Include="Toolbox\AddComponentsDialog.cs" />
@ -173,9 +169,6 @@ @@ -173,9 +169,6 @@
<Folder Include="Toolbox" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="ImageResourceEditorDialog.resx">
<DependentUpon>ImageResourceEditorDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="OptionPanels\LocalizationModelOptionsPanel.resx">
<DependentUpon>LocalizationModelOptionsPanel.cs</DependentUpon>
</EmbeddedResource>

6
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs

@ -379,13 +379,13 @@ namespace ICSharpCode.FormsDesigner @@ -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 @@ -422,7 +422,7 @@ namespace ICSharpCode.FormsDesigner
ProjectResourceService CreateProjectResourceService()
{
IProjectContent projectContent = GetProjectContentForFile();
return new ProjectResourceService(projectContent);
return new ProjectResourceService(appDomainHost, projectContent);
}
IProjectContent GetProjectContentForFile()

627
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.cs

@ -1,627 +0,0 @@ @@ -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
{
/// <summary>
/// Allows the user to select a resource for an image or icon property.
/// </summary>
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
/// <summary>
/// Gets the <see cref="ProjectResourceInfo"/> for the selected project resource,
/// or <c>null</c> if the selected resource is not a project resource.
/// </summary>
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;
}
}
}
/// <summary>
/// Gets the selected image.
/// This can be an Image or an Icon (matching the type that was passed to the constructor) or null.
/// </summary>
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<FileProjectItem>().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<string, object> 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<string, object> 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<string, object>();
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<object, Stream> createStream;
public ImageResourceEditorDialogWrapper(IProject project, Func<object, Stream> 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;
}
}
}

179
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialogWrapper.cs

@ -0,0 +1,179 @@ @@ -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<FileProjectItem>().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<bool, Exception, TreeScanResult> finishedAction)
{
var ct = new CancellationTokenSource().Token;
this.requiredResourceType = requiredResourceType;
var task = new System.Threading.Tasks.Task<TreeScanResult>(() => 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);
}
}
}
}

12
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/FormsMessageService.cs

@ -13,7 +13,7 @@ namespace ICSharpCode.FormsDesigner.Services @@ -13,7 +13,7 @@ namespace ICSharpCode.FormsDesigner.Services
/// <summary>
/// Description of MessageService.
/// </summary>
public class FormsMessageService : MarshalByRefObject, IMessageService
public class FormsMessageService : MarshalByRefObject, ISharpDevelopIDEService
{
public void ShowOutputPad()
{
@ -48,5 +48,15 @@ namespace ICSharpCode.FormsDesigner.Services @@ -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);
}
}
}

15
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceService.cs

@ -22,13 +22,17 @@ namespace ICSharpCode.FormsDesigner.Services @@ -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 @@ -71,7 +75,7 @@ namespace ICSharpCode.FormsDesigner.Services
/// <summary>
/// Gets the project resource from the specified expression.
/// </summary>
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 @@ -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);
}
/// <summary>
@ -175,11 +179,6 @@ namespace ICSharpCode.FormsDesigner.Services @@ -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;

45
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ResourceStore.cs

@ -18,7 +18,7 @@ namespace ICSharpCode.FormsDesigner.Services @@ -18,7 +18,7 @@ namespace ICSharpCode.FormsDesigner.Services
/// <summary>
/// Manages the resource files that belong to an open forms designer view.
/// </summary>
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 @@ -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 @@ -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 @@ -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;
}
}
}

8
src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj

@ -74,6 +74,10 @@ @@ -74,6 +74,10 @@
<Compile Include="Src\IDesignerGenerator.cs" />
<Compile Include="Src\IFormsDesigner.cs" />
<Compile Include="Src\IFormsDesignerLoggingService.cs" />
<Compile Include="Src\ImageResourceEditorDialog.cs" />
<Compile Include="Src\ImageResourceEditorDialog.Designer.cs">
<DependentUpon>ImageResourceEditorDialog.cs</DependentUpon>
</Compile>
<Compile Include="Src\Services\AssemblyInfo.cs" />
<Compile Include="Src\Services\DefaultMemberRelationshipService.cs" />
<Compile Include="Src\Services\DefaultServiceContainer.cs" />
@ -84,6 +88,7 @@ @@ -84,6 +88,7 @@
<Compile Include="Src\Services\IProjectResourceService.cs" />
<Compile Include="Src\Services\ITypeLocator.cs" />
<Compile Include="Src\Services\MenuCommandService.cs" />
<Compile Include="Src\Services\ProjectResourceInfo.cs" />
<Compile Include="Src\Services\ProjectResourcesComponentCodeDomSerializer.cs" />
<Compile Include="Src\Services\ProjectResourcesMemberCodeDomSerializer.cs" />
<Compile Include="Src\Services\PropertyValueUIService.cs" />
@ -101,6 +106,9 @@ @@ -101,6 +106,9 @@
</Compile>
<EmbeddedResource Include="Resources\WindowsFormsGeneralOptions.xfrm" />
<Compile Include="Src\Services\DesignerSerializationService.cs" />
<EmbeddedResource Include="Src\ImageResourceEditorDialog.resx">
<DependentUpon>ImageResourceEditorDialog.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj">

16
src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs

@ -107,6 +107,7 @@ namespace ICSharpCode.FormsDesigner @@ -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 @@ -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 @@ -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

1
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/IFormsDesigner.cs

@ -45,5 +45,6 @@ namespace ICSharpCode.FormsDesigner @@ -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);
}
}

8
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.Designer.cs → src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.Designer.cs generated

@ -42,7 +42,6 @@ namespace ICSharpCode.FormsDesigner.Gui @@ -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 @@ -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 @@ -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;

398
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.cs

@ -0,0 +1,398 @@ @@ -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
{
/// <summary>
/// Allows the user to select a resource for an image or icon property.
/// </summary>
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
/// <summary>
/// Gets the <see cref="ProjectResourceInfo"/> for the selected project resource,
/// or <c>null</c> if the selected resource is not a project resource.
/// </summary>
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;
}
}
}
/// <summary>
/// Gets the selected image.
/// This can be an Image or an Icon (matching the type that was passed to the constructor) or null.
/// </summary>
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<KeyValuePair<string, object>> 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, object>((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
}
}

0
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/ImageResourceEditorDialog.resx → src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ImageResourceEditorDialog.resx

4
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/IProjectResourceService.cs

@ -19,7 +19,7 @@ namespace ICSharpCode.FormsDesigner.Services @@ -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 @@ -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

65
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ITypeLocator.cs

@ -2,8 +2,14 @@ @@ -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 @@ -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<bool, Exception, TreeScanResult> 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<TreeScanResult> children;
public IList<TreeScanResult> Children {
get {
if (children == null)
children = new List<TreeScanResult>();
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;
}
}
}

52
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ImageResourceEditor.cs

@ -4,8 +4,10 @@ @@ -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 @@ -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 @@ -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 @@ -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 @@ -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);

2
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs

@ -27,7 +27,7 @@ namespace ICSharpCode.FormsDesigner.Services @@ -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);

58
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Services/ProjectResourceInfo.cs → src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourceInfo.cs

@ -3,23 +3,22 @@ @@ -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
{
/// <summary>
/// Describes a project resource reference.
/// </summary>
public sealed class ProjectResourceInfo : MarshalByRefObject, IProjectResourceInfoWrapper
public sealed class ProjectResourceInfo : MarshalByRefObject, IProjectResourceInfo
{
readonly string resourceFile;
readonly string resourceKey;
readonly object originalValue;
object originalValue;
/// <summary>
/// Gets the full file name of the resource file that contains the resource.
@ -43,20 +42,16 @@ namespace ICSharpCode.FormsDesigner.Services @@ -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;
}
/// <summary>
/// Initializes a new instance of the <see cref="ProjectResourceInfo"/> class
/// and stores the resource value in the <see cref="OriginalValue"/> property
@ -64,27 +59,15 @@ namespace ICSharpCode.FormsDesigner.Services @@ -64,27 +59,15 @@ namespace ICSharpCode.FormsDesigner.Services
/// </summary>
/// <param name="resourceFile">The full name of the resource file that contains the resource.</param>
/// <param name="resourceKey">The resource key.</param>
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 @@ -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();
}
}

4
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ProjectResourcesComponentCodeDomSerializer.cs

@ -96,7 +96,7 @@ namespace ICSharpCode.FormsDesigner.Services @@ -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 @@ -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)));

2
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs

@ -129,7 +129,7 @@ namespace ICSharpCode.FormsDesigner.Services @@ -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) {

4
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/UIService.cs

@ -13,7 +13,7 @@ namespace ICSharpCode.FormsDesigner.Services @@ -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 @@ -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;
}

Loading…
Cancel
Save