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