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