From 4aa5d96613c5b1018254cd7965fe83dd42808075 Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Tue, 22 Apr 2008 21:31:28 +0000 Subject: [PATCH] * invalidate only the items in question, should fix ticket #1803 git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25107 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/preferences/print/Globals.cpp | 30 ++++++++++--- src/preferences/print/Globals.h | 3 ++ src/preferences/print/PrinterListView.cpp | 40 ++++++++++------- src/preferences/print/PrinterListView.h | 5 ++- src/preferences/print/PrintersWindow.cpp | 55 +++++++++++++---------- 5 files changed, 88 insertions(+), 45 deletions(-) diff --git a/src/preferences/print/Globals.cpp b/src/preferences/print/Globals.cpp index 68a61bd0d9..c03580ac0b 100644 --- a/src/preferences/print/Globals.cpp +++ b/src/preferences/print/Globals.cpp @@ -33,14 +33,34 @@ #include -status_t GetPrinterServerMessenger(BMessenger& msgr) +BString +ActivePrinterName() { - // If print server is not yet running, start it - if (!be_roster->IsRunning(PSRV_SIGNATURE_TYPE)) { + BMessenger msgr; + if (GetPrinterServerMessenger(msgr) != B_OK) + return BString(); + + BMessage getNameOfActivePrinter(B_GET_PROPERTY); + getNameOfActivePrinter.AddSpecifier("ActivePrinter"); + + BMessage reply; + msgr.SendMessage(&getNameOfActivePrinter, &reply); + + BString activePrinterName; + reply.FindString("result", &activePrinterName); + + return activePrinterName; +} + + +status_t +GetPrinterServerMessenger(BMessenger& msgr) +{ + // If print server is not yet running, start it + if (!be_roster->IsRunning(PSRV_SIGNATURE_TYPE)) be_roster->Launch(PSRV_SIGNATURE_TYPE); - } msgr = BMessenger(PSRV_SIGNATURE_TYPE); - return msgr.IsValid() ? B_OK : B_ERROR; } + diff --git a/src/preferences/print/Globals.h b/src/preferences/print/Globals.h index 5600dd6079..d5f7f09e04 100644 --- a/src/preferences/print/Globals.h +++ b/src/preferences/print/Globals.h @@ -30,7 +30,10 @@ #define GLOBALS_H #include +#include +BString ActivePrinterName(); status_t GetPrinterServerMessenger(BMessenger& msgr); #endif + diff --git a/src/preferences/print/PrinterListView.cpp b/src/preferences/print/PrinterListView.cpp index c27b5555b9..47ba8a1bcb 100644 --- a/src/preferences/print/PrinterListView.cpp +++ b/src/preferences/print/PrinterListView.cpp @@ -45,7 +45,8 @@ PrinterListView::PrinterListView(BRect frame) : Inherited(frame, "printers_list", B_SINGLE_SELECTION_LIST, B_FOLLOW_ALL), - fFolder(NULL) + fFolder(NULL), + fActivePrinter(NULL) { } @@ -99,10 +100,13 @@ PrinterListView::AttachedToWindow() BuildPrinterList(); // Select active printer + BString activePrinterName(ActivePrinterName()); for (int32 i = 0; i < CountItems(); i ++) { PrinterItem* item = dynamic_cast(ItemAt(i)); - if (item != NULL && item->IsActivePrinter()) { - Select(i); break; + if (item != NULL && item->Name() == activePrinterName) { + Select(i); + fActivePrinter = item; + break; } } @@ -173,6 +177,9 @@ void PrinterListView::EntryRemoved(node_ref* node) { PrinterItem* item = FindItem(node); if (item) { + if (item == fActivePrinter) + fActivePrinter = NULL; + RemoveItem(item); delete item; } @@ -199,6 +206,20 @@ PrinterItem* PrinterListView::SelectedItem() } +PrinterItem* +PrinterListView::ActivePrinter() const +{ + return fActivePrinter; +} + + +void +PrinterListView::SetActivePrinter(PrinterItem* item) +{ + fActivePrinter = item; +} + + BBitmap* PrinterItem::sIcon = NULL; BBitmap* PrinterItem::sSelectedIcon = NULL; @@ -368,18 +389,7 @@ void PrinterItem::DrawItem(BView *owner, BRect /*bounds*/, bool complete) bool PrinterItem::IsActivePrinter() { - BMessenger msgr; - if (::GetPrinterServerMessenger(msgr) != B_OK) - return false; - - BMessage getNameOfActivePrinter(B_GET_PROPERTY); - getNameOfActivePrinter.AddSpecifier("ActivePrinter"); - - BString activePrinterName; - BMessage reply; - return msgr.SendMessage(&getNameOfActivePrinter, &reply) == B_OK - && reply.FindString("result", &activePrinterName) == B_OK - && fName == activePrinterName; + return fName == ActivePrinterName(); } diff --git a/src/preferences/print/PrinterListView.h b/src/preferences/print/PrinterListView.h index b5ddbaa434..ba9912eb84 100644 --- a/src/preferences/print/PrinterListView.h +++ b/src/preferences/print/PrinterListView.h @@ -61,12 +61,15 @@ class PrinterListView : public BListView, public FolderListener { void BuildPrinterList(); PrinterItem *SelectedItem(); - void UpdateItem(PrinterItem *item); + PrinterItem* ActivePrinter() const; + void SetActivePrinter(PrinterItem* item); + private: BDirectory fNode; FolderWatcher *fFolder; + PrinterItem *fActivePrinter; }; class BBitmap; diff --git a/src/preferences/print/PrintersWindow.cpp b/src/preferences/print/PrintersWindow.cpp index ee43775a7f..92f56ec348 100644 --- a/src/preferences/print/PrintersWindow.cpp +++ b/src/preferences/print/PrintersWindow.cpp @@ -107,27 +107,21 @@ void PrintersWindow::MessageReceived(BMessage* msg) } break; - case kMsgMakeDefaultPrinter: - { - int32 prIndex = fPrinterListView->CurrentSelection(); - if (prIndex >= 0) - { - PrinterItem* printer = dynamic_cast(fPrinterListView->ItemAt(prIndex)); - BMessenger msgr; - if (printer != NULL && ::GetPrinterServerMessenger(msgr) == B_OK) - { - BMessage setActivePrinter(B_SET_PROPERTY); - setActivePrinter.AddSpecifier("ActivePrinter"); - setActivePrinter.AddString("data", printer->Name()); - msgr.SendMessage(&setActivePrinter); - - fPrinterListView->Invalidate(); - UpdatePrinterButtons(); - } - } - } - break; + case kMsgMakeDefaultPrinter: + { + PrinterItem* printer = fPrinterListView->SelectedItem(); + if (printer && printer == fPrinterListView->ActivePrinter()) + break; + BMessenger msgr; + if (printer && GetPrinterServerMessenger(msgr) == B_OK) { + BMessage setActivePrinter(B_SET_PROPERTY); + setActivePrinter.AddSpecifier("ActivePrinter"); + setActivePrinter.AddString("data", printer->Name()); + msgr.SendMessage(&setActivePrinter); + UpdatePrinterButtons(); + } + } break; case kMsgCancelJob: fJobListView->CancelJob(); break; @@ -139,10 +133,23 @@ void PrintersWindow::MessageReceived(BMessage* msg) break; case B_PRINTER_CHANGED: - // active printer could have been changed - fPrinterListView->Invalidate(); - break; - + { + // active printer could have been changed, even outside of prefs + BString activePrinterName(ActivePrinterName()); + PrinterItem* item = fPrinterListView->ActivePrinter(); + if (item && item->Name() != activePrinterName) + fPrinterListView->UpdateItem(item); + + for (int32 i = 0; i < fPrinterListView->CountItems(); ++i) { + item = dynamic_cast(fPrinterListView->ItemAt(i)); + if (item && item->Name() == activePrinterName) { + fPrinterListView->UpdateItem(item); + fPrinterListView->SetActivePrinter(item); + break; + } + } + } break; + default: Inherited::MessageReceived(msg); }