[haiku-commits] r39141 - in haiku/trunk: headers/libs/print/libprint src/add-ons/print/drivers/canon_lips/lips3 src/add-ons/print/drivers/canon_lips/lips4 src/add-ons/print/drivers/pcl5 src/add-ons/print/drivers/pcl6 ...

  • From: michael.w.pfeiffer@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 25 Oct 2010 16:21:10 +0200 (CEST)

Author: laplace
Date: 2010-10-25 16:21:09 +0200 (Mon, 25 Oct 2010)
New Revision: 39141
Changeset: http://dev.haiku-os.org/changeset/39141

Modified:
   haiku/trunk/headers/libs/print/libprint/JobSetupDlg.h
   haiku/trunk/headers/libs/print/libprint/PrinterCap.h
   haiku/trunk/src/add-ons/print/drivers/canon_lips/lips3/Lips3Cap.cpp
   haiku/trunk/src/add-ons/print/drivers/canon_lips/lips4/Lips4Cap.cpp
   haiku/trunk/src/add-ons/print/drivers/pcl5/PCL5Cap.cpp
   haiku/trunk/src/add-ons/print/drivers/pcl6/PCL6Cap.cpp
   haiku/trunk/src/add-ons/print/drivers/postscript/PSCap.cpp
   haiku/trunk/src/libs/print/libprint/JobSetupDlg.cpp
   haiku/trunk/src/libs/print/libprint/PrinterCap.cpp
Log:
* Added field fKey to BaseCap (will be required for Gutenprint printer
  driver add-on).
* Added ability to search for a PrinterCap by ID to class PrinterCap
  (for Gutenprint driver add-on).
* Moved code for searching a PrinterCap by name into class PrinterCap.
* Refactored code in JobSetupDlg to use the new method.
* Refactored duplicated code in JobSetupDlg.
* There is still a lot of refactoring potential in libprint.


Modified: haiku/trunk/headers/libs/print/libprint/JobSetupDlg.h
===================================================================
--- haiku/trunk/headers/libs/print/libprint/JobSetupDlg.h       2010-10-25 
11:44:09 UTC (rev 39140)
+++ haiku/trunk/headers/libs/print/libprint/JobSetupDlg.h       2010-10-25 
14:21:09 UTC (rev 39141)
@@ -12,6 +12,7 @@
 #include "JobData.h"
 #include "Halftone.h"
 #include "JSDSlider.h"
+#include "PrinterCap.h"
 
 class BTextControl;
 class BTextView;
@@ -34,13 +35,20 @@
 
 private:
        void UpdateButtonEnabledState();
+       void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
+               PrinterCap::CapID category, int id);
+       void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
+               const BaseCap** capabilities, int count, int id);
+       int     GetID(const BaseCap** capabilities, int count, const char* 
label,
+               int defaultValue);
        BRadioButton* CreatePageSelectionItem(const char* name, const char* 
label,
                JobData::PageSelection pageSelection);
        void AllowOnlyDigits(BTextView* textView, int maxDigits);
-       JobData::Color getColor();
-       Halftone::DitherType getDitherType();
-       float getGamma();
-       float getInkDensity();
+       JobData::Color Color();
+       Halftone::DitherType DitherType();
+       float Gamma();
+       float InkDensity();
+       JobData::PaperSource PaperSource();
 
        BTextControl     *fCopies;
        BTextControl     *fFromPage;

Modified: haiku/trunk/headers/libs/print/libprint/PrinterCap.h
===================================================================
--- haiku/trunk/headers/libs/print/libprint/PrinterCap.h        2010-10-25 
11:44:09 UTC (rev 39140)
+++ haiku/trunk/headers/libs/print/libprint/PrinterCap.h        2010-10-25 
14:21:09 UTC (rev 39141)
@@ -18,9 +18,13 @@
 
 struct BaseCap {
                                                        BaseCap(const string 
&label, bool isDefault);
+       virtual                                 ~BaseCap();
 
+       virtual int                             ID() const = 0;
+
                        string                  fLabel;
                        bool                    fIsDefault;
+                       string                  fKey;
 };
 
 struct PaperCap : public BaseCap {
@@ -28,6 +32,8 @@
                                                                JobData::Paper 
paper, const BRect &paperRect,
                                                                const BRect 
&physicalRect);
 
