xref: /haiku/src/kits/mail/FileConfigView.cpp (revision 579f1dbca962a2a03df54f69fdc6e9423f91f20e)
1 /* BMailFileConfigView - a file configuration view for filters
2 **
3 ** Copyright 2001 Dr. Zoidberg Enterprises. All rights reserved.
4 */
5 
6 
7 #include <stdio.h>
8 
9 #include <Button.h>
10 #include <Catalog.h>
11 #include <Message.h>
12 #include <Path.h>
13 #include <String.h>
14 #include <TextControl.h>
15 
16 #include <FileConfigView.h>
17 
18 
19 class _EXPORT BFileControl;
20 class _EXPORT BMailFileConfigView;
21 
22 
23 #undef B_TRANSLATION_CONTEXT
24 #define B_TRANSLATION_CONTEXT "MailKit"
25 
26 
27 const uint32 kMsgSelectButton = 'fsel';
28 
29 
30 BFileControl::BFileControl(BRect rect, const char* name, const char* label,
31 	const char *pathOfFile,uint32 flavors)
32 	:
33 	BView(rect, name, B_FOLLOW_LEFT | B_FOLLOW_TOP, 0)
34 {
35 	SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
36 
37 	// determine font height
38 	font_height fontHeight;
39 	GetFontHeight(&fontHeight);
40 	float itemHeight = (int32)(fontHeight.ascent + fontHeight.descent
41 		+ fontHeight.leading) + 13;
42 	BString selectString = B_TRANSLATE("Select" B_UTF8_ELLIPSIS);
43 	float labelWidth = StringWidth(selectString) + 20;
44 	rect = Bounds();
45 	rect.right -= labelWidth;
46 	rect.top = 4;
47 	rect.bottom = itemHeight + 2;
48 	fText = new BTextControl(rect,"file_path", label, pathOfFile, NULL);
49 	if (label)
50 		fText->SetDivider(fText->StringWidth(label) + 6);
51 	AddChild(fText);
52 
53 	fButton = new BButton(BRect(0, 0, 1, 1), "select_file", selectString,
54 		new BMessage(kMsgSelectButton));
55 	fButton->ResizeToPreferred();
56 	fButton->MoveBy(rect.right + 6,
57 		(rect.Height() - fButton->Frame().Height()) / 2);
58 	AddChild(fButton);
59 
60 	fPanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, flavors, false);
61 
62 	ResizeToPreferred();
63 }
64 
65 
66 BFileControl::~BFileControl()
67 {
68 	delete fPanel;
69 }
70 
71 
72 void
73 BFileControl::AttachedToWindow()
74 {
75 	fButton->SetTarget(this);
76 
77 	BMessenger messenger(this);
78 	if (messenger.IsValid())
79 		fPanel->SetTarget(messenger);
80 }
81 
82 
83 void
84 BFileControl::MessageReceived(BMessage* msg)
85 {
86 	switch (msg->what)
87 	{
88 		case kMsgSelectButton:
89 		{
90 			fPanel->Hide();
91 			//fPanel->Window()->SetTitle(title);
92 
93 			BPath path(fText->Text());
94 			if (path.InitCheck() >= B_OK)
95 				if (path.GetParent(&path) >= B_OK)
96 					fPanel->SetPanelDirectory(path.Path());
97 
98 			fPanel->Show();
99 			break;
100 		}
101 		case B_REFS_RECEIVED:
102 		{
103 			entry_ref ref;
104 			if (msg->FindRef("refs", &ref) >= B_OK)
105 			{
106 				BEntry entry(&ref);
107 				if (entry.InitCheck() >= B_OK)
108 				{
109 					BPath path;
110 					entry.GetPath(&path);
111 
112 					fText->SetText(path.Path());
113 				}
114 			}
115 			break;
116 		}
117 		default:
118 			BView::MessageReceived(msg);
119 			break;
120 	}
121 }
122 
123 
124 void
125 BFileControl::SetText(const char* pathOfFile)
126 {
127 	fText->SetText(pathOfFile);
128 }
129 
130 
131 const char*
132 BFileControl::Text() const
133 {
134 	return fText->Text();
135 }
136 
137 
138 void
139 BFileControl::SetEnabled(bool enabled)
140 {
141 	fText->SetEnabled(enabled);
142 	fButton->SetEnabled(enabled);
143 }
144 
145 
146 void
147 BFileControl::GetPreferredSize(float* width, float* height)
148 {
149 	*width = fButton->Frame().right + 5;
150 	*height = fText->Bounds().Height() + 8;
151 }
152 
153 
154 //--------------------------------------------------------------------------
155 //	#pragma mark -
156 
157 BMailFileConfigView::BMailFileConfigView(const char* label, const char*name,
158 	bool useMeta, const char* defaultPath, uint32 flavors)
159 	:
160 	BFileControl(BRect(5, 0, 255, 10), name, label, defaultPath, flavors),
161 	fUseMeta(useMeta),
162 	fName(name)
163 {
164 }
165 
166 
167 void
168 BMailFileConfigView::SetTo(const BMessage* archive, BMessage* meta)
169 {
170 	fMeta = meta;
171 	BString path = (fUseMeta ? meta : archive)->FindString(fName);
172 
173 	if (path != "")
174 		SetText(path.String());
175 }
176 
177 
178 status_t
179 BMailFileConfigView::Archive(BMessage* into, bool /*deep*/) const
180 {
181 	const char* path = Text();
182 	BMessage* archive = fUseMeta ? fMeta : into;
183 
184 	if (archive->ReplaceString(fName,path) != B_OK)
185 		archive->AddString(fName,path);
186 
187 	return B_OK;
188 }
189