xref: /haiku/src/kits/tracker/FilePanelPriv.h (revision 106388ddbfdd00f4409c86bd3fe8d581bae532ec)
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 
144 	bool fIsSavePanel;
145 	uint32 fNodeFlavors;
146 	BView* fBackView;
147 	BDirMenu* fDirMenu;
148 	BMenuField* fDirMenuField;
149 	BTextControl* fTextControl;
150 	BMessenger fTarget;
151 	BFilePanel* fClientObject;
152 	int32 fSelectionIterator;
153 	BMessage* fMessage;
154 	BString fButtonText;
155 	bool fHideWhenDone;
156 	bool fIsTrackingMenu;
157 	bool fDefaultStateRestored;
158 
159 	typedef BContainerWindow _inherited;
160 };
161 
162 
163 class BFilePanelPoseView : public BPoseView {
164 public:
165 	BFilePanelPoseView(Model*);
166 
167 	virtual bool IsFilePanel() const;
168 	virtual bool FSNotification(const BMessage*);
169 
170 	void SetIsDesktop(bool);
171 
172 protected:
173 	// don't do any volume watching and memtamime watching in file panels
174 	// for now
175 	virtual void StartWatching();
176 	virtual void StopWatching();
177 
178 	virtual void RestoreState(AttributeStreamNode*);
179 	virtual void RestoreState(const BMessage &);
180 	virtual void SavePoseLocations(BRect* = NULL);
181 
182 	virtual EntryListBase* InitDirentIterator(const entry_ref*);
183 	virtual void AddPosesCompleted();
184 	virtual bool IsDesktopView() const;
185 
186 	void ShowVolumes(bool visible, bool showShared);
187 
188 	void AdaptToVolumeChange(BMessage*);
189 	void AdaptToDesktopIntegrationChange(BMessage*);
190 
191 private:
192 	bool fIsDesktop;
193 		// This flags makes the distinction between the Desktop as
194 		// the root of the world and "/boot/home/Desktop" to which
195 		// we might have navigated from the home dir.
196 
197 	typedef BPoseView _inherited;
198 };
199 
200 
201 // inlines follow
202 
203 inline bool
204 BFilePanelPoseView::IsFilePanel() const
205 {
206 	return true;
207 }
208 
209 
210 inline bool
211 TFilePanel::IsSavePanel() const
212 {
213 	return fIsSavePanel;
214 }
215 
216 
217 inline const BMessenger*
218 TFilePanel::Target() const
219 {
220 	return &fTarget;
221 }
222 
223 
224 inline void
225 TFilePanel::Refresh()
226 {
227 	fPoseView->Refresh();
228 }
229 
230 
231 inline bool
232 TFilePanel::HidesWhenDone(void)
233 {
234 	return fHideWhenDone;
235 }
236 
237 
238 inline void
239 TFilePanel::SetHideWhenDone(bool on)
240 {
241 	fHideWhenDone = on;
242 }
243 
244 
245 inline bool
246 TFilePanel::TrackingMenu() const
247 {
248 	return fIsTrackingMenu;
249 }
250 
251 } // namespace BPrivate
252 
253 using namespace BPrivate;
254 
255 
256 #endif	// _FILE_PANEL_PRIV_H
257