Browse Source

Add Undo/Redo support to integrated WPF designer.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2576 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
77efe1ecc1
  1. 55
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/PropertyDescriptionService.cs
  2. 94
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/SharpDevelopElementHost.cs
  3. 37
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfToolbox.cs
  4. 14
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs
  5. 12
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj
  6. 7
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyNameTextBlock.cs
  7. 10
      src/Main/Base/Project/Src/Commands/EditCommands.cs
  8. 4
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/OverrideCompletionDataProvider.cs

55
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/PropertyDescriptionService.cs

@ -0,0 +1,55 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
namespace ICSharpCode.WpfDesign.AddIn
{
public class PropertyDescriptionService : IPropertyDescriptionService
{
OpenedFile file;
public PropertyDescriptionService(OpenedFile file)
{
if (file == null)
throw new ArgumentNullException("file");
this.file = file;
}
public object GetDescription(DesignItemProperty property)
{
IProjectContent pc = GetProjectContent();
if (pc != null) {
string fullName = property.DeclaringType.FullName + "." + property.Name;
IDecoration dec = pc.GetElement(fullName);
if (dec != null)
return CodeCompletionData.GetDocumentation(dec.Documentation);
foreach (IProjectContent rpc in pc.ReferencedContents) {
dec = rpc.GetElement(fullName);
if (dec != null)
return CodeCompletionData.GetDocumentation(dec.Documentation);
}
}
return null;
}
IProjectContent GetProjectContent()
{
if (ProjectService.OpenSolution != null) {
IProject p = ProjectService.OpenSolution.FindProjectContainingFile(file.FileName);
if (p != null) {
return ParserService.GetProjectContent(p);
}
}
return ParserService.DefaultProjectContent;
}
}
}

94
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/SharpDevelopElementHost.cs

@ -0,0 +1,94 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Forms.Integration;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.WpfDesign.AddIn
{
/// <summary>
/// Hosts a WPF element inside a Windows.Forms application.
/// </summary>
public class SharpDevelopElementHost : ElementHost, IUndoHandler, IClipboardHandler
{
static bool IsEnabled(ICommand command)
{
return command.CanExecute(null);
}
static void Run(ICommand command)
{
command.Execute(null);
}
public bool EnableUndo {
get { return IsEnabled(ApplicationCommands.Undo); }
}
public bool EnableRedo {
get { return IsEnabled(ApplicationCommands.Redo); }
}
public void Undo()
{
Run(ApplicationCommands.Undo);
}
public void Redo()
{
Run(ApplicationCommands.Redo);
}
public bool EnableCut {
get { return IsEnabled(ApplicationCommands.Undo); }
}
public bool EnableCopy {
get { return IsEnabled(ApplicationCommands.Copy); }
}
public bool EnablePaste {
get { return IsEnabled(ApplicationCommands.Paste); }
}
public bool EnableDelete {
get { return IsEnabled(ApplicationCommands.Delete); }
}
public bool EnableSelectAll {
get { return IsEnabled(ApplicationCommands.SelectAll); }
}
public void Cut()
{
Run(ApplicationCommands.Cut);
}
public void Copy()
{
Run(ApplicationCommands.Copy);
}
public void Paste()
{
Run(ApplicationCommands.Paste);
}
public void Delete()
{
Run(ApplicationCommands.Delete);
}
public void SelectAll()
{
Run(ApplicationCommands.SelectAll);
}
}
}

37
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfToolbox.cs

@ -86,14 +86,35 @@ namespace ICSharpCode.WpfDesign.AddIn
void OnCurrentToolChanged(object sender, EventArgs e) void OnCurrentToolChanged(object sender, EventArgs e)
{ {
Debug.WriteLine("WpfToolbox.OnCurrentToolChanged"); object tagToFind;
// for (int i = 0; i < this.Items.Count; i++) { if (toolService.CurrentTool == toolService.PointerTool) {
// if (((ListBoxItem)this.Items[i]).Tag == toolService.CurrentTool) { tagToFind = null;
// this.SelectedIndex = i; } else {
// return; tagToFind = toolService.CurrentTool;
// } }
// } if (sideBar.ActiveTab.ChoosedItem != null) {
// this.SelectedIndex = -1; if (sideBar.ActiveTab.ChoosedItem.Tag == tagToFind)
return;
}
foreach (SideTabItem item in sideBar.ActiveTab.Items) {
if (item.Tag == tagToFind) {
sideBar.ActiveTab.ChoosedItem = item;
sideBar.Refresh();
return;
}
}
foreach (SideTab tab in sideBar.Tabs) {
foreach (SideTabItem item in tab.Items) {
if (item.Tag == tagToFind) {
sideBar.ActiveTab = tab;
sideBar.ActiveTab.ChoosedItem = item;
sideBar.Refresh();
return;
}
}
}
sideBar.ActiveTab.ChoosedItem = null;
sideBar.Refresh();
} }
sealed class WpfSideBar : SharpDevelopSideBar sealed class WpfSideBar : SharpDevelopSideBar

