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 18 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 @@ @@ -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 @@ @@ -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 @@ -86,14 +86,35 @@ namespace ICSharpCode.WpfDesign.AddIn
void OnCurrentToolChanged(object sender, EventArgs e)
{
Debug.WriteLine("WpfToolbox.OnCurrentToolChanged");
// for (int i = 0; i < this.Items.Count; i++) {
// if (((ListBoxItem)this.Items[i]).Tag == toolService.CurrentTool) {
// this.SelectedIndex = i;
// return;
// }
// }
// this.SelectedIndex = -1;
object tagToFind;
if (toolService.CurrentTool == toolService.PointerTool) {
tagToFind = null;
} else {
tagToFind = toolService.CurrentTool;
}
if (sideBar.ActiveTab.ChoosedItem != null) {
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

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

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

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

@ -52,12 +52,19 @@ @@ -52,12 +52,19 @@
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\PropertyDescriptionService.cs" />
<Compile Include="Src\SharpDevelopElementHost.cs" />
<Compile Include="Src\WpfDisplayBinding.cs" />
<Compile Include="Src\WpfSideTabItem.cs" />
<Compile Include="Src\WpfToolbox.cs" />
<Compile Include="Src\WpfViewContent.cs" />
</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">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>
@ -68,6 +75,11 @@ @@ -68,6 +75,11 @@
<Name>ICSharpCode.Core</Name>
<Private>False</Private>
</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">
<Project>{8035765F-D51F-4A0C-A746-2FD100E19419}</Project>
<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 @@ -60,7 +60,12 @@ namespace ICSharpCode.WpfDesign.Designer.Controls
DockPanel.SetDock(textBlock, Dock.Top);
toolTipDockPanel.Children.Add(textBlock);
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();
cc.Content = description;
toolTipDockPanel.Children.Add(cc);

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

@ -16,7 +16,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -16,7 +16,7 @@ namespace ICSharpCode.SharpDevelop.Commands
{
public override bool IsEnabled {
get {
IUndoHandler editable = WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler;
IUndoHandler editable = (WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler) ?? (WorkbenchSingleton.ActiveControl as IUndoHandler);
if (editable != null) {
return editable.EnableUndo;
} else {
@ -31,7 +31,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -31,7 +31,7 @@ namespace ICSharpCode.SharpDevelop.Commands
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) {
editable.Undo();
} else {
@ -47,7 +47,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -47,7 +47,7 @@ namespace ICSharpCode.SharpDevelop.Commands
{
public override bool IsEnabled {
get {
IUndoHandler editable = WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler;
IUndoHandler editable = (WorkbenchSingleton.Workbench.ActiveContent as IUndoHandler) ?? (WorkbenchSingleton.ActiveControl as IUndoHandler);
if (editable != null) {
return editable.EnableRedo;
}
@ -57,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -57,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.Commands
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) {
editable.Redo();
}
@ -77,7 +77,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -77,7 +77,7 @@ namespace ICSharpCode.SharpDevelop.Commands
ComboBox cb = ctl as ComboBox;
if (cb != null && cb.DropDownStyle != ComboBoxStyle.DropDownList)
return new ComboBoxWrapper(cb);
return null;
return ctl as 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 @@ -99,14 +99,14 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
"override " + GetName(method, ConversionFlags.ShowReturnType
| ConversionFlags.ShowParameterList
| ConversionFlags.ShowAccessibility)
+ "\n\n" + method.Documentation,
+ "\n\n" + CodeCompletionData.GetDocumentation(method.Documentation),
ClassBrowserIconService.GetIcon(method))
{
this.member = method;
}
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))
{
this.member = property;

Loading…
Cancel
Save