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 <FilePanel.h> 40 #include <ObjectList.h> 41 #include <View.h> 42 #include <Window.h> 43 44 #include "DialogPane.h" 45 #include "MimeTypeList.h" 46 #include "Utilities.h" 47 #include "NodeWalker.h" 48 49 50 class BFilePanel; 51 class BQuery; 52 class BBox; 53 class BTextControl; 54 class BCheckBox; 55 class BMenuBar; 56 class BMenuField; 57 class BFile; 58 class BPopUpMenu; 59 class BGroupView; 60 class BGridLayout; 61 62 namespace BPrivate { 63 64 class FindPanel; 65 class Model; 66 class DraggableIcon; 67 class TAttrView; 68 69 const uint32 kVolumeItem = 'Fvol'; 70 const uint32 kAttributeItemMain = 'Fatr'; 71 const uint32 kByNameItem = 'Fbyn'; 72 const uint32 kByAttributeItem = 'Fbya'; 73 const uint32 kByFormulaItem = 'Fbyq'; 74 const uint32 kAddItem = 'Fadd'; 75 const uint32 kRemoveItem = 'Frem'; 76 77 const uint32 kClearHistory = 'FClH'; 78 const uint32 kClearTemplates = 'FClT'; 79 const uint32 kSaveQueryOrTemplate = 'FSaQ'; 80 const uint32 kOpenSaveAsPanel = 'Fosv'; 81 const uint32 kOpenLoadQueryPanel = 'Folo'; 82 const uint32 kTemporaryOptionClicked = 'FTCl'; 83 const uint32 kSearchInTrashOptionClicked = 'FSCl'; 84 85 const uint32 kSelectDirectoryFilter = 'FSeD'; 86 const uint32 kAddDirectoryFilters = 'FAdF'; 87 const uint32 kRemoveDirectoryFilter = 'FRmD'; 88 89 #ifdef _IMPEXP_TRACKER 90 _IMPEXP_TRACKER 91 #endif 92 BMenu* TrackerBuildRecentFindItemsMenu(const char* title); 93 94 struct MoreOptionsStruct { 95 // Some options used to be in a collapsable part of the window, but 96 // this was removed. Now the options are always visible. 97 bool showMoreOptions; 98 bool searchTrash; 99 // reserve a bunch of fields so that we can add stuff later but not 100 // make old queries incompatible. Reserved fields are set to 0 when 101 // saved 102 int32 reserved1; 103 bool temporary; 104 bool reserved9; 105 bool reserved10; 106 bool reserved11; 107 int32 reserved3; 108 int32 reserved4; 109 int32 reserved5; 110 int32 reserved6; 111 int32 reserved7; 112 int32 reserved8; 113 114 MoreOptionsStruct() 115 : 116 showMoreOptions(true), 117 searchTrash(false), 118 reserved1(0), 119 temporary(true), 120 reserved9(false), 121 reserved10(false), 122 reserved11(false), 123 reserved3(0), 124 reserved4(0), 125 reserved5(0), 126 reserved6(0), 127 reserved7(0), 128 reserved8(0) 129 {} 130 131 static void EndianSwap(void* castToThis); 132 133 static void SetQueryTemporary(BNode*, bool on); 134 static bool QueryTemporary(const BNode*); 135 }; 136 137 138 class FindWindow : public BWindow { 139 public: 140 FindWindow(const entry_ref* ref = NULL, 141 bool editIfTemplateOnly = false); 142 virtual ~FindWindow(); 143 144 FindPanel* BackgroundView() const { return fBackground; } 145 146 BNode* QueryNode() const { return fFile; } 147 148 // reads in the query name from either a saved name in a template 149 // or form a saved query name 150 const char* QueryName() const; 151 152 static bool IsQueryTemplate(BNode* file); 153 void SetOptions(bool searchInTrash); 154 void AddIconToMenuBar(BView*); 155 156 protected: 157 virtual void MessageReceived(BMessage* message); 158 159 private: 160 static BFile* TryOpening(const entry_ref* ref); 161 // when opening an empty panel, use the default query to set the panel up 162 static void GetDefaultQuery(BEntry& entry); 163 void SaveQueryAttributes(BNode* file, bool templateQuery); 164 165 // retrieve the results 166 void Find(); 167 // save the contents of the find window into the query file 168 void Save(); 169 170 void SwitchToTemplate(const entry_ref*); 171 bool FindSaveCommon(bool find); 172 173 status_t SaveQueryAsAttributes(BNode*, BEntry*, bool queryTemplate, 174 const BMessage* oldAttributes = 0, 175 const BPoint* oldLocation = 0, bool temporary = true); 176 status_t GetQueryLastChangeTimeFromFile(BMessage* message); 177 178 void GetDefaultName(BString&); 179 // dynamic date is a date such as 'today' 180 void GetPredicateString(BString&, bool& dynamicDate); 181 182 void BuildMenuBar(); 183 void PopulateTemplatesMenu(); 184 void UpdateFileReferences(const entry_ref*); 185 void ClearHistoryOrTemplates(bool clearTemplates, bool temporaryOnly); 186 status_t DeleteQueryOrTemplate(BEntry*); 187 188 private: 189 BFile* fFile; 190 entry_ref fRef; 191 bool fFromTemplate; 192 bool fEditTemplateOnly; 193 FindPanel* fBackground; 194 mutable BString fQueryNameFromTemplate; 195 BFilePanel* fSaveAsPanel; 196 BFilePanel* fOpenQueryPanel; 197 198 // Menu Bar For New Panel 199 BGroupView* fMenuBarContainer; 200 BMenuBar* fMenuBar; 201 BMenu* fQueryMenu; 202 BMenuItem* fSaveQueryOrTemplateItem; 203 BMenu* fOptionsMenu; 204 BMenu* fTemplatesMenu; 205 BMenu* fHistoryMenu; 206 BMenu* fSaveAsMenu; 207 BMenuItem* fSearchInTrash; 208 209 typedef BWindow _inherited; 210 }; 211 212 213 class FindPanel : public BView { 214 public: 215 FindPanel(BFile*, FindWindow* parent, bool fromTemplate, 216 bool editTemplateOnly); 217 virtual ~FindPanel(); 218 219 virtual void AttachedToWindow(); 220 virtual void Draw(BRect updateRect); 221 virtual void MessageReceived(BMessage*); 222 223 void BuildAttrQuery(BQuery*, bool& dynamicDate) const; 224 BPopUpMenu* MimeTypeMenu() const { return fMimeTypeMenu; } 225 BMenuItem* CurrentMimeType(const char** type = NULL) const; 226 status_t SetCurrentMimeType(BMenuItem* item); 227 status_t SetCurrentMimeType(const char* label); 228 229 BPopUpMenu* VolMenu() const { return fVolMenu; } 230 uint32 Mode() const { return fMode; } 231 232 static uint32 InitialMode(const BNode* entry); 233 void SaveWindowState(BNode*, bool editTemplate); 234 235 void SwitchToTemplate(const BNode*); 236 237 // build up a query from by-attribute items 238 void GetByAttrPredicate(BQuery*, bool& dynamicDate) const; 239 // build up a simple query from the name we are searching for 240 void GetByNamePredicate(BQuery*) const; 241 242 void GetDefaultName(BString&) const; 243 void GetDefaultAttrName(BString&, int32) const; 244 // name filled out in the query name text field 245 const char* UserSpecifiedName() const; 246 247 // populate the recent query menu with query templates and recent queries 248 static void AddRecentQueries(BMenu*, bool addSaveAsItem, 249 const BMessenger* target, uint32 what, 250 bool includeTemplates = true, 251 bool includeTemporaryQueries = true, 252 bool includePersistedQueries = true); 253 254 status_t SaveDirectoryFiltersToFile(BNode*); 255 void LoadDirectoryFiltersFromFile(const BNode*); 256 257 private: 258 // populates the type menu 259 void AddMimeTypesToMenu(); 260 static bool AddOneMimeTypeToMenu(const ShortMimeInfo*, void* castToMenu); 261 262 // populates the volume menu 263 void AddVolumes(BMenu*); 264 265 void ShowVolumeMenuLabel(); 266 267 // add one more attribute item to the attr view 268 void AddAttrRow(); 269 // remove the last attribute item 270 void RemoveAttrRow(); 271 void AddFirstAttr(); 272 273 // panel building/restoring calls 274 void RestoreWindowState(const BNode*); 275 void RestoreMimeTypeMenuSelection(const BNode*); 276 void AddByAttributeItems(const BNode*); 277 void RemoveByAttributeItems(); 278 void RemoveAttrViewItems(bool removeGrid = true); 279 // MimeTypeWindow is only shown in kByNameItem and kByAttributeItem modes 280 void ShowOrHideMimeTypeMenu(); 281 282 void AddAttributeControls(int32); 283 284 // fMode gets set by this and the call relies on it being up-to-date 285 void ShowOrHideMoreOptions(bool show); 286 static int32 InitialAttrCount(const BNode*); 287 void FillCurrentQueryName(BTextControl*, FindWindow*); 288 void AddByNameOrFormulaItems(); 289 void SetupAddRemoveButtons(); 290 291 // go from search by name to search by attribute, etc. 292 void SwitchMode(uint32); 293 294 void PushMimeType(BQuery* query) const; 295 296 void SaveAsQueryOrTemplate(const entry_ref*, 297 const char*, bool queryTemplate); 298 299 BView* FindAttrView(const char*, int row) const; 300 301 void AddAttributes(BMenu* menu, const BMimeType& type); 302 void AddMimeTypeAttrs(BMenu* menu); 303 void RestoreAttrState(const BMessage&, int32); 304 void SaveAttrState(BMessage*, int32); 305 void AddLogicMenu(int32, bool selectAnd = true); 306 void RemoveLogicMenu(int32); 307 308 void ResizeMenuField(BMenuField*); 309 310 status_t AddDirectoryFiltersToMenu(BMenu*, BHandler* target); 311 status_t AddDirectoryFilter(const entry_ref* ref, bool addToMenu = true); 312 void RemoveDirectoryFilter(const entry_ref* ref); 313 static status_t AddDirectoryFilterItemToMenu(BMenu*, const entry_ref* ref, 314 BHandler* target, int32 index = -1); 315 void UnmarkDisks(); 316 void MarkDiskAccordingToDirectoryFilter(entry_ref*); 317 318 public: 319 BObjectList<entry_ref> fDirectoryFilters; 320 321 private: 322 uint32 fMode; 323 BGridLayout* fAttrGrid; 324 BPopUpMenu* fMimeTypeMenu; 325 BMenuField* fMimeTypeField; 326 BPopUpMenu* fVolMenu; 327 BPopUpMenu* fSearchModeMenu; 328 BPopUpMenu* fRecentQueries; 329 BBox* fMoreOptions; 330 BTextControl* fQueryName; 331 BString fInitialQueryName; 332 333 DraggableIcon* fDraggableIcon; 334 335 BFilePanel* fDirectorySelectPanel; 336 337 bool fAddSeparatorItemState; 338 339 typedef BView _inherited; 340 341 friend class RecentQueriesPopUp; 342 }; 343 344 345 // transient queries get deleted if they didn't get used in a while; 346 // this is the task that takes care of it 347 class DeleteTransientQueriesTask { 348 public: 349 virtual ~DeleteTransientQueriesTask(); 350 351 static void StartUpTransientQueryCleaner(); 352 353 // returns true when done 354 bool DoSomeWork(); 355 356 protected: 357 DeleteTransientQueriesTask(); 358 359 void Initialize(); 360 bool GetSome(); 361 362 bool ProcessOneRef(Model*); 363 364 protected: 365 enum State { 366 kInitial, 367 kAllocatedWalker, 368 kTraversing, 369 kError 370 }; 371 372 protected: 373 State state; 374 375 private: 376 BTrackerPrivate::TNodeWalker* fWalker; 377 }; 378 379 380 class RecentFindItemsMenu : public BMenu { 381 public: 382 RecentFindItemsMenu(const char* title, 383 const BMessenger* target, uint32 what); 384 385 protected: 386 virtual void AttachedToWindow(); 387 388 private: 389 BMessenger fTarget; 390 uint32 fWhat; 391 }; 392 393 394 // query/query template drag&drop helper 395 class DraggableQueryIcon : public DraggableIcon { 396 public: 397 DraggableQueryIcon(BRect frame, const char* name, 398 const BMessage* message, BMessenger target, 399 uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP, 400 uint32 flags = B_WILL_DRAW); 401 402 protected: 403 virtual bool DragStarted(BMessage*); 404 virtual void Draw(BRect); 405 }; 406 407 408 class FolderFilter : public BRefFilter { 409 public: 410 virtual bool Filter(const entry_ref*, BNode*, struct stat_beos*, const char*); 411 }; 412 413 } // namespace BPrivate 414 415 using namespace BPrivate; 416 417 #endif // _FIND_PANEL_H 418