xref: /haiku/src/kits/tracker/FindPanel.h (revision dd2a1e350b303b855a50fd64e6cb55618be1ae6a)
1 /*
2 Open Tracker License
3 
4 Terms and Conditions
5 
6 Copyright (c) 1991-2000, Be Incorporated. All rights reserved.
7 
8 Permission is hereby granted, free of charge, to any person obtaining a copy of
9 this software and associated documentation files (the "Software"), to deal in
10 the Software without restriction, including without limitation the rights to
11 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12 of the Software, and to permit persons to whom the Software is furnished to do
13 so, subject to the following conditions:
14 
15 The above copyright notice and this permission notice applies to all licensees
16 and shall be included in all copies or substantial portions of the Software.
17 
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
23 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 
25 Except as contained in this notice, the name of Be Incorporated shall not be
26 used in advertising or otherwise to promote the sale, use or other dealings in
27 this Software without prior written authorization from Be Incorporated.
28 
29 Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks
30 of Be Incorporated in the United States and other countries. Other brand product
31 names are registered trademarks or trademarks of their respective holders.
32 All rights reserved.
33 */
34 #ifndef _FIND_PANEL_H
35 #define _FIND_PANEL_H
36 
37 
38 #include <ByteOrder.h>
39 #include <ObjectList.h>
40 #include <Window.h>
41 #include <View.h>
42 
43 #include "DialogPane.h"
44 #include "MimeTypeList.h"
45 #include "Utilities.h"
46 #include "NodeWalker.h"
47 
48 
49 class BFilePanel;
50 class BQuery;
51 class BBox;
52 class BTextControl;
53 class BCheckBox;
54 class BMenuField;
55 class BFile;
56 class BPopUpMenu;
57 class BGridLayout;
58 
59 namespace BPrivate {
60 
61 class FindPanel;
62 class Model;
63 class DraggableIcon;
64 class TAttrView;
65 
66 const uint32 kVolumeItem = 'Fvol';
67 const uint32 kAttributeItemMain = 'Fatr';
68 const uint32 kByNameItem = 'Fbyn';
69 const uint32 kByAttributeItem = 'Fbya';
70 const uint32 kByFormulaItem = 'Fbyq';
71 const uint32 kAddItem = 'Fadd';
72 const uint32 kRemoveItem = 'Frem';
73 
74 #ifdef _IMPEXP_TRACKER
75 _IMPEXP_TRACKER
76 #endif
77 BMenu* TrackerBuildRecentFindItemsMenu(const char* title);
78 
79 struct MoreOptionsStruct {
80 			// Some options used to be in a collapsable part of the window, but
81 			// this was removed. Now the options are always visible.
82 			bool 				showMoreOptions;
83 			bool 				searchTrash;
84 			// reserve a bunch of fields so that we can add stuff later but not
85 			// make old queries incompatible. Reserved fields are set to 0 when
86 			// saved
87 			int32 				reserved1;
88 			bool 				temporary;
89 			bool 				reserved9;
90 			bool 				reserved10;
91 			bool 				reserved11;
92 			int32 				reserved3;
93 			int32 				reserved4;
94 			int32 				reserved5;
95 			int32 				reserved6;
96 			int32 				reserved7;
97 			int32 				reserved8;
98 
99 								MoreOptionsStruct()
100 									:
101 									showMoreOptions(true),
102 									searchTrash(false),
103 									reserved1(0),
104 									temporary(true),
105 									reserved9(false),
106 									reserved10(false),
107 									reserved11(false),
108 									reserved3(0),
109 									reserved4(0),
110 									reserved5(0),
111 									reserved6(0),
112 									reserved7(0),
113 									reserved8(0)
114 								{}
115 
116 	static	void				EndianSwap(void* castToThis);
117 
118 	static	void 				SetQueryTemporary(BNode*, bool on);
119 	static	bool 				QueryTemporary(const BNode*);
120 };
121 
122 
123 class FindWindow : public BWindow {
124 public:
125 								FindWindow(const entry_ref* ref = NULL,
126 									bool editIfTemplateOnly = false);
127 	virtual 					~FindWindow();
128 
129 			FindPanel* 			BackgroundView() const { return fBackground; }
130 
131 			BNode* 				QueryNode() const { return fFile; }
132 
133 	// reads in the query name from either a saved name in a template
134 	// or form a saved query name
135 	const 	char* 				QueryName() const;
136 
137 	static 	bool 				IsQueryTemplate(BNode* file);
138 
139 protected:
140 	virtual	void 				MessageReceived(BMessage* message);
141 
142 private:
143 	static 	BFile* 				TryOpening(const entry_ref* ref);
144 	// when opening an empty panel, use the default query to set the panel up
145 	static 	void 				GetDefaultQuery(BEntry& entry);
146 			void 				SaveQueryAttributes(BNode* file, bool templateQuery);
147 
148 			// retrieve the results
149 			void 				Find();
150 			// save the contents of the find window into the query file
151 			void 				Save();
152 
153 			void 				SwitchToTemplate(const entry_ref*);
154 			bool 				FindSaveCommon(bool find);
155 
156 			status_t 			SaveQueryAsAttributes(BNode*, BEntry*, bool queryTemplate,
157 									const BMessage* oldAttributes = 0,
158 									const BPoint* oldLocation = 0);
159 
160 			void 				GetDefaultName(BString&);
161 			// dynamic date is a date such as 'today'
162 			void 				GetPredicateString(BString&, bool& dynamicDate);
163 
164 private:
165 			BFile* 				fFile;
166 			entry_ref 			fRef;
167 			bool 				fFromTemplate;
168 			bool 				fEditTemplateOnly;
169 			FindPanel* 			fBackground;
170 	mutable BString 			fQueryNameFromTemplate;
171 			BFilePanel* 		fSaveAsTemplatePanel;
172 
173 	typedef BWindow _inherited;
174 };
175 
176 
177 class FindPanel : public BView {
178 public:
179 								FindPanel(BFile*, FindWindow* parent, bool fromTemplate,
180 									bool editTemplateOnly);
181 	virtual 					~FindPanel();
182 
183 	virtual	void 				AttachedToWindow();
184 	virtual	void 				Draw(BRect updateRect);
185 	virtual	void 				MessageReceived(BMessage*);
186 
187 			void 				BuildAttrQuery(BQuery*, bool& dynamicDate) const;
188 			BPopUpMenu* 		MimeTypeMenu() const { return fMimeTypeMenu; }
189 			BMenuItem* 			CurrentMimeType(const char** type = NULL) const;
190 			status_t 			SetCurrentMimeType(BMenuItem* item);
191 			status_t 			SetCurrentMimeType(const char* label);
192 
193 			BPopUpMenu* 		VolMenu() const { return fVolMenu; }
194 			uint32 				Mode() const { return fMode; }
195 
196 	static 	uint32 				InitialMode(const BNode* entry);
197 			void 				SaveWindowState(BNode*, bool editTemplate);
198 
199 			void 				SwitchToTemplate(const BNode*);
200 
201 			// build up a query from by-attribute items
202 			void 				GetByAttrPredicate(BQuery*, bool& dynamicDate) const;
203 			// build up a simple query from the name we are searching for
204 			void 				GetByNamePredicate(BQuery*) const;
205 
206 			void 				GetDefaultName(BString&) const;
207 			void 				GetDefaultAttrName(BString&, int32) const;
208 	// name filled out in the query name text field
209 	const 	char* 				UserSpecifiedName() const;
210 
211 	// populate the recent query menu with query templates and recent queries
212 	static 	void 				AddRecentQueries(BMenu*, bool addSaveAsItem,
213 									const BMessenger* target, uint32 what);
214 
215 private:
216 	// populates the type menu
217 	void 						AddMimeTypesToMenu();
218 	static 	bool 				AddOneMimeTypeToMenu(const ShortMimeInfo*, void* castToMenu);
219 
220 			// populates the volume menu
221 			void 				AddVolumes(BMenu*);
222 
223 			void 				ShowVolumeMenuLabel();
224 
225 			// add one more attribute item to the attr view
226 			void 				AddAttrRow();
227 			// remove the last attribute item
228 			void 				RemoveAttrRow();
229 			void 				AddFirstAttr();
230 
231 			// panel building/restoring calls
232 			void 				RestoreWindowState(const BNode*);
233 			void 				RestoreMimeTypeMenuSelection(const BNode*);
234 			void 				AddByAttributeItems(const BNode*);
235 			void 				RemoveByAttributeItems();
236 			void 				RemoveAttrViewItems(bool removeGrid = true);
237 			// MimeTypeWindow is only shown in kByNameItem and kByAttributeItem modes
238 			void 				ShowOrHideMimeTypeMenu();
239 
240 			void 				AddAttributeControls(int32);
241 
242 			// fMode gets set by this and the call relies on it being up-to-date
243 			void 				ShowOrHideMoreOptions(bool show);
244 	static 	int32 				InitialAttrCount(const BNode*);
245 			void 				FillCurrentQueryName(BTextControl*, FindWindow*);
246 			void 				AddByNameOrFormulaItems();
247 			void 				SetupAddRemoveButtons();
248 
249 			// go from search by name to search by attribute, etc.
250 			void 				SwitchMode(uint32);
251 
252 			void 				PushMimeType(BQuery* query) const;
253 
254 			void 				SaveAsQueryOrTemplate(const entry_ref*,
255 									const char*, bool queryTemplate);
256 
257 			BView* 				FindAttrView(const char*, int row) const;
258 
259 			void 				AddAttributes(BMenu* menu, const BMimeType& type);
260 			void 				AddMimeTypeAttrs(BMenu* menu);
261 			void 				RestoreAttrState(const BMessage&, int32);
262 			void 				SaveAttrState(BMessage*, int32);
263 			void 				AddLogicMenu(int32, bool selectAnd = true);
264 			void 				RemoveLogicMenu(int32);
265 
266 			void 				ResizeMenuField(BMenuField*);
267 
268 private:
269 			uint32 				fMode;
270 			BGridLayout*		fAttrGrid;
271 			BPopUpMenu* 		fMimeTypeMenu;
272 			BMenuField* 		fMimeTypeField;
273 			BPopUpMenu* 		fVolMenu;
274 			BPopUpMenu*			fSearchModeMenu;
275 			BPopUpMenu* 		fRecentQueries;
276 			BBox* 				fMoreOptions;
277 			BTextControl* 		fQueryName;
278 			BString 			fInitialQueryName;
279 
280 			BCheckBox* 			fTemporaryCheck;
281 			BCheckBox* 			fSearchTrashCheck;
282 
283 			DraggableIcon* 		fDraggableIcon;
284 
285 	typedef BView _inherited;
286 
287 	friend class RecentQueriesPopUp;
288 };
289 
290 
291 // transient queries get deleted if they didn't get used in a while;
292 // this is the task that takes care of it
293 class DeleteTransientQueriesTask {
294 public:
295 	virtual 					~DeleteTransientQueriesTask();
296 
297 	static 	void 				StartUpTransientQueryCleaner();
298 
299 			// returns true when done
300 			bool 				DoSomeWork();
301 
302 protected:
303 								DeleteTransientQueriesTask();
304 
305 			void 				Initialize();
306 			bool 				GetSome();
307 
308 			bool 				ProcessOneRef(Model*);
309 
310 protected:
311 			enum State {
312 				kInitial,
313 				kAllocatedWalker,
314 				kTraversing,
315 				kError
316 			};
317 
318 protected:
319 			State 				state;
320 
321 private:
322 			BTrackerPrivate::TNodeWalker* fWalker;
323 };
324 
325 
326 class RecentFindItemsMenu : public BMenu {
327 public:
328 								RecentFindItemsMenu(const char* title,
329 									const BMessenger* target, uint32 what);
330 
331 protected:
332 	virtual void 				AttachedToWindow();
333 
334 private:
335 			BMessenger 			fTarget;
336 			uint32 				fWhat;
337 };
338 
339 
340 // query/query template drag&drop helper
341 class DraggableQueryIcon : public DraggableIcon {
342 public:
343 								DraggableQueryIcon(BRect frame, const char* name,
344 									const BMessage* message, BMessenger target,
345 									uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP,
346 									uint32 flags = B_WILL_DRAW);
347 
348 protected:
349 	virtual bool 				DragStarted(BMessage*);
350 };
351 
352 } // namespace BPrivate
353 
354 using namespace BPrivate;
355 
356 #endif	// _FIND_PANEL_H
357