* 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:
parent
9fdd497614
commit
4aa5d96613
@ -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;
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,10 @@
|
||||
#define GLOBALS_H
|
||||
|
||||
#include <Messenger.h>
|
||||
#include <String.h>
|
||||
|
||||
BString ActivePrinterName();
|
||||
status_t GetPrinterServerMessenger(BMessenger& msgr);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user