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