#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

588 lines
16 KiB

/*
* Created by SharpDevelop.
* User: itai
* Date: 20/10/2006
* Time: 20:08
*
* 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 System.IO;
using System.Xml;
using System.Xml.XPath;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.TextEditor;
using Aga.Controls.Tree;
using Aga.Controls.Tree.NodeControls;
namespace ClassDiagram
{
public partial class ClassEditor
{
VisibilityModifiersEditor visibilityModifierEditor = new VisibilityModifiersEditor();
ParameterModifiersEditor parameterModifierEditor = new ParameterModifiersEditor();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(ClassEditor));
Dictionary<Type, Node> addMemberItems = new Dictionary<Type, Node>();
Dictionary<IMethod, Node> addParameterItems = new Dictionary<IMethod, Node>();
Dictionary<ClassType, Action<IClass>> classTypeGroupCreators = new Dictionary<ClassType, Action<IClass>>();
IClass currClass;
public event EventHandler<IMemberEventArgs> MemberActivated = delegate {};
public event EventHandler<IParameterEventArgs> ParameterActivated = delegate {};
public event EventHandler<IMemberModificationEventArgs> MemberModified = delegate {};
public event EventHandler<IParameterModificationEventArgs> ParameterModified = delegate {};
public event EventHandler<IMemberEventArgs> ClassMemberAdded = delegate {};
TreeModel model = new TreeModel();
private class GroupNode : Node
{
public GroupNode(Type groupType, string title)
: base (title)
{
this.groupType = groupType;
}
Type groupType;
public Type GroupType {
get { return groupType; }
}
public string MemberName
{
get { return base.Text; }
}
}
private class MemberNode : Node
{
public MemberNode(IMember member, IAmbience ambience, ClassEditor editor)
{
this.member = member;
this.ambience = ambience;
this.editor = editor;
UpdateValues();
}
void UpdateValues()
{
IMethod methodMember = member as IMethod;
IEvent eventMember = member as IEvent;
IProperty propertyMember = member as IProperty;
IField fieldMember = member as IField;
int iconIndex = -1;
try
{
iconIndex = ClassBrowserIconService.GetIcon(member);
}
catch {}
if (iconIndex > -1)
icon = ClassBrowserIconService.ImageList.Images[iconIndex];
if (methodMember != null) memberName = ambience.Convert(methodMember);
if (eventMember != null) memberName = ambience.Convert(eventMember);
if (propertyMember != null) memberName = ambience.Convert(propertyMember);
if (fieldMember != null) memberName = ambience.Convert(fieldMember);
}
IAmbience ambience;
IMember member;
ClassEditor editor;
public IMember Member
{
get { return member; }
set { member = value; UpdateValues(); }
}
private string memberName;
public string MemberName
{
get { return memberName; }
set
{
IMemberModificationEventArgs mmea = new IMemberModificationEventArgs(member, Modification.Name, value);
editor.EmitMemberModified(mmea);
}
}
protected Image icon;
public Image MemberIcon
{
get { return icon; }
}
public string MemberType
{
get { return ambience.Convert(member.ReturnType); }
set
{
IMemberModificationEventArgs mmea = new IMemberModificationEventArgs(member, Modification.Type, value);
editor.EmitMemberModified(mmea);
}
}
public string MemberModifiers
{
get { return member.Modifiers.ToString(); }
set
{
IMemberModificationEventArgs mmea = new IMemberModificationEventArgs(member, Modification.Modifier, value);
editor.EmitMemberModified(mmea);
}
}
public string MemberSummary
{
get { return ClassEditor.GetSummary(member); }
set
{
IMemberModificationEventArgs mmea = new IMemberModificationEventArgs(member, Modification.Summary, value);
editor.EmitMemberModified(mmea);
}
}
}
private class ParameterNode : Node
{
public ParameterNode(IMethod method, IParameter parameter, IAmbience ambience, Image icon, ClassEditor editor)
{
this.ambience = ambience;
this.icon = icon;
this.parameter = parameter;
this.editor = editor;
this.method = method;
}
IAmbience ambience;
IParameter parameter;
IMethod method;
ClassEditor editor;
Image icon;
public IParameter Parameter {
get { return parameter; }
set { parameter = value; }
}
public IMethod Method {
get { return method; }
set { method = value; }
}
public string MemberName
{
get { return parameter.Name; }
set
{
IParameterModificationEventArgs pmea = new IParameterModificationEventArgs(method, parameter, Modification.Name, value);
editor.EmitParameterModified(pmea);
}
}
public Image MemberIcon
{
get { return icon; }
set { icon = value; }
}
public string MemberType
{
get { return ambience.Convert(parameter.ReturnType); }
set
{
IParameterModificationEventArgs pmea = new IParameterModificationEventArgs(method, parameter, Modification.Type, value);
editor.EmitParameterModified(pmea);
}
}
public string MemberModifiers
{
get { return parameter.Modifiers.ToString(); }
set
{
IParameterModificationEventArgs pmea = new IParameterModificationEventArgs(method, parameter, Modification.Modifier, value);
editor.EmitParameterModified(pmea);
}
}
public string MemberSummary
{
get { return ClassEditor.GetParameterSummary(method, parameter.Name); }
set
{
IParameterModificationEventArgs pmea = new IParameterModificationEventArgs(method, parameter, Modification.Summary, value);
editor.EmitParameterModified(pmea);
}
}
}
private class AddMemberNode : Node
{
public AddMemberNode (string str) : base (str) {}
public string MemberName {
get { return base.Text; }
}
}
private class AddParameterNode : Node
{
public AddParameterNode (Image icon) : base ("<Add Parameter>")
{
this.icon = icon;
}
Image icon;
public Image MemberIcon {
get { return icon; }
}
public string MemberName {
get { return base.Text; }
}
}
public ClassEditor()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
membersList.Model = model;
classTypeGroupCreators.Add(ClassType.Class, SetClassGroups);
classTypeGroupCreators.Add(ClassType.Interface, SetClassGroups);
classTypeGroupCreators.Add(ClassType.Struct, SetClassGroups);
classTypeGroupCreators.Add(ClassType.Enum, SetEnumGroups);
classTypeGroupCreators.Add(ClassType.Delegate, SetDelegateGroups);
//classTypeGroupCreators[ClassType.Module] = SetClassGroups; //???
}
private void InitTypeList()
{
_type.DropDownItems.Clear();
IProjectContent pc = ProjectService.CurrentProject.CreateProjectContent();
foreach (IClass c in pc.Classes)
_type.DropDownItems.Add(c.Name);
_type.DropDownItems.Sort();
}
private void HandleDoubleClick (object sender, EventArgs e)
{
}
internal void EmitMemberModified(IMemberModificationEventArgs e)
{
MemberModified(this, e);
}
internal void EmitParameterModified(IParameterModificationEventArgs e)
{
ParameterModified(this, e);
}
/*
private void AfterEdit (object sender, TreeListViewLabelEditEventArgs e)
{
IProjectContent pc = ProjectService.CurrentProject.CreateProjectContent();
IMember member = null;
if (addMemberItems.ContainsValue(editedItem))
{
Type parentGroupType = editedItem.Parent.Tag as Type;
if (parentGroupType == typeof(IMethod))
{
member = new DefaultMethod(currClass, e.Label);
member.ReturnType = pc.SystemTypes.Void;
}
else if (parentGroupType == typeof(IField))
{
member = new DefaultField(currClass, e.Label);
if (currClass.ClassType == ClassType.Enum)
member.ReturnType = pc.SystemTypes.Int32;
else
member.ReturnType = pc.SystemTypes.Object;
}
else if (parentGroupType == typeof(IProperty))
{
member = new DefaultProperty(currClass, e.Label);
member.ReturnType = pc.SystemTypes.Object;
}
else if (parentGroupType == typeof(IEvent))
{
member = new DefaultEvent(currClass, e.Label);
member.ReturnType = pc.SystemTypes.CreatePrimitive(typeof(EventHandler));
}
ConvertAddItemToMemberItem(editedItem, member, GetAmbience());
AddAddItem(parentGroupType, editedItem.Parent);
IReturnType memberType = VoidReturnType.Instance;
IMemberEventArgs memberargs = new IMemberEventArgs(member);
ClassMemberAdded(this, memberargs);
return;
}
}
*/
private void SetClassGroups (IClass classType)
{
AddGroup<IMethod>("Methods", classType.Methods);
AddGroup<IProperty>("Properties", classType.Properties);
AddGroup<IField>("Fields", classType.Fields);
AddGroup<IEvent>("Events", classType.Events);
}
private void SetEnumGroups (IClass classType)
{
AddGroup<IField>("Fields", classType.Fields);
}
private void SetDelegateGroups (IClass classType)
{
}
public void SetClass (IClass classType)
{
membersList.BeginUpdate();
model.Nodes.Clear();
currClass = classType;
if (classType != null)
classTypeGroupCreators[classType.ClassType](classType);
membersList.EndUpdate();
}
private Node AddGroup<MT>(string title, ICollection<MT> members) where MT : IMember
{
if (members == null) return null;
GroupNode group = new GroupNode(typeof(MT), title);
//TreeListViewItem group = new TreeListViewItem(title);
// group.ForeColor = Color.Gray;
// group.Font = new Font(group.Font, FontStyle.Bold);
// group.Items.Sortable = false;
// group.Tag = typeof(MT);
IAmbience ambience = GetAmbience();
if (members.Count != 0)
{
foreach (IMember member in members)
{
MemberNode memberItem = CreateMemberItem(member, ambience);
group.Nodes.Add(memberItem);
IMethod methodMember = memberItem.Member as IMethod;
if (methodMember != null)
FillParams (memberItem, methodMember);
}
}
AddAddItem(typeof(MT), group);
model.Nodes.Add(group);
return group;
}
private MemberNode CreateMemberItem(IMember member, IAmbience ambience)
{
MemberNode memberItem = new MemberNode(member, ambience, this);
return memberItem;
}
private void AddAddItem(Type memberType, GroupNode group)
{
string str = "";
if (memberType == typeof(IMethod)) str = "<Add Method>";
else if (memberType == typeof(IEvent)) str = "<Add Event>";
else if (memberType == typeof(IProperty)) str = "<Add Property>";
else if (memberType == typeof(IField)) str = "<Add Field>";
AddMemberNode addNewMember = new AddMemberNode(str); // TODO set color
//addNewMember.ForeColor = SystemColors.GrayText;
group.Nodes.Add(addNewMember);
addMemberItems[memberType] = addNewMember;
}
private void ConvertAddItemToMemberItem(Node addItem, IMember member, IAmbience ambience)
{
//addItem.
// addItem.ForeColor = SystemColors.ControlText;
// addItem.SubItems.Add(ambience.Convert(member.ReturnType));
// addItem.SubItems.Add(member.Modifiers.ToString());
// addItem.SubItems.Add(GetSummary(member));
}
private static string GetSummary (IEntity decoration)
{
if (decoration == null) return String.Empty;
return GetSummary(decoration.Documentation, @"/docroot/summary");
}
private static string GetParameterSummary (IEntity decoration, string parameterName)
{
if (decoration == null) return String.Empty;
return GetSummary(decoration.Documentation, @"/docroot/param[@name='"+parameterName+"']");
}
private static string GetSummary (string documentation, string xpath)
{
StringReader strReader = new StringReader("<docroot>" + documentation + "</docroot>");
XmlDocument doc = new XmlDocument();
doc.Load(strReader);
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator ni = nav.Select(xpath);
if (ni.MoveNext())
return ni.Current.InnerXml;
else
return String.Empty;
}
private void FillParams(MemberNode item, IMethod method)
{
Image comma = (Image)resources.GetObject("ClassEditor.Comma");
Image openBrace = (Image)resources.GetObject("ClassEditor.OpenBrace");
Image closeBrace = (Image)resources.GetObject("ClassEditor.CloseBrace");
Image emptyBraces = (Image)resources.GetObject("ClassEditor.EmptyBraces");
Image currentImage = openBrace;
foreach (IParameter param in method.Parameters)
{
ParameterNode parameter = new ParameterNode(method, param, GetAmbience(), currentImage, this);
currentImage = comma;
item.Nodes.Add(parameter);
}
if (currentImage == openBrace)
currentImage = emptyBraces;
else
currentImage = closeBrace;
AddParameterNode addParam = new AddParameterNode(currentImage);
item.Nodes.Add(addParam);
addParameterItems[method] = addParam;
}
protected IAmbience GetAmbience()
{
IAmbience ambience = null;
try
{
ambience = AmbienceService.CurrentAmbience;
}
catch (NullReferenceException)
{
ambience = ICSharpCode.SharpDevelop.Dom.CSharp.CSharpAmbience.Instance;
}
ambience.ConversionFlags = ConversionFlags.None;
return ambience;
}
private static TextEditorControl GetTextEditorControl()
{
ITextEditorControlProvider textEditorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorControlProvider;
if (textEditorProvider != null)
return textEditorProvider.TextEditorControl;
else
return null;
}
void _modifiersEditorShowing(object sender, CancelEventArgs e)
{
MemberNode memberItem = membersList.SelectedNode.Tag as MemberNode;
ParameterNode parameterItem = membersList.SelectedNode.Tag as ParameterNode;
if (memberItem != null)
{
_modifiers.DropDownItems.Clear();
_modifiers.DropDownItems.Add(ICSharpCode.NRefactory.Ast.Modifiers.Public);
_modifiers.DropDownItems.Add(ICSharpCode.NRefactory.Ast.Modifiers.Private);
_modifiers.DropDownItems.Add(ICSharpCode.NRefactory.Ast.Modifiers.Protected);
_modifiers.DropDownItems.Add(ICSharpCode.NRefactory.Ast.Modifiers.Internal);
}
else if (parameterItem != null)
{
_modifiers.DropDownItems.Clear();
_modifiers.DropDownItems.Add(ParameterModifiers.In);
_modifiers.DropDownItems.Add(ParameterModifiers.Out);
_modifiers.DropDownItems.Add(ParameterModifiers.Ref);
_modifiers.DropDownItems.Add(ParameterModifiers.Params);
_modifiers.DropDownItems.Add(ParameterModifiers.Optional);
}
else
e.Cancel = true;
}
void MembersListNodeMouseDoubleClick(object sender, TreeNodeAdvMouseEventArgs e)
{
Node item = e.Node.Tag as Node;
if (item == null) return;
MemberNode memberItem = item as MemberNode;
ParameterNode paramItem = item as ParameterNode;
AddMemberNode addMemberItem = item as AddMemberNode;
AddParameterNode addParamItem = item as AddParameterNode;
if (addMemberItem != null)// && addMemberItems.ContainsValue(memberItem))
{
/* IAmbience ambience = GetAmbience();
item.SubItems.Add(ambience.Convert(VoidReturnType.Instance));
item.SubItems.Add(ModifierEnum.Public.ToString());
item.SubItems.Add("");
item.Text = "[method name]";
item.BeginEdit(0);*/
}
else if (addParamItem != null) //addParameterItems.ContainsValue(item))
{
}
else if (memberItem != null)
{
MemberActivated(this, new IMemberEventArgs(memberItem.Member));
}
else if (paramItem != null)
{
if (paramItem.Parameter != null && paramItem.Method != null)
ParameterActivated(this, new IParameterEventArgs(paramItem.Method, paramItem.Parameter));
}
}
void _nameDrawText(object sender, DrawEventArgs e)
{
if ((e.Node.Tag is GroupNode || e.Node.Tag is AddParameterNode || e.Node.Tag is AddMemberNode) && e.Node.IsSelected == false)
e.TextColor = Color.Gray;
}
}
public enum Modification { None, Name, Type, Modifier, Summary }
}