+                       int                             ID() const;
+
                        JobData::Paper  fPaper;
                        BRect                   fPaperRect;
                        BRect                   fPhysicalRect;
@@ -37,13 +43,18 @@
                                                        PaperSourceCap(const 
string &label, bool isDefault,
                                                                
JobData::PaperSource paperSource);
 
+                       int                             ID() const;
+
                        JobData::PaperSource    fPaperSource;
 };
 
 struct ResolutionCap : public BaseCap {
                                                        ResolutionCap(const 
string &label, bool isDefault,
-                                                               int 
xResolution, int yResolution);
+                                                               int id, int 
xResolution, int yResolution);
 
+                       int                             ID() const;
+
+                       int                             fID;
                        int                             fXResolution;
                        int                             fYResolution;
 };
@@ -52,6 +63,8 @@
                                                        OrientationCap(const 
string &label, bool isDefault,
                                                                        
JobData::Orientation orientation);
 
+                       int                             ID() const;
+
                        JobData::Orientation    fOrientation;
 };
 
@@ -59,6 +72,8 @@
                                                        PrintStyleCap(const 
string &label, bool isDefault,
                                                                
JobData::PrintStyle printStyle);
 
+                       int                             ID() const;
+
                        JobData::PrintStyle             fPrintStyle;
 };
 
@@ -67,6 +82,8 @@
                                                                bool isDefault,
                                                                
JobData::BindingLocation bindingLocation);
 
+                       int                             ID() const;
+
                        JobData::BindingLocation        fBindingLocation;
 };
 
@@ -74,6 +91,8 @@
                                                        ColorCap(const string 
&label, bool isDefault,
                                                                JobData::Color 
color);
 
+                       int                             ID() const;
+
                        JobData::Color  fColor;
 };
 
@@ -82,6 +101,8 @@
                                                                bool isDefault, 
int protocolClass,
                                                                const string 
&description);
 
+                       int                             ID() const;
+
                        int                     fProtocolClass;
                        string          fDescription;
 };
@@ -108,16 +129,19 @@
                kCopyCommand,       // supports printer page copy command?
        };
 
-       virtual int                             countCap(CapID) const = 0;
-       virtual bool                    isSupport(CapID) const = 0;
-       virtual const BaseCap** enumCap(CapID) const = 0;
-                       const BaseCap*  getDefaultCap(CapID) const;
+       virtual int                             countCap(CapID category) const 
= 0;
+       virtual bool                    isSupport(CapID category) const = 0;
+       virtual const BaseCap** enumCap(CapID category) const = 0;
+                       const BaseCap*  getDefaultCap(CapID category) const;
+                       const BaseCap*  findCap(CapID category, int id) const;
+                       const BaseCap*  findCap(CapID category, const char* 
label) const;
+
                        int                             getPrinterId() const;
                        int                             getProtocolClass() 
const;
 
 protected:
-                                                       PrinterCap(const 
PrinterCap &);
-                       PrinterCap&             operator=(const PrinterCap &);
+                                                       PrinterCap(const 
PrinterCap &printerCap);
+                       PrinterCap&             operator=(const PrinterCap 
&printerCap);
 
                        const PrinterData*      getPrinterData() const;
                        void                            setPrinterId(int id);

Modified: haiku/trunk/src/add-ons/print/drivers/canon_lips/lips3/Lips3Cap.cpp
===================================================================
--- haiku/trunk/src/add-ons/print/drivers/canon_lips/lips3/Lips3Cap.cpp 
2010-10-25 11:44:09 UTC (rev 39140)
+++ haiku/trunk/src/add-ons/print/drivers/canon_lips/lips3/Lips3Cap.cpp 
2010-10-25 14:21:09 UTC (rev 39141)
@@ -71,7 +71,7 @@
 const PaperSourceCap upper("Upper",   false, JobData::kUpper);
 const PaperSourceCap lower("Lower",   false, JobData::kLower);
 
