xref: /haiku/src/kits/tracker/FilePanelPriv.h (revision 445d4fd926c569e7b9ae28017da86280aaecbae2)
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 _FILE_PANEL_PRIV_H
35 #define _FILE_PANEL_PRIV_H
36 
37 
38 #include <FilePanel.h>
39 
40 #include "ContainerWindow.h"
41 #include "PoseView.h"
42 #include "TaskLoop.h"
43 
44 
45 class BTextControl;
46 class BFilePanel;
47 class BRefFilter;
48 class BMessenger;
49 class BMenuField;
50 
51 namespace BPrivate {
52 
53 class BorderedView;
54 class BDirMenu;
55 class AttributeStreamNode;
56 class BFilePanelPoseView;
57 
58 class TFilePanel : public BContainerWindow {
59 public:
60 	TFilePanel(file_panel_mode = B_OPEN_PANEL,
61 		BMessenger* target = NULL, const BEntry* startDirectory = NULL,
62 		uint32 nodeFlavors = B_FILE_NODE | B_SYMLINK_NODE,
63 		bool multipleSelection = true, BMessage* = NULL, BRefFilter* = NULL,
64 		uint32 containerWindowFlags = 0,
65 		window_look look = B_DOCUMENT_WINDOW_LOOK,
66 		window_feel feel = B_NORMAL_WINDOW_FEEL,
67 		bool hideWhenDone = true);
68 
69 	virtual ~TFilePanel();
70 
71 	BFilePanelPoseView* PoseView() const;
72 
73 	virtual bool QuitRequested();
74 	virtual void MenusBeginning();
75 	virtual void MenusEnded();
76 	virtual void DispatchMessage(BMessage* message, BHandler* handler);
77 	virtual void ShowContextMenu(BPoint, const entry_ref*);
78 
79 	void SetClientObject(BFilePanel*);
80 	void SetRefFilter(BRefFilter*);
81 	void SetNodeFlavors(uint32 nodeFlavors) { fNodeFlavors = nodeFlavors; }
82 	void SetSaveText(const char* text);
83 	void SetButtonLabel(file_panel_button, const char* text);
84 	void SetTo(const entry_ref* ref);
85 	virtual void SelectionChanged();
86 	void HandleOpenButton();
87 	void HandleSaveButton();
88 	void Rewind();
89 	bool IsSavePanel() const;
90 	void Refresh();
91 	const BMessenger* Target() const;
92 	BRefFilter* Filter() const;
93 
94 	void SetTarget(BMessenger);
95 	void SetMessage(BMessage* message);
96 
97 	virtual status_t GetNextEntryRef(entry_ref*);
98 	virtual void MessageReceived(BMessage*);
99 
100 	void SetHideWhenDone(bool);
101 	bool HidesWhenDone(void);
102 
103 	bool TrackingMenu() const;
104 
105 	// Returns false if RestoreState has not run or if it failed to find
106 	// a default state file the last time it ran.
107 	bool DefaultStateRestored() const { return fDefaultStateRestored; }
108 
109 protected:
110 	BPoseView* NewPoseView(Model* model, uint32);
111 	virtual void Init(const BMessage* message = NULL);
112 	virtual void SaveState(bool hide = true);
113 	virtual void SaveState(BMessage &) const;
114 	virtual void RestoreState();
115 	virtual void RestoreWindowState(AttributeStreamNode*);
116 	virtual void RestoreWindowState(const BMessage&);
117 	virtual void RestoreState(const BMessage&);
118 
119 	virtual void AddFileContextMenus(BMenu*);
120 	virtual void AddVolumeContextMenus(BMenu*);
121 	virtual void AddWindowContextMenus(BMenu*);
122 	virtual void AddDropContextMenus(BMenu*);
123 
124 	virtual void SetupNavigationMenu(const entry_ref*, BMenu*);
125 	virtual void OpenDirectory();
126 	virtual void OpenParent();
127 	virtual void WindowActivated(bool state);
128 
129 	static filter_result FSFilter(BMessage*, BHandler**, BMessageFilter*);
130 	static filter_result MessageDropFilter(BMessage*, BHandler**,
131 		BMessageFilter*);
132 
133 	int32 ShowCenteredAlert(const char* text, const char* button1,
134 		const char* button2 = NULL, const char* button3 = NULL);
135 
136 private:
137 	bool SwitchDirToDesktopIfNeeded(entry_ref &ref);
138 	bool CanOpenParent() const;
139 	void SwitchDirMenuTo(const entry_ref* ref);
140 	void AdjustButton();
141 	bool SelectChildInParent(const entry_ref* parent, const node_ref* child);
142 	void OpenSelectionCommon(BMessage*);
143 	bool IsOpenButtonAlwaysEnabled() const;
144 
145 	bool fIsSavePanel;
146 	uint32 fNodeFlavors;
147 	BView* fBackView;
148 	BDirMenu* fDirMenu;
149 	BMenuField* fDirMenuField;
150 	BTextControl* fTextControl;
151 	BMessenger fTarget;
152 	BFilePanel* fClientObject;
153 	int32 fSelectionIterator;
154 	BMessage* fMessage;
155 	BString fButtonText;
156 	bool fHideWhenDone;
157 	bool fIsTrackingMenu;
158 	bool fDefaultStateRestored;
159 
160 	typedef BContainerWindow _inherited;
161 };
162 
163 
164 class BFilePanelPoseView : public BPoseView {
165 public:
166 	BFilePanelPoseView(Model*);
167 
168 	virtual bool IsFilePanel() const;
169 	virtual bool FSNotification(const BMessage*);
170 
171 	void SetIsDesktop(bool);
172 
173 protected:
174 	// don't do any volume watching and memtamime watching in file panels
175 	// for now
176 	virtual void StartWatching();
177 	virtual void StopWatching();
178 
179 	virtual void RestoreState(AttributeStreamNode*);
180 	virtual void RestoreState(const BMessage &);
181 	virtual void SavePoseLocations(BRect* = NULL);
182 
183 	virtual EntryListBase* InitDirentIterator(const entry_ref*);
184 	virtual void AddPosesCompleted();
185 	virtual bool IsDesktopView() const;
186 
187 	void ShowVolumes(bool visible, bool showShared);
188 
189 	void AdaptToVolumeChange(BMessage*);
190 	void AdaptToDesktopIntegrationChange(BMessage*);
191 
192 private:
193 	bool fIsDesktop;
194 		// This flags makes the distinction between the Desktop as
195 		// the root of the world and "/boot/home/Desktop" to which
196 		// we might have navigated from the home dir.
197 
198 	typedef BPoseView _inherited;
199 };
200 
201 
202 // inlines follow
203 
204 inline bool
205 BFilePanelPoseView::IsFilePanel() const
206 {
207 	return true;
208 }
209 
210 
211 inline bool
212 TFilePanel::IsSavePanel() const
213 {
214 	return fIsSavePanel;
215 }
216 
217 
218 inline const BMessenger*
219 TFilePanel::Target() const
220 {
221 	return &fTarget;
222 }
223 
224 
225 inline void
226 TFilePanel::Refresh()
227 {
228 	fPoseView->Refresh();
229 }
230 
231 
232 inline bool
233 TFilePanel::HidesWhenDone(void)
234 {
235 	return fHideWhenDone;
236 }
237 
238 
239 inline void
240 TFilePanel::SetHideWhenDone(bool on)
241 {
242 	fHideWhenDone = on;
243 }
244 
245 
246 inline bool
247 TFilePanel::TrackingMenu() const
248 {
249 	return fIsTrackingMenu;
250 }
251 
252 } // namespace BPrivate
253 
254 using namespace BPrivate;
255 
256 
257 #endif	// _FILE_PANEL_PRIV_H
258