Skip to content

Commit bb20c7f

Browse files
committed
extracted classes, added icon tooltips
1 parent 4fb4988 commit bb20c7f

File tree

5 files changed

+205
-110
lines changed

5 files changed

+205
-110
lines changed

Rubberduck.Core/UI/CodeExplorer/CodeExplorerControl.xaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
<converters:AnnotationToCodeStringConverter x:Key="AnnotationToCodeString" />
5959
<converters:AnnotateDeclarationCommandParameterToTupleConverter x:Key="AnnotateDeclarationCommandParameterToTuple" />
6060
<converters:AnnotateDeclarationCommandCEVisibilityConverter x:Key="AnnotateDeclarationCommandVisibility" />
61+
<converters:DeclarationToDeclarationTypeStringConverter x:Key="DeclarationTypeNameConverter" />
6162

6263
<CompositeCollection x:Key="AddModuleCommands" x:Shared="False">
6364
<MenuItem Header="{Resx ResxName=Rubberduck.Resources.CodeExplorer.CodeExplorerUI, Key=CodeExplorer_AddExistingFileText}"
@@ -604,7 +605,8 @@
604605
</HierarchicalDataTemplate.Resources>
605606
<StackPanel Orientation="Horizontal">
606607
<Grid>
607-
<Image Style="{StaticResource ToolbarIconStyle}">
608+
<Image Style="{StaticResource ToolbarIconStyle}"
609+
ToolTip="{Binding Converter={StaticResource DeclarationTypeNameConverter}}">
608610
<Image.Source>
609611
<MultiBinding Converter="{StaticResource NodeToIcon}">
610612
<MultiBinding.Bindings>
@@ -616,7 +618,8 @@
616618
</MultiBinding>
617619
</Image.Source>
618620
</Image>
619-
<Image Source="{Binding Declaration, Converter={StaticResource AccessibilityToIcon}}" Style="{StaticResource ToolbarIconStyle}" />
621+
<Image Source="{Binding Declaration, Converter={StaticResource AccessibilityToIcon}}" Style="{StaticResource ToolbarIconStyle}"
622+
ToolTip="{Binding Converter={StaticResource DeclarationTypeNameConverter}}"/>
620623
</Grid>
621624
<TextBlock Style="{StaticResource TreeViewItemStyleModified}" />
622625
</StackPanel>

Rubberduck.Core/UI/Converters/CodeExplorerNodeToIconConverter.cs

Lines changed: 0 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,12 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Globalization;
4-
using System.Linq;
53
using System.Windows.Data;
64
using System.Windows.Media;
75
using Rubberduck.Navigation.CodeExplorer;
8-
using Rubberduck.Parsing.Annotations.Concrete;
9-
using Rubberduck.Parsing.Symbols;
106
using Rubberduck.Resources.CodeExplorer;
117

