1 #include "AddPrinterDlg.h" 2 3 #include "PrinterCap.h" 4 #include "PrinterData.h" 5 6 #define DIALOG_WIDTH 400 7 8 #define BUTTON_WIDTH 70 9 #define BUTTON_HEIGHT 20 10 #define TEXT_HEIGHT 16 11 12 #define BOX_TOP_INSET 18 13 #define BOX_BOTTOM_INSET 10 14 #define BOX_H_INSET 10 15 16 #define PROTOCOL_CLASS_BOX_H 10 17 #define PROTOCOL_CLASS_BOX_V 10 18 #define PROTOCOL_CLASS_BOX_WIDTH DIALOG_WIDTH - 20 19 #define PROTOCOL_CLASS_BOX_HEIGHT 125 20 21 #define PROTOCOL_CLASS_H BOX_H_INSET 22 #define PROTOCOL_CLASS_V BOX_TOP_INSET 23 #define PROTOCOL_CLASS_WIDTH PROTOCOL_CLASS_BOX_WIDTH - 2 * BOX_H_INSET 24 #define PROTOCOL_CLASS_HEIGHT PROTOCOL_CLASS_BOX_HEIGHT - BOX_TOP_INSET - BOX_BOTTOM_INSET 25 26 #define DESCRIPTION_BOX_H PROTOCOL_CLASS_BOX_H 27 #define DESCRIPTION_BOX_V PROTOCOL_CLASS_BOX_V + PROTOCOL_CLASS_BOX_HEIGHT + 10 28 #define DESCRIPTION_BOX_WIDTH PROTOCOL_CLASS_BOX_WIDTH 29 #define DESCRIPTION_BOX_HEIGHT 125 30 31 #define DESCRIPTION_H BOX_H_INSET 32 #define DESCRIPTION_V BOX_TOP_INSET 33 #define DESCRIPTION_WIDTH DESCRIPTION_BOX_WIDTH - 2 * BOX_H_INSET 34 #define DESCRIPTION_HEIGHT DESCRIPTION_BOX_HEIGHT - BOX_TOP_INSET - BOX_BOTTOM_INSET 35 36 #define DIALOG_HEIGHT DESCRIPTION_BOX_V + DESCRIPTION_BOX_HEIGHT + BUTTON_HEIGHT + 20 37 38 #define OK_H (DIALOG_WIDTH - BUTTON_WIDTH - 11) 39 #define OK_V (DIALOG_HEIGHT - BUTTON_HEIGHT - 11) 40 #define OK_TEXT "OK" 41 42 #define CANCEL_H (OK_H - BUTTON_WIDTH - 12) 43 #define CANCEL_V OK_V 44 #define CANCEL_TEXT "Cancel" 45 46 const BRect PROTOCOL_CLASS_BOX_RECT( 47 PROTOCOL_CLASS_BOX_H, 48 PROTOCOL_CLASS_BOX_V, 49 PROTOCOL_CLASS_BOX_H + PROTOCOL_CLASS_BOX_WIDTH , 50 PROTOCOL_CLASS_BOX_V + PROTOCOL_CLASS_BOX_HEIGHT); 51 52 const BRect PROTOCOL_CLASS_RECT( 53 PROTOCOL_CLASS_H, 54 PROTOCOL_CLASS_V, 55 PROTOCOL_CLASS_H + PROTOCOL_CLASS_WIDTH - B_V_SCROLL_BAR_WIDTH, 56 PROTOCOL_CLASS_V + PROTOCOL_CLASS_HEIGHT); 57 58 const BRect DESCRIPTION_BOX_RECT( 59 DESCRIPTION_BOX_H, 60 DESCRIPTION_BOX_V, 61 DESCRIPTION_BOX_H + DESCRIPTION_BOX_WIDTH, 62 DESCRIPTION_BOX_V + DESCRIPTION_BOX_HEIGHT); 63 64 const BRect DESCRIPTION_RECT( 65 DESCRIPTION_H, 66 DESCRIPTION_V, 67 DESCRIPTION_H + DESCRIPTION_WIDTH - B_V_SCROLL_BAR_WIDTH, 68 DESCRIPTION_V + DESCRIPTION_HEIGHT); 69 70 const BRect OK_RECT( 71 OK_H, 72 OK_V, 73 OK_H + BUTTON_WIDTH, 74 OK_V + BUTTON_HEIGHT); 75 76 const BRect CANCEL_RECT( 77 CANCEL_H, 78 CANCEL_V, 79 CANCEL_H + BUTTON_WIDTH, 80 CANCEL_V + BUTTON_HEIGHT); 81 82 83 enum MSGS { 84 kMsgCancel = 1, 85 kMsgOK, 86 kMsgProtocolClassChanged, 87 }; 88 89 ProtocolClassItem::ProtocolClassItem(const ProtocolClassCap* cap) 90 : BStringItem(cap->label.c_str()) 91 , fProtocolClassCap(cap) 92 { 93 } 94 95 int 96 ProtocolClassItem::getProtocolClass() 97 { 98 return fProtocolClassCap->protocolClass; 99 } 100 101 const char * 102 ProtocolClassItem::getDescription() 103 { 104 return fProtocolClassCap->description.c_str(); 105 } 106 107 108 AddPrinterView::AddPrinterView(BRect frame, PrinterData *printer_data, const PrinterCap *printer_cap) 109 : BView(frame, "", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS), fPrinterData(printer_data), fPrinterCap(printer_cap) 110 { 111 SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 112 } 113 114 AddPrinterView::~AddPrinterView() 115 { 116 } 117 118 void 119 AddPrinterView::AttachedToWindow() 120 { 121 /* protocol class box */ 122 BBox *box; 123 box = new BBox(PROTOCOL_CLASS_BOX_RECT, NULL, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); 124 box->SetLabel("Protocol Classes:"); 125 AddChild(box); 126 127 /* protocol class */ 128 fProtocolClassList = new BListView( 129 PROTOCOL_CLASS_RECT, 130 "protocolClassList", 131 B_SINGLE_SELECTION_LIST, 132 B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); 133 box->AddChild(new BScrollView( 134 "protocolClassListScroller", 135 fProtocolClassList, 136 B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, 137 0, 138 false, 139 true)); 140 fProtocolClassList->SetSelectionMessage(new BMessage(kMsgProtocolClassChanged)); 141 fProtocolClassList->SetTarget(this); 142 143 int count = fPrinterCap->countCap(PrinterCap::kProtocolClass); 144 ProtocolClassCap **protocolClasses = (ProtocolClassCap **)fPrinterCap->enumCap(PrinterCap::kProtocolClass); 145 while (count--) { 146 const ProtocolClassCap *protocolClass = *protocolClasses; 147 148 BStringItem* item = new ProtocolClassItem(protocolClass); 149 fProtocolClassList->AddItem(item); 150 if (protocolClass->is_default) { 151 int index = fProtocolClassList->IndexOf(item); 152 fProtocolClassList->Select(index); 153 } 154 protocolClasses ++; 155 } 156 157 /* description of protocol class box */ 158 box = new BBox(DESCRIPTION_BOX_RECT, NULL, B_FOLLOW_ALL_SIDES); 159 box->SetLabel("Description:"); 160 AddChild(box); 161 162 /* description of protocol class */ 163 BRect textRect(DESCRIPTION_RECT); 164 textRect.OffsetTo(0, 0); 165 fDescription = new BTextView(DESCRIPTION_RECT, "description", textRect, B_FOLLOW_ALL_SIDES, B_WILL_DRAW); 166 fDescription->SetViewColor(box->ViewColor()); 167 box->AddChild(new BScrollView("descriptionScroller", fDescription, 168 B_FOLLOW_ALL_SIDES, 0, false, true, B_NO_BORDER)); 169 fDescription->MakeEditable(false); 170 171 /* cancel */ 172 BButton *button; 173 button = new BButton(CANCEL_RECT, "", CANCEL_TEXT, new BMessage(kMsgCancel), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); 174 AddChild(button); 175 176 /* ok */ 177 178 button = new BButton(OK_RECT, "", OK_TEXT, new BMessage(kMsgOK), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); 179 AddChild(button); 180 button->MakeDefault(true); 181 182 // update description 183 BMessage updateDescription(kMsgProtocolClassChanged); 184 MessageReceived(&updateDescription); 185 } 186 187 void 188 AddPrinterView::FrameResized(float w, float h) 189 { 190 BView::FrameResized(w, h); 191 // update text rectangle 192 BRect rect(fDescription->TextRect()); 193 rect.right = rect.left + fDescription->Frame().Width(); 194 fDescription->SetTextRect(rect); 195 } 196 197 ProtocolClassItem * 198 AddPrinterView::CurrentSelection() 199 { 200 int selected = fProtocolClassList->CurrentSelection(); 201 if (selected >= 0) { 202 return (ProtocolClassItem*)fProtocolClassList->ItemAt(selected); 203 } 204 return NULL; 205 } 206 207 void 208 AddPrinterView::MessageReceived(BMessage *msg) 209 { 210 if (msg->what == kMsgProtocolClassChanged) { 211 ProtocolClassItem *item = CurrentSelection(); 212 if (item != NULL) { 213 fDescription->SetText(item->getDescription()); 214 } 215 } else { 216 BView::MessageReceived(msg); 217 } 218 } 219 220 void 221 AddPrinterView::Save() 222 { 223 ProtocolClassItem *item = CurrentSelection(); 224 if (item != NULL) { 225 fPrinterData->setProtocolClass(item->getProtocolClass()); 226 fPrinterData->save(); 227 } 228 } 229 230 AddPrinterDlg::AddPrinterDlg(PrinterData *printerData, const PrinterCap *printerCap) 231 : DialogWindow(BRect(100, 100, 100 + DIALOG_WIDTH, 100 + DIALOG_HEIGHT), 232 "Add Printer", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL, 233 B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS) 234 { 235 SetResult(B_ERROR); 236 237 // increase min. window size 238 float minWidth, maxWidth, minHeight, maxHeight; 239 GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight); 240 minHeight = DIALOG_HEIGHT; 241 minWidth = DIALOG_WIDTH; 242 SetSizeLimits(minWidth, maxWidth, minHeight, maxHeight); 243 244 fAddPrinterView = new AddPrinterView(Bounds(), printerData, printerCap); 245 AddChild(fAddPrinterView); 246 } 247 248 void 249 AddPrinterDlg::MessageReceived(BMessage *msg) 250 { 251 switch (msg->what) { 252 case kMsgOK: 253 fAddPrinterView->Save(); 254 SetResult(B_NO_ERROR); 255 PostMessage(B_QUIT_REQUESTED); 256 break; 257 258 case kMsgCancel: 259 PostMessage(B_QUIT_REQUESTED); 260 break; 261 262 default: 263 DialogWindow::MessageReceived(msg); 264 break; 265 } 266 } 267