/* * 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 addMemberItems = new Dictionary(); Dictionary addParameterItems = new Dictionary(); Dictionary> classTypeGroupCreators = new Dictionary>(); IClass currClass; public event EventHandler MemberActivated = delegate {}; public event EventHandler ParameterActivated = delegate {}; public event EventHandler MemberModified = delegate {}; public event EventHandler ParameterModified = delegate {}; public event EventHandler 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 ("") { 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("Methods", classType.Methods); AddGroup("Properties", classType.Properties); AddGroup("Fields", classType.Fields); AddGroup("Events", classType.Events); } private void SetEnumGroups (IClass classType) { AddGroup("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(string title, ICollection 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 = ""; else if (memberType == typeof(IEvent)) str = ""; else if (memberType == typeof(IProperty)) str = ""; else if (memberType == typeof(IField)) str = ""; 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("" + documentation + ""); 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 } }