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	_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
45class BTextControl;
46class BFilePanel;
47class BRefFilter;
48class BMessenger;
49class BMenuField;
50
51namespace BPrivate {
52
53class BackgroundView;
54class BDirMenu;
55class AttributeStreamNode;
56class BFilePanelPoseView;
57
58class TFilePanel : public BContainerWindow {
59public:
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*, BView*);
78
79			void SetClientObject(BFilePanel*);
80			void SetRefFilter(BRefFilter*);
81			void SetSaveText(const char* text);
82			void SetButtonLabel(file_panel_button, const char* text);
83			void SetTo(const entry_ref* ref);
84	virtual	void SelectionChanged();
85			void HandleOpenButton();
86			void HandleSaveButton();
87			void Rewind();
88			bool IsSavePanel() const;
89			void Refresh();
90			const BMessenger* Target() const;
91	BRefFilter* Filter() const;
92
93	void SetTarget(BMessenger);
94	void SetMessage(BMessage* message);
95
96	virtual	status_t GetNextEntryRef(entry_ref*);
97	virtual	void MessageReceived(BMessage*);
98
99	void SetHideWhenDone(bool);
100	bool HidesWhenDone(void);
101
102	bool TrackingMenu() const;
103
104protected:
105	BPoseView* NewPoseView(Model* model, BRect rect, uint32 viewMode);
106	virtual	void Init(const BMessage* message = NULL);
107	virtual	void SaveState(bool hide = true);
108	virtual	void SaveState(BMessage &) const;
109	virtual void RestoreState();
110	virtual void RestoreWindowState(AttributeStreamNode*);
111	virtual void RestoreWindowState(const BMessage&);
112	virtual void RestoreState(const BMessage&);
113
114	virtual	void AddFileContextMenus(BMenu*);
115	virtual	void AddWindowContextMenus(BMenu*);
116	virtual	void AddDropContextMenus(BMenu*);
117	virtual	void AddVolumeContextMenus(BMenu*);
118
119	virtual	void SetupNavigationMenu(const entry_ref*, BMenu*);
120	virtual	void OpenDirectory();
121	virtual	void OpenParent();
122	virtual	void WindowActivated(bool state);
123
124	static	filter_result FSFilter(BMessage*, BHandler**, BMessageFilter*);
125	static	filter_result MessageDropFilter(BMessage*, BHandler**,
126		BMessageFilter*);
127
128			int32 ShowCenteredAlert(const char* text, const char* button1,
129				const char* button2 = NULL, const char* button3 = NULL);
130
131private:
132			bool SwitchDirToDesktopIfNeeded(entry_ref &ref);
133			bool CanOpenParent() const;
134			void SwitchDirMenuTo(const entry_ref* ref);
135			void AdjustButton();
136			bool SelectChildInParent(const entry_ref* parent,
137				const node_ref* child);
138			void OpenSelectionCommon(BMessage*);
139
140			bool			fIsSavePanel;
141			uint32			fNodeFlavors;
142			BackgroundView*	fBackView;
143			BDirMenu*		fDirMenu;
144			BMenuField*		fDirMenuField;
145			BTextControl*	fTextControl;
146			BMessenger		fTarget;
147			BFilePanel*		fClientObject;
148			int32			fSelectionIterator;
149			BMessage*		fMessage;
150			BString			fButtonText;
151			bool			fHideWhenDone;
152			bool			fIsTrackingMenu;
153
154			typedef BContainerWindow _inherited;
155
156			friend class BackgroundView;
157};
158
159
160class BFilePanelPoseView : public BPoseView {
161public:
162	BFilePanelPoseView(Model*, BRect, uint32 resizeMask = B_FOLLOW_ALL);
163
164	virtual bool IsFilePanel() const;
165	virtual bool FSNotification(const BMessage*);
166
167	void SetIsDesktop(bool);
168
169protected:
170	// don't do any volume watching and memtamime watching in file panels
171	// for now
172	virtual	void StartWatching();
173	virtual	void StopWatching();
174
175	virtual	void RestoreState(AttributeStreamNode*);
176	virtual	void RestoreState(const BMessage &);
177	virtual	void SavePoseLocations(BRect* = NULL);
178
179	virtual	EntryListBase* InitDirentIterator(const entry_ref*);
180	virtual	void AddPosesCompleted();
181	virtual	bool IsDesktopView() const;
182
183			void ShowVolumes(bool visible, bool showShared);
184
185			void AdaptToVolumeChange(BMessage*);
186			void AdaptToDesktopIntegrationChange(BMessage*);
187
188private:
189			bool fIsDesktop;
190				// This flags makes the distinction between the Desktop as
191				// the root of the world and "/boot/home/Desktop" to which
192				// we might have navigated from the home dir.
193
194			typedef BPoseView _inherited;
195};
196
197
198// inlines follow
199
200inline bool
201BFilePanelPoseView::IsFilePanel() const
202{
203	return true;
204}
205
206
207inline bool
208TFilePanel::IsSavePanel() const
209{
210	return fIsSavePanel;
211}
212
213
214inline const BMessenger*
215TFilePanel::Target() const
216{
217	return &fTarget;
218}
219
220
221inline void
222TFilePanel::Refresh()
223{
224	fPoseView->Refresh();
225}
226
227
228inline bool
229TFilePanel::HidesWhenDone(void)
230{
231	return fHideWhenDone;
232}
233
234
235inline void
236TFilePanel::SetHideWhenDone(bool on)
237{
238	fHideWhenDone = on;
239}
240
241
242inline bool
243TFilePanel::TrackingMenu() const
244{
245	return fIsTrackingMenu;
246}
247
248} // namespace BPrivate
249
250using namespace BPrivate;
251
252#endif
253