WIP: add a print test page button.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40216 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Philippe Houdoin 2011-01-12 17:08:35 +00:00
parent 67938b0d59
commit e8e66c5cbd
4 changed files with 148 additions and 80 deletions

View File

@ -21,5 +21,6 @@ const uint32 kMsgPrinterSelected = 'PSel';
const uint32 kMsgCancelJob = 'CncJ';
const uint32 kMsgRestartJob = 'RstJ';
const uint32 kMsgJobSelected = 'JSel';
const uint32 kMsgPrintTestPage = 'PtPg';
#endif // _MESSAGES_H

View File

@ -42,26 +42,26 @@ public:
bool QuitRequested();
void BuildPrinterList();
PrinterItem *SelectedItem() const;
void UpdateItem(PrinterItem *item);
PrinterItem* SelectedItem() const;
void UpdateItem(PrinterItem* item);
PrinterItem *ActivePrinter() const;
PrinterItem* ActivePrinter() const;
void SetActivePrinter(PrinterItem* item);
private:
typedef BListView Inherited;
void _AddPrinter(BDirectory &printer, bool calculateLayout);
void _AddPrinter(BDirectory& printer, bool calculateLayout);
void _LayoutPrinterItems();
PrinterItem *_FindItem(node_ref* node) const;
PrinterItem* _FindItem(node_ref* node) const;
void EntryCreated(node_ref *node,
entry_ref *entry);
void EntryRemoved(node_ref *node);
void AttributeChanged(node_ref *node);
void EntryCreated(node_ref* node,
entry_ref* entry);
void EntryRemoved(node_ref* node);
void AttributeChanged(node_ref* node);
FolderWatcher *fFolder;
PrinterItem *fActivePrinter;
FolderWatcher* fFolder;
PrinterItem* fActivePrinter;
PrinterListLayoutData fLayoutData;
};
@ -76,25 +76,29 @@ public:
void GetColumnWidth(BView* view, float& leftColumn,
float& rightColumn);
void DrawItem(BView *owner, BRect bounds,
void DrawItem(BView* owner, BRect bounds,
bool complete);
void Update(BView *owner, const BFont *font);
void Update(BView* owner, const BFont* font);
bool Remove(BListView *view);
bool Remove(BListView* view);
bool IsActivePrinter() const;
bool HasPendingJobs() const;
const char *Name() const { return fName.String(); }
const char* Name() const { return fName.String(); }
const char* Driver() const { return fDriverName.String(); }
const char* Transport() const { return fTransport.String(); }
const char* TransportAddress() const
{ return fTransportAddress.String(); }
SpoolFolder *Folder() const;
BDirectory *Node();
SpoolFolder* Folder() const;
BDirectory* Node();
void UpdatePendingJobs();
private:
void _GetStringProperty(const char *propName,
BString &outString);
void _GetStringProperty(const char* propName,
BString& outString);
SpoolFolder *fFolder;
SpoolFolder* fFolder;
BDirectory fNode;
BString fComments;
BString fTransport;
@ -104,8 +108,8 @@ private:
BString fPendingJobs;
PrinterListLayoutData& fLayoutData;
static BBitmap *sIcon;
static BBitmap *sSelectedIcon;
static BBitmap* sIcon;
static BBitmap* sSelectedIcon;
};
#endif // _PRINTERS_LISTVIEW_H

View File