-const ResolutionCap dpi300("300dpi",   true, 300,  300);
+const ResolutionCap dpi300("300dpi",   true, 0, 300,  300);
 
 const PaperCap* papers[] = {
        &a4,

Modified: haiku/trunk/src/add-ons/print/drivers/canon_lips/lips4/Lips4Cap.cpp
===================================================================
--- haiku/trunk/src/add-ons/print/drivers/canon_lips/lips4/Lips4Cap.cpp 
2010-10-25 11:44:09 UTC (rev 39140)
+++ haiku/trunk/src/add-ons/print/drivers/canon_lips/lips4/Lips4Cap.cpp 
2010-10-25 14:21:09 UTC (rev 39141)
@@ -98,9 +98,9 @@
 const PaperSourceCap middle("Middle", false, JobData::kMiddle);
 const PaperSourceCap lower("Lower",   false, JobData::kLower);
 
-const ResolutionCap dpi1200("1200dpi", false, 1200, 1200);
-const ResolutionCap dpi600("600dpi",   true,  600,  600);
-const ResolutionCap dpi300("300dpi",   false, 300,  300);
+const ResolutionCap dpi1200("1200dpi", false, 0, 1200, 1200);
+const ResolutionCap dpi600("600dpi",   true,  1, 600,  600);
+const ResolutionCap dpi300("300dpi",   false, 2, 300,  300);
 
 const PrintStyleCap simplex("Simplex", true,  JobData::kSimplex);
 const PrintStyleCap duplex("Duplex",   false, JobData::kDuplex);

Modified: haiku/trunk/src/add-ons/print/drivers/pcl5/PCL5Cap.cpp
===================================================================
--- haiku/trunk/src/add-ons/print/drivers/pcl5/PCL5Cap.cpp      2010-10-25 
11:44:09 UTC (rev 39140)
+++ haiku/trunk/src/add-ons/print/drivers/pcl5/PCL5Cap.cpp      2010-10-25 
14:21:09 UTC (rev 39141)
@@ -68,9 +68,9 @@
 
 const PaperSourceCap autobin("Auto",  true,  JobData::kAuto);
 
-const ResolutionCap dpi300("300dpi",   true, 300,  300);
-const ResolutionCap dpi600("600dpi",  false, 600,  600);
-const ResolutionCap dpi1200("1200dpi", false, 1200, 1200);
+const ResolutionCap dpi300("300dpi",   true, 0, 300,  300);
+const ResolutionCap dpi600("600dpi",  false, 1, 600,  600);
+const ResolutionCap dpi1200("1200dpi", false, 2, 1200, 1200);
 
 const PaperCap* papers[] = {
        &a4,

Modified: haiku/trunk/src/add-ons/print/drivers/pcl6/PCL6Cap.cpp
===================================================================
--- haiku/trunk/src/add-ons/print/drivers/pcl6/PCL6Cap.cpp      2010-10-25 
11:44:09 UTC (rev 39140)
+++ haiku/trunk/src/add-ons/print/drivers/pcl6/PCL6Cap.cpp      2010-10-25 
14:21:09 UTC (rev 39141)
@@ -145,10 +145,10 @@
 // since 2.0:
 const PaperSourceCap thridCassette("Thrid Cassette",  false,  
JobData::kMiddle);
 
-const ResolutionCap dpi150("150dpi", false, 150, 150);
-const ResolutionCap dpi300("300dpi", true, 300, 300);
-const ResolutionCap dpi600("600dpi", false, 600, 600);
-const ResolutionCap dpi1200("1200dpi", false, 1200, 1200);
+const ResolutionCap dpi150("150dpi", false, 0, 150, 150);
+const ResolutionCap dpi300("300dpi", true, 1, 300, 300);
+const ResolutionCap dpi600("600dpi", false, 2, 600, 600);
+const ResolutionCap dpi1200("1200dpi", false, 3, 1200, 1200);
 
 const PrintStyleCap simplex("Simplex", true, JobData::kSimplex);
 const PrintStyleCap duplex("Duplex", false, JobData::kDuplex);

Modified: haiku/trunk/src/add-ons/print/drivers/postscript/PSCap.cpp
===================================================================
--- haiku/trunk/src/add-ons/print/drivers/postscript/PSCap.cpp  2010-10-25 
11:44:09 UTC (rev 39140)
+++ haiku/trunk/src/add-ons/print/drivers/postscript/PSCap.cpp  2010-10-25 
14:21:09 UTC (rev 39141)
@@ -68,9 +68,9 @@
 
 const PaperSourceCap autobin("Auto",  true,  JobData::kAuto);
 
-const ResolutionCap dpi300("300dpi", true, 300,  300);
-const ResolutionCap dpi600("600dpi", false, 600,  600);
-const ResolutionCap dpi1200("1200dpi", false, 1200, 1200);
+const ResolutionCap dpi300("300dpi", true, 0, 300,  300);
+const ResolutionCap dpi600("600dpi", false, 1, 600,  600);
+const ResolutionCap dpi1200("1200dpi", false, 2, 1200, 1200);
 
 const PaperCap* papers[] = {
        &a4,

Modified: haiku/trunk/src/libs/print/libprint/JobSetupDlg.cpp
===================================================================
--- haiku/trunk/src/libs/print/libprint/JobSetupDlg.cpp 2010-10-25 11:44:09 UTC 
(rev 39140)
+++ haiku/trunk/src/libs/print/libprint/JobSetupDlg.cpp 2010-10-25 14:21:09 UTC 
(rev 39141)
@@ -56,6 +56,8 @@
                fNup(nup)
        {}
 
+       int     ID() const { return fNup; }
+
        int     fNup;
 };
 
@@ -68,6 +70,8 @@
                fDitherType(ditherType)
        {}
 
+       int     ID() const { return fDitherType; }
+
        Halftone::DitherType fDitherType;
 };
 
@@ -90,7 +94,7 @@
        Halftone::kTypeFloydSteinberg);
 
 
