1+ using System . Collections . ObjectModel ;
2+ using System . Linq ;
3+ using System . Windows . Controls ;
4+ using System . Windows . Input ;
5+ using Cpp2ILAdapter . TreeView ;
6+ using dnSpy . Contracts . Documents . Tabs ;
7+ using dnSpy . Contracts . Documents . TreeView ;
8+ using dnSpy . Contracts . Images ;
9+ using dnSpy . Contracts . MVVM ;
10+ using dnSpy . Contracts . Search ;
11+ using FieldNode = Cpp2ILAdapter . TreeView . FieldNode ;
12+ using MethodNode = Cpp2ILAdapter . TreeView . MethodNode ;
13+
14+ namespace Cpp2ILAdapter . Search ;
15+
16+ internal sealed class SearchControlVM : ViewModelBase
17+ {
18+ public class SearchSettingsContainer
19+ {
20+ SearchType SearchType { get ; set ; }
21+ public bool SyntaxHighlight { get ; set ; }
22+ public bool MatchWholeWords { get ; set ; }
23+ public bool CaseSensitive { get ; set ; }
24+ public bool MatchAnySearchTerm { get ; set ; }
25+ public bool SearchDecompiledData { get ; set ; }
26+ public bool SearchFrameworkAssemblies { get ; set ; }
27+ public bool SearchCompilerGeneratedMembers { get ; set ; }
28+ }
29+
30+ private readonly SearchControl _control ;
31+
32+ public SearchSettingsContainer SearchSettings { get ; set ; } = new ( ) ;
33+
34+ public SearchControlVM ( SearchControl control )
35+ {
36+ _control = control ;
37+ SearchTypeVMs = new ( ) ;
38+
39+ Add ( SearchType . TypeDef , "Type" , DsImages . ClassPublic , "Type_Key" , VisibleMembersFlags . TypeDef ) ;
40+ Add ( SearchType . FieldDef , "Field" , DsImages . FieldPublic , "Field_Key" , VisibleMembersFlags . FieldDef ) ;
41+ Add ( SearchType . MethodDef , "Method" , DsImages . MethodPublic , "Method_Key" , VisibleMembersFlags . MethodDef ) ;
42+ //Add(SearchType.PropertyDef, Property, DsImages.Property, Property_Key, VisibleMembersFlags.PropertyDef);
43+ //Add(SearchType.EventDef, Event, DsImages.EventPublic, Event_Key, VisibleMembersFlags.EventDef);
44+ //Add(SearchType.ParamDef, Parameter, DsImages.Parameter, Parameter_Key, VisibleMembersFlags.ParamDef);
45+ //Add(SearchType.Local, Local, DsImages.LocalVariable, Local_Key, VisibleMembersFlags.Local);
46+ //Add(SearchType.ParamLocal, ParameterLocal, DsImages.LocalVariable, ParameterLocal_Key, VisibleMembersFlags.ParamDef | VisibleMembersFlags.Local);
47+ //Add(SearchType.AssemblyRef, AssemblyRef, DsImages.Reference, null, VisibleMembersFlags.AssemblyRef);
48+ //Add(SearchType.ModuleRef, ModuleRef, DsImages.Reference, null, VisibleMembersFlags.ModuleRef);
49+ //Add(SearchType.Resource, Resource, DsImages.Dialog, Resource_Key, VisibleMembersFlags.Resource | VisibleMembersFlags.ResourceElement);
50+ //Add(SearchType.GenericTypeDef, Generic, DsImages.Template, null, VisibleMembersFlags.GenericTypeDef);
51+ //Add(SearchType.NonGenericTypeDef, NonGeneric, DsImages.ClassPublic, null, VisibleMembersFlags.NonGenericTypeDef);
52+ Add ( SearchType . EnumTypeDef , "Enum" , DsImages . EnumerationPublic , null , VisibleMembersFlags . EnumTypeDef ) ;
53+ Add ( SearchType . InterfaceTypeDef , "Interface" , DsImages . InterfacePublic , null , VisibleMembersFlags . InterfaceTypeDef ) ;
54+ Add ( SearchType . ClassTypeDef , "Class" , DsImages . ClassPublic , null , VisibleMembersFlags . ClassTypeDef ) ;
55+ Add ( SearchType . StructTypeDef , "Struct" , DsImages . StructurePublic , null , VisibleMembersFlags . StructTypeDef ) ;
56+ //Add(SearchType.DelegateTypeDef, Delegate, DsImages.DelegatePublic, null, VisibleMembersFlags.DelegateTypeDef);
57+ //Add(SearchType.Member, Member, DsImages.Property, Member_Key, VisibleMembersFlags.MethodDef | VisibleMembersFlags.FieldDef | VisibleMembersFlags.PropertyDef | VisibleMembersFlags.EventDef);
58+ Add ( SearchType . Any , "AllAbove" , DsImages . ClassPublic , "AllAbove_Key" , VisibleMembersFlags . TreeViewAll | VisibleMembersFlags . ParamDef | VisibleMembersFlags . Local ) ;
59+ //Add(SearchType.Literal, Literal, DsImages.ConstantPublic, Literal_Key, VisibleMembersFlags.MethodBody | VisibleMembersFlags.FieldDef | VisibleMembersFlags.ParamDef | VisibleMembersFlags.PropertyDef | VisibleMembersFlags.Resource | VisibleMembersFlags.ResourceElement | VisibleMembersFlags.Attributes);
60+
61+ _control . SearchListBoxDoubleClick += FollowSelectedReference ;
62+
63+ _control . SearchTextBox . TextChanged += TextChanged ;
64+ }
65+
66+ private void TextChanged ( object sender , TextChangedEventArgs e )
67+ {
68+ var selectedItem = CreateSearchWindowCommand . SharedDocumentTabService . DocumentTreeView . TreeView . SelectedItem ;
69+ if ( selectedItem . GetTopNode ( ) is not Cpp2ILDocumentNode documentNode )
70+ return ;
71+
72+ var list = _control . ListBox ;
73+
74+ var searchType = selectedSearchTypeVM . SearchType ;
75+ if ( searchType == SearchType . TypeDef )
76+ {
77+ if ( SearchSettings . MatchWholeWords )
78+ list . ItemsSource = documentNode . AllTypes . Where ( t => t . Context . FullName == _control . SearchTextBox . Text ) ;
79+ else
80+ list . ItemsSource = documentNode . AllTypes . Where ( t => t . Context . FullName . Contains ( _control . SearchTextBox . Text ) ) ;
81+ }
82+ if ( searchType == SearchType . ClassTypeDef )
83+ {
84+ if ( SearchSettings . MatchWholeWords )
85+ list . ItemsSource = documentNode . AllTypes . Where ( t => ! t . Context . IsValueType && t . Context . FullName == _control . SearchTextBox . Text ) ;
86+ else
87+ list . ItemsSource = documentNode . AllTypes . Where ( t => ! t . Context . IsValueType && t . Context . FullName . Contains ( _control . SearchTextBox . Text ) ) ;
88+ }
89+ if ( searchType == SearchType . StructTypeDef )
90+ {
91+ if ( SearchSettings . MatchWholeWords )
92+ list . ItemsSource = documentNode . AllTypes . Where ( t => t . Context . IsValueType && t . Context . FullName == _control . SearchTextBox . Text ) ;
93+ else
94+ list . ItemsSource = documentNode . AllTypes . Where ( t => t . Context . IsValueType && t . Context . FullName . Contains ( _control . SearchTextBox . Text ) ) ;
95+ }
96+ if ( searchType == SearchType . InterfaceTypeDef )
97+ {
98+ if ( SearchSettings . MatchWholeWords )
99+ list . ItemsSource = documentNode . AllTypes . Where ( t => t . Context . IsInterface && t . Context . FullName == _control . SearchTextBox . Text ) ;
100+ else
101+ list . ItemsSource = documentNode . AllTypes . Where ( t => t . Context . IsInterface && t . Context . FullName . Contains ( _control . SearchTextBox . Text ) ) ;
102+ }
103+ if ( searchType == SearchType . EnumTypeDef )
104+ {
105+ if ( SearchSettings . MatchWholeWords )
106+ list . ItemsSource = documentNode . AllTypes . Where ( t => t . Context . IsEnumType && t . Context . FullName == _control . SearchTextBox . Text ) ;
107+ else
108+ list . ItemsSource = documentNode . AllTypes . Where ( t => t . Context . IsEnumType && t . Context . FullName . Contains ( _control . SearchTextBox . Text ) ) ;
109+ }
110+ else if ( searchType == SearchType . FieldDef )
111+ {
112+ var source = documentNode . AllTypes . SelectMany ( _ => _ . GetTreeNodeData . OfType < FieldNode > ( ) ) ;
113+ if ( SearchSettings . MatchWholeWords )
114+ list . ItemsSource = source . Where ( t => t . Context . Name == _control . SearchTextBox . Text ) ;
115+ else
116+ list . ItemsSource = source . Where ( t => t . Context . Name . Contains ( _control . SearchTextBox . Text ) ) ;
117+ }
118+ else if ( searchType == SearchType . MethodDef )
119+ {
120+ var source = documentNode . AllTypes . SelectMany ( _ => _ . GetTreeNodeData . OfType < MethodNode > ( ) ) ;
121+ if ( SearchSettings . MatchWholeWords )
122+ list . ItemsSource = source . Where ( t => t . Context . Name == _control . SearchTextBox . Text ) ;
123+ else
124+ list . ItemsSource = source . Where ( t => t . Context . Name . Contains ( _control . SearchTextBox . Text ) ) ;
125+ }
126+ }
127+
128+ private void FollowSelectedReference ( object ? sender , EventArgs e )
129+ {
130+ bool newTab = Keyboard . Modifiers == ModifierKeys . Control || Keyboard . Modifiers == ModifierKeys . Shift ;
131+ var @ref = _control . searchListBox . SelectedItem ;
132+ CreateSearchWindowCommand . SharedDocumentTabService . FollowReference ( @ref , newTab , true ) ;
133+ }
134+
135+ public ObservableCollection < SearchTypeVM > SearchTypeVMs { get ; }
136+
137+ public SearchTypeVM SelectedSearchTypeVM {
138+ get => selectedSearchTypeVM ;
139+ set {
140+ if ( selectedSearchTypeVM != value ) {
141+ selectedSearchTypeVM = value ;
142+ OnPropertyChanged ( nameof ( SelectedSearchTypeVM ) ) ;
143+ }
144+ }
145+ }
146+ SearchTypeVM selectedSearchTypeVM ;
147+
148+ void Add ( SearchType searchType , string name , ImageReference icon , string ? toolTip , VisibleMembersFlags flags ) =>
149+ SearchTypeVMs . Add ( new SearchTypeVM ( searchType , name , toolTip , icon , flags ) ) ;
150+ }
0 commit comments