@ -1,14 +1,17 @@
/*
* Copyright 2001-2010, Haiku.
* Copyright 2001-2011, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Pfeiffer
* Philippe Houdoin
*/
#include "PrintersWindow.h"
#include <stdio.h>
// BeOS API
#include <Application.h>
#include <Button.h>
@ -16,6 +19,7 @@
#include <FindDirectory.h>
#include <ListView.h>
#include <Locale.h>
#include <PrintJob.h>
#include <ScrollView.h>
#include "pr_server.h"
@ -38,7 +42,7 @@ PrintersWindow::PrintersWindow(BRect frame)
fSelectedPrinter(NULL),
fAddingPrinter(false)
{
BuildGUI();
_BuildGUI();
}
@ -74,11 +78,11 @@ PrintersWindow::MessageReceived(BMessage* msg)
fSelectedPrinter = NULL;
fJobListView->SetSpoolFolder(NULL);
}
UpdateJobButtons();
UpdatePrinterButtons();
_UpdateJobButtons();
_UpdatePrinterButtons();
break;
}
case kMsgAddPrinter:
if (!fAddingPrinter) {
fAddingPrinter = true;
@ -97,7 +101,7 @@ PrintersWindow::MessageReceived(BMessage* msg)
fSelectedPrinter->Remove(fPrinterListView);
break;
}
case kMsgMakeDefaultPrinter:
{
PrinterItem* printer = fPrinterListView->SelectedItem();
@ -109,11 +113,19 @@ PrintersWindow::MessageReceived(BMessage* msg)
setActivePrinter.AddSpecifier("ActivePrinter");
setActivePrinter.AddString("data", printer->Name());
msgr.SendMessage(&setActivePrinter);
UpdatePrinterButtons();
_UpdatePrinterButtons();
}
break;
}
case kMsgPrintTestPage:
{
fSelectedPrinter = fPrinterListView->SelectedItem();
if (fSelectedPrinter)
PrintTestPage(fSelectedPrinter);
break;
}
case kMsgCancelJob:
fJobListView->CancelJob();
break;
@ -123,7 +135,7 @@ PrintersWindow::MessageReceived(BMessage* msg)
break;
case kMsgJobSelected:
UpdateJobButtons();
_UpdateJobButtons();
break;
case B_PRINTER_CHANGED:
@ -151,7 +163,66 @@ PrintersWindow::MessageReceived(BMessage* msg)
void
PrintersWindow::BuildGUI()
PrintersWindow::PrintTestPage(PrinterItem* printer)
{
BPrintJob job("TestPage");
job.ConfigPage();
BMessage* settings = job.Settings();
printf("print job settings:\n");
settings->PrintToStream();
BRect pageRect = job.PrintableRect();
job.BeginJob();
// TestPageView testPage(pageRect, printer);
// job.DrawView(testPage, pageRect, BPoint(0.0, 0.0));
job.SpoolPage();
if (!job.CanContinue())
return;
job.CommitJob();
}
void
PrintersWindow::AddJob(SpoolFolder* folder, Job* job)
{
if (_IsSelected(folder->Item()))
fJobListView->AddJob(job);
fPrinterListView->UpdateItem(folder->Item());
_UpdatePrinterButtons();
}
void
PrintersWindow::RemoveJob(SpoolFolder* folder, Job* job)
{
if (_IsSelected(folder->Item()))
fJobListView->RemoveJob(job);
fPrinterListView->UpdateItem(folder->Item());
_UpdatePrinterButtons();
}
void
PrintersWindow::UpdateJob(SpoolFolder* folder, Job* job)
{
if (_IsSelected(folder->Item())) {
fJobListView->UpdateJob(job);
_UpdateJobButtons();
}
fPrinterListView->UpdateItem(folder->Item());
_UpdatePrinterButtons();
}
// #pragma mark -
void
PrintersWindow::_BuildGUI()
{
const float boxInset = 10.0;
BRect r(Bounds());
@ -163,7 +234,7 @@ PrintersWindow::BuildGUI()
AddChild(backdrop);
// ------------------------ Next, build the printers overview box
BBox* printersBox = new BBox(BRect(boxInset, boxInset,
BBox* printersBox = new BBox(BRect(boxInset, boxInset,
r.Width() - boxInset, (r.Height()/2) - (boxInset/2)),
"printersBox", B_FOLLOW_ALL);
printersBox->SetFont(be_bold_font);
@ -201,6 +272,17 @@ PrintersWindow::BuildGUI()
if (fMakeDefault->Bounds().Width() > maxWidth)
maxWidth = fMakeDefault->Bounds().Width();
// Print Test Page button
fPrintTestPage = new BButton(BRect(5,60,5,60), "print_test_page",
B_TRANSLATE("Print test page"), new BMessage(kMsgPrintTestPage),
B_FOLLOW_RIGHT);
printersBox->AddChild(fPrintTestPage);
fPrintTestPage->ResizeToPreferred();
if (fPrintTestPage->Bounds().Width() > maxWidth)
maxWidth = fPrintTestPage->Bounds().Width();
// Resize all buttons to maximum width and align them to the right
float xPos = printersBox->Bounds().Width() - boxInset - maxWidth;
addButton->MoveTo(xPos, boxInset + 8);
@ -214,12 +296,19 @@ PrintersWindow::BuildGUI()
boxInset + fRemove->Bounds().Height() + boxInset + 8);
fMakeDefault->ResizeTo(maxWidth, fMakeDefault->Bounds().Height());
fPrintTestPage->MoveTo(xPos, boxInset + addButton->Bounds().Height() +
boxInset + fRemove->Bounds().Height() +
boxInset + fMakeDefault->Bounds().Height() + boxInset + 8);
fPrintTestPage->ResizeTo(maxWidth, fPrintTestPage->Bounds().Height());
// Disable all selection-based buttons
fRemove->SetEnabled(false);
fMakeDefault->SetEnabled(false);
fPrintTestPage->SetEnabled(false);
// Create listview with scroller
BRect listBounds(boxInset, boxInset + 8,
BRect listBounds(boxInset, boxInset + 8,
fMakeDefault->Frame().left - boxInset - B_V_SCROLL_BAR_WIDTH,
printersBox->Bounds().Height()- boxInset - 3);
fPrinterListView = new PrinterListView(listBounds);
@ -229,7 +318,7 @@ PrintersWindow::BuildGUI()
// ------------------------ Lastly, build the jobs overview box
fJobsBox = new BBox(BRect(boxInset, r.Height() / 2 + boxInset / 2,
Bounds().Width() - 10, Bounds().Height() - boxInset), "jobsBox",
Bounds().Width() - 10, Bounds().Height() - boxInset), "jobsBox",
B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM);
fJobsBox->SetFont(be_bold_font);
fJobsBox->SetLabel(B_TRANSLATE("Print jobs: No printer selected"));
@ -270,7 +359,7 @@ PrintersWindow::BuildGUI()
restartButton->SetEnabled(false);
// Create listview with scroller
listBounds = BRect(boxInset, boxInset + 8,
listBounds = BRect(boxInset, boxInset + 8,
cancelButton->Frame().left - boxInset - B_V_SCROLL_BAR_WIDTH,
fJobsBox->Bounds().Height() - boxInset - 3);
fJobListView = new JobListView(listBounds);
@ -289,55 +378,24 @@ PrintersWindow::BuildGUI()
bool
PrintersWindow::IsSelected(PrinterItem* printer)
PrintersWindow::_IsSelected(PrinterItem* printer)
{
return fSelectedPrinter && fSelectedPrinter == printer;
}
void
PrintersWindow::AddJob(SpoolFolder* folder, Job* job)
{
if (IsSelected(folder->Item()))
fJobListView->AddJob(job);
fPrinterListView->UpdateItem(folder->Item());
UpdatePrinterButtons();
}
void
PrintersWindow::RemoveJob(SpoolFolder* folder, Job* job)
{
if (IsSelected(folder->Item()))
fJobListView->RemoveJob(job);
fPrinterListView->UpdateItem(folder->Item());
UpdatePrinterButtons();
}
void
PrintersWindow::UpdateJob(SpoolFolder* folder, Job* job)
{
if (IsSelected(folder->Item())) {
fJobListView->UpdateJob(job);
UpdateJobButtons();
}
fPrinterListView->UpdateItem(folder->Item());
UpdatePrinterButtons();
}
void
PrintersWindow::UpdatePrinterButtons()
PrintersWindow::_UpdatePrinterButtons()
{
PrinterItem* item = fPrinterListView->SelectedItem();
fRemove->SetEnabled(item && !item->HasPendingJobs());
fMakeDefault->SetEnabled(item && !item->IsActivePrinter());
fPrintTestPage->SetEnabled(item);
}
void
PrintersWindow::UpdateJobButtons()
PrintersWindow::_UpdateJobButtons()
{
JobItem* item = fJobListView->SelectedItem();
if (item != NULL) {
@ -349,3 +407,5 @@ PrintersWindow::UpdateJobButtons()
fRestart->SetEnabled(false);
}
}

View File

@ -24,34 +24,37 @@ class PrinterItem;
class PrintersWindow : public BWindow {
public:
PrintersWindow(BRect frame);
void MessageReceived(BMessage* msg);
bool QuitRequested();
void PrintTestPage(PrinterItem* printer);
void AddJob(SpoolFolder* folder, Job* job);
void RemoveJob(SpoolFolder* folder, Job* job);
void UpdateJob(SpoolFolder* folder, Job* job);
private:
void BuildGUI();
bool IsSelected(PrinterItem* printer);
void UpdatePrinterButtons();
void UpdateJobButtons();
void _BuildGUI();
bool _IsSelected(PrinterItem* printer);
void _UpdatePrinterButtons();
void _UpdateJobButtons();
typedef BWindow Inherited;
PrinterListView* fPrinterListView;
BButton* fMakeDefault;
BButton* fRemove;
BButton* fPrintTestPage;
JobListView* fJobListView;
BButton* fRestart;
BButton* fCancel;
BBox* fJobsBox;
PrinterItem* fSelectedPrinter;
bool fAddingPrinter;
};