1#include "AddPrinterDlg.h" 2 3#include <GroupLayoutBuilder.h> 4 5#include "PrinterCap.h" 6#include "PrinterData.h" 7 8 9enum MSGS { 10 kMsgCancel = 1, 11 kMsgOK, 12 kMsgProtocolClassChanged, 13}; 14 15 16ProtocolClassItem::ProtocolClassItem(const ProtocolClassCap* cap) 17 : BStringItem(cap->fLabel.c_str()) 18 , fProtocolClassCap(cap) 19{ 20} 21 22 23int 24ProtocolClassItem::GetProtocolClass() const 25{ 26 return fProtocolClassCap->fProtocolClass; 27} 28 29const char * 30ProtocolClassItem::GetDescription() const 31{ 32 return fProtocolClassCap->fDescription.c_str(); 33} 34 35 36AddPrinterView::AddPrinterView(PrinterData* printerData, 37 const PrinterCap* printerCap) 38 : 39 BView("addPrinter", B_WILL_DRAW), 40 fPrinterData(printerData), 41 fPrinterCap(printerCap) 42{ 43} 44 45 46AddPrinterView::~AddPrinterView() 47{ 48} 49 50 51void 52AddPrinterView::AttachedToWindow() 53{ 54 // protocol class box 55 BBox* protocolClassBox = new BBox("protocolClass"); 56 protocolClassBox->SetLabel("Protocol classes:"); 57 58 // protocol class 59 fProtocolClassList = new BListView("protocolClassList"); 60 fProtocolClassList->SetExplicitMinSize(BSize(500, 200)); 61 BScrollView* protocolClassScroller = new BScrollView( 62 "protocolClassListScroller", 63 fProtocolClassList, 64 0, 65 false, 66 true, 67 B_NO_BORDER); 68 fProtocolClassList->SetSelectionMessage( 69 new BMessage(kMsgProtocolClassChanged)); 70 fProtocolClassList->SetTarget(this); 71 72 protocolClassBox->AddChild(protocolClassScroller); 73 74 int count = fPrinterCap->CountCap(PrinterCap::kProtocolClass); 75 ProtocolClassCap **protocolClasses = 76 (ProtocolClassCap **)fPrinterCap->GetCaps(PrinterCap::kProtocolClass); 77 while (count--) { 78 const ProtocolClassCap *protocolClass = *protocolClasses; 79 80 BStringItem* item = new ProtocolClassItem(protocolClass); 81 fProtocolClassList->AddItem(item); 82 if (protocolClass->fIsDefault) { 83 int index = fProtocolClassList->IndexOf(item); 84 fProtocolClassList->Select(index); 85 } 86 protocolClasses ++; 87 } 88 89 // description of protocol class box 90 BBox* descriptionBox = new BBox("descriptionBox"); 91 descriptionBox->SetLabel("Description:"); 92 93 // description of protocol class 94 fDescription = new BTextView("description"); 95 fDescription->SetExplicitMinSize(BSize(200, 200)); 96 fDescription->SetViewColor(descriptionBox->ViewColor()); 97 BScrollView* descriptionScroller = new BScrollView("descriptionScroller", 98 fDescription, 99 0, 100 false, 101 true, 102 B_NO_BORDER); 103 fDescription->MakeEditable(false); 104 105 descriptionBox->AddChild(descriptionScroller); 106 107 // separator line 108 BBox *separator = new BBox("separator"); 109 separator->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1)); 110 111 // buttons 112 BButton* cancel = new BButton("cancel", "Cancel", 113 new BMessage(kMsgCancel)); 114 BButton* ok = new BButton("ok", "OK", new BMessage(kMsgOK)); 115 ok->MakeDefault(true); 116 117 SetLayout(new BGroupLayout(B_VERTICAL)); 118 AddChild(BGroupLayoutBuilder(B_VERTICAL, 0) 119 .Add(protocolClassBox) 120 .Add(descriptionBox) 121 .AddGlue() 122 .Add(separator) 123 .AddGroup(B_HORIZONTAL, 10, 1.0f) 124 .AddGlue() 125 .Add(cancel) 126 .Add(ok) 127 .End() 128 .SetInsets(0, 0, 0, 0) 129 ); 130 131 132 // update description 133 BMessage updateDescription(kMsgProtocolClassChanged); 134 MessageReceived(&updateDescription); 135} 136 137 138ProtocolClassItem* 139AddPrinterView::CurrentSelection() 140{ 141 int selected = fProtocolClassList->CurrentSelection(); 142 if (selected >= 0) { 143 return (ProtocolClassItem*)fProtocolClassList->ItemAt(selected); 144 } 145 return NULL; 146} 147 148 149void 150AddPrinterView::MessageReceived(BMessage* msg) 151{ 152 if (msg->what == kMsgProtocolClassChanged) { 153 ProtocolClassItem *item = CurrentSelection(); 154 if (item != NULL) { 155 fDescription->SetText(item->GetDescription()); 156 } 157 } else { 158 BView::MessageReceived(msg); 159 } 160} 161 162 163void 164AddPrinterView::Save() 165{ 166 ProtocolClassItem* item = CurrentSelection(); 167 if (item != NULL) { 168 fPrinterData->SetProtocolClass(item->GetProtocolClass()); 169 fPrinterData->Save(); 170 } 171} 172 173 174AddPrinterDlg::AddPrinterDlg(PrinterData* printerData, 175 const PrinterCap *printerCap) 176 : 177 DialogWindow(BRect(100, 100, 120, 120), 178 "Add printer", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL, 179 B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS 180 | B_AUTO_UPDATE_SIZE_LIMITS) 181{ 182 SetResult(B_ERROR); 183 184 fAddPrinterView = new AddPrinterView(printerData, printerCap); 185 SetLayout(new BGroupLayout(B_VERTICAL)); 186 AddChild(BGroupLayoutBuilder(B_VERTICAL, 0) 187 .Add(fAddPrinterView) 188 .SetInsets(10, 10, 10, 10) 189 ); 190} 191 192 193void 194AddPrinterDlg::MessageReceived(BMessage* msg) 195{ 196 switch (msg->what) { 197 case kMsgOK: 198 fAddPrinterView->Save(); 199 SetResult(B_NO_ERROR); 200 PostMessage(B_QUIT_REQUESTED); 201 break; 202 203 case kMsgCancel: 204 PostMessage(B_QUIT_REQUESTED); 205 break; 206 207 default: 208 DialogWindow::MessageReceived(msg); 209 break; 210 } 211} 212