* 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:
Michael Pfeiffer
2010-10-30 06:54:16 +00:00
parent 6e62e74423
commit de18d919e7
6 changed files with 315 additions and 37 deletions
+12
View File
@@ -10,6 +10,9 @@
#include <GraphicsDefs.h>
#include <Rect.h>
#include <map>
#include <string>
#include "Halftone.h"
#include "MarginView.h" // for MarginUnit
@@ -255,6 +258,7 @@ private:
Halftone::DitherType fDitherType;
PageSelection fPageSelection;
MarginUnit fMarginUnit;
map<string, string> fDriverSpecificSettings;
public:
JobData(BMessage *msg, const PrinterCap *cap, Settings settings);
@@ -355,6 +359,14 @@ public:
MarginUnit getMarginUnit() const { return fMarginUnit; }
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 */
+17 -6
View File
@@ -7,6 +7,8 @@
#define __JOBSETUPDLG_H
#include <View.h>
#include <map>
#include "DialogWindow.h"
#include "JobData.h"
@@ -14,16 +16,17 @@
#include "JSDSlider.h"
#include "PrinterCap.h"
class BCheckBox;
class BGridLayout;
class BPopUpMenu;
class BRadioButton;
class BTextControl;
class BTextView;
class BRadioButton;
class BCheckBox;
class BPopUpMenu;
class JobData;
class PrinterData;
class PrinterCap;
class HalftoneView;
class JobData;
class PagesView;
class PrinterCap;
class PrinterData;
class JobSetupView : public BView {
public:
@@ -37,6 +40,13 @@ private:
void UpdateButtonEnabledState();
bool IsHalftoneConfigurationNeeded();
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,
PrinterCap::CapID category, int id);
void FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
@@ -78,6 +88,7 @@ private:
BRadioButton* fAllPages;
BRadioButton* fOddNumberedPages;
BRadioButton* fEvenNumberedPages;
std::map<PrinterCap::CapID, BPopUpMenu*> fDriverSpecificLists;
};
class JobSetupDlg : public DialogWindow {
+63 -3
View File
@@ -117,7 +117,7 @@ struct DriverSpecificCap : public BaseCap {
};
DriverSpecificCap(const string& label,
bool isDefault, int32 category, Type type);
int32 category, Type type);
int32 ID() const;
@@ -125,6 +125,13 @@ struct DriverSpecificCap : public BaseCap {
Type fType;
};
struct ListItemCap : public BaseCap {
ListItemCap(const string& label,
bool isDefault, int32 id);
int32 ID() const;
int32 fID;
};
class PrinterData;
@@ -142,7 +149,7 @@ public:
kBindingLocation,
kColor,
kProtocolClass,
kDriverSpecifcCapababilities,
kDriverSpecificCapabilities,
// Static boolean settings follow.
// For them isSupport() has to be implemented only.
@@ -151,7 +158,54 @@ public:
// for class Halftone?
// 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;
@@ -160,12 +214,16 @@ public:
const BaseCap* getDefaultCap(CapID category) const;
const BaseCap* findCap(CapID category, int id) const;
const BaseCap* findCap(CapID category, const char* label) const;
const BaseCap* findCapWithKey(CapID category, const char* key)
const;
int getProtocolClass() const;
protected:
PrinterCap(const PrinterCap& printerCap);
PrinterCap& operator=(const PrinterCap& printerCap);
template<typename Predicate>
const BaseCap* findCap(CapID category, Predicate& predicate) const;
const PrinterData* getPrinterData() const;
@@ -174,4 +232,6 @@ private:
};
#endif /* __PRINTERCAP_H */
+87 -1
View File
@@ -3,9 +3,13 @@
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
*/
#include "JobData.h"
#include <InterfaceDefs.h>
#include <Message.h>
#include "JobData.h"
#include <sstream>
#include "PrinterCap.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* kJDScaledPhysicalRect = "JJJJ_scaled_physical_rect";
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)
@@ -92,6 +99,7 @@ JobData::operator=(const JobData &job_data)
fMarginUnit = job_data.fMarginUnit;
fPhysicalRect = job_data.fPhysicalRect;
fScaledPhysicalRect = job_data.fScaledPhysicalRect;
fDriverSpecificSettings = job_data.fDriverSpecificSettings;
return *this;
}
@@ -288,6 +296,11 @@ JobData::load(BMessage *msg, const PrinterCap *cap, Settings settings)
fMarginUnit = (MarginUnit)msg->FindInt32(kJDMarginUnit);
else
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);
if (fSettings == kJobSettings)
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);
}
+96 -9
View File
@@ -17,6 +17,7 @@
#include <Box.h>
#include <Button.h>
#include <CheckBox.h>
#include <Debug.h>
#include <GridView.h>
#include <GroupLayout.h>
#include <GroupLayoutBuilder.h>
@@ -257,7 +258,7 @@ JobSetupView::AttachedToWindow()
fNup = new BPopUpMenu("");
fNup->SetRadioMode(true);
FillCapabilityMenu(fNup, kMsgNone, gNups, sizeof(gNups) / sizeof(gNups[0]),
fJobData->getNup());
(int)fJobData->getNup());
BMenuField* pagesPerSheet = new BMenuField("pagesPerSheet",
"Pages Per Sheet:", fNup);
@@ -348,6 +349,8 @@ JobSetupView::AttachedToWindow()
qualityGridLayout->AddView(fGamma, 0, 2, 2);
qualityGridLayout->AddView(fInkDensity, 0, 3, 2);
qualityGridLayout->AddView(fHalftoneBox, 0, 4, 2);
} else {
AddDriverSpecificSettings(qualityGridLayout, 1);
}
qualityGridLayout->SetSpacing(0, 0);
qualityGridLayout->SetInsets(5, 5, 5, 5);
@@ -447,7 +450,7 @@ JobSetupView::CreateHalftoneConfigurationUI()
fDitherType->SetRadioMode(true);
FillCapabilityMenu(fDitherType, kMsgQuality, gDitherTypes,
sizeof(gDitherTypes) / sizeof(gDitherTypes[0]),
fJobData->getDitherType());
(int)fJobData->getDitherType());
fDitherMenuField = new BMenuField("dithering", "Dot Pattern:",
fDitherType);
fDitherType->SetTargetForItems(this);
@@ -489,17 +492,69 @@ JobSetupView::CreateHalftoneConfigurationUI()
void
JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
PrinterCap::CapID category, int id)
JobSetupView::AddDriverSpecificSettings(BGridLayout* gridLayout, int row)
{
int count = fPrinterCap->countCap(category);
const BaseCap **capabilities = fPrinterCap->enumCap(category);
FillCapabilityMenu(menu, message, capabilities, count, id);
if (!fPrinterCap->isSupport(PrinterCap::kDriverSpecificCapabilities))
return;
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
JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
const BaseCap** capabilities, int count, int id)
const BaseCap** capabilities, int count, Predicate& predicate)
{
bool marked = false;
@@ -523,7 +578,7 @@ JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
defaultItem = item;
if (capability->ID() == id) {
if (predicate(capability)) {
item->SetMarked(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
JobSetupView::GetID(const BaseCap** capabilities, int count, const char* label,
int defaultValue)
@@ -703,6 +778,18 @@ JobSetupView::UpdateJobData(bool showPreview)
pageSelection = JobData::kEvenNumberedPages;
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();
return true;
}
+40 -18
View File
@@ -158,10 +158,10 @@ ProtocolClassCap::ID() const
}
DriverSpecificCap::DriverSpecificCap(const string& label, bool isDefault,
int32 category, Type type)
DriverSpecificCap::DriverSpecificCap(const string& label, int32 category,
Type type)
:
BaseCap(label, isDefault),
BaseCap(label, false),
fCategory(category),
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)
:
fPrinterData(printer_data)
@@ -206,8 +221,9 @@ PrinterCap::getDefaultCap(CapID category) const
}
template<typename Predicate>
const BaseCap*
PrinterCap::findCap(CapID category, int id) const
PrinterCap::findCap(CapID category, Predicate& predicate) const
{
int count = countCap(category);
if (count <= 0)
@@ -215,33 +231,39 @@ PrinterCap::findCap(CapID category, int id) const
const BaseCap **base_cap = enumCap(category);
while (count--) {
if ((*base_cap)->ID() == id) {
if (predicate(*base_cap)) {
return *base_cap;
}
base_cap++;
}
return NULL;
}
const BaseCap*
PrinterCap::findCap(CapID category, int id) const
{
IDPredicate predicate(id);
return findCap(category, predicate);
}
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;
LabelPredicate predicate(label);
return findCap(category, predicate);
}
const BaseCap*
PrinterCap::findCapWithKey(CapID category, const char* key) const
{
KeyPredicate predicate(key);
return findCap(category, predicate);
}
int
PrinterCap::getProtocolClass() const {
return fPrinterData->getProtocolClass();