From af09bc0a280d077c8d43d6d178345261365b8f96 Mon Sep 17 00:00:00 2001 From: Michael Pfeiffer Date: Tue, 26 Nov 2002 23:21:28 +0000 Subject: [PATCH] Implemented job list handling. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2093 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/prefs/print/AddPrinterDialog.cpp | 4 +- src/prefs/print/AddPrinterDialog.h | 19 + src/prefs/print/Globals.cpp | 19 + src/prefs/print/Globals.h | 19 + src/prefs/print/Jamfile | 13 +- src/prefs/print/JobListView.cpp | 258 ++++++++++ src/prefs/print/JobListView.h | 77 +++ src/prefs/print/Messages.h | 3 +- src/prefs/print/PrinterListView.cpp | 205 ++++++-- src/prefs/print/PrinterListView.h | 47 +- src/prefs/print/Printers.cpp | 15 +- src/prefs/print/Printers.h | 3 +- src/prefs/print/PrintersWindow.cpp | 112 +++-- src/prefs/print/PrintersWindow.h | 24 +- src/prefs/print/SpoolFolder.cpp | 54 +++ src/prefs/print/SpoolFolder.h | 45 ++ src/prefs/print/doxygen.cfg | 691 +++++++++++++++++++++++++++ 17 files changed, 1517 insertions(+), 91 deletions(-) create mode 100644 src/prefs/print/JobListView.cpp create mode 100644 src/prefs/print/JobListView.h create mode 100644 src/prefs/print/SpoolFolder.cpp create mode 100644 src/prefs/print/SpoolFolder.h create mode 100644 src/prefs/print/doxygen.cfg diff --git a/src/prefs/print/AddPrinterDialog.cpp b/src/prefs/print/AddPrinterDialog.cpp index 5071d22ba7..c699759048 100644 --- a/src/prefs/print/AddPrinterDialog.cpp +++ b/src/prefs/print/AddPrinterDialog.cpp @@ -1,6 +1,6 @@ /* * Printers Preference Application. - * Copyright (C) 2001 OpenBeOS. All Rights Reserved. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -260,6 +260,8 @@ void AddPrinterDialog::BuildGUI(int stage) // Auto resize window ResizeTo(ok->Frame().right + H_MARGIN, ok->Frame().bottom + V_MARGIN); + fName->MakeFocus(true); + Update(); // Stage == 0 // init_icon 64x114 Add a Local or Network Printer diff --git a/src/prefs/print/AddPrinterDialog.h b/src/prefs/print/AddPrinterDialog.h index 5790ce21d1..2ed6e8d3f8 100644 --- a/src/prefs/print/AddPrinterDialog.h +++ b/src/prefs/print/AddPrinterDialog.h @@ -1,3 +1,22 @@ +/* + * Printers Preference Application. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #ifndef ADDPRINTERDIALOG_H #define ADDPRINTERDIALOG_H diff --git a/src/prefs/print/Globals.cpp b/src/prefs/print/Globals.cpp index 1bedea622b..91df6b43e8 100644 --- a/src/prefs/print/Globals.cpp +++ b/src/prefs/print/Globals.cpp @@ -1,3 +1,22 @@ +/* + * Printers Preference Application. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #include "Globals.h" #include "pr_server.h" diff --git a/src/prefs/print/Globals.h b/src/prefs/print/Globals.h index 9bf4beda6d..0fcc2c00c9 100644 --- a/src/prefs/print/Globals.h +++ b/src/prefs/print/Globals.h @@ -1,3 +1,22 @@ +/* + * Printers Preference Application. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #ifndef GLOBALS_H #define GLOBALS_H diff --git a/src/prefs/print/Jamfile b/src/prefs/print/Jamfile index 4bb3fa7ca8..7db97cb791 100644 --- a/src/prefs/print/Jamfile +++ b/src/prefs/print/Jamfile @@ -1,6 +1,6 @@ SubDir OBOS_TOP src prefs print ; -UsePrivateHeaders interface ; +UsePrivateHeaders interface shared print ; AddResources Printers : Printers.FileTypes.rsrc ; @@ -9,6 +9,15 @@ Preference Printers : Printers.cpp PrintersWindow.cpp PrinterListView.cpp + JobListView.cpp + SpoolFolder.cpp Globals.cpp ; -LinkSharedOSLibs Printers : be ; \ No newline at end of file +# TODO remove dependency to libtranslation (BeUtils) +LinkSharedOSLibs + Printers + : + be + translation + libprint.a + ; diff --git a/src/prefs/print/JobListView.cpp b/src/prefs/print/JobListView.cpp new file mode 100644 index 0000000000..58a3611d9d --- /dev/null +++ b/src/prefs/print/JobListView.cpp @@ -0,0 +1,258 @@ +/* + * Printers Preference Application. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "JobListView.h" +#include "pr_server.h" + +#include "Messages.h" +#include "Globals.h" +#include "Jobs.h" +#include "SpoolFolder.h" + +#include +#include +#include +#include +#include +#include + +JobListView::JobListView(BRect frame) + : Inherited(frame, "jobs_list", B_SINGLE_SELECTION_LIST, B_FOLLOW_ALL) +{ +} + +void JobListView::AttachedToWindow() +{ + Inherited::AttachedToWindow(); + + SetSelectionMessage(new BMessage(MSG_JOB_SELECTED)); + SetTarget(Window()); +} + + +void JobListView::SetSpoolFolder(SpoolFolder* folder) +{ + BPath path; + + // clear list + const BListItem** items = Items(); + for (int i = CountItems() - 1; i >= 0; i --) { + delete items[i]; + } + MakeEmpty(); + if (folder == NULL) return; + + // Find directory containing printer definition nodes + for (int32 i = 0; i < folder->CountJobs(); i ++) { + Job* job = folder->JobAt(i); + AddJob(job); + } +} + +JobItem* JobListView::Find(Job* job) +{ + const int32 n = CountItems(); + for (int32 i = 0; i < n; i ++) { + JobItem* item = dynamic_cast(ItemAt(i)); + if (item && item->GetJob() == job) return item; + } + return NULL; +} + +JobItem* JobListView::SelectedItem() { + BListItem* item = ItemAt(CurrentSelection()); + return dynamic_cast(item); +} + +void JobListView::AddJob(Job* job) +{ + JobItem* item = new JobItem(job); + AddItem(item); + Invalidate(); +} + +void JobListView::RemoveJob(Job* job) +{ + JobItem* item = Find(job); + if (item) { + RemoveItem(item); + delete item; + Invalidate(); + } +} + +void JobListView::UpdateJob(Job* job) +{ + JobItem* item = Find(job); + if (item) { + item->Update(); + InvalidateItem(IndexOf(item)); + } +} + +void JobListView::RestartJob() +{ + JobItem* item = SelectedItem(); + if (item && item->GetJob()->Status() == kFailed) { + // setting the state changes the file attribute and + // we will receive a notification from SpoolFolder + item->GetJob()->SetStatus(kWaiting); + } +} + +void JobListView::CancelJob() +{ + JobItem* item = SelectedItem(); + if (item && item->GetJob()->Status() != kProcessing) { + item->GetJob()->SetStatus(kFailed); + item->GetJob()->Remove(); + } +} + + +// Implementation of JobItem + +JobItem::JobItem(Job* job) + : BListItem(0, false) + , fJob(job) + , fIcon(NULL) +{ + fJob->Acquire(); + + Update(); +} + +JobItem::~JobItem() { + fJob->Release(); +} + +void JobItem::Update() +{ + BNode node(&fJob->EntryRef()); + if (node.InitCheck() != B_OK) return; + + node.ReadAttrString(PSRV_SPOOL_ATTR_DESCRIPTION, &fName); + + BString mimeType; + node.ReadAttrString(PSRV_SPOOL_ATTR_MIMETYPE, &mimeType); + entry_ref ref; + if (fIcon == NULL && be_roster->FindApp(mimeType.String(), &ref) == B_OK) { + fIcon = new BBitmap(BRect(0,0,B_MINI_ICON-1,B_MINI_ICON-1), B_CMAP8); + BMimeType type(mimeType.String()); + if (type.GetIcon(fIcon, B_MINI_ICON) != B_OK) { + delete fIcon; fIcon = NULL; + } + } + + int32 pages; + fPages = ""; fSize = ""; fStatus = ""; + + if (node.ReadAttr(PSRV_SPOOL_ATTR_PAGECOUNT, B_INT32_TYPE, 0, &pages, sizeof(pages)) == sizeof(pages)) { + fPages << pages; + if (pages > 1) fPages << " pages."; + else fPages << " page."; + } else { + fPages = "??? pages."; + } + + off_t size; + if (node.GetSize(&size) == B_OK) { + char buffer[80]; + sprintf(buffer, "%.2f KB", size / 1024.0); + fSize = buffer; + } + + switch (fJob->Status()) { + case kWaiting: fStatus = "Waiting"; + break; + case kProcessing: fStatus = "Processing"; + break; + case kFailed: fStatus = "Failed"; + break; + case kCompleted: fStatus = "Completed"; + break; + default: fStatus = "Unkown status"; + } +} + +void JobItem::Update(BView *owner, const BFont *font) +{ + BListItem::Update(owner, font); + + font_height height; + font->GetHeight(&height); + + SetHeight( (height.ascent+height.descent+height.leading) * 2.0 +4 ); +} + +void JobItem::DrawItem(BView *owner, BRect, bool complete) +{ + BListView* list = dynamic_cast(owner); + if (list) + { + font_height height; + BFont font; + owner->GetFont(&font); + font.GetHeight(&height); + float fntheight = height.ascent+height.descent+height.leading; + + BRect bounds = list->ItemFrame(list->IndexOf(this)); + + rgb_color color = owner->ViewColor(); + if ( IsSelected() ) + color = tint_color(color, B_HIGHLIGHT_BACKGROUND_TINT); + + rgb_color oldviewcolor = owner->ViewColor(); + rgb_color oldlowcolor = owner->LowColor(); + rgb_color oldcolor = owner->HighColor(); + owner->SetViewColor( color ); + owner->SetHighColor( color ); + owner->SetLowColor( color ); + owner->FillRect(bounds); + owner->SetLowColor( oldlowcolor ); + owner->SetHighColor( oldcolor ); + + BPoint iconPt(bounds.LeftTop() + BPoint(2, 2)); + BPoint leftTop(bounds.LeftTop() + BPoint(12+B_MINI_ICON, 2)); + BPoint namePt(leftTop + BPoint(0, fntheight)); + BPoint statusPt(leftTop + BPoint(0, fntheight*2)); + + float width = owner->StringWidth(fPages.String()); + BPoint pagePt(bounds.RightTop() + BPoint(-width-32, fntheight)); + width = owner->StringWidth(fSize.String()); + BPoint sizePt(bounds.RightTop() + BPoint(-width-32, fntheight*2)); + + drawing_mode mode = owner->DrawingMode(); + owner->SetDrawingMode(B_OP_OVER); + + if (fIcon) owner->DrawBitmap(fIcon, iconPt); + + // left of item + owner->DrawString(fName.String(), fName.Length(), namePt); + owner->DrawString(fStatus.String(), fStatus.Length(), statusPt); + + // right of item + owner->DrawString(fPages.String(), fPages.Length(), pagePt); + owner->DrawString(fSize.String(), fSize.Length(), sizePt); + + owner->SetDrawingMode(mode); + + owner->SetViewColor(oldviewcolor); + } +} diff --git a/src/prefs/print/JobListView.h b/src/prefs/print/JobListView.h new file mode 100644 index 0000000000..aaba7a7410 --- /dev/null +++ b/src/prefs/print/JobListView.h @@ -0,0 +1,77 @@ +/* + * Printers Preference Application. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef JOBLISTVIEW_H +#define JOBLISTVIEW_H + +#include +#include +#include + +#include "Jobs.h" + +class JobItem; +class JobListView; +class SpoolFolder; + +class JobListView : public BListView +{ + typedef BListView Inherited; +private: + JobItem* Find(Job* job); + +public: + JobListView(BRect frame); + void AttachedToWindow(); + void SetSpoolFolder(SpoolFolder* folder); + + void AddJob(Job* job); + void RemoveJob(Job* job); + void UpdateJob(Job* job); + + JobItem* SelectedItem(); + + void RestartJob(); + void CancelJob(); +}; + +class BBitmap; +class JobItem : public BListItem +{ +public: + JobItem(Job* job); + ~JobItem(); + + void Update(); + + void Update(BView *owner, const BFont *font); + void DrawItem(BView *owner, BRect bounds, bool complete); + + Job* GetJob() { return fJob; } + +private: + + Job* fJob; + BBitmap* fIcon; + BString fName, fPages; + BString fStatus, fSize; +}; + + +#endif diff --git a/src/prefs/print/Messages.h b/src/prefs/print/Messages.h index ac3f74d720..e6d086346f 100644 --- a/src/prefs/print/Messages.h +++ b/src/prefs/print/Messages.h @@ -1,6 +1,6 @@ /* * Printers Preference Application. - * Copyright (C) 2001 OpenBeOS. All Rights Reserved. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,6 +28,7 @@ const uint32 MSG_MKDEF_PRINTER = 'MDfP'; const uint32 MSG_PRINTER_SELECTED = 'PSel'; const uint32 MSG_CANCEL_JOB = 'CncJ'; const uint32 MSG_RESTART_JOB = 'RstJ'; +const uint32 MSG_JOB_SELECTED = 'JSel'; const uint32 MSG_TRANSPORT_SELECTED = 'TSel'; const uint32 MSG_NAME_CHANGED = 'NCgd'; diff --git a/src/prefs/print/PrinterListView.cpp b/src/prefs/print/PrinterListView.cpp index 84644468c6..6aa069352d 100644 --- a/src/prefs/print/PrinterListView.cpp +++ b/src/prefs/print/PrinterListView.cpp @@ -1,6 +1,6 @@ /* * Printers Preference Application. - * Copyright (C) 2001 OpenBeOS. All Rights Reserved. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,41 +22,48 @@ #include "Messages.h" #include "Globals.h" +#include "PrintersWindow.h" +#include "SpoolFolder.h" #include #include #include #include #include +#include + +// Implementation of PrinterListView PrinterListView::PrinterListView(BRect frame) : Inherited(frame, "printers_list", B_SINGLE_SELECTION_LIST, B_FOLLOW_ALL) + , fFolder(NULL) { - // TODO: Fixup situation in which PrintServer is not running - BMessenger msgr; - if (GetPrinterServerMessenger(msgr) == B_OK) - { - BMessage count(B_COUNT_PROPERTIES); - count.AddSpecifier("Printers"); - - BMessage reply; - msgr.SendMessage(&count, &reply); +} - int32 countPrinters; - if (reply.FindInt32("result", &countPrinters) == B_OK) - { - for (int32 printerIdx=0; printerIdx < countPrinters; printerIdx++) - { - BMessage getPrinter(B_GET_PROPERTY); - getPrinter.AddSpecifier("Printer", printerIdx); - msgr.SendMessage(&getPrinter, &reply); - - reply.PrintToStream(); - - BMessenger thePrinter; - if (reply.FindMessenger("result", &thePrinter) == B_OK) { - AddItem(new PrinterItem(thePrinter), CountItems()); - } +void PrinterListView::BuildPrinterList() { + // clear list + const BListItem** items = Items(); + for (int32 i = CountItems()-1; i >= 0; i --) { + delete items[i]; + } + MakeEmpty(); + + // TODO: Fixup situation in which PrintServer is not running + BEntry entry; + status_t rc; + BPath path; + + // Find directory containing printer definition nodes + if ((rc=::find_directory(B_USER_PRINTERS_DIRECTORY, &path)) == B_OK) { + BDirectory dir(path.Path()); + + // Can we reach the directory? + if ((rc = dir.InitCheck()) == B_OK) { + fNode = dir; + // Yes, so loop over it's entries + while((rc = dir.GetNextEntry(&entry)) == B_OK) { + BDirectory printer(&entry); + AddPrinter(printer); } } } @@ -70,6 +77,8 @@ void PrinterListView::AttachedToWindow() SetInvocationMessage(new BMessage(MSG_MKDEF_PRINTER)); SetTarget(Window()); + BuildPrinterList(); + // Select active printer for (int32 i = 0; i < CountItems(); i ++) { PrinterItem* item = dynamic_cast(ItemAt(i)); @@ -77,14 +86,89 @@ void PrinterListView::AttachedToWindow() Select(i); break; } } + + BPath path; + if (find_directory(B_USER_PRINTERS_DIRECTORY, &path) == B_OK) { + BDirectory dir(path.Path()); + if (dir.InitCheck() == B_OK) { + fFolder = new FolderWatcher(this->Window(), dir, true); + fFolder->SetListener(this); + } + } +} + +bool PrinterListView::QuitRequested() { + delete fFolder; fFolder = NULL; + return true; +} + +void PrinterListView::AddPrinter(BDirectory& printer) { + BString state; + node_ref node; + // If the entry is a directory + if (printer.InitCheck() == B_OK && + printer.GetNodeRef(&node) == B_OK && + FindItem(&node) == NULL && + printer.ReadAttrString(PSRV_PRINTER_ATTR_STATE, &state) == B_OK && + state == "free") { + // Check it's Mime type for a spool director + BNodeInfo info(&printer); + char buffer[256]; + + if (info.GetType(buffer) == B_OK && + strcmp(buffer, PSRV_PRINTER_FILETYPE) == 0) { + // Yes, it is a printer definition node + AddItem(new PrinterItem(dynamic_cast(Window()), printer)); + } + } +} + +PrinterItem* PrinterListView::FindItem(node_ref* node) { + for (int32 i = CountItems()-1; i >= 0; i --) { + PrinterItem* item = dynamic_cast(ItemAt(i)); + node_ref ref; + if (item && item->Node()->GetNodeRef(&ref) == B_OK && ref == *node) { + return item; + } + } + return NULL; +} + +void PrinterListView::EntryCreated(node_ref* node, entry_ref* entry) { + BDirectory printer(node); + AddPrinter(printer); +} + +void PrinterListView::EntryRemoved(node_ref* node) { + PrinterItem* item = FindItem(node); + if (item) { + RemoveItem(item); + delete item; + } +} + +void PrinterListView::AttributeChanged(node_ref* node) { + BDirectory printer(node); + AddPrinter(printer); +} + +void PrinterListView::UpdateItem(PrinterItem* item) { + item->UpdatePendingJobs(); + InvalidateItem(IndexOf(item)); +} + +PrinterItem* PrinterListView::SelectedItem() { + BListItem* item = ItemAt(CurrentSelection()); + return dynamic_cast(item); } BBitmap* PrinterItem::sIcon = NULL; BBitmap* PrinterItem::sSelectedIcon = NULL; -PrinterItem::PrinterItem(const BMessenger& thePrinter) - : BListItem(0, false), - fMessenger(thePrinter) +PrinterItem::PrinterItem(PrintersWindow* window, const BDirectory& node) + : BListItem(0, false) + , fFolder(NULL) + , fNode(node) { if (sIcon == NULL) { @@ -101,19 +185,29 @@ PrinterItem::PrinterItem(const BMessenger& thePrinter) } // Get Name of printer - GetStringProperty("Name", fName); - GetStringProperty("Comments", fComments); - GetStringProperty("TransportAddon", fTransport); - GetStringProperty("PrinterAddon", fDriverName); + GetStringProperty(PSRV_PRINTER_ATTR_PRT_NAME, fName); + GetStringProperty(PSRV_PRINTER_ATTR_COMMENTS, fComments); + GetStringProperty(PSRV_PRINTER_ATTR_TRANSPORT, fTransport); + GetStringProperty(PSRV_PRINTER_ATTR_DRV_NAME, fDriverName); + + BPath path; + // Setup spool folder + if (find_directory(B_USER_PRINTERS_DIRECTORY, &path) == B_OK) { + path.Append(fName.String()); + BDirectory dir(path.Path()); + if (dir.InitCheck() != B_OK) return; + fFolder = new SpoolFolder(window, this, dir); + } + UpdatePendingJobs(); +} + +PrinterItem::~PrinterItem() { + delete fFolder; fFolder = NULL; } void PrinterItem::GetStringProperty(const char* propName, BString& outString) { - BMessage script(B_GET_PROPERTY); - BMessage reply; - script.AddSpecifier(propName); - fMessenger.SendMessage(&script,&reply); - reply.FindString("result", &outString); + fNode.ReadAttrString(propName, &outString); } void PrinterItem::Update(BView *owner, const BFont *font) @@ -126,7 +220,7 @@ void PrinterItem::Update(BView *owner, const BFont *font) SetHeight( (height.ascent+height.descent+height.leading) * 3.0 +4 ); } -void PrinterItem::Remove(BListView* view) +bool PrinterItem::Remove(BListView* view) { BMessenger msgr; @@ -137,9 +231,11 @@ void PrinterItem::Remove(BListView* view) script.AddSpecifier("Printer", view->IndexOf(this)); - if (msgr.SendMessage(&script,&reply) == B_OK) - view->RemoveItem(this); + if (msgr.SendMessage(&script,&reply) == B_OK) { + return true; + } } + return false; } void PrinterItem::DrawItem(BView *owner, BRect /*bounds*/, bool complete) @@ -174,7 +270,7 @@ void PrinterItem::DrawItem(BView *owner, BRect /*bounds*/, bool complete) BPoint driverPt = iconPt + BPoint(B_LARGE_ICON+8, fntheight*2); BPoint commentPt = iconPt + BPoint(B_LARGE_ICON+8, fntheight*3); - float width = owner->StringWidth("No jobs pending."); + float width = owner->StringWidth("No pending jobs."); BPoint pendingPt(bounds.right - width -8, namePt.y); BPoint transportPt(bounds.right - width -8, driverPt.y); @@ -188,7 +284,7 @@ void PrinterItem::DrawItem(BView *owner, BRect /*bounds*/, bool complete) owner->DrawString(fComments.String(), fComments.Length(), commentPt); // right of item - owner->DrawString("No jobs pending.", 16, pendingPt); + owner->DrawString(fPendingJobs.String(), 16, pendingPt); owner->DrawString(fTransport.String(), fTransport.Length(), transportPt); owner->SetDrawingMode(mode); @@ -218,3 +314,28 @@ bool PrinterItem::IsActivePrinter() return rc; } +bool PrinterItem::HasPendingJobs() { + return fFolder && fFolder->CountJobs() > 0; +} + +SpoolFolder* PrinterItem::Folder() { + return fFolder; +} + +BDirectory* PrinterItem::Node() { + return &fNode; +} + +void PrinterItem::UpdatePendingJobs() { + if (fFolder) { + uint32 pendingJobs = fFolder->CountJobs(); + fPendingJobs = ""; + if (pendingJobs == 1) { + fPendingJobs = "1 pending job."; + } else if (pendingJobs > 1) { + fPendingJobs << pendingJobs << " pending jobs.h"; + } + if (pendingJobs >= 1) return; + } + fPendingJobs = "No pending jobs."; +} diff --git a/src/prefs/print/PrinterListView.h b/src/prefs/print/PrinterListView.h index fe4dee96fb..5c011b2f77 100644 --- a/src/prefs/print/PrinterListView.h +++ b/src/prefs/print/PrinterListView.h @@ -1,6 +1,6 @@ /* * Printers Preference Application. - * Copyright (C) 2001 OpenBeOS. All Rights Reserved. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,37 +25,72 @@ class PrinterListView; #include #include #include +#include +#include -class PrinterListView : public BListView +#include "FolderWatcher.h" + +class SpoolFolder; +class PrinterItem; +class PrinterListView; + +class PrinterListView : public BListView, public FolderListener { typedef BListView Inherited; + + BDirectory fNode; + FolderWatcher* fFolder; + + void AddPrinter(BDirectory& printer); + PrinterItem* FindItem(node_ref* node); + + void EntryCreated(node_ref* node, entry_ref* entry); + void EntryRemoved(node_ref* node); + void AttributeChanged(node_ref* node); + public: PrinterListView(BRect frame); void AttachedToWindow(); + bool QuitRequested(); + + void BuildPrinterList(); + PrinterItem* SelectedItem(); + + void UpdateItem(PrinterItem* item); }; class BBitmap; +class PrintersWindow; class PrinterItem : public BListItem { public: - PrinterItem(const BMessenger& thePrinter); - + PrinterItem(PrintersWindow* window, const BDirectory& node/*const BMessenger& thePrinter*/); + ~PrinterItem(); + void DrawItem(BView *owner, BRect bounds, bool complete); void Update(BView *owner, const BFont *font); - void Remove(BListView* view); + bool Remove(BListView* view); bool IsActivePrinter(); + bool HasPendingJobs(); const char* Name() const { return fName.String(); } + + SpoolFolder* Folder(); + BDirectory* Node(); + void UpdatePendingJobs(); + private: void GetStringProperty(const char* propName, BString& outString); - BMessenger fMessenger; + SpoolFolder *fFolder; + BDirectory fNode; BString fComments; BString fTransport; BString fDriverName; BString fName; + BString fPendingJobs; static BBitmap* sIcon; static BBitmap* sSelectedIcon; }; diff --git a/src/prefs/print/Printers.cpp b/src/prefs/print/Printers.cpp index 4e6ee636a0..69a2254e38 100644 --- a/src/prefs/print/Printers.cpp +++ b/src/prefs/print/Printers.cpp @@ -1,6 +1,6 @@ /* * Printers Preference Application. - * Copyright (C) 2001 OpenBeOS. All Rights Reserved. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,3 +40,16 @@ void PrintersApp::ReadyToRun() PrintersWindow* win = new PrintersWindow(BRect(78.0, 71.0, 561.0, 409.0)); win->Show(); } + +void PrintersApp::MessageReceived(BMessage* msg) { + if (msg->what == B_PRINTER_CHANGED) { + // broadcast message + BWindow* w; + for (int32 i = 0; (w = WindowAt(i)) != NULL; i ++) { + BMessenger msgr(NULL, w); + msgr.SendMessage(B_PRINTER_CHANGED); + } + } else { + BApplication::MessageReceived(msg); + } +} diff --git a/src/prefs/print/Printers.h b/src/prefs/print/Printers.h index 52efab781a..020994a821 100644 --- a/src/prefs/print/Printers.h +++ b/src/prefs/print/Printers.h @@ -1,6 +1,6 @@ /* * Printers Preference Application. - * Copyright (C) 2001 OpenBeOS. All Rights Reserved. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,6 +32,7 @@ class PrintersApp : public BApplication public: PrintersApp(); void ReadyToRun(); + void MessageReceived(BMessage* msg); }; #endif diff --git a/src/prefs/print/PrintersWindow.cpp b/src/prefs/print/PrintersWindow.cpp index 3ce6908c97..8efc7c39e6 100644 --- a/src/prefs/print/PrintersWindow.cpp +++ b/src/prefs/print/PrintersWindow.cpp @@ -1,6 +1,6 @@ /* * Printers Preference Application. - * Copyright (C) 2001 OpenBeOS. All Rights Reserved. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,8 @@ #include "pr_server.h" #include "Globals.h" #include "Messages.h" +#include "JobListView.h" +#include "SpoolFolder.h" // BeOS API #include @@ -31,9 +33,11 @@ #include #include #include +#include PrintersWindow::PrintersWindow(BRect frame) : Inherited(BRect(78.0, 71.0, 561.0, 409.0), "Printers", B_TITLED_WINDOW, B_NOT_H_RESIZABLE) + , fSelectedPrinter(NULL) { BuildGUI(); } @@ -54,52 +58,35 @@ void PrintersWindow::MessageReceived(BMessage* msg) { case MSG_PRINTER_SELECTED: { - int32 prIndex = fPrinterListView->CurrentSelection(); - if (prIndex >= 0) + PrinterItem* fSelectedPrinter = fPrinterListView->SelectedItem(); + if (fSelectedPrinter) { - BMessenger msgr; - if (::GetPrinterServerMessenger(msgr) == B_OK) - { - BMessage script(B_GET_PROPERTY); - BMessage reply; - BString name; - - script.AddSpecifier("Name"); - script.AddSpecifier("Printer", fPrinterListView->CurrentSelection()); - msgr.SendMessage(&script,&reply); - if (reply.FindString("result", &name) == B_OK) - { - fJobsBox->SetLabel((BString("Print Jobs for ") << name).String()); - fMakeDefault->SetEnabled(true); - fRemove->SetEnabled(true); - } - } + fJobsBox->SetLabel((BString("Print Jobs for ") << fSelectedPrinter->Name()).String()); + fMakeDefault->SetEnabled(true); + fRemove->SetEnabled(true); + fJobListView->SetSpoolFolder(fSelectedPrinter->Folder()); } else { fJobsBox->SetLabel("Print Jobs: No printer selected"); fMakeDefault->SetEnabled(false); fRemove->SetEnabled(false); + fSelectedPrinter = NULL; + fJobListView->SetSpoolFolder(NULL); } + UpdateJobButtons(); + UpdatePrinterButtons(); } break; case MSG_ADD_PRINTER: - if (AddPrinterDialog::Start() == B_OK); + AddPrinterDialog::Start(); break; case MSG_REMOVE_PRINTER: { - // Get selection - int32 idx = fPrinterListView->CurrentSelection(); - - // If a printer is selected - if (idx >= 0) - { - PrinterItem* item = (PrinterItem*)fPrinterListView->ItemAt(idx); - if (item != NULL) - item->Remove(fPrinterListView); - } + fSelectedPrinter = fPrinterListView->SelectedItem(); + if (fSelectedPrinter) fSelectedPrinter->Remove(fPrinterListView); } break; @@ -118,19 +105,27 @@ void PrintersWindow::MessageReceived(BMessage* msg) msgr.SendMessage(&setActivePrinter); fPrinterListView->Invalidate(); + UpdatePrinterButtons(); } } } break; - case MSG_CANCEL_JOB: + case MSG_CANCEL_JOB: fJobListView->CancelJob(); break; - case MSG_RESTART_JOB: + case MSG_RESTART_JOB: fJobListView->RestartJob(); break; + case MSG_JOB_SELECTED: UpdateJobButtons(); + break; + case B_PRINTER_CHANGED: + // active printer could have been changed + fPrinterListView->Invalidate(); + break; + default: Inherited::MessageReceived(msg); } @@ -216,6 +211,7 @@ void PrintersWindow::BuildGUI() BButton* cancelButton = new BButton(BRect(5,5,5,5), "cancel", "Cancel Job", new BMessage(MSG_CANCEL_JOB), B_FOLLOW_RIGHT+B_FOLLOW_TOP); fJobsBox->AddChild(cancelButton); cancelButton->ResizeToPreferred(); + fCancel = cancelButton; maxWidth = cancelButton->Bounds().Width(); @@ -223,6 +219,7 @@ void PrintersWindow::BuildGUI() BButton* restartButton = new BButton(BRect(5,30,5,30), "restart", "Restart Job", new BMessage(MSG_RESTART_JOB), B_FOLLOW_RIGHT+B_FOLLOW_TOP); fJobsBox->AddChild(restartButton); restartButton->ResizeToPreferred(); + fRestart = restartButton; if (restartButton->Bounds().Width() > maxWidth) maxWidth = restartButton->Bounds().Width(); @@ -242,7 +239,7 @@ void PrintersWindow::BuildGUI() // Create listview with scroller listBounds = BRect(boxInset, boxInset+5, cancelButton->Frame().left - boxInset - B_V_SCROLL_BAR_WIDTH, fJobsBox->Bounds().Height()-boxInset); - fJobListView = new BListView(listBounds, "jobs_list", B_SINGLE_SELECTION_LIST, B_FOLLOW_ALL); + fJobListView = new JobListView(listBounds); BScrollView* jscroller = new BScrollView("jobs_scroller", fJobListView, B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS, false, true, B_FANCY_BORDER); fJobsBox->AddChild(jscroller); @@ -258,3 +255,50 @@ void PrintersWindow::BuildGUI() SetSizeLimits(Bounds().Width(), Bounds().Width(), Bounds().Height(), 20000); } + +bool 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() { + PrinterItem* item = fPrinterListView->SelectedItem(); + fRemove->SetEnabled(item && !item->HasPendingJobs()); + fMakeDefault->SetEnabled(item && !item->IsActivePrinter()); +} + +void PrintersWindow::UpdateJobButtons() { + JobItem* item = fJobListView->SelectedItem(); + if (item != NULL) { + Job* job = item->GetJob(); + fCancel->SetEnabled(job->Status() != kProcessing); + fRestart->SetEnabled(job->Status() == kFailed); + } else { + fCancel->SetEnabled(false); + fRestart->SetEnabled(false); + } +} diff --git a/src/prefs/print/PrintersWindow.h b/src/prefs/print/PrintersWindow.h index 001ad300de..e20addd560 100644 --- a/src/prefs/print/PrintersWindow.h +++ b/src/prefs/print/PrintersWindow.h @@ -1,6 +1,6 @@ /* * Printers Preference Application. - * Copyright (C) 2001 OpenBeOS. All Rights Reserved. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,11 @@ #define PRINTERSWINDOW_H class PrintersWindow; +class PrinterListView; +class JobListView; +class Job; +class SpoolFolder; +class PrinterItem; #include @@ -32,15 +37,28 @@ public: void MessageReceived(BMessage* msg); bool QuitRequested(); + + 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(); - BListView* fPrinterListView; + PrinterListView* fPrinterListView; BButton* fMakeDefault; BButton* fRemove; - BListView* fJobListView; + JobListView* fJobListView; + BButton* fRestart; + BButton* fCancel; + BBox* fJobsBox; + + PrinterItem* fSelectedPrinter; }; #endif diff --git a/src/prefs/print/SpoolFolder.cpp b/src/prefs/print/SpoolFolder.cpp new file mode 100644 index 0000000000..717c0c673b --- /dev/null +++ b/src/prefs/print/SpoolFolder.cpp @@ -0,0 +1,54 @@ +/* + * Printers Preference Application. + * Copyright (C) 2002 OpenBeOS. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "SpoolFolder.h" +#include "JobListView.h" +#include "pr_server.h" + +#include "Messages.h" +#include "Globals.h" +#include "Jobs.h" +#include "PrintersWindow.h" + +#include +#include +#include +#include +#include +#include + +SpoolFolder::SpoolFolder(PrintersWindow* window, PrinterItem* item, const BDirectory& spoolDir) + : Folder(NULL, window, spoolDir) + , fWindow(window) + , fItem(item) +{ +} + +void SpoolFolder::Notify(Job* job, int kind) +{ + switch (kind) { + case kJobAdded: fWindow->AddJob(this, job); + break; + case kJobRemoved: fWindow->RemoveJob(this, job); + break; + case kJobAttrChanged: fWindow->UpdateJob(this, job); + break; + default: ; + } +} diff --git a/src/prefs/print/SpoolFolder.h b/src/prefs/print/SpoolFolder.h new file mode 100644 index 0000000000..f3958e43fc --- /dev/null +++ b/src/prefs/print/SpoolFolder.h @@ -0,0 +1,45 @@ +/* + * Printers Preference Application. + * Copyright (C) 2001, 2002 OpenBeOS. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef SPOOL_FOLDER_H +#define SPOOL_FODLER_H + +#include +#include +#include + +#include "Jobs.h" + +class PrintersWindow; +class PrinterItem; + +class SpoolFolder : public Folder { +protected: + void Notify(Job* job, int kind); + + PrintersWindow* fWindow; + PrinterItem* fItem; + +public: + SpoolFolder(PrintersWindow* window, PrinterItem* item, const BDirectory& spoolDir); + PrinterItem* Item() const { return fItem; } +}; + + +#endif diff --git a/src/prefs/print/doxygen.cfg b/src/prefs/print/doxygen.cfg new file mode 100644 index 0000000000..c7f63891eb --- /dev/null +++ b/src/prefs/print/doxygen.cfg @@ -0,0 +1,691 @@ +# Doxyfile 1.2.1 + +# This file describes the settings to be used by doxygen for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "Printer Preferences" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = "Beta 3" + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, +# Spanish, Russian, Croatian, Polish, and Portuguese. + +OUTPUT_LANGUAGE = English + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these class will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. + +STRIP_FROM_PATH = + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a class diagram (in Html and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. + +CLASS_DIAGRAMS = YES + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the CASE_SENSE_NAMES tag is set to NO (the default) then Doxygen +# will only generate file names in lower case letters. If set to +# YES upper case letters are also allowed. This is useful if you have +# classes or files whose names only differ in case and if your file system +# supports case sensitive file names. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the Javadoc-style will +# behave just like the Qt-style comments. + +JAVADOC_AUTOBRIEF = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# reimplements. + +INHERIT_DOCS = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# The ENABLE_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./ + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +FILE_PATTERNS = *.cpp *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimised for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using a WORD or other. +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assigments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. Warning: This feature +# is still experimental and very incomplete. + +GENERATE_XML = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tagfiles. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /boot/apps/GeekGadgets/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to +# YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other +# documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to +# YES then doxygen will generate a graph for each documented header file showing +# the documented files that directly or indirectly include this file + +INCLUDED_BY_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO + +# The CGI_NAME tag should be the name of the CGI script that +# starts the search engine (doxysearch) with the correct parameters. +# A script with this name will be generated by doxygen. + +CGI_NAME = search.cgi + +# The CGI_URL tag should be the absolute URL to the directory where the +# cgi binaries are located. See the documentation of your http daemon for +# details. + +CGI_URL = + +# The DOC_URL tag should be the absolute URL to the directory where the +# documentation is located. If left blank the absolute path to the +# documentation, with file:// prepended to it, will be used. + +DOC_URL = + +# The DOC_ABSPATH tag should be the absolute path to the directory where the +# documentation is located. If left blank the directory on the local machine +# will be used. + +DOC_ABSPATH = + +# The BIN_ABSPATH tag must point to the directory where the doxysearch binary +# is installed. + +BIN_ABSPATH = /usr/local/bin/ + +# The EXT_DOC_PATHS tag can be used to specify one or more paths to +# documentation generated for other projects. This allows doxysearch to search +# the documentation for these projects as well. + +EXT_DOC_PATHS =