Browse Source

Added initial editing (refactoring) support to the class editor.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2267 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Itar Bar-Haim 19 years ago
parent
commit
e5631e90ae
  1. 1
      src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/ClassCanvas.csproj
  2. 73
      src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/Src/ClassEditorPad.cs
  3. 271
      src/AddIns/DisplayBindings/ClassDiagram/ClassEditor/ClassEditor.cs
  4. 5
      src/AddIns/DisplayBindings/ClassDiagram/ClassEditor/ClassEditor.csproj
  5. 57
      src/AddIns/DisplayBindings/ClassDiagram/ClassEditor/MembersList.cs

1
src/AddIns/DisplayBindings/ClassDiagram/ClassCanvas/ClassCanvas.csproj

@ -80,6 +80,7 @@
<Compile Include="Decorators\SizeGripDecorator.cs" /> <Compile Include="Decorators\SizeGripDecorator.cs" />
<Content Include="ClassCanvas.cd" /> <Content Include="ClassCanvas.cd" />
<Content Include="ClassCanvas.cd" /> <Content Include="ClassCanvas.cd" />
<None Include="ClassDiagramAddin.sln" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Shapes" /> <Folder Include="Shapes" />

73
src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/Src/ClassEditorPad.cs

@ -9,10 +9,12 @@
using System; using System;
using System.Windows.Forms; using System.Windows.Forms;
using System.Collections.Generic;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Refactoring;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.TextEditor; using ICSharpCode.TextEditor;
@ -34,6 +36,9 @@ namespace ClassDiagramAddin
public ClassEditorPad() public ClassEditorPad()
{ {
editor.MemberActivated += EditorMemberActivated; editor.MemberActivated += EditorMemberActivated;
editor.MemberModified += EditorMemberModified;
editor.ParameterActivated += EditorParameterActivated;
editor.ParameterModified += EditorParameterModified;
} }
private void EditorMemberActivated (object sender, IMemberEventArgs e) private void EditorMemberActivated (object sender, IMemberEventArgs e)
@ -42,7 +47,73 @@ namespace ClassDiagramAddin
FileService.JumpToFilePosition(compUnit.FileName, FileService.JumpToFilePosition(compUnit.FileName,
e.Member.Region.BeginLine - 1, e.Member.Region.BeginLine - 1,
e.Member.Region.BeginColumn - 1); e.Member.Region.BeginColumn - 1);
}
private void EditorParameterActivated (object sender, IParameterEventArgs e)
{
ICompilationUnit compUnit = e.Method.DeclaringType.CompilationUnit;
FileService.JumpToFilePosition(compUnit.FileName,
e.Parameter.Region.BeginLine - 1,
e.Parameter.Region.BeginColumn - 1);
}
private void EditorMemberModified (object sender, IMemberModificationEventArgs e)
{
switch (e.Modification)
{
case Modification.Name:
DialogResult dr = MessageBox.Show("Rename all occurances?", "Rename Member", MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Cancel) e.Cancel = true;
else if (dr == DialogResult.Yes)
{
FindReferencesAndRenameHelper.RenameMember(e.Member, e.NewValue);
}
else
{
// TODO - place local renameing code here.
}
break;
case Modification.Type:
// TODO - place type replacment code here.
break;
case Modification.Modifier:
// TODO - place visibility replacment code here.
break;
case Modification.Summary:
// TODO - place summary replacment code here.
break;
}
}
private void EditorParameterModified (object sender, IParameterModificationEventArgs e)
{
switch (e.Modification)
{
case Modification.Name:
DialogResult dr = MessageBox.Show("Rename all occurances?", "Rename Parameter", MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Cancel) e.Cancel = true;
else if (dr == DialogResult.Yes)
{
ResolveResult local = new LocalResolveResult(e.Method, new DefaultField.ParameterField(e.Parameter.ReturnType, e.Parameter.Name, e.Parameter.Region, e.Method.DeclaringType));
List<Reference> list = RefactoringService.FindReferences(local, null);
if (list == null) return;
FindReferencesAndRenameHelper.RenameReferences(list, e.NewValue);
}
else
{
// TODO - place local renameing code here.
}
break;
case Modification.Type:
// TODO - place type replacment code here.
break;
case Modification.Modifier:
// TODO - place visibility replacment code here.
break;
case Modification.Summary:
// TODO - place summary replacment code here.
break;
}
} }
/// <summary> /// <summary>