-const NupCap *gNups[] = {
+const BaseCap *gNups[] = {
        &gNup1,
        &gNup2,
        &gNup4,
@@ -103,7 +107,7 @@
 };
 
 
-const DitherCap *gDitherTypes[] = {
+const BaseCap *gDitherTypes[] = {
        &gDitherType1,
        &gDitherType2,
        &gDitherType3,
@@ -121,6 +125,7 @@
        kMsgCollateChanged,
        kMsgReverseChanged,
        kMsgDuplexChanged,
+       kMsgNone = 0
 };
 
 
@@ -172,48 +177,16 @@
        // color
        fColorType = new BPopUpMenu("color");
        fColorType->SetRadioMode(true);
-
-       int count = fPrinterCap->countCap(PrinterCap::kColor);
-       const ColorCap **color_cap = (const ColorCap **)fPrinterCap->enumCap(
-               PrinterCap::kColor);
-       bool marked = false;
-       BMenuItem* item = NULL;
-       while (count--) {
-               item = new BMenuItem((*color_cap)->fLabel.c_str(),
-                       new BMessage(kMsgQuality));
-               fColorType->AddItem(item);
-               if ((*color_cap)->fColor == fJobData->getColor()) {
-                       item->SetMarked(true);
-                       marked = true;
-               }
-               color_cap++;
-       }
-       if (!marked && item)
-               item->SetMarked(true);
-
+       FillCapabilityMenu(fColorType, kMsgQuality, PrinterCap::kColor,
+               fJobData->getColor());
        BMenuField* colorMenuField = new BMenuField("color", "Color:", 
fColorType);
        fColorType->SetTargetForItems(this);
        
        // dither type
        fDitherType = new BPopUpMenu("");
        fDitherType->SetRadioMode(true);
-
-       count = sizeof(gDitherTypes) / sizeof(gDitherTypes[0]);
-       const DitherCap **dither_cap = gDitherTypes;
-       marked = false;
-       item = NULL;
-       while (count--) {
-               item = new BMenuItem((*dither_cap)->fLabel.c_str(),
-                       new BMessage(kMsgQuality));
-               fDitherType->AddItem(item);
-               if ((*dither_cap)->fDitherType == fJobData->getDitherType()) {
-                       item->SetMarked(true);
-                       marked = true;
-               }
-               dither_cap++;
-       }
-       if (!marked && item)
-               item->SetMarked(true);
+       FillCapabilityMenu(fDitherType, kMsgQuality, gDitherTypes, 
sizeof(gDitherTypes) /
+               sizeof(gDitherTypes[0]), fJobData->getDitherType());
        BMenuField* ditherMenuField = new BMenuField("dithering", "Dot 
Pattern:",
                fDitherType);
        fDitherType->SetTargetForItems(this);
@@ -297,43 +270,16 @@
        // paper source
        fPaperFeed = new BPopUpMenu("");
        fPaperFeed->SetRadioMode(true);
-       count = fPrinterCap->countCap(PrinterCap::kPaperSource);
-       const PaperSourceCap **paper_source_cap =
-               (const PaperSourceCap 
**)fPrinterCap->enumCap(PrinterCap::kPaperSource);
-       marked = false;
-       item = NULL;
-       while (count--) {
-               item = new BMenuItem((*paper_source_cap)->fLabel.c_str(), NULL);
-               fPaperFeed->AddItem(item);
-               if ((*paper_source_cap)->fPaperSource == 
fJobData->getPaperSource()) {
-                       item->SetMarked(true);
-                       marked = true;
-               }
-               paper_source_cap++;
-       }
-       if (!marked)
-               item->SetMarked(true);
+       FillCapabilityMenu(fPaperFeed, kMsgNone, PrinterCap::kPaperSource,
+               fJobData->getPaperSource());
        BMenuField* paperSourceMenufield = new BMenuField("paperSource",
                "Paper Source:", fPaperFeed);
 
        // Pages per sheet
        fNup = new BPopUpMenu("");
        fNup->SetRadioMode(true);
-       count = sizeof(gNups) / sizeof(gNups[0]);
-       const NupCap **nup_cap = gNups;
-       marked = false;
-       item = NULL;
-       while (count--) {
-               item = new BMenuItem((*nup_cap)->fLabel.c_str(), NULL);
-               fNup->AddItem(item);
-               if ((*nup_cap)->fNup == fJobData->getNup()) {
-                       item->SetMarked(true);
-                       marked = true;
-               }
-               nup_cap++;
-       }
-       if (!marked)
-               item->SetMarked(true);
+       FillCapabilityMenu(fNup, kMsgNone, gNups, sizeof(gNups) / 
sizeof(gNups[0]),
+               fJobData->getNup());
        BMenuField* pagesPerSheet = new BMenuField("pagesPerSheet",
                "Pages Per Sheet:", fNup);
 
@@ -505,6 +451,72 @@
 
 
 void
+JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
+       PrinterCap::CapID category, int id)
+{
+       int count = fPrinterCap->countCap(category);
+       const BaseCap **capabilities = fPrinterCap->enumCap(category);
+       FillCapabilityMenu(menu, message, capabilities, count, id);
+}
+
+void
+JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
+       const BaseCap** capabilities, int count, int id)
+{
+       bool marked = false;
+
+       BMenuItem* firstItem = NULL;
+       BMenuItem* defaultItem = NULL;
+       BMenuItem* item = NULL;
+       while (count--) {
+               const BaseCap* capability = *capabilities;
+               if (message != kMsgNone)
+                       item = new BMenuItem(capability->fLabel.c_str(),
+                               new BMessage(kMsgQuality));
+               else
+                       item = new BMenuItem(capability->fLabel.c_str(), NULL);
+
+               menu->AddItem(item);
+
+               if (firstItem == NULL)
+                       firstItem = item;
+
+               if (capability->fIsDefault)
+                       defaultItem = item;
+
+
+               if (capability->ID() == id) {
+                       item->SetMarked(true);
+                       marked = true;
+               }
+
+               capabilities++;
+       }
+
+       if (marked)
+               return;
+
+       if (defaultItem != NULL)
+               defaultItem->SetMarked(true);
+       else if (firstItem != NULL)
+               firstItem->SetMarked(true);
+}
+
+
+int
+JobSetupView::GetID(const BaseCap** capabilities, int count, const char* label,
+       int defaultValue)
+{
+       while (count--) {
+               const BaseCap* capability = *capabilities;
+               if (capability->fLabel == label)
+                       return capability->ID();
+       }
+       return defaultValue;
+}
+
+
+void
 JobSetupView::UpdateButtonEnabledState()
 {
        bool pageRangeEnabled = fAll->Value() != B_CONTROL_ON;
@@ -530,7 +542,8 @@
                break;
 
        case kMsgQuality:
-               fHalftone->preview(getGamma(), getInkDensity(), 
getDitherType(), getColor() != JobData::kMonochrome); 
+               fHalftone->preview(Gamma(), InkDensity(), DitherType(),
+                       Color() != JobData::kMonochrome);
                break;
 
        case kMsgCollateChanged:
@@ -545,38 +558,29 @@
 
 
 JobData::Color 
-JobSetupView::getColor()
+JobSetupView::Color()
 {
-       int count = fPrinterCap->countCap(PrinterCap::kColor);
-       const ColorCap **color_cap = (const 
ColorCap**)fPrinterCap->enumCap(PrinterCap::kColor);
-       const char *color_label = fColorType->FindMarked()->Label();
-       while (count--) {
-               if (!strcmp((*color_cap)->fLabel.c_str(), color_label)) {
-                       return (*color_cap)->fColor;
-               }
-               color_cap++;
-       }
-       return JobData::kMonochrome;
+       const char *label = fColorType->FindMarked()->Label();
+       const BaseCap* capability = fPrinterCap->findCap(PrinterCap::kColor, 
label);
+       if (capability == NULL)
+               return JobData::kMonochrome;
+
+       const ColorCap* colorCap = static_cast<const ColorCap*>(capability);
+       return colorCap->fColor;
 }
 
 
 Halftone::DitherType 
-JobSetupView::getDitherType()
+JobSetupView::DitherType()
 {
-       int count = sizeof(gDitherTypes) / sizeof(gDitherTypes[0]);
-       const DitherCap **dither_cap = gDitherTypes;
-       const char *dithering_label = fDitherType->FindMarked()->Label();
-       while (count --) {
-               if (strcmp((*dither_cap)->fLabel.c_str(), dithering_label) == 
0) {
-                       return (*dither_cap)->fDitherType;
-               }
-               dither_cap ++;
-       }
-       return Halftone::kTypeFloydSteinberg;
+       const char *label = fDitherType->FindMarked()->Label();
+       int id = GetID(gDitherTypes, sizeof(gDitherTypes) / 
sizeof(gDitherTypes[0]),
+               label, Halftone::kTypeFloydSteinberg);
+       return static_cast<Halftone::DitherType>(id);
 }
 
 float 
-JobSetupView::getGamma()
+JobSetupView::Gamma()
 {
        const float value = (float)fGamma->Value();
        return pow(2.0, value / 100.0);
@@ -584,23 +588,34 @@
 
 
 float 
-JobSetupView::getInkDensity()
+JobSetupView::InkDensity()
 {
        const float value = (float)(127 - fInkDensity->Value());
        return value;
 }
 
 
+JobData::PaperSource
+JobSetupView::PaperSource()
+{
+       const char *label = fPaperFeed->FindMarked()->Label();
+       const BaseCap* capability = 
fPrinterCap->findCap(PrinterCap::kPaperSource,
+               label);
+
+       if (capability == NULL)
+               capability = 
fPrinterCap->getDefaultCap(PrinterCap::kPaperSource);
+       return static_cast<const PaperSourceCap*>(capability)->fPaperSource;
+
+}
+
 bool 
 JobSetupView::UpdateJobData(bool showPreview)
 {
-       int count;
-
        fJobData->setShowPreview(showPreview);
-       fJobData->setColor(getColor()); 
-       fJobData->setGamma(getGamma());
-       fJobData->setInkDensity(getInkDensity());
-       fJobData->setDitherType(getDitherType());
+       fJobData->setColor(Color());
+       fJobData->setGamma(Gamma());
+       fJobData->setInkDensity(InkDensity());
+       fJobData->setDitherType(DitherType());
 
        int first_page;
        int last_page;
@@ -616,30 +631,14 @@
        fJobData->setFirstPage(first_page);
        fJobData->setLastPage(last_page);
 
-       count = fPrinterCap->countCap(PrinterCap::kPaperSource);
-       const PaperSourceCap **paper_source_cap = (const PaperSourceCap 
**)fPrinterCap->enumCap(PrinterCap::kPaperSource);
-       const char *paper_source_label = fPaperFeed->FindMarked()->Label();
-       while (count--) {
-               if (!strcmp((*paper_source_cap)->fLabel.c_str(), 
paper_source_label)) {
-                       
fJobData->setPaperSource((*paper_source_cap)->fPaperSource);
-                       break;
-               }
-               paper_source_cap++;
-       }
+       fJobData->setPaperSource(PaperSource());
 
-       count = sizeof(gNups) / sizeof(gNups[0]);
-       const NupCap **nup_cap = gNups;
-       const char *nup_label = fNup->FindMarked()->Label();
-       while (count--) {
-               if (!strcmp((*nup_cap)->fLabel.c_str(), nup_label)) {
-                       fJobData->setNup((*nup_cap)->fNup);
-                       break;
-               }
-               nup_cap++;
-       }
+       fJobData->setNup(GetID(gNups, sizeof(gNups) / sizeof(gNups[0]),
+               fNup->FindMarked()->Label(), 1));
 
        if (fPrinterCap->isSupport(PrinterCap::kPrintStyle)) {
-               fJobData->setPrintStyle((B_CONTROL_ON == fDuplex->Value()) ? 
JobData::kDuplex : JobData::kSimplex);
+               fJobData->setPrintStyle((B_CONTROL_ON == fDuplex->Value())
+                       ? JobData::kDuplex : JobData::kSimplex);
        }
 
        fJobData->setCopies(atoi(fCopies->Text()));

Modified: haiku/trunk/src/libs/print/libprint/PrinterCap.cpp
===================================================================
--- haiku/trunk/src/libs/print/libprint/PrinterCap.cpp  2010-10-25 11:44:09 UTC 
(rev 39140)
+++ haiku/trunk/src/libs/print/libprint/PrinterCap.cpp  2010-10-25 14:21:09 UTC 
(rev 39141)
@@ -14,6 +14,11 @@
 }
 
 
+BaseCap::~BaseCap()
+{
+}
+
+
 PaperCap::PaperCap(const string &label, bool isDefault, JobData::Paper paper,
        const BRect &paperRect, const BRect &physicalRect)
        :
@@ -25,6 +30,13 @@
 }
 
 
+int
+PaperCap::ID() const
+{
+       return fPaper;
+}
+
+
 PaperSourceCap::PaperSourceCap(const string &label, bool isDefault,
        JobData::PaperSource paperSource)
        :
@@ -34,16 +46,31 @@
 }
 
 
