1/* 2 * Copyright 2009 Ankur Sethi <get.me.ankur@gmail.com> 3 * Copyright 2004-2011, Axel D��rfler, axeld@pinc-software.de. 4 * All rights reserved. Distributed under the terms of the MIT License. 5 */ 6 7 8#include "OpenWindow.h" 9 10#include <Application.h> 11#include <Button.h> 12#include <Catalog.h> 13#include <Directory.h> 14#include <Entry.h> 15#include <GroupLayout.h> 16#include <GridLayoutBuilder.h> 17#include <Locale.h> 18#include <MenuField.h> 19#include <MenuItem.h> 20#include <Path.h> 21#include <PopUpMenu.h> 22#include <Screen.h> 23 24#include "DiskProbe.h" 25 26 27#undef B_TRANSLATION_CONTEXT 28#define B_TRANSLATION_CONTEXT "OpenWindow" 29 30static const uint32 kMsgProbeFile = 'prDv'; 31static const uint32 kMsgProbeDevice = 'prFl'; 32 33 34OpenWindow::OpenWindow() 35 : 36 BWindow(BRect(0, 0, 35, 10), B_TRANSLATE_SYSTEM_NAME("DiskProbe"), 37 B_TITLED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE 38 | B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS) 39{ 40 fDevicesMenu = new BPopUpMenu("devices"); 41 CollectDevices(fDevicesMenu); 42 if (BMenuItem *item = fDevicesMenu->ItemAt(0)) 43 item->SetMarked(true); 44 45 BMenuField *field = new BMenuField(B_TRANSLATE("Examine device:"), 46 fDevicesMenu); 47 48 BButton *probeDeviceButton = new BButton("device", 49 B_TRANSLATE("Probe device"), new BMessage(kMsgProbeDevice)); 50 probeDeviceButton->MakeDefault(true); 51 52 BButton *probeFileButton = new BButton("file", 53 B_TRANSLATE("Probe file" B_UTF8_ELLIPSIS), 54 new BMessage(kMsgProbeFile)); 55 56 BButton *cancelButton = new BButton("cancel", B_TRANSLATE("Cancel"), 57 new BMessage(B_QUIT_REQUESTED)); 58 59 SetLayout(new BGroupLayout(B_HORIZONTAL)); 60 61 AddChild(BGridLayoutBuilder(8, 8) 62 .Add(field, 0, 0, 3) 63 .Add(cancelButton, 0, 1) 64 .Add(probeFileButton, 1, 1) 65 .Add(probeDeviceButton, 2, 1) 66 .SetInsets(8, 8, 8, 8) 67 ); 68 69 CenterOnScreen(); 70} 71 72 73OpenWindow::~OpenWindow() 74{ 75} 76 77 78void 79OpenWindow::MessageReceived(BMessage *message) 80{ 81 switch (message->what) { 82 case kMsgProbeDevice: { 83 BMenuItem *item = fDevicesMenu->FindMarked(); 84 if (item == NULL) 85 break; 86 87 be_app_messenger.SendMessage(item->Message()); 88 PostMessage(B_QUIT_REQUESTED); 89 break; 90 } 91 92 case kMsgProbeFile: 93 be_app_messenger.SendMessage(kMsgOpenFilePanel); 94 PostMessage(B_QUIT_REQUESTED); 95 break; 96 97 case B_SIMPLE_DATA: { 98 // if it's a file drop, open it 99 entry_ref ref; 100 if (message->FindRef("refs", 0, &ref) == B_OK) { 101 BMessage openMessage(*message); 102 openMessage.what = B_REFS_RECEIVED; 103 104 be_app_messenger.SendMessage(&openMessage); 105 PostMessage(B_QUIT_REQUESTED); 106 } 107 break; 108 } 109 110 default: 111 BWindow::MessageReceived(message); 112 break; 113 } 114} 115 116 117bool 118OpenWindow::QuitRequested() 119{ 120 be_app_messenger.SendMessage(kMsgOpenWindowClosed); 121 return true; 122} 123 124 125void 126OpenWindow::CollectDevices(BMenu *menu, BEntry *startEntry) 127{ 128 BDirectory directory; 129 if (startEntry != NULL) 130 directory.SetTo(startEntry); 131 else 132 directory.SetTo("/dev/disk"); 133 134 BEntry entry; 135 while (directory.GetNextEntry(&entry) == B_OK) { 136 if (entry.IsDirectory()) { 137 CollectDevices(menu, &entry); 138 continue; 139 } 140 141 entry_ref ref; 142 if (entry.GetRef(&ref) != B_OK) 143 continue; 144 145 BPath path; 146 if (entry.GetPath(&path) != B_OK) 147 continue; 148 149 BMessage *message = new BMessage(B_REFS_RECEIVED); 150 message->AddRef("refs", &ref); 151 152 menu->AddItem(new BMenuItem(path.Path(), message)); 153 } 154} 155 156