271
src/AddIns/DisplayBindings/ClassDiagram/ClassEditor/ClassEditor.cs

@ -31,6 +31,10 @@ namespace ClassDiagram
public partial class ClassEditor public partial class ClassEditor
{ {
TreeListView membersList = new TreeListView(); TreeListView membersList = new TreeListView();
VisibilityModifiersEditor visibilityModifierEditor = new VisibilityModifiersEditor();
ParameterModifiersEditor parameterModifierEditor = new ParameterModifiersEditor();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(ClassEditor)); System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(ClassEditor));
Dictionary<Type, TreeListViewItem> addMemberItems = new Dictionary<Type, TreeListViewItem>(); Dictionary<Type, TreeListViewItem> addMemberItems = new Dictionary<Type, TreeListViewItem>();
@ -40,6 +44,17 @@ namespace ClassDiagram
IClass currClass; IClass currClass;
public event EventHandler<IMemberEventArgs> MemberActivated = delegate {}; public event EventHandler<IMemberEventArgs> MemberActivated = delegate {};
public event EventHandler<IParameterEventArgs> ParameterActivated = delegate {};
public event EventHandler<IMemberModificationEventArgs> MemberModified = delegate {};
public event EventHandler<IParameterModificationEventArgs> ParameterModified = delegate {};
TreeListViewItem editedItem = null;
ColumnHeader nameCol;
ColumnHeader typeCol;
ColumnHeader modifierCol;
ColumnHeader summaryCol;
public ClassEditor() public ClassEditor()
{ {
@ -48,10 +63,10 @@ namespace ClassDiagram
// //
InitializeComponent(); InitializeComponent();
ColumnHeader nameCol = membersList.Columns.Add("Name"); nameCol = membersList.Columns.Add("Name");
ColumnHeader typeCol = membersList.Columns.Add("Type"); typeCol = membersList.Columns.Add("Type");
ColumnHeader modifierCol = membersList.Columns.Add("Modifier"); modifierCol = membersList.Columns.Add("Modifier");
ColumnHeader summaryCol = membersList.Columns.Add("Summary"); summaryCol = membersList.Columns.Add("Summary");
nameCol.Width = 160; nameCol.Width = 160;
typeCol.Width = 100; typeCol.Width = 100;
@ -73,6 +88,7 @@ namespace ClassDiagram
membersList.SmallImageList.Images.Add("CloseBrace", (Bitmap)resources.GetObject("closebrace")); membersList.SmallImageList.Images.Add("CloseBrace", (Bitmap)resources.GetObject("closebrace"));
membersList.SmallImageList.Images.Add("EmptyBraces", (Bitmap)resources.GetObject("emptybraces")); membersList.SmallImageList.Images.Add("EmptyBraces", (Bitmap)resources.GetObject("emptybraces"));
membersList.LabelEdit = true;
membersList.Sorting = SortOrder.None; membersList.Sorting = SortOrder.None;
membersList.ShowPlusMinus = true; membersList.ShowPlusMinus = true;
membersList.FullRowSelect = true; membersList.FullRowSelect = true;
@ -81,6 +97,8 @@ namespace ClassDiagram
membersList.HeaderStyle = ColumnHeaderStyle.Nonclickable; membersList.HeaderStyle = ColumnHeaderStyle.Nonclickable;
membersList.DoubleClick += HandleDoubleClick; membersList.DoubleClick += HandleDoubleClick;
membersList.BeforeLabelEdit += BeforeEdit;
membersList.AfterLabelEdit += AfterEdit;
Controls.Add(membersList); Controls.Add(membersList);
membersList.Dock = DockStyle.Fill; membersList.Dock = DockStyle.Fill;
@ -108,8 +126,134 @@ namespace ClassDiagram
else else
{ {
IMember itemMember = membersList.SelectedItems[0].Tag as IMember; IMember itemMember = membersList.SelectedItems[0].Tag as IMember;
IParameter itemParameter = membersList.SelectedItems[0].Tag as IParameter;
if (itemMember != null) if (itemMember != null)
{
MemberActivated(this, new IMemberEventArgs(itemMember)); MemberActivated(this, new IMemberEventArgs(itemMember));
}
else if (itemParameter != null)
{
IMethod method = membersList.SelectedItems[0].Parent.Tag as IMethod;
if (method != null)
ParameterActivated(this, new IParameterEventArgs(method, itemParameter));
}
}
}
private void BeforeEdit(object sender, TreeListViewBeforeLabelEditEventArgs e)
{
editedItem = membersList.SelectedItems[0];
if (addMemberItems.ContainsValue(editedItem))
{
e.Cancel = true;
}
else if (addParameterItems.ContainsValue(editedItem))
{
e.Cancel = true;
}
else
{
IMember itemMember = editedItem.Tag as IMember;
IParameter itemParameter = editedItem.Tag as IParameter;
if (itemMember != null)
{
if (e.ColumnIndex == nameCol.Index)
{
}
else if (e.ColumnIndex == typeCol.Index)
{
}
else if (e.ColumnIndex == modifierCol.Index)
{
e.Editor = visibilityModifierEditor;
}
else if (e.ColumnIndex == summaryCol.Index)
{
}
else
{
e.Cancel = true;
}
}
else if (itemParameter != null)
{
if (e.ColumnIndex == nameCol.Index)
{
}
else if (e.ColumnIndex == typeCol.Index)
{
}
else if (e.ColumnIndex == modifierCol.Index)
{
e.Editor = parameterModifierEditor;
}
else if (e.ColumnIndex == summaryCol.Index)
{
}
else
{
e.Cancel = true;
}
}
else
{
e.Cancel = true;
}
}
}
private void AfterEdit (object sender, TreeListViewLabelEditEventArgs e)
{
Modification modification = Modification.None;
if (e.ColumnIndex == nameCol.Index)
{
modification = Modification.Name;
}
else if (e.ColumnIndex == typeCol.Index)
{
modification = Modification.Type;
}
else if (e.ColumnIndex == modifierCol.Index)
{
modification = Modification.Modifier;
}
else if (e.ColumnIndex == summaryCol.Index)
{
modification = Modification.Summary;
}
else
{
e.Cancel = true;
}
if (!e.Cancel)
{
IMember member = editedItem.Tag as IMember;
IParameter parameter = editedItem.Tag as IParameter;
if (member != null)
{
IMemberModificationEventArgs mmea = new IMemberModificationEventArgs(member, modification, e.Label);
MemberModified(this, mmea);
e.Cancel = mmea.Cancel;
}
else if (parameter != null)
{
IMethod method = editedItem.Parent.Tag as IMethod;
if (method == null)
{
e.Cancel = true;
}
else
{
IParameterModificationEventArgs pmea = new IParameterModificationEventArgs(method, parameter, modification, e.Label);
ParameterModified(this, pmea);
e.Cancel = pmea.Cancel;
}
}
else
{
e.Cancel = true;
}
} }
} }
@ -243,7 +387,10 @@ namespace ClassDiagram
TreeListViewItem parameter = new TreeListViewItem(param.Name); TreeListViewItem parameter = new TreeListViewItem(param.Name);
parameter.ImageKey = imageKey; parameter.ImageKey = imageKey;
parameter.SubItems.Add (param.ReturnType.Name); parameter.SubItems.Add (param.ReturnType.Name);
parameter.SubItems.Add (param.Modifiers.ToString());
parameter.SubItems.Add (param.Documentation);
item.Items.Add(parameter); item.Items.Add(parameter);
parameter.Tag = param;
imageKey = "Comma"; imageKey = "Comma";
} }
TreeListViewItem addParam = new TreeListViewItem("<add parameter>"); TreeListViewItem addParam = new TreeListViewItem("<add parameter>");
@ -285,12 +432,11 @@ namespace ClassDiagram
return control1; return control1;
} }
} }
public class IMemberEventArgs : EventArgs public class IMemberEventArgs : EventArgs
{ {
IMember member; IMember member;
public IMemberEventArgs (IMember member)
public IMemberEventArgs(IMember member)
{ {
this.member = member; this.member = member;
} }
@ -300,4 +446,115 @@ namespace ClassDiagram
get { return member; } get { return member; }
} }
} }
public class IParameterEventArgs : EventArgs
{
IParameter parameter;
IMethod method;
public IParameterEventArgs (IMethod method, IParameter parameter)
{
this.method = method;
this.parameter = parameter;
}
public IParameter Parameter
{
get { return parameter; }
}
public IMethod Method
{
get { return method; }
}
}
public enum Modification { None, Name, Type, Modifier, Summary }
public class IMemberModificationEventArgs : IMemberEventArgs
{
Modification modification;
string newValue;
bool cancel = false;
public IMemberModificationEventArgs(IMember member, Modification modification, string newValue)
: base (member)
{
this.modification = modification;
this.newValue = newValue;
}
public Modification Modification
{
get { return modification; }
}
public string NewValue
{
get { return newValue; }
}
public bool Cancel
{
get { return cancel; }
set { cancel = value; }
}
}
public class IParameterModificationEventArgs : IParameterEventArgs
{
Modification modification;
string newValue;
bool cancel = false;
public IParameterModificationEventArgs(IMethod method, IParameter parameter, Modification modification, string newValue)
: base (method, parameter)
{
this.modification = modification;
this.newValue = newValue;
}
public Modification Modification
{
get { return modification; }
}
public string NewValue
{
get { return newValue; }
}
public bool Cancel
{
get { return cancel; }
set { cancel = value; }
}
}
internal class VisibilityModifiersEditor : ComboBox
{
public VisibilityModifiersEditor()
{
this.DropDownStyle = ComboBoxStyle.DropDownList;
Items.Add(ICSharpCode.NRefactory.Ast.Modifiers.Public);
Items.Add(ICSharpCode.NRefactory.Ast.Modifiers.Private);
Items.Add(ICSharpCode.NRefactory.Ast.Modifiers.Protected);
Items.Add(ICSharpCode.NRefactory.Ast.Modifiers.Internal);
}
}
internal class ParameterModifiersEditor : ComboBox
{
public ParameterModifiersEditor()
{
this.DropDownStyle = ComboBoxStyle.DropDownList;
Items.Add(ParameterModifiers.In);
Items.Add(ParameterModifiers.Out);
Items.Add(ParameterModifiers.Ref);
Items.Add(ParameterModifiers.Params);
Items.Add(ParameterModifiers.Optional);
}
}
} }

