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 _CONTAINER_WINDOW_H 35 #define _CONTAINER_WINDOW_H 36 37 38 #include <Window.h> 39 40 #include "LockingList.h" 41 #include "Model.h" 42 #include "SlowContextPopup.h" 43 #include "TaskLoop.h" 44 45 class BPopUpMenu; 46 class BMenuBar; 47 48 namespace BPrivate { 49 50 class BNavigator; 51 class BPoseView; 52 class ModelMenuItem; 53 class AttributeStreamNode; 54 class BackgroundImage; 55 class Model; 56 class ModelNodeLazyOpener; 57 class SelectionWindow; 58 59 #define kDefaultFolderTemplate "DefaultFolderTemplate" 60 61 extern const char* kAddOnsMenuName; 62 63 const window_feel kPrivateDesktopWindowFeel = window_feel(1024); 64 const window_look kPrivateDesktopWindowLook = window_look(4); 65 // this is a mirror of an app server private values 66 67 enum { 68 // flags that describe opening of the window 69 kRestoreWorkspace = 0x1, 70 kIsHidden = 0x2, 71 // set when opening a window during initial Tracker start 72 kRestoreDecor = 0x4 73 }; 74 75 struct AddonShortcut { 76 Model* model; 77 char key; 78 char defaultKey; 79 uint32 modifiers; 80 }; 81 82 class BContainerWindow : public BWindow { 83 public: 84 BContainerWindow(LockingList<BWindow>* windowList, 85 uint32 containerWindowFlags, 86 window_look look = B_DOCUMENT_WINDOW_LOOK, 87 window_feel feel = B_NORMAL_WINDOW_FEEL, 88 uint32 flags = B_WILL_ACCEPT_FIRST_CLICK 89 | B_NO_WORKSPACE_ACTIVATION, 90 uint32 workspace = B_CURRENT_WORKSPACE); 91 92 virtual ~BContainerWindow(); 93 94 virtual void Init(const BMessage* message = NULL); 95 96 static BRect InitialWindowRect(window_feel); 97 98 virtual void Minimize(bool minimize); 99 virtual void Quit(); 100 virtual bool QuitRequested(); 101 102 virtual void UpdateIfTrash(Model*); 103 104 virtual void CreatePoseView(Model*); 105 106 virtual void ShowContextMenu(BPoint, const entry_ref*, BView*); 107 virtual uint32 ShowDropContextMenu(BPoint); 108 virtual void MenusBeginning(); 109 virtual void MenusEnded(); 110 virtual void MessageReceived(BMessage*); 111 virtual void FrameResized(float, float); 112 virtual void FrameMoved(BPoint); 113 virtual void Zoom(BPoint, float, float); 114 virtual void WorkspacesChanged(uint32, uint32); 115 116 // virtuals that control setup of window 117 virtual bool ShouldAddMenus() const; 118 virtual bool ShouldAddScrollBars() const; 119 virtual bool ShouldAddCountView() const; 120 121 virtual void CheckScreenIntersect(); 122 123 bool IsTrash() const; 124 bool InTrash() const; 125 bool IsPrintersDir() const; 126 127 virtual bool IsShowing(const node_ref*) const; 128 virtual bool IsShowing(const entry_ref*) const; 129 130 void ResizeToFit(); 131 132 Model* TargetModel() const; 133 BPoseView* PoseView() const; 134 BNavigator* Navigator() const; 135 136 virtual void SelectionChanged(); 137 virtual void ViewModeChanged(uint32 oldMode, uint32 newMode); 138 139 virtual void RestoreState(); 140 virtual void RestoreState(const BMessage &); 141 void RestoreStateCommon(); 142 virtual void SaveState(bool hide = true); 143 virtual void SaveState(BMessage &) const; 144 void UpdateTitle(); 145 146 bool StateNeedsSaving() const; 147 bool SaveStateIsEnabled() const; 148 void SetSaveStateEnabled(bool); 149 150 void UpdateBackgroundImage(); 151 152 static status_t GetLayoutState(BNode*, BMessage*); 153 static status_t SetLayoutState(BNode*, const BMessage*); 154 // calls for inheriting window size, attribute layout, etc. 155 // deprecated 156 157 virtual void AddMimeTypesToMenu(BMenu*); 158 void AddMimeTypesToMenu(); 159 virtual void MarkAttributeMenu(BMenu*); 160 void MarkAttributeMenu(); 161 void MarkArrangeByMenu(BMenu*); 162 BMenuItem* NewAttributeMenuItem(const char* label, const char* name, 163 int32 type, float width, int32 align, bool editable, 164 bool statField); 165 BMenuItem* NewAttributeMenuItem(const char* label, const char* name, 166 int32 type, const char* displayAs, float width, int32 align, 167 bool editable, bool statField); 168 virtual void NewAttributeMenu(BMenu*); 169 170 void HideAttributeMenu(); 171 void ShowAttributeMenu(); 172 PiggybackTaskLoop* DelayedTaskLoop(); 173 // use for RunLater queueing 174 void PulseTaskLoop(); 175 // called by some view that has pulse, either BackgroundView 176 // or BPoseView 177 178 static bool DefaultStateSourceNode(const char* name, BNode* result, 179 bool createNew = false, bool createFolder = true); 180 181 // add-on iteration 182 void EachAddon(bool (*)(const Model*, const char*, uint32 shortcut, 183 uint32 modifiers, bool primary, void*), void*, 184 BObjectList<BString> &); 185 186 BPopUpMenu* ContextMenu(); 187 188 // drag&drop support 189 status_t DragStart(const BMessage*); 190 void DragStop(); 191 bool Dragging() const; 192 BMessage* DragMessage() const; 193 194 void ShowSelectionWindow(); 195 196 void ShowNavigator(bool); 197 void SetSingleWindowBrowseShortcuts(bool); 198 199 void SetPathWatchingEnabled(bool); 200 bool IsPathWatchingEnabled(void) const; 201 202 protected: 203 virtual BPoseView* NewPoseView(Model*, BRect, uint32); 204 // instantiate a different flavor of BPoseView for different 205 // ContainerWindows 206 207 virtual void RestoreWindowState(AttributeStreamNode*); 208 virtual void RestoreWindowState(const BMessage &); 209 virtual void SaveWindowState(AttributeStreamNode*); 210 virtual void SaveWindowState(BMessage&) const; 211 212 virtual bool NeedsDefaultStateSetup(); 213 virtual void SetUpDefaultState(); 214 // these two virtuals control setting up a new folder that 215 // does not have any state settings yet with the default 216 217 virtual void AddMenus(); 218 virtual void AddShortcuts(); 219 // add equivalents of the menu shortcuts to the menuless 220 // desktop window 221 virtual void AddFileMenu(BMenu* menu); 222 virtual void AddWindowMenu(BMenu* menu); 223 224 virtual void AddContextMenus(); 225 226 virtual void AddFileContextMenus(BMenu*); 227 virtual void AddWindowContextMenus(BMenu*); 228 virtual void AddVolumeContextMenus(BMenu*); 229 virtual void AddDropContextMenus(BMenu*); 230 virtual void AddTrashContextMenus(BMenu*); 231 232 virtual void RepopulateMenus(); 233 void PopulateArrangeByMenu(BMenu*); 234 235 virtual void SetCutItem(BMenu*); 236 virtual void SetCopyItem(BMenu*); 237 virtual void SetPasteItem(BMenu*); 238 virtual void SetArrangeMenu(BMenu*); 239 virtual void SetCloseItem(BMenu*); 240 virtual void SetupNavigationMenu(const entry_ref*, BMenu*); 241 virtual void SetupMoveCopyMenus(const entry_ref*, BMenu*); 242 virtual void PopulateMoveCopyNavMenu(BNavMenu*, uint32, 243 const entry_ref*, bool); 244 245 virtual void SetupOpenWithMenu(BMenu*); 246 virtual void SetUpEditQueryItem(BMenu*); 247 virtual void SetUpDiskMenu(BMenu*); 248 249 virtual void BuildAddOnMenu(BMenu*); 250 void BuildMimeTypeList(BObjectList<BString>& mimeTypes); 251 252 enum UpdateMenuContext { 253 kMenuBarContext, 254 kPosePopUpContext, 255 kWindowPopUpContext 256 }; 257 258 virtual void UpdateMenu(BMenu* menu, UpdateMenuContext context); 259 260 BMenu* AddMimeMenu(const BMimeType& mimeType, bool isSuperType, 261 BMenu* menu, int32 start); 262 263 BHandler* ResolveSpecifier(BMessage*, int32, BMessage*, int32, 264 const char*); 265 266 bool EachAddon(BPath &path, 267 bool (*)(const Model*, const char*, uint32, bool, void*), 268 BObjectList<Model>*, void*, BObjectList<BString> &); 269 void LoadAddOn(BMessage*); 270 271 BPopUpMenu* fFileContextMenu; 272 BPopUpMenu* fWindowContextMenu; 273 BPopUpMenu* fDropContextMenu; 274 BPopUpMenu* fVolumeContextMenu; 275 BPopUpMenu* fTrashContextMenu; 276 BSlowContextMenu* fDragContextMenu; 277 BMenuItem* fMoveToItem; 278 BMenuItem* fCopyToItem; 279 BMenuItem* fCreateLinkItem; 280 BMenuItem* fOpenWithItem; 281 ModelMenuItem* fNavigationItem; 282 BMenuBar* fMenuBar; 283 BNavigator* fNavigator; 284 BPoseView* fPoseView; 285 LockingList<BWindow>* fWindowList; 286 BMenu* fAttrMenu; 287 BMenu* fWindowMenu; 288 BMenu* fFileMenu; 289 BMenu* fArrangeByMenu; 290 291 SelectionWindow* fSelectionWindow; 292 293 PiggybackTaskLoop* fTaskLoop; 294 295 bool fIsTrash; 296 bool fInTrash; 297 bool fIsPrinters; 298 299 uint32 fContainerWindowFlags; 300 BackgroundImage* fBackgroundImage; 301 302 static LockingList<struct AddonShortcut>* fAddonsList; 303 304 private: 305 BRect fSavedZoomRect; 306 BRect fPreviousBounds; 307 308 static BRect sNewWindRect; 309 310 BPopUpMenu* fContextMenu; 311 BMessage* fDragMessage; 312 BObjectList<BString>* fCachedTypesList; 313 bool fWaitingForRefs; 314 315 bool fStateNeedsSaving; 316 bool fSaveStateIsEnabled; 317 318 bool fIsWatchingPath; 319 320 typedef BWindow _inherited; 321 322 friend int32 show_context_menu(void*); 323 friend class BackgroundView; 324 325 void _UpdateSelectionMIMEInfo(); 326 }; 327 328 class WindowStateNodeOpener { 329 // this class manages opening and closing the proper node for 330 // state restoring / saving; the constructor knows how to decide whether 331 // to use a special directory for root, etc. 332 // setter calls used when no attributes can be read from a node and 333 // defaults are to be substituted 334 public: 335 WindowStateNodeOpener(BContainerWindow* window, bool forWriting); 336 virtual ~WindowStateNodeOpener(); 337 338 void SetTo(const BDirectory*); 339 void SetTo(const BEntry* entry, bool forWriting); 340 void SetTo(Model*, bool forWriting); 341 342 AttributeStreamNode* StreamNode() const; 343 BNode* Node() const; 344 345 private: 346 ModelNodeLazyOpener* fModelOpener; 347 BNode* fNode; 348 AttributeStreamNode* fStreamNode; 349 }; 350 351 class BackgroundView : public BView { 352 // background view placed in a BContainerWindow, under the pose view 353 public: 354 BackgroundView(BRect); 355 virtual void AttachedToWindow(); 356 virtual void FrameResized(float, float); 357 virtual void Draw(BRect); 358 359 void PoseViewFocused(bool); 360 virtual void Pulse(); 361 362 protected: 363 virtual void WindowActivated(bool); 364 365 private: 366 typedef BView _inherited; 367 }; 368 369 int CompareLabels(const BMenuItem*, const BMenuItem*); 370 371 // inlines --------- 372 373 inline BNavigator* 374 BContainerWindow::Navigator() const 375 { 376 return fNavigator; 377 } 378 379 inline BPoseView* 380 BContainerWindow::PoseView() const 381 { 382 return fPoseView; 383 } 384 385 inline bool 386 BContainerWindow::IsTrash() const 387 { 388 return fIsTrash; 389 } 390 391 inline bool 392 BContainerWindow::InTrash() const 393 { 394 return fInTrash; 395 } 396 397 inline bool 398 BContainerWindow::IsPrintersDir() const 399 { 400 return fIsPrinters; 401 } 402 403 inline void 404 BContainerWindow::SetUpDiskMenu(BMenu*) 405 { 406 // nothing at this level 407 } 408 409 inline BPopUpMenu* 410 BContainerWindow::ContextMenu() 411 { 412 return fContextMenu; 413 } 414 415 inline bool 416 BContainerWindow::Dragging() const 417 { 418 return fDragMessage && fCachedTypesList; 419 } 420 421 inline BMessage* 422 BContainerWindow::DragMessage() const 423 { 424 return fDragMessage; 425 } 426 inline 427 bool 428 BContainerWindow::SaveStateIsEnabled() const 429 { 430 return fSaveStateIsEnabled; 431 } 432 433 inline 434 void 435 BContainerWindow::SetSaveStateEnabled(bool value) 436 { 437 fSaveStateIsEnabled = value; 438 } 439 440 inline 441 bool 442 BContainerWindow::IsPathWatchingEnabled() const 443 { 444 return fIsWatchingPath; 445 } 446 447 filter_result ActivateWindowFilter(BMessage* message, BHandler** target, 448 BMessageFilter* messageFilter); 449 450 } // namespace BPrivate 451 452 using namespace BPrivate; 453 454 #endif 455