* Added driver specific settings to job data and job
setup dialog. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39191 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -10,6 +10,9 @@
|
|||||||
#include <GraphicsDefs.h>
|
#include <GraphicsDefs.h>
|
||||||
#include <Rect.h>
|
#include <Rect.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "Halftone.h"
|
#include "Halftone.h"
|
||||||
#include "MarginView.h" // for MarginUnit
|
#include "MarginView.h" // for MarginUnit
|
||||||
|
|
||||||
@@ -255,6 +258,7 @@ private:
|
|||||||
Halftone::DitherType fDitherType;
|
Halftone::DitherType fDitherType;
|
||||||
PageSelection fPageSelection;
|
PageSelection fPageSelection;
|
||||||
MarginUnit fMarginUnit;
|
MarginUnit fMarginUnit;
|
||||||
|
map<string, string> fDriverSpecificSettings;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
JobData(BMessage *msg, const PrinterCap *cap, Settings settings);
|
JobData(BMessage *msg, const PrinterCap *cap, Settings settings);
|
||||||
@@ -355,6 +359,14 @@ public:
|
|||||||
|
|
||||||
MarginUnit getMarginUnit() const { return fMarginUnit; }
|
MarginUnit getMarginUnit() const { return fMarginUnit; }
|
||||||
void setMarginUnit(MarginUnit marginUnit) { fMarginUnit = marginUnit; }
|
void setMarginUnit(MarginUnit marginUnit) { fMarginUnit = marginUnit; }
|
||||||
|
|
||||||
|
bool HasDriverSpecificSetting(const string& category) const;
|
||||||
|
const string& DriverSpecificSetting(const string& category) const;
|
||||||
|
void SetDriverSpecificSetting(const string& category, const string& value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void SerializePrinterSpecificSettings(BString& serializedSettings);
|
||||||
|
void DeserializePrinterSpecificSettings(BString& serializedSettings);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __JOBDATA_H */
|
#endif /* __JOBDATA_H */
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
#define __JOBSETUPDLG_H
|
#define __JOBSETUPDLG_H
|
||||||
|
|
||||||
#include <View.h>
|
#include <View.h>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#include "DialogWindow.h"
|
#include "DialogWindow.h"
|
||||||
|
|
||||||
#include "JobData.h"
|
#include "JobData.h"
|
||||||
@@ -14,16 +16,17 @@
|
|||||||
#include "JSDSlider.h"
|
#include "JSDSlider.h"
|
||||||
#include "PrinterCap.h"
|
#include "PrinterCap.h"
|
||||||
|
|
||||||
|
class BCheckBox;
|
||||||
|
class BGridLayout;
|
||||||
|
class BPopUpMenu;
|
||||||
|
class BRadioButton;
|
||||||
class BTextControl;
|
class BTextControl;
|
||||||
class BTextView;
|
class BTextView;
|
||||||
class BRadioButton;
|
|
||||||
class BCheckBox;
|
|
||||||
class BPopUpMenu;
|
|
||||||
class JobData;
|
|
||||||
class PrinterData;
|
|
||||||
class PrinterCap;
|
|
||||||
class HalftoneView;
|
class HalftoneView;
|
||||||
|
class JobData;
|
||||||
class PagesView;
|
class PagesView;
|
||||||
|
class PrinterCap;
|
||||||
|
class PrinterData;
|
||||||
|
|
||||||
class JobSetupView : public BView {
|
class JobSetupView : public BView {
|
||||||
public:
|
public:
|
||||||
@@ -37,6 +40,13 @@ private:
|
|||||||
void UpdateButtonEnabledState();
|
void UpdateButtonEnabledState();
|
||||||
bool IsHalftoneConfigurationNeeded();
|
bool IsHalftoneConfigurationNeeded();
|
||||||
void CreateHalftoneConfigurationUI();
|
void CreateHalftoneConfigurationUI();
|
||||||
|
void AddDriverSpecificSettings(BGridLayout* gridLayout, int row);
|
||||||
|
string GetDriverSpecificValue(PrinterCap::CapID category,
|
||||||
|
const char* key);
|
||||||
|
template<typename Predicate>
|
||||||
|
void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
||||||
|
const BaseCap** capabilities, int count,
|
||||||
|
Predicate& predicate);
|
||||||
void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
||||||
PrinterCap::CapID category, int id);
|
PrinterCap::CapID category, int id);
|
||||||
void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
||||||
@@ -78,6 +88,7 @@ private:
|
|||||||
BRadioButton* fAllPages;
|
BRadioButton* fAllPages;
|
||||||
BRadioButton* fOddNumberedPages;
|
BRadioButton* fOddNumberedPages;
|
||||||
BRadioButton* fEvenNumberedPages;
|
BRadioButton* fEvenNumberedPages;
|
||||||
|
std::map<PrinterCap::CapID, BPopUpMenu*> fDriverSpecificLists;
|
||||||
};
|
};
|
||||||
|
|
||||||
class JobSetupDlg : public DialogWindow {
|
class JobSetupDlg : public DialogWindow {
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ struct DriverSpecificCap : public BaseCap {
|
|||||||
};
|
};
|
||||||
|
|
||||||
DriverSpecificCap(const string& label,
|
DriverSpecificCap(const string& label,
|
||||||
bool isDefault, int32 category, Type type);
|
int32 category, Type type);
|
||||||
|
|
||||||
int32 ID() const;
|
int32 ID() const;
|
||||||
|
|
||||||
@@ -125,6 +125,13 @@ struct DriverSpecificCap : public BaseCap {
|
|||||||
Type fType;
|
Type fType;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ListItemCap : public BaseCap {
|
||||||
|
ListItemCap(const string& label,
|
||||||
|
bool isDefault, int32 id);
|
||||||
|
|
||||||
|
int32 ID() const;
|
||||||
|
int32 fID;
|
||||||
|
};
|
||||||
|
|
||||||
class PrinterData;
|
class PrinterData;
|
||||||
|
|
||||||
@@ -142,7 +149,7 @@ public:
|
|||||||
kBindingLocation,
|
kBindingLocation,
|
||||||
kColor,
|
kColor,
|
||||||
kProtocolClass,
|
kProtocolClass,
|
||||||
kDriverSpecifcCapababilities,
|
kDriverSpecificCapabilities,
|
||||||
|
|
||||||
// Static boolean settings follow.
|
// Static boolean settings follow.
|
||||||
// For them isSupport() has to be implemented only.
|
// For them isSupport() has to be implemented only.
|
||||||
@@ -151,7 +158,54 @@ public:
|
|||||||
// for class Halftone?
|
// for class Halftone?
|
||||||
|
|
||||||
// The driver specific generic capabilities start here
|
// The driver specific generic capabilities start here
|
||||||
kDriverSpecificCapabablitiesBegin = 100
|
kDriverSpecificCapabilitiesBegin = 100
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IDPredicate
|
||||||
|
{
|
||||||
|
IDPredicate(int id)
|
||||||
|
: fID(id)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool operator()(const BaseCap* baseCap) {
|
||||||
|
return baseCap->ID() == fID;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fID;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LabelPredicate
|
||||||
|
{
|
||||||
|
LabelPredicate(const char* label)
|
||||||
|
: fLabel(label)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool operator()(const BaseCap* baseCap) {
|
||||||
|
return baseCap->fLabel == fLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* fLabel;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct KeyPredicate
|
||||||
|
{
|
||||||
|
KeyPredicate(const char* key)
|
||||||
|
: fKey(key)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool operator()(const BaseCap* baseCap) {
|
||||||
|
return baseCap->fKey == fKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* fKey;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual int countCap(CapID category) const = 0;
|
virtual int countCap(CapID category) const = 0;
|
||||||
@@ -160,12 +214,16 @@ public:
|
|||||||
const BaseCap* getDefaultCap(CapID category) const;
|
const BaseCap* getDefaultCap(CapID category) const;
|
||||||
const BaseCap* findCap(CapID category, int id) const;
|
const BaseCap* findCap(CapID category, int id) const;
|
||||||
const BaseCap* findCap(CapID category, const char* label) const;
|
const BaseCap* findCap(CapID category, const char* label) const;
|
||||||
|
const BaseCap* findCapWithKey(CapID category, const char* key)
|
||||||
|
const;
|
||||||
|
|
||||||
int getProtocolClass() const;
|
int getProtocolClass() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
PrinterCap(const PrinterCap& printerCap);
|
PrinterCap(const PrinterCap& printerCap);
|
||||||
PrinterCap& operator=(const PrinterCap& printerCap);
|
PrinterCap& operator=(const PrinterCap& printerCap);
|
||||||
|
template<typename Predicate>
|
||||||
|
const BaseCap* findCap(CapID category, Predicate& predicate) const;
|
||||||
|
|
||||||
const PrinterData* getPrinterData() const;
|
const PrinterData* getPrinterData() const;
|
||||||
|
|
||||||
@@ -174,4 +232,6 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __PRINTERCAP_H */
|
#endif /* __PRINTERCAP_H */
|
||||||
|
|||||||
@@ -3,9 +3,13 @@
|
|||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "JobData.h"
|
||||||
|
|
||||||
#include <InterfaceDefs.h>
|
#include <InterfaceDefs.h>
|
||||||
#include <Message.h>
|
#include <Message.h>
|
||||||
#include "JobData.h"
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include "PrinterCap.h"
|
#include "PrinterCap.h"
|
||||||
#include "DbgMsg.h"
|
#include "DbgMsg.h"
|
||||||
|
|
||||||
@@ -39,6 +43,9 @@ static const char* kJDMarginUnit = "JJJJ_margin_unit";
|
|||||||
static const char* kJDPhysicalRect = "JJJJ_physical_rect";
|
static const char* kJDPhysicalRect = "JJJJ_physical_rect";
|
||||||
static const char* kJDScaledPhysicalRect = "JJJJ_scaled_physical_rect";
|
static const char* kJDScaledPhysicalRect = "JJJJ_scaled_physical_rect";
|
||||||
static const char* kJDResolution = "JJJJ_resolution";
|
static const char* kJDResolution = "JJJJ_resolution";
|
||||||
|
static const char* kJDDriverSpecificSettings = "JJJJ_driverSpecificSettings";
|
||||||
|
|
||||||
|
static const char* kDriverSpecificSettingsSeparator = ";";
|
||||||
|
|
||||||
|
|
||||||
JobData::JobData(BMessage *msg, const PrinterCap *cap, Settings settings)
|
JobData::JobData(BMessage *msg, const PrinterCap *cap, Settings settings)
|
||||||
@@ -92,6 +99,7 @@ JobData::operator=(const JobData &job_data)
|
|||||||
fMarginUnit = job_data.fMarginUnit;
|
fMarginUnit = job_data.fMarginUnit;
|
||||||
fPhysicalRect = job_data.fPhysicalRect;
|
fPhysicalRect = job_data.fPhysicalRect;
|
||||||
fScaledPhysicalRect = job_data.fScaledPhysicalRect;
|
fScaledPhysicalRect = job_data.fScaledPhysicalRect;
|
||||||
|
fDriverSpecificSettings = job_data.fDriverSpecificSettings;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,6 +296,11 @@ JobData::load(BMessage *msg, const PrinterCap *cap, Settings settings)
|
|||||||
fMarginUnit = (MarginUnit)msg->FindInt32(kJDMarginUnit);
|
fMarginUnit = (MarginUnit)msg->FindInt32(kJDMarginUnit);
|
||||||
else
|
else
|
||||||
fMarginUnit = kUnitInch;
|
fMarginUnit = kUnitInch;
|
||||||
|
|
||||||
|
BString serializedSettings;
|
||||||
|
if (msg->HasString(kJDDriverSpecificSettings))
|
||||||
|
msg->FindString(kJDDriverSpecificSettings, &serializedSettings);
|
||||||
|
DeserializePrinterSpecificSettings(serializedSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -406,4 +419,77 @@ JobData::save(BMessage *msg)
|
|||||||
msg->RemoveName(kJDPageSelection);
|
msg->RemoveName(kJDPageSelection);
|
||||||
if (fSettings == kJobSettings)
|
if (fSettings == kJobSettings)
|
||||||
msg->AddInt32(kJDPageSelection, fPageSelection);
|
msg->AddInt32(kJDPageSelection, fPageSelection);
|
||||||
|
|
||||||
|
msg->RemoveName(kJDDriverSpecificSettings);
|
||||||
|
if (fSettings == kJobSettings)
|
||||||
|
{
|
||||||
|
BString serializedSettings;
|
||||||
|
SerializePrinterSpecificSettings(serializedSettings);
|
||||||
|
msg->AddString(kJDDriverSpecificSettings, serializedSettings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
JobData::HasDriverSpecificSetting(const string& category) const
|
||||||
|
{
|
||||||
|
return fDriverSpecificSettings.find(category) !=
|
||||||
|
fDriverSpecificSettings.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const string&
|
||||||
|
JobData::DriverSpecificSetting(const string& category) const
|
||||||
|
{
|
||||||
|
return fDriverSpecificSettings.find(category)->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JobData::SetDriverSpecificSetting(const string& category, const string& value)
|
||||||
|
{
|
||||||
|
fDriverSpecificSettings[category] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JobData::SerializePrinterSpecificSettings(BString& serializedSettings)
|
||||||
|
{
|
||||||
|
bool first = true;
|
||||||
|
map<string, string>::iterator it = fDriverSpecificSettings.begin();
|
||||||
|
for (; it != fDriverSpecificSettings.end(); it++) {
|
||||||
|
if (first)
|
||||||
|
first = false;
|
||||||
|
else
|
||||||
|
serializedSettings << kDriverSpecificSettingsSeparator;
|
||||||
|
|
||||||
|
serializedSettings << it->first.c_str()
|
||||||
|
<< kDriverSpecificSettingsSeparator
|
||||||
|
<< it->second.c_str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JobData::DeserializePrinterSpecificSettings(BString& serializedSettings)
|
||||||
|
{
|
||||||
|
// Note: strtok_r terminates the string after the first token
|
||||||
|
fDriverSpecificSettings.clear();
|
||||||
|
|
||||||
|
int length = serializedSettings.Length() + 1;
|
||||||
|
char* state = NULL;
|
||||||
|
char* buffer = serializedSettings.LockBuffer(length);
|
||||||
|
const char* separator = kDriverSpecificSettingsSeparator;
|
||||||
|
char* token = strtok_r(buffer, separator, &state);
|
||||||
|
while (token != NULL) {
|
||||||
|
char* key = token;
|
||||||
|
token = strtok_r(NULL, separator, &state);
|
||||||
|
if (token == NULL)
|
||||||
|
break;
|
||||||
|
char* value = token;
|
||||||
|
fDriverSpecificSettings[key] = value;
|
||||||
|
token = strtok_r(NULL, separator, &state);
|
||||||
|
}
|
||||||
|
|
||||||
|
serializedSettings.UnlockBuffer(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include <Box.h>
|
#include <Box.h>
|
||||||
#include <Button.h>
|
#include <Button.h>
|
||||||
#include <CheckBox.h>
|
#include <CheckBox.h>
|
||||||
|
#include <Debug.h>
|
||||||
#include <GridView.h>
|
#include <GridView.h>
|
||||||
#include <GroupLayout.h>
|
#include <GroupLayout.h>
|
||||||
#include <GroupLayoutBuilder.h>
|
#include <GroupLayoutBuilder.h>
|
||||||
@@ -257,7 +258,7 @@ JobSetupView::AttachedToWindow()
|
|||||||
fNup = new BPopUpMenu("");
|
fNup = new BPopUpMenu("");
|
||||||
fNup->SetRadioMode(true);
|
fNup->SetRadioMode(true);
|
||||||
FillCapabilityMenu(fNup, kMsgNone, gNups, sizeof(gNups) / sizeof(gNups[0]),
|
FillCapabilityMenu(fNup, kMsgNone, gNups, sizeof(gNups) / sizeof(gNups[0]),
|
||||||
fJobData->getNup());
|
(int)fJobData->getNup());
|
||||||
BMenuField* pagesPerSheet = new BMenuField("pagesPerSheet",
|
BMenuField* pagesPerSheet = new BMenuField("pagesPerSheet",
|
||||||
"Pages Per Sheet:", fNup);
|
"Pages Per Sheet:", fNup);
|
||||||
|
|
||||||
@@ -348,6 +349,8 @@ JobSetupView::AttachedToWindow()
|
|||||||
qualityGridLayout->AddView(fGamma, 0, 2, 2);
|
qualityGridLayout->AddView(fGamma, 0, 2, 2);
|
||||||
qualityGridLayout->AddView(fInkDensity, 0, 3, 2);
|
qualityGridLayout->AddView(fInkDensity, 0, 3, 2);
|
||||||
qualityGridLayout->AddView(fHalftoneBox, 0, 4, 2);
|
qualityGridLayout->AddView(fHalftoneBox, 0, 4, 2);
|
||||||
|
} else {
|
||||||
|
AddDriverSpecificSettings(qualityGridLayout, 1);
|
||||||
}
|
}
|
||||||
qualityGridLayout->SetSpacing(0, 0);
|
qualityGridLayout->SetSpacing(0, 0);
|
||||||
qualityGridLayout->SetInsets(5, 5, 5, 5);
|
qualityGridLayout->SetInsets(5, 5, 5, 5);
|
||||||
@@ -447,7 +450,7 @@ JobSetupView::CreateHalftoneConfigurationUI()
|
|||||||
fDitherType->SetRadioMode(true);
|
fDitherType->SetRadioMode(true);
|
||||||
FillCapabilityMenu(fDitherType, kMsgQuality, gDitherTypes,
|
FillCapabilityMenu(fDitherType, kMsgQuality, gDitherTypes,
|
||||||
sizeof(gDitherTypes) / sizeof(gDitherTypes[0]),
|
sizeof(gDitherTypes) / sizeof(gDitherTypes[0]),
|
||||||
fJobData->getDitherType());
|
(int)fJobData->getDitherType());
|
||||||
fDitherMenuField = new BMenuField("dithering", "Dot Pattern:",
|
fDitherMenuField = new BMenuField("dithering", "Dot Pattern:",
|
||||||
fDitherType);
|
fDitherType);
|
||||||
fDitherType->SetTargetForItems(this);
|
fDitherType->SetTargetForItems(this);
|
||||||
@@ -489,17 +492,69 @@ JobSetupView::CreateHalftoneConfigurationUI()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
JobSetupView::AddDriverSpecificSettings(BGridLayout* gridLayout, int row)
|
||||||
PrinterCap::CapID category, int id)
|
|
||||||
{
|
{
|
||||||
int count = fPrinterCap->countCap(category);
|
if (!fPrinterCap->isSupport(PrinterCap::kDriverSpecificCapabilities))
|
||||||
const BaseCap **capabilities = fPrinterCap->enumCap(category);
|
return;
|
||||||
FillCapabilityMenu(menu, message, capabilities, count, id);
|
|
||||||
|
int count = fPrinterCap->countCap(PrinterCap::kDriverSpecificCapabilities);
|
||||||
|
const BaseCap** capabilities = fPrinterCap->enumCap(
|
||||||
|
PrinterCap::kDriverSpecificCapabilities);
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i ++) {
|
||||||
|
const DriverSpecificCap* capability = static_cast<const DriverSpecificCap*>(
|
||||||
|
capabilities[i]);
|
||||||
|
|
||||||
|
const char* label = capability->fLabel.c_str();
|
||||||
|
BPopUpMenu* popUpMenu = new BPopUpMenu(label);
|
||||||
|
popUpMenu->SetRadioMode(true);
|
||||||
|
|
||||||
|
PrinterCap::CapID category = static_cast<PrinterCap::CapID>(
|
||||||
|
capability->ID());
|
||||||
|
|
||||||
|
const BaseCap** categoryCapabilities = fPrinterCap->enumCap(category);
|
||||||
|
|
||||||
|
int categoryCount = fPrinterCap->countCap(category);
|
||||||
|
|
||||||
|
string value = GetDriverSpecificValue(category, capability->Key());
|
||||||
|
PrinterCap::KeyPredicate predicate(value.c_str());
|
||||||
|
|
||||||
|
FillCapabilityMenu(popUpMenu, kMsgNone, categoryCapabilities,
|
||||||
|
categoryCount, predicate);
|
||||||
|
|
||||||
|
BString menuLabel = label;
|
||||||
|
menuLabel << ":";
|
||||||
|
BMenuField* menuField = new BMenuField(label, menuLabel.String(),
|
||||||
|
popUpMenu);
|
||||||
|
popUpMenu->SetTargetForItems(this);
|
||||||
|
|
||||||
|
gridLayout->AddItem(menuField->CreateLabelLayoutItem(),
|
||||||
|
0, row);
|
||||||
|
gridLayout->AddItem(menuField->CreateMenuBarLayoutItem(),
|
||||||
|
1, row);
|
||||||
|
row ++;
|
||||||
|
|
||||||
|
fDriverSpecificLists[category] = popUpMenu;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string
|
||||||
|
JobSetupView::GetDriverSpecificValue(PrinterCap::CapID category,
|
||||||
|
const char* key)
|
||||||
|
{
|
||||||
|
if (fJobData->HasDriverSpecificSetting(key))
|
||||||
|
return fJobData->DriverSpecificSetting(key);
|
||||||
|
|
||||||
|
const BaseCap* defaultCapability = fPrinterCap->getDefaultCap(category);
|
||||||
|
return defaultCapability->fKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename Predicate>
|
||||||
void
|
void
|
||||||
JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
||||||
const BaseCap** capabilities, int count, int id)
|
const BaseCap** capabilities, int count, Predicate& predicate)
|
||||||
{
|
{
|
||||||
bool marked = false;
|
bool marked = false;
|
||||||
|
|
||||||
@@ -523,7 +578,7 @@ JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
|||||||
defaultItem = item;
|
defaultItem = item;
|
||||||
|
|
||||||
|
|
||||||
if (capability->ID() == id) {
|
if (predicate(capability)) {
|
||||||
item->SetMarked(true);
|
item->SetMarked(true);
|
||||||
marked = true;
|
marked = true;
|
||||||
}
|
}
|
||||||
@@ -541,6 +596,26 @@ JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
||||||
|
PrinterCap::CapID category, int id)
|
||||||
|
{
|
||||||
|
PrinterCap::IDPredicate predicate(id);
|
||||||
|
int count = fPrinterCap->countCap(category);
|
||||||
|
const BaseCap **capabilities = fPrinterCap->enumCap(category);
|
||||||
|
FillCapabilityMenu(menu, message, capabilities, count, predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
|
||||||
|
const BaseCap** capabilities, int count, int id)
|
||||||
|
{
|
||||||
|
PrinterCap::IDPredicate predicate(id);
|
||||||
|
FillCapabilityMenu(menu, message, capabilities, count, predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
JobSetupView::GetID(const BaseCap** capabilities, int count, const char* label,
|
JobSetupView::GetID(const BaseCap** capabilities, int count, const char* label,
|
||||||
int defaultValue)
|
int defaultValue)
|
||||||
@@ -703,6 +778,18 @@ JobSetupView::UpdateJobData(bool showPreview)
|
|||||||
pageSelection = JobData::kEvenNumberedPages;
|
pageSelection = JobData::kEvenNumberedPages;
|
||||||
fJobData->setPageSelection(pageSelection);
|
fJobData->setPageSelection(pageSelection);
|
||||||
|
|
||||||
|
std::map<PrinterCap::CapID, BPopUpMenu*>::iterator it =
|
||||||
|
fDriverSpecificLists.begin();
|
||||||
|
for(; it != fDriverSpecificLists.end(); it++) {
|
||||||
|
PrinterCap::CapID category = it->first;
|
||||||
|
BPopUpMenu* popUpMenu = it->second;
|
||||||
|
const char* key = fPrinterCap->findCap(
|
||||||
|
PrinterCap::kDriverSpecificCapabilities, (int)category)->Key();
|
||||||
|
const char* label = popUpMenu->FindMarked()->Label();
|
||||||
|
const char* value = fPrinterCap->findCap(category, label)->Key();
|
||||||
|
fJobData->SetDriverSpecificSetting(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
fJobData->save();
|
fJobData->save();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,10 +158,10 @@ ProtocolClassCap::ID() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DriverSpecificCap::DriverSpecificCap(const string& label, bool isDefault,
|
DriverSpecificCap::DriverSpecificCap(const string& label, int32 category,
|
||||||
int32 category, Type type)
|
Type type)
|
||||||
:
|
:
|
||||||
BaseCap(label, isDefault),
|
BaseCap(label, false),
|
||||||
fCategory(category),
|
fCategory(category),
|
||||||
fType(type)
|
fType(type)
|
||||||
{
|
{
|
||||||
@@ -175,6 +175,21 @@ DriverSpecificCap::ID() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ListItemCap::ListItemCap(const string& label, bool isDefault, int32 id)
|
||||||
|
:
|
||||||
|
BaseCap(label, isDefault),
|
||||||
|
fID(id)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
ListItemCap::ID() const
|
||||||
|
{
|
||||||
|
return fID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PrinterCap::PrinterCap(const PrinterData *printer_data)
|
PrinterCap::PrinterCap(const PrinterData *printer_data)
|
||||||
:
|
:
|
||||||
fPrinterData(printer_data)
|
fPrinterData(printer_data)
|
||||||
@@ -206,8 +221,9 @@ PrinterCap::getDefaultCap(CapID category) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename Predicate>
|
||||||
const BaseCap*
|
const BaseCap*
|
||||||
PrinterCap::findCap(CapID category, int id) const
|
PrinterCap::findCap(CapID category, Predicate& predicate) const
|
||||||
{
|
{
|
||||||
int count = countCap(category);
|
int count = countCap(category);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
@@ -215,33 +231,39 @@ PrinterCap::findCap(CapID category, int id) const
|
|||||||
|
|
||||||
const BaseCap **base_cap = enumCap(category);
|
const BaseCap **base_cap = enumCap(category);
|
||||||
while (count--) {
|
while (count--) {
|
||||||
if ((*base_cap)->ID() == id) {
|
if (predicate(*base_cap)) {
|
||||||
return *base_cap;
|
return *base_cap;
|
||||||
}
|
}
|
||||||
base_cap++;
|
base_cap++;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const BaseCap*
|
||||||
|
PrinterCap::findCap(CapID category, int id) const
|
||||||
|
{
|
||||||
|
IDPredicate predicate(id);
|
||||||
|
return findCap(category, predicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const BaseCap*
|
const BaseCap*
|
||||||
PrinterCap::findCap(CapID category, const char* label) const
|
PrinterCap::findCap(CapID category, const char* label) const
|
||||||
{
|
{
|
||||||
int count = countCap(category);
|
LabelPredicate predicate(label);
|
||||||
if (count <= 0)
|
return findCap(category, predicate);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
const BaseCap **base_cap = enumCap(category);
|
|
||||||
while (count--) {
|
|
||||||
if ((*base_cap)->fLabel == label) {
|
|
||||||
return *base_cap;
|
|
||||||
}
|
|
||||||
base_cap++;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const BaseCap*
|
||||||
|
PrinterCap::findCapWithKey(CapID category, const char* key) const
|
||||||
|
{
|
||||||
|
KeyPredicate predicate(key);
|
||||||
|
return findCap(category, predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
PrinterCap::getProtocolClass() const {
|
PrinterCap::getProtocolClass() const {
|
||||||
return fPrinterData->getProtocolClass();
|
return fPrinterData->getProtocolClass();
|
||||||
|
|||||||
Reference in New Issue
Block a user