5
src/AddIns/DisplayBindings/ClassDiagram/ClassEditor/ClassEditor.csproj

@ -42,7 +42,6 @@
<EmbeddedResource Include="ClassEditor.resx"> <EmbeddedResource Include="ClassEditor.resx">
<DependentUpon>ClassEditor.cs</DependentUpon> <DependentUpon>ClassEditor.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<Compile Include="MembersList.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj"> <ProjectReference Include="..\..\..\..\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj">
@ -50,6 +49,10 @@
<Name>ICSharpCode.TextEditor</Name> <Name>ICSharpCode.TextEditor</Name>
<Private>False</Private> <Private>False</Private>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\Project\NRefactory.csproj">
<Project>{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}</Project>
<Name>NRefactory</Name>
</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>

57
src/AddIns/DisplayBindings/ClassDiagram/ClassEditor/MembersList.cs

@ -1,57 +0,0 @@
/*
* Created by SharpDevelop.
* User: itai
* Date: 20/10/2006
* Time: 20:41
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop;
namespace ClassDiagram
{
/// <summary>
/// Description of MembersList.
/// </summary>
public class MembersList<MT> where MT : IMember
{
TreeListViewItem titleItem;
TreeListViewItem addNewMember;
TreeListView treeListView;
public MembersList(string title, ICollection<MT> members, TreeListView tlv)
{
treeListView = tlv;
titleItem = tlv.Items.Add(title);
//tlv.SmallImageList = ClassBrowserIconService.ImageList;
if (members != null && members.Count != 0)
{
foreach (IMember member in members)
{
int icon = ClassBrowserIconService.GetIcon(member);
TreeListViewItem methodItem = titleItem.Items.Add(member.Name, icon);
}
}
addNewMember = titleItem.Items.Add("[Add]");
}
private void ItemActivated (object sender, EventArgs e)
{
}
}
}
Loading…
Cancel
Save