From 4b710559dcb154cb9243e50a186908c81050f361 Mon Sep 17 00:00:00 2001 From: Michael Pfeiffer Date: Mon, 4 Nov 2002 23:54:55 +0000 Subject: [PATCH] Added some logic to select and add a local printer. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1842 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/prefs/print/AddPrinterDialog.cpp | 178 +++++++++++++++++++++++- src/prefs/print/AddPrinterDialog.h | 16 +++ src/prefs/print/Messages.h | 3 + src/prefs/print/PrinterListView.cpp | 11 +- src/prefs/print/Printers.FileTypes.rsrc | Bin 4210 -> 115040 bytes src/prefs/print/Printers.cpp | 6 +- 6 files changed, 205 insertions(+), 9 deletions(-) diff --git a/src/prefs/print/AddPrinterDialog.cpp b/src/prefs/print/AddPrinterDialog.cpp index 08774d4b2f..5071d22ba7 100644 --- a/src/prefs/print/AddPrinterDialog.cpp +++ b/src/prefs/print/AddPrinterDialog.cpp @@ -28,11 +28,13 @@ #include #include #include +#include #include #include #include #include #include +#include status_t AddPrinterDialog::Start() { AddPrinterDialog* dialog = new AddPrinterDialog(); @@ -53,13 +55,75 @@ void AddPrinterDialog::MessageReceived(BMessage* msg) { switch(msg->what) { - case B_OK: - // TODO: create the new spooler! - // fallback not to dialog cancelling case... + case B_OK: { + BMessage m(PSRV_MAKE_PRINTER); + BMessenger msgr; + if (GetPrinterServerMessenger(msgr) != B_OK) break; + + BString transport, transportPath; + if (fPrinterText != "Preview") { + transport = fTransportText; + transportPath = fTransportPathText; + } + + m.AddString("driver", fPrinterText.String()); + m.AddString("transport", transport.String()); + m.AddString("transport path", transportPath.String()); + m.AddString("printer name", fNameText.String()); + m.AddString("connection", "Local"); + // request print_server to create printer + msgr.SendMessage(&m); + + PostMessage(B_QUIT_REQUESTED); + } + break; case B_CANCEL: PostMessage(B_QUIT_REQUESTED); break; - + case MSG_NAME_CHANGED: + fNameText = fName->Text(); Update(); + break; + case MSG_PRINTER_SELECTED: + case MSG_TRANSPORT_SELECTED: + { + BString name, path; + if (msg->FindString("name", &name) != B_OK) { + name = ""; + } + if (msg->what == MSG_PRINTER_SELECTED) { + fPrinterText = name; + } else { + fTransportText = name; + if (msg->FindString("path", &path) == B_OK) { + // transport path selected + fTransportPathText = path; + void* pointer; + // mark sub menu + if (msg->FindPointer("source", &pointer) == B_OK) { + BMenuItem* item = (BMenuItem*)pointer; + BMenu* menu = item->Menu(); + int32 index = fTransport->IndexOf(menu); + item = fTransport->ItemAt(index); + if (item) item->SetMarked(true); + } + } else { + // transport selected + fTransportPathText = ""; + // remove mark from item in sub menu of transport sub menu + for (int32 i = fTransport->CountItems()-1; i >= 0; i --) { + BMenu* menu = fTransport->SubmenuAt(i); + if (menu) { + BMenuItem* item = menu->FindMarked(); + if (item) item->SetMarked(false); + } + } + } + } + Update(); + } + break; + + default: Inherited::MessageReceived(msg); } @@ -100,8 +164,10 @@ void AddPrinterDialog::BuildGUI(int stage) // add a "printer name" input field tc = new BTextControl(r, "printer_name", NAME_LABEL, B_EMPTY_STRING, NULL); + fName = tc; tc->SetAlignment(B_ALIGN_LEFT, B_ALIGN_LEFT); panel->AddChild(tc); + tc->SetModificationMessage(new BMessage(MSG_NAME_CHANGED)); tc->SetFont(be_bold_font); tc->GetPreferredSize(&w, &h); tc->SetDivider(be_bold_font->StringWidth(NAME_LABEL "#")); @@ -116,6 +182,7 @@ void AddPrinterDialog::BuildGUI(int stage) panel->AddChild(bb); pum = new BPopUpMenu(""); + fPrinter = pum; mf = new BMenuField(r, "drivers_list", KIND_LABEL, pum, B_FOLLOW_TOP | B_FOLLOW_LEFT_RIGHT, B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE); @@ -124,6 +191,7 @@ void AddPrinterDialog::BuildGUI(int stage) bb->SetLabel(mf); mf->ResizeToPreferred(); mf->GetPreferredSize(&w, &h); + FillMenu(pum, "Print", MSG_PRINTER_SELECTED); tr = bb->Bounds(); tr.top += h; @@ -145,6 +213,7 @@ void AddPrinterDialog::BuildGUI(int stage) // add a "connected to" (aka transports list) menu field pum = new BPopUpMenu(""); + fTransport = pum; mf = new BMenuField(r, "transports_list", PORT_LABEL, pum, B_FOLLOW_TOP | B_FOLLOW_LEFT_RIGHT, B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE); @@ -153,6 +222,7 @@ void AddPrinterDialog::BuildGUI(int stage) bb->SetLabel(mf); mf->ResizeToPreferred(); mf->GetPreferredSize(&w, &h); + FillMenu(pum, "Print/transport", MSG_TRANSPORT_SELECTED); tr = bb->Bounds(); tr.top += h; @@ -171,12 +241,14 @@ void AddPrinterDialog::BuildGUI(int stage) // add a "OK" button, and make it default ok = new BButton(r, NULL, "Add", new BMessage(B_OK), B_FOLLOW_RIGHT | B_FOLLOW_TOP); + fOk = ok; ok->MakeDefault(true); ok->ResizeToPreferred(); ok->GetPreferredSize(&w, &h); x = r.right - w; ok->MoveTo(x, ok->Frame().top); // put the ok bottom at bottom right corner panel->AddChild(ok); + SetDefaultButton(fOk); // add a "Cancel button cancel = new BButton(r, NULL, "Cancel", new BMessage(B_CANCEL), B_FOLLOW_RIGHT | B_FOLLOW_TOP); @@ -188,6 +260,7 @@ void AddPrinterDialog::BuildGUI(int stage) // Auto resize window ResizeTo(ok->Frame().right + H_MARGIN, ok->Frame().bottom + V_MARGIN); + Update(); // Stage == 0 // init_icon 64x114 Add a Local or Network Printer // ------------------------------ @@ -240,3 +313,100 @@ void AddPrinterDialog::BuildGUI(int stage) // ------------------------------------------------ // Cancel Add } + +static directory_which gAddonDirs[] = { + B_BEOS_ADDONS_DIRECTORY, + B_COMMON_ADDONS_DIRECTORY + // B_USER_ADDONS_DIRECTORY same as common directory +}; + +#ifdef __INTEL__ +static const char* kExecutableType = "application/x-vnd.Be-elfexecutable"; +#else +static const char* kExecutableType = "application/x-vnd.Be-executable"; +#endif + +void AddPrinterDialog::FillMenu(BMenu* menu, const char* path, uint32 what) { + for (int i = 0; i < sizeof(gAddonDirs) / sizeof(directory_which); i ++) { + BPath addonPath; + if (find_directory(gAddonDirs[i], &addonPath) != B_OK) continue; + if (addonPath.Append(path) != B_OK) continue; + BDirectory dir(addonPath.Path()); + if (dir.InitCheck() != B_OK) continue; + BEntry entry; + while (dir.GetNextEntry(&entry) == B_OK) { + if (!entry.IsFile()) continue; + + BNode node(&entry); + if (node.InitCheck() != B_OK) continue; + + BNodeInfo info(&node); + if (info.InitCheck() != B_OK) continue; + + char type[B_MIME_TYPE_LENGTH+1]; + info.GetType(type); + if (strcmp(type, kExecutableType) != 0) continue; + + BPath path; + if (entry.GetPath(&path) != B_OK) continue; + + bool addMenuItem = true; + // some hard coded special cases for transport add-ons + if (menu == fTransport) { + const char* transport = path.Leaf(); + // Network not implemented yet! + if (strcmp(transport, "Network") == 0) continue; + addMenuItem = false; + if (strcmp(transport, "Serial Port") == 0) { + AddPortSubMenu(menu, transport, "/dev/ports"); + } else if (strcmp(transport, "Parallel Port") == 0) { + AddPortSubMenu(menu, transport, "/dev/parallel"); + } else if (strcmp(transport, "USB Port") == 0) { + AddPortSubMenu(menu, transport, "/dev/printer/usb"); + } else { + addMenuItem = true; + } + } + + if (addMenuItem) { + BMessage* msg = new BMessage(what); + msg->AddString("name", path.Leaf()); + menu->AddItem(new BMenuItem(path.Leaf(), msg)); + } + } + } +} + +void AddPrinterDialog::AddPortSubMenu(BMenu* menu, const char* transport, const char* port) { + BEntry entry(port); + BDirectory dir(&entry); + if (dir.InitCheck() != B_OK) return; + BMenu* subMenu = NULL; + + BPath path; + while (dir.GetNextEntry(&entry) == B_OK) { + if (entry.GetPath(&path) != B_OK) continue; + // lazily create sub menu + if (subMenu == NULL) { + subMenu = new BMenu(transport); + menu->AddItem(subMenu); + subMenu->SetRadioMode(true); + int32 index = menu->IndexOf(subMenu); + BMenuItem* item = menu->ItemAt(index); + if (item) item->SetMessage(new BMessage(MSG_TRANSPORT_SELECTED)); + } + // setup menu item for port + BMessage* msg = new BMessage(MSG_TRANSPORT_SELECTED); + msg->AddString("name", transport); + msg->AddString("path", path.Leaf()); + BMenuItem* item = new BMenuItem(path.Leaf(), msg); + subMenu->AddItem(item); + } +} + +void AddPrinterDialog::Update() { + fOk->SetEnabled(fNameText != "" && fPrinterText != "" && + (fTransportText != "" || fPrinterText == "Preview")); + fTransport->SetEnabled(fPrinterText != "" &&fPrinterText != "Preview"); +} + diff --git a/src/prefs/print/AddPrinterDialog.h b/src/prefs/print/AddPrinterDialog.h index a76e789138..5790ce21d1 100644 --- a/src/prefs/print/AddPrinterDialog.h +++ b/src/prefs/print/AddPrinterDialog.h @@ -3,6 +3,10 @@ class AddPrinterDialog; +#include +#include +#include +#include #include class AddPrinterDialog : public BWindow @@ -16,7 +20,19 @@ private: void MessageReceived(BMessage* msg); void BuildGUI(int stage); + void FillMenu(BMenu* menu, const char* path, uint32 what); + void AddPortSubMenu(BMenu* menu, const char* transport, const char* port); + void Update(); + BTextControl* fName; + BPopUpMenu* fPrinter; + BPopUpMenu* fTransport; + BButton* fOk; + + BString fNameText; + BString fPrinterText; + BString fTransportText; + BString fTransportPathText; }; #endif diff --git a/src/prefs/print/Messages.h b/src/prefs/print/Messages.h index f8219c9ebe..ac3f74d720 100644 --- a/src/prefs/print/Messages.h +++ b/src/prefs/print/Messages.h @@ -29,4 +29,7 @@ const uint32 MSG_PRINTER_SELECTED = 'PSel'; const uint32 MSG_CANCEL_JOB = 'CncJ'; const uint32 MSG_RESTART_JOB = 'RstJ'; +const uint32 MSG_TRANSPORT_SELECTED = 'TSel'; +const uint32 MSG_NAME_CHANGED = 'NCgd'; + #endif diff --git a/src/prefs/print/PrinterListView.cpp b/src/prefs/print/PrinterListView.cpp index 1c58156bc6..84644468c6 100644 --- a/src/prefs/print/PrinterListView.cpp +++ b/src/prefs/print/PrinterListView.cpp @@ -54,8 +54,9 @@ PrinterListView::PrinterListView(BRect frame) reply.PrintToStream(); BMessenger thePrinter; - if (reply.FindMessenger("result", &thePrinter) == B_OK) + if (reply.FindMessenger("result", &thePrinter) == B_OK) { AddItem(new PrinterItem(thePrinter), CountItems()); + } } } } @@ -68,6 +69,14 @@ void PrinterListView::AttachedToWindow() SetSelectionMessage(new BMessage(MSG_PRINTER_SELECTED)); SetInvocationMessage(new BMessage(MSG_MKDEF_PRINTER)); SetTarget(Window()); + + // Select active printer + for (int32 i = 0; i < CountItems(); i ++) { + PrinterItem* item = dynamic_cast(ItemAt(i)); + if (item->IsActivePrinter()) { + Select(i); break; + } + } } BBitmap* PrinterItem::sIcon = NULL; diff --git a/src/prefs/print/Printers.FileTypes.rsrc b/src/prefs/print/Printers.FileTypes.rsrc index c36a0c8c6df7a80ee17e0a2ba627c97732a34b9c..eb53fcf94acdf5bde3746f45f05882c879b624d4 100644 GIT binary patch literal 115040 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 delta 55 zcmaFR#QsTvGbosWfkD9Eg>53|cD7c228Ndm6OZ|A4q!}Sn^<78c?Run(); - delete be_app; - + PrintersApp app; + app.Run(); return 0; }