+int
+PaperSourceCap::ID() const
+{
+       return fPaperSource;
+}
+
+
 ResolutionCap::ResolutionCap(const string &label, bool isDefault,
-       int xResolution, int yResolution)
+       int id, int xResolution, int yResolution)
        :
        BaseCap(label, isDefault),
+       fID(id),
        fXResolution(xResolution),
        fYResolution(yResolution)
 {
 }
 
 
+int
+ResolutionCap::ID() const
+{
+       return fID;
+}
+
+
 OrientationCap::OrientationCap(const string &label, bool isDefault,
        JobData::Orientation orientation)
        :
@@ -53,6 +80,13 @@
 }
 
 
+int
+OrientationCap::ID() const
+{
+       return fOrientation;
+}
+
+
 PrintStyleCap::PrintStyleCap(const string &label, bool isDefault,
        JobData::PrintStyle printStyle)
        :
@@ -62,6 +96,13 @@
 }
 
 
+int
+PrintStyleCap::ID() const
+{
+       return fPrintStyle;
+}
+
+
 BindingLocationCap::BindingLocationCap(const string &label, bool isDefault,
        JobData::BindingLocation bindingLocation)
        :
@@ -71,6 +112,13 @@
 }
 
 
+int
+BindingLocationCap::ID() const
+{
+       return fBindingLocation;
+}
+
+
 ColorCap::ColorCap(const string &label, bool isDefault, JobData::Color color)
        :
        BaseCap(label, isDefault),
