* 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
This commit is contained in:
Karsten Heimrich 2008-04-22 21:31:28 +00:00
parent 9fdd497614
commit 4aa5d96613
5 changed files with 88 additions and 45 deletions

View File

@ -33,14 +33,34 @@
#include <stdio.h>
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;
}

View File

@ -30,7 +30,10 @@
#define GLOBALS_H
#include <Messenger.h>
#include <String.h>
BString ActivePrinterName();
status_t GetPrinterServerMessenger(BMessenger& msgr);
#endif

View File

@ -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<PrinterItem*>(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();
}

View File

@ -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;

View File

@ -107,27 +107,21 @@ void PrintersWindow::MessageReceived(BMessage* msg)
}
break;
case kMsgMakeDefaultPrinter:
{
int32 prIndex = fPrinterListView->CurrentSelection();
if (prIndex >= 0)
{
PrinterItem* printer = dynamic_cast<PrinterItem*>(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<PrinterItem*>(fPrinterListView->ItemAt(i));
if (item && item->Name() == activePrinterName) {
fPrinterListView->UpdateItem(item);
fPrinterListView->SetActivePrinter(item);
break;
}
}
} break;
default:
Inherited::MessageReceived(msg);
}