128
namespace Rubberduck.UI.Converters
139
{
14-
public class DeclarationToIconConverter : ImageSourceConverter
15-
{
16-
private static readonly ImageSource NullIcon = ToImageSource(CodeExplorerUI.status_offline);
17-
private static readonly ImageSource ExceptionIcon = ToImageSource(CodeExplorerUI.exclamation);
18-
private static readonly ImageSource InterfaceIcon = ToImageSource(CodeExplorerUI.ObjectInterface);
19-
private static readonly ImageSource PredeclaredIcon = ToImageSource(CodeExplorerUI.ObjectClassPredeclared);
20-
private static readonly ImageSource TestMethodIcon = ToImageSource(CodeExplorerUI.ObjectTestMethod);
21-
22-
protected ImageSource NullIconSource => NullIcon;
23-
protected ImageSource ExceptionIconSource => ExceptionIcon;
24-
25-
private static readonly IDictionary<DeclarationType, ImageSource> DeclarationIcons = new Dictionary<DeclarationType, ImageSource>
26-
{
27-
// Components
28-
{ DeclarationType.ClassModule, ToImageSource(CodeExplorerUI.ObjectClass) },
29-
{ DeclarationType.ProceduralModule, ToImageSource(CodeExplorerUI.ObjectModule) },
30-
{ DeclarationType.UserForm, ToImageSource(CodeExplorerUI.ProjectForm) },
31-
{ DeclarationType.Document, ToImageSource(CodeExplorerUI.document_office) },
32-
{ DeclarationType.VbForm, ToImageSource(CodeExplorerUI.ProjectForm)},
33-
{ DeclarationType.MdiForm, ToImageSource(CodeExplorerUI.MdiForm)},
34-
{ DeclarationType.UserControl, ToImageSource(CodeExplorerUI.ui_scroll_pane_form)},
35-
{ DeclarationType.DocObject, ToImageSource(CodeExplorerUI.document_globe)},
36-
{ DeclarationType.PropPage, ToImageSource(CodeExplorerUI.ui_tab_content)},
37-
{ DeclarationType.ActiveXDesigner, ToImageSource(CodeExplorerUI.pencil_ruler)},
38-
{ DeclarationType.ResFile, ToImageSource(CodeExplorerUI.document_block)},
39-
{ DeclarationType.RelatedDocument, ToImageSource(CodeExplorerUI.document_import)},
40-
// Members
41-
{ DeclarationType.Constant, ToImageSource(CodeExplorerUI.ObjectConstant)},
42-
{ DeclarationType.Enumeration, ToImageSource(CodeExplorerUI.ObjectEnum)},
43-
{ DeclarationType.EnumerationMember, ToImageSource(CodeExplorerUI.ObjectEnumItem)},
44-
{ DeclarationType.Event, ToImageSource(CodeExplorerUI.ObjectEvent)},
45-
{ DeclarationType.Function, ToImageSource(CodeExplorerUI.ObjectMethod)},
46-
{ DeclarationType.LibraryFunction, ToImageSource(CodeExplorerUI.ObjectLibraryFunction)},
47-
{ DeclarationType.LibraryProcedure, ToImageSource(CodeExplorerUI.ObjectLibraryFunction)},
48-
{ DeclarationType.Procedure, ToImageSource(CodeExplorerUI.ObjectMethod)},
49-
{ DeclarationType.PropertyGet, ToImageSource(CodeExplorerUI.ObjectPropertyGet)},
50-
{ DeclarationType.PropertyLet, ToImageSource(CodeExplorerUI.ObjectPropertyLet)},
51-
{ DeclarationType.PropertySet, ToImageSource(CodeExplorerUI.ObjectPropertySet)},
52-
{ DeclarationType.UserDefinedType, ToImageSource(CodeExplorerUI.ObjectValueType)},
53-
{ DeclarationType.UserDefinedTypeMember, ToImageSource(CodeExplorerUI.ObjectField)},
54-
{ DeclarationType.Variable, ToImageSource(CodeExplorerUI.ObjectField)},
55-
{ DeclarationType.Parameter, ToImageSource(CodeExplorerUI.ObjectField)},
56-
};
57-
58-
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
59-
{
60-
if (value == null)
61-
{
62-
return NullIcon;
63-
}
64-
65-
if (value is Declaration declaration)
66-
{
67-
if (declaration is ClassModuleDeclaration classModule)
68-
{
69-
if (classModule.QualifiedModuleName.ComponentType ==
70-
VBEditor.SafeComWrappers.ComponentType.Document)
71-
{
72-
return DeclarationIcons[DeclarationType.Document];
73-
}
74-
75-
if (classModule.QualifiedModuleName.ComponentType == VBEditor.SafeComWrappers.ComponentType.UserForm)
76-
{
77-
// a form has a predeclared ID, but we want it to have a UserForm icon:
78-
return DeclarationIcons[DeclarationType.UserForm];
79-
}
80-
81-
if (classModule.IsInterface || classModule.Annotations.Any(annotation => annotation.Annotation is InterfaceAnnotation))
82-
{
83-
return InterfaceIcon;
84-
}
85-
86-
if (classModule.HasPredeclaredId)
87-
{
88-
return PredeclaredIcon;
89-
}
90-
91-
return DeclarationIcons.ContainsKey(classModule.DeclarationType)
92-
? DeclarationIcons[classModule.DeclarationType]
93-
: NullIcon;
94-
}
95-
96-
if (DeclarationIcons.ContainsKey(declaration.DeclarationType))
97-
{
98-
if (declaration.Annotations.Any(a => a.Annotation is TestMethodAnnotation))
99-
{
100-
return TestMethodIcon;
101-
}
102-
103-
return DeclarationIcons[declaration.DeclarationType];
104-
}
105-
return NullIcon;
106-
}
107-
108-
return null;
109-
}
110-
}
111-
11210
public class CodeExplorerNodeToIconConverter : DeclarationToIconConverter, IMultiValueConverter
11311
{
11412
private static readonly ImageSource ProjectIcon = ToImageSource(CodeExplorerUI.ObjectLibrary);
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Linq;
4+
using System.Windows.Data;
5+
using Rubberduck.Navigation.CodeExplorer;
6+
using Rubberduck.Parsing.Annotations.Concrete;
7+
using Rubberduck.Parsing.Symbols;
8+
using Rubberduck.Resources;
9+
using Rubberduck.Resources.UnitTesting;
10+
11+
namespace Rubberduck.UI.Converters
12+
{
13+
public class DeclarationToDeclarationTypeStringConverter : IValueConverter
14+
{
15+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
16+
{
17+
var declaration = value as Declaration ?? (value as ICodeExplorerNode)?.Declaration;
18+
if (declaration == null)
19+
{
20+
return null;
21+
}
22+
23+
if (value is CodeExplorerCustomFolderViewModel folder)
24+
{
25+
return folder.Description;
26+
}
27+
28+
if (declaration is ClassModuleDeclaration classModule)
29+
{
30+
var supertype = classModule.SupertypeNames.FirstOrDefault();
31+
if (classModule.QualifiedModuleName.ComponentType ==
32+
VBEditor.SafeComWrappers.ComponentType.Document)
33+
{
34+
return $"{RubberduckUI.ResourceManager.GetString($"DeclarationType_{nameof(DeclarationType.Document)}", CultureInfo.CurrentUICulture)} ({classModule.IdentifierName}:{supertype})";
35+
}
36+
37+
if (classModule.QualifiedModuleName.ComponentType == VBEditor.SafeComWrappers.ComponentType.UserForm)
38+
{
39+
// a form has a predeclared ID, but we want it to have a UserForm icon:
40+
return $"{RubberduckUI.ResourceManager.GetString($"DeclarationType_{nameof(DeclarationType.UserForm)}", CultureInfo.CurrentUICulture)} ({classModule.IdentifierName}:{supertype})";
41+
}
42+
43+
if (classModule.IsInterface || classModule.Annotations.Any(annotation => annotation.Annotation is InterfaceAnnotation))
44+
{
45+
return $"{RubberduckUI.ResourceManager.GetString($"DeclarationType_{nameof(DeclarationType.ClassModule)}", CultureInfo.CurrentUICulture)} (interface)";
46+
}
47+
48+
if (classModule.HasPredeclaredId)
49+
{
50+
return $"{RubberduckUI.ResourceManager.GetString($"DeclarationType_{nameof(DeclarationType.ClassModule)}", CultureInfo.CurrentUICulture)} (predeclared)";
51+
}
52+
53+
return $"{RubberduckUI.ResourceManager.GetString($"DeclarationType_{nameof(DeclarationType.ClassModule)}", CultureInfo.CurrentUICulture)}";
54+
}
55+
56+
if (declaration.DeclarationType.HasFlag(DeclarationType.ProceduralModule) && declaration.Annotations.Any(a => a.Annotation is TestModuleAnnotation))
57+
{
58+
return TestExplorer.TestExplorer_AddTestModule;
59+
}
60+
61+
if (declaration.DeclarationType.HasFlag(DeclarationType.Member) && declaration.Annotations.Any(a => a.Annotation is TestMethodAnnotation))
62+
{
63+
return TestExplorer.TestExplorer_AddTestMethod;
64+
}
65+
66+
return $"{RubberduckUI.ResourceManager.GetString($"DeclarationType_{declaration.DeclarationType}", CultureInfo.CurrentUICulture)}";
67+
}
68+
69+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
70+
{
71+
throw new NotImplementedException();
72+
}
73+
}
74+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Globalization;
4+
using System.Linq;
5+
using System.Windows.Media;
6+
using Rubberduck.Parsing.Annotations.Concrete;
7+
using Rubberduck.Parsing.Symbols;
8+
using Rubberduck.Resources.CodeExplorer;
9+
10+
namespace Rubberduck.UI.Converters
11+
{
12+
public class DeclarationToIconConverter : ImageSourceConverter
13+
{
14+
private static readonly ImageSource NullIcon = ToImageSource(CodeExplorerUI.status_offline);
15+
private static readonly ImageSource ExceptionIcon = ToImageSource(CodeExplorerUI.exclamation);
16+
private static readonly ImageSource InterfaceIcon = ToImageSource(CodeExplorerUI.ObjectInterface);
17+
private static readonly ImageSource PredeclaredIcon = ToImageSource(CodeExplorerUI.ObjectClassPredeclared);
18+
private static readonly ImageSource TestMethodIcon = ToImageSource(CodeExplorerUI.ObjectTestMethod);
19+
20+
protected ImageSource NullIconSource => NullIcon;
21+
protected ImageSource ExceptionIconSource => ExceptionIcon;
22+
23+
private static readonly IDictionary<DeclarationType, ImageSource> DeclarationIcons = new Dictionary<DeclarationType, ImageSource>
24+
{
25+
// Components
26+
{ DeclarationType.ClassModule, ToImageSource(CodeExplorerUI.ObjectClass) },
27+
{ DeclarationType.ProceduralModule, ToImageSource(CodeExplorerUI.ObjectModule) },
28+
{ DeclarationType.UserForm, ToImageSource(CodeExplorerUI.ProjectForm) },
29+
{ DeclarationType.Document, ToImageSource(CodeExplorerUI.document_office) },
30+
{ DeclarationType.VbForm, ToImageSource(CodeExplorerUI.ProjectForm)},
31+
{ DeclarationType.MdiForm, ToImageSource(CodeExplorerUI.MdiForm)},
32+
{ DeclarationType.UserControl, ToImageSource(CodeExplorerUI.ui_scroll_pane_form)},
33+
{ DeclarationType.DocObject, ToImageSource(CodeExplorerUI.document_globe)},
34+
{ DeclarationType.PropPage, ToImageSource(CodeExplorerUI.ui_tab_content)},
35+
{ DeclarationType.ActiveXDesigner, ToImageSource(CodeExplorerUI.pencil_ruler)},
36+
{ DeclarationType.ResFile, ToImageSource(CodeExplorerUI.document_block)},
37+
{ DeclarationType.RelatedDocument, ToImageSource(CodeExplorerUI.document_import)},
38+
// Members
39+
{ DeclarationType.Constant, ToImageSource(CodeExplorerUI.ObjectConstant)},
40+
{ DeclarationType.Enumeration, ToImageSource(CodeExplorerUI.ObjectEnum)},
41+
{ DeclarationType.EnumerationMember, ToImageSource(CodeExplorerUI.ObjectEnumItem)},
42+
{ DeclarationType.Event, ToImageSource(CodeExplorerUI.ObjectEvent)},
43+
{ DeclarationType.Function, ToImageSource(CodeExplorerUI.ObjectMethod)},
44+
{ DeclarationType.LibraryFunction, ToImageSource(CodeExplorerUI.ObjectLibraryFunction)},
45+
{ DeclarationType.LibraryProcedure, ToImageSource(CodeExplorerUI.ObjectLibraryFunction)},
46+
{ DeclarationType.Procedure, ToImageSource(CodeExplorerUI.ObjectMethod)},
47+
{ DeclarationType.PropertyGet, ToImageSource(CodeExplorerUI.ObjectPropertyGet)},
48+
{ DeclarationType.PropertyLet, ToImageSource(CodeExplorerUI.ObjectPropertyLet)},
49+
{ DeclarationType.PropertySet, ToImageSource(CodeExplorerUI.ObjectPropertySet)},
50+
{ DeclarationType.UserDefinedType, ToImageSource(CodeExplorerUI.ObjectValueType)},
51+
{ DeclarationType.UserDefinedTypeMember, ToImageSource(CodeExplorerUI.ObjectField)},
52+
{ DeclarationType.Variable, ToImageSource(CodeExplorerUI.ObjectField)},
53+
{ DeclarationType.Parameter, ToImageSource(CodeExplorerUI.ObjectField)},
54+
};
55+
56+
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
57+
{
58+
if (value == null)
59+
{
60+
return NullIcon;
61+
}
62+
63+
if (value is Declaration declaration)
64+
{
65+
if (declaration is ClassModuleDeclaration classModule)
66+
{
67+
if (classModule.QualifiedModuleName.ComponentType ==
68+
VBEditor.SafeComWrappers.ComponentType.Document)
69+
{
70+
return DeclarationIcons[DeclarationType.Document];
71+
}
72+
73+
if (classModule.QualifiedModuleName.ComponentType == VBEditor.SafeComWrappers.ComponentType.UserForm)
74+
{
75+
// a form has a predeclared ID, but we want it to have a UserForm icon:
76+
return DeclarationIcons[DeclarationType.UserForm];
77+
}
78+
79+
if (classModule.IsInterface || classModule.Annotations.Any(annotation => annotation.Annotation is InterfaceAnnotation))
80+
{
81+
return InterfaceIcon;
82+
}
83+
84+
if (classModule.HasPredeclaredId)
85+
{
86+
return PredeclaredIcon;
87+
}
88+
89+
return DeclarationIcons.ContainsKey(classModule.DeclarationType)
90+
? DeclarationIcons[classModule.DeclarationType]
91+
: NullIcon;
92+
}
93+
94+
if (DeclarationIcons.ContainsKey(declaration.DeclarationType))
95+
{
96+
if (declaration.Annotations.Any(a => a.Annotation is TestMethodAnnotation))
97+
{
98+
return TestMethodIcon;
99+
}
100+
101+
return DeclarationIcons[declaration.DeclarationType];
102+
}
103+
return NullIcon;
104+
}
105+
106+
return null;
107+
}
108+
}
109+
}

0 commit comments

Comments
 (0)