1 #include "ide.h"
2
CharFilterFindFileMask(int c)3 static int CharFilterFindFileMask(int c)
4 {
5 return ToUpper(ToAscii(c));
6 }
7
8 class FindFileData final : public Moveable<FindFileData> {
9 public:
10 FindFileData(const String& file, const String& package);
11
12 String GetFile() const;
13 String GetPackage() const;
14
15 private:
16 String file;
17 String package;
18 };
19
FindFileData(const String & file,const String & package)20 FindFileData::FindFileData(const String& file, const String& package)
21 : file(file)
22 , package(package)
23 {
24 }
25
GetFile() const26 String FindFileData::GetFile() const
27 {
28 return file;
29 }
30
GetPackage() const31 String FindFileData::GetPackage() const
32 {
33 return package;
34 }
35
36 class FindFileWindow final : public WithFindFileLayout<TopWindow> {
37 private:
38 struct FindFileFileDisplay : public Display {
PaintFindFileWindow::FindFileFileDisplay39 void Paint(Draw& w, const Rect& r, const Value& q,
40 Color ink, Color paper, dword style) const override
41 {
42 String txt = q;
43 Image fileImage = IdeFileImage(txt, false, false);
44
45 int cellHeight = r.bottom - r.top;
46
47 w.DrawRect(r, paper);
48 w.DrawImage(r.left, r.top + ((cellHeight - fileImage.GetHeight()) / 2), fileImage);
49 w.DrawText(r.left + fileImage.GetWidth() + Zx(5), r.top +
50 ((cellHeight - StdFont().GetCy()) / 2),
51 txt, StdFont(), ink);
52 }
53 };
54
55 public:
56 FindFileWindow(const Workspace& wspc, const String& acctualPackage);
57 bool Key(dword key, int count) override;
58
59 Vector<FindFileData> GetFindedFilesData() const;
60
61 void Find();
62
63 private:
64 bool DoesFileMeetTheCriteria(
65 const Package::File& file, const String& packageName, const String& query);
66 bool IsActualPackage(const String& packageName);
67
68 private:
69 const String actualPackage;
70 const Workspace& wspc;
71 };
72
FindFileWindow(const Workspace & wspc,const String & actualPackage)73 FindFileWindow::FindFileWindow(const Workspace& wspc, const String& actualPackage)
74 : actualPackage(actualPackage)
75 , wspc(wspc)
76 {
77 CtrlLayoutOKCancel(*this, "Find File");
78 Sizeable().Zoomable().MinimizeBox(false);
79 list.AddColumn("File").SetDisplay(Single<FindFileFileDisplay>());
80 list.AddColumn("Package");
81 list.WhenLeftDouble = Acceptor(IDOK);
82 list.SetLineCy(max(Zy(16), Draw::GetStdFontCy()));
83 list.HorzGrid(false);
84 list.MultiSelect();
85 list.WantFocus(false);
86 mask.NullText("Search");
87 mask.SelectAll();
88 mask.SetFilter(CharFilterFindFileMask);
89 mask << [=] { Find(); };
90 searchInCurrentPackage << [=] { Find(); };
91 help << [=] { LaunchWebBrowser("https://www.ultimatepp.org/app$ide$FindFile$en-us.html"); };
92 }
93
Key(dword key,int count)94 bool FindFileWindow::Key(dword key, int count)
95 {
96 return list.Key(key, count);
97 }
98
GetFindedFilesData() const99 Vector<FindFileData> FindFileWindow::GetFindedFilesData() const
100 {
101 Vector<FindFileData> data;
102
103 for(int i = 0; i < list.GetCount(); i++) {
104 if(list.IsSelected(i)) {
105 data.Add(FindFileData(list.Get(i, 0), list.Get(i, 1)));
106 }
107 }
108
109 return data;
110 }
111
Find()112 void FindFileWindow::Find()
113 {
114 list.Clear();
115 String maskValue = ~mask;
116 for(int p = 0; p < wspc.GetCount(); p++) {
117 String packageName = wspc[p];
118 const Package& pack = wspc.GetPackage(p);
119 for(const auto& file : pack.file) {
120 if(DoesFileMeetTheCriteria(file, packageName, maskValue)) {
121 list.Add(file, packageName);
122 }
123 }
124 }
125 if(list.GetCount() > 0) {
126 list.SetCursor(0);
127 }
128
129 ok.Enable(list.IsCursor());
130 }
131
DoesFileMeetTheCriteria(const Package::File & file,const String & packageName,const String & query)132 bool FindFileWindow::DoesFileMeetTheCriteria(const Package::File& file, const String& packageName,
133 const String& query)
134 {
135 if (searchInCurrentPackage && !IsActualPackage(packageName)) {
136 return false;
137 }
138
139 return !file.separator && (ToUpper(packageName).Find(query) >= 0 || ToUpper(file).Find(query) >= 0);
140 }
141
IsActualPackage(const String & packageName)142 bool FindFileWindow::IsActualPackage(const String& packageName)
143 {
144 return actualPackage.Compare(packageName) == 0;
145 }
146
FindFileName()147 void Ide::FindFileName()
148 {
149 FindFileWindow window(IdeWorkspace(), actualpackage);
150 window.mask.SetText(find_file_search_string);
151 window.searchInCurrentPackage.Set(find_file_search_in_current_package);
152 window.Find();
153
154 auto status = window.Execute();
155
156 find_file_search_in_current_package = ~window.searchInCurrentPackage;
157 find_file_search_string = ~window.mask;
158 find_file_search_in_current_package = ~window.searchInCurrentPackage;
159
160 if (status != IDOK) {
161 return;
162 }
163
164 for(const auto& currentData : window.GetFindedFilesData()) {
165 AddHistory();
166
167 String filePath = SourcePath(currentData.GetPackage(), currentData.GetFile());
168 EditFile(filePath);
169 }
170 }
171