14
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs

@ -6,6 +6,7 @@
// </file> // </file>
using System; using System;
using System.Diagnostics;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
@ -15,6 +16,7 @@ using System.Xml;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.WpfDesign.Designer; using ICSharpCode.WpfDesign.Designer;
using ICSharpCode.WpfDesign.Designer.Services;
using ICSharpCode.WpfDesign.PropertyEditor; using ICSharpCode.WpfDesign.PropertyEditor;
namespace ICSharpCode.WpfDesign.AddIn namespace ICSharpCode.WpfDesign.AddIn
@ -34,10 +36,11 @@ namespace ICSharpCode.WpfDesign.AddIn
protected override void LoadInternal(OpenedFile file, System.IO.Stream stream) protected override void LoadInternal(OpenedFile file, System.IO.Stream stream)
{ {
Debug.Assert(file == this.PrimaryFile);
if (designer == null) { if (designer == null) {
// initialize designer on first load // initialize designer on first load
DragDropExceptionHandler.HandleException = ICSharpCode.Core.MessageService.ShowError; DragDropExceptionHandler.HandleException = ICSharpCode.Core.MessageService.ShowError;
wpfHost = new ElementHost(); wpfHost = new SharpDevelopElementHost();
designer = new DesignSurface(); designer = new DesignSurface();
wpfHost.Child = designer; wpfHost.Child = designer;
this.UserControl = wpfHost; this.UserControl = wpfHost;
@ -45,7 +48,9 @@ namespace ICSharpCode.WpfDesign.AddIn
} }
using (XmlTextReader r = new XmlTextReader(stream)) { using (XmlTextReader r = new XmlTextReader(stream)) {
designer.LoadDesigner(r); designer.LoadDesigner(r);
designer.DesignContext.Services.AddService(typeof(IPropertyDescriptionService), new PropertyDescriptionService(this.PrimaryFile));
designer.DesignContext.Services.Selection.SelectionChanged += OnSelectionChanged; designer.DesignContext.Services.Selection.SelectionChanged += OnSelectionChanged;
designer.DesignContext.Services.GetService<UndoService>().UndoStackChanged += OnUndoStackChanged;
} }
} }
@ -57,13 +62,18 @@ namespace ICSharpCode.WpfDesign.AddIn
} }
} }
void OnUndoStackChanged(object sender, EventArgs e)
{
this.PrimaryFile.MakeDirty();
}
#region Property editor / SelectionChanged #region Property editor / SelectionChanged
Designer.PropertyEditor propertyEditor; Designer.PropertyEditor propertyEditor;
ElementHost propertyEditorHost; ElementHost propertyEditorHost;
void InitPropertyEditor() void InitPropertyEditor()
{ {
propertyEditorHost = new ElementHost(); propertyEditorHost = new SharpDevelopElementHost();
propertyEditor = new Designer.PropertyEditor(); propertyEditor = new Designer.PropertyEditor();
propertyEditorHost.Child = propertyEditor; propertyEditorHost.Child = propertyEditor;
propertyContainer.PropertyGridReplacementControl = propertyEditorHost; propertyContainer.PropertyGridReplacementControl = propertyEditorHost;

12
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj

@ -52,12 +52,19 @@
<Link>Configuration\GlobalAssemblyInfo.cs</Link> <Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile> </Compile>
<Compile Include="Configuration\AssemblyInfo.cs" /> <Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\PropertyDescriptionService.cs" />
<Compile Include="Src\SharpDevelopElementHost.cs" />
<Compile Include="Src\WpfDisplayBinding.cs" /> <Compile Include="Src\WpfDisplayBinding.cs" />
<Compile Include="Src\WpfSideTabItem.cs" /> <Compile Include="Src\WpfSideTabItem.cs" />
<Compile Include="Src\WpfToolbox.cs" /> <Compile Include="Src\WpfToolbox.cs" />
<Compile Include="Src\WpfViewContent.cs" /> <Compile Include="Src\WpfViewContent.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj">
<Project>{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}</Project>
<Name>ICSharpCode.TextEditor</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj"> <ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project> <Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name> <Name>ICSharpCode.SharpDevelop</Name>
@ -68,6 +75,11 @@
<Name>ICSharpCode.Core</Name> <Name>ICSharpCode.Core</Name>
<Private>False</Private> <Private>False</Private>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj">
<Project>{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}</Project>
<Name>ICSharpCode.SharpDevelop.Dom</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj"> <ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj">
<Project>{8035765F-D51F-4A0C-A746-2FD100E19419}</Project> <Project>{8035765F-D51F-4A0C-A746-2FD100E19419}</Project>
<Name>ICSharpCode.SharpDevelop.Widgets</Name> <Name>ICSharpCode.SharpDevelop.Widgets</Name>

7
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyNameTextBlock.cs

@ -60,7 +60,12 @@ namespace ICSharpCode.WpfDesign.Designer.Controls
DockPanel.SetDock(textBlock, Dock.Top); DockPanel.SetDock(textBlock, Dock.Top);
toolTipDockPanel.Children.Add(textBlock); toolTipDockPanel.Children.Add(textBlock);
object description = property.GetDescription(); object description = property.GetDescription();
if (description != null) { if (description is UIElement) {
toolTipDockPanel.Children.Add((UIElement)description);
} else if (description is string) {
textBlock.Inlines.Add(new LineBreak());
textBlock.Inlines.Add((string)description);
} else if (description != null) {
ContentControl cc = new ContentControl(); ContentControl cc = new ContentControl();
cc.Content = description; cc.Content = description;
toolTipDockPanel.Children.Add(cc); toolTipDockPanel.Children.Add(cc);

10
src/Main/Base/Project/Src/Commands/EditCommands.cs

@ -16,7 +16,7 @@ namespace ICSharpCode.SharpDevelop.Commands
{ {
public override bool IsEnabled { public override bool IsEnabled {
get { get {
IUndoHandler editable = WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler; IUndoHandler editable = (WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler) ?? (WorkbenchSingleton.ActiveControl as IUndoHandler);
if (editable != null) { if (editable != null) {
return editable.EnableUndo; return editable.EnableUndo;
} else { } else {
@ -31,7 +31,7 @@ namespace ICSharpCode.SharpDevelop.Commands
public override void Run() public override void Run()
{ {
IUndoHandler editable = WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler; IUndoHandler editable = (WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler) ?? (WorkbenchSingleton.ActiveControl as IUndoHandler);
if (editable != null) { if (editable != null) {
editable.Undo(); editable.Undo();
} else { } else {
@ -47,7 +47,7 @@ namespace ICSharpCode.SharpDevelop.Commands
{ {
public override bool IsEnabled { public override bool IsEnabled {
get { get {
IUndoHandler editable = WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler; IUndoHandler editable = (WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler) ?? (WorkbenchSingleton.ActiveControl as IUndoHandler);
if (editable != null) { if (editable != null) {
return editable.EnableRedo; return editable.EnableRedo;
} }
@ -57,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.Commands
public override void Run() public override void Run()
{ {
IUndoHandler editable = WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler; IUndoHandler editable = (WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler) ?? (WorkbenchSingleton.ActiveControl as IUndoHandler);
if (editable != null) { if (editable != null) {
editable.Redo(); editable.Redo();
} }
@ -77,7 +77,7 @@ namespace ICSharpCode.SharpDevelop.Commands
ComboBox cb = ctl as ComboBox; ComboBox cb = ctl as ComboBox;
if (cb != null && cb.DropDownStyle != ComboBoxStyle.DropDownList) if (cb != null && cb.DropDownStyle != ComboBoxStyle.DropDownList)
return new ComboBoxWrapper(cb); return new ComboBoxWrapper(cb);
return null; return ctl as IClipboardHandler;
} }
private class TextBoxWrapper : IClipboardHandler private class TextBoxWrapper : IClipboardHandler

4
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/OverrideCompletionDataProvider.cs

@ -99,14 +99,14 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
"override " + GetName(method, ConversionFlags.ShowReturnType "override " + GetName(method, ConversionFlags.ShowReturnType
| ConversionFlags.ShowParameterList | ConversionFlags.ShowParameterList
| ConversionFlags.ShowAccessibility) | ConversionFlags.ShowAccessibility)
+ "\n\n" + method.Documentation, + "\n\n" + CodeCompletionData.GetDocumentation(method.Documentation),
ClassBrowserIconService.GetIcon(method)) ClassBrowserIconService.GetIcon(method))
{ {
this.member = method; this.member = method;
} }
public OverrideCompletionData(IProperty property) public OverrideCompletionData(IProperty property)
: base(property.Name, "override " + property.Name + "\n\n" + property.Documentation, : base(property.Name, "override " + property.Name + "\n\n" + CodeCompletionData.GetDocumentation(property.Documentation),
ClassBrowserIconService.GetIcon(property)) ClassBrowserIconService.GetIcon(property))
{ {
this.member = property; this.member = property;

Loading…
Cancel
Save