@@ -79,6 +127,13 @@
 }
 
 
+int
+ColorCap::ID() const
+{
+       return fColor;
+}
+
+
 ProtocolClassCap::ProtocolClassCap(const string &label, bool isDefault,
        int protocolClass, const string &description)
        :
@@ -89,6 +144,13 @@
 }
 
 
+int
+ProtocolClassCap::ID() const
+{
+       return fProtocolClass;
+}
+
+
 PrinterCap::PrinterCap(const PrinterData *printer_data)
        : fPrinterData(printer_data), 
        fPrinterID(kUnknownPrinter)
@@ -101,22 +163,61 @@
 }
 
 
-const BaseCap *PrinterCap::getDefaultCap(CapID id) const
+const BaseCap *
+PrinterCap::getDefaultCap(CapID category) const
 {
-       int count = countCap(id);
-       if (count > 0) {
-               const BaseCap **base_cap = enumCap(id);
-               while (count--) {
-                       if ((*base_cap)->fIsDefault) {
-                               return *base_cap;
-                       }
-                       base_cap++;
+       int count = countCap(category);
+       if (count <= 0)
+               return NULL;
+
+       const BaseCap **base_cap = enumCap(category);
+       while (count--) {
+               if ((*base_cap)->fIsDefault) {
+                       return *base_cap;
                }
+               base_cap++;
        }
+
+       return enumCap(category)[0];
+}
+
+
+const BaseCap*
+PrinterCap::findCap(CapID category, int id) const
+{
+       int count = countCap(category);
+       if (count <= 0)
+               return NULL;
+
+       const BaseCap **base_cap = enumCap(category);
+       while (count--) {
+               if ((*base_cap)->ID() == id) {
+                       return *base_cap;
+               }
+               base_cap++;
+       }
        return NULL;
 }
 
 
+const BaseCap*
+PrinterCap::findCap(CapID category, const char* label) const
+{
+       int count = countCap(category);
+       if (count <= 0)
+               return NULL;
+
+       const BaseCap **base_cap = enumCap(category);
+       while (count--) {
+               if ((*base_cap)->fLabel == label) {
+                       return *base_cap;
+               }
+               base_cap++;
+       }
+       return NULL;
+
+}
+
 int
 PrinterCap::getProtocolClass() const {
        return fPrinterData->getProtocolClass();


Other related posts:

  • » [haiku-commits] r39141 - in haiku/trunk: headers/libs/print/libprint src/add-ons/print/drivers/canon_lips/lips3 src/add-ons/print/drivers/canon_lips/lips4 src/add-ons/print/drivers/pcl5 src/add-ons/print/drivers/pcl6 ... - michael . w . pfeiffer