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