112fd6cc2SKarsten Heimrich /* 212fd6cc2SKarsten Heimrich * JobSetupDlg.cpp 312fd6cc2SKarsten Heimrich * Copyright 1999-2000 Y.Takagi. All Rights Reserved. 412fd6cc2SKarsten Heimrich */ 512fd6cc2SKarsten Heimrich 612fd6cc2SKarsten Heimrich #include <cstdio> 712fd6cc2SKarsten Heimrich #include <cstring> 812fd6cc2SKarsten Heimrich #include <cstdlib> 912fd6cc2SKarsten Heimrich #include <string> 1012fd6cc2SKarsten Heimrich #include <fcntl.h> 1112fd6cc2SKarsten Heimrich #include <unistd.h> 1212fd6cc2SKarsten Heimrich #include <sys/stat.h> 1312fd6cc2SKarsten Heimrich #include <math.h> 1412fd6cc2SKarsten Heimrich 1512fd6cc2SKarsten Heimrich #include <Alert.h> 1612fd6cc2SKarsten Heimrich #include <Bitmap.h> 1712fd6cc2SKarsten Heimrich #include <Box.h> 1812fd6cc2SKarsten Heimrich #include <Button.h> 1912fd6cc2SKarsten Heimrich #include <CheckBox.h> 20de18d919SMichael Pfeiffer #include <Debug.h> 215a695bceSMichael Pfeiffer #include <GridView.h> 225a695bceSMichael Pfeiffer #include <GroupLayout.h> 235a695bceSMichael Pfeiffer #include <GroupLayoutBuilder.h> 2412fd6cc2SKarsten Heimrich #include <Looper.h> 2512fd6cc2SKarsten Heimrich #include <MessageFilter.h> 2612fd6cc2SKarsten Heimrich #include <MenuField.h> 2712fd6cc2SKarsten Heimrich #include <MenuItem.h> 2812fd6cc2SKarsten Heimrich #include <Message.h> 2912fd6cc2SKarsten Heimrich #include <Point.h> 3012fd6cc2SKarsten Heimrich #include <PopUpMenu.h> 3112fd6cc2SKarsten Heimrich #include <PrintJob.h> 3212fd6cc2SKarsten Heimrich #include <RadioButton.h> 3312fd6cc2SKarsten Heimrich #include <Rect.h> 3412fd6cc2SKarsten Heimrich #include <Slider.h> 3512fd6cc2SKarsten Heimrich #include <String.h> 3612fd6cc2SKarsten Heimrich #include <TextControl.h> 3712fd6cc2SKarsten Heimrich #include <TextView.h> 3812fd6cc2SKarsten Heimrich #include <View.h> 3912fd6cc2SKarsten Heimrich 4012fd6cc2SKarsten Heimrich #include "HalftoneView.h" 4112fd6cc2SKarsten Heimrich #include "JobSetupDlg.h" 4212fd6cc2SKarsten Heimrich #include "JobData.h" 4312fd6cc2SKarsten Heimrich #include "JSDSlider.h" 4412fd6cc2SKarsten Heimrich #include "PagesView.h" 4512fd6cc2SKarsten Heimrich #include "PrinterData.h" 4612fd6cc2SKarsten Heimrich #include "PrinterCap.h" 4712fd6cc2SKarsten Heimrich #include "DbgMsg.h" 4812fd6cc2SKarsten Heimrich 49a7dde370SMichael Pfeiffer 5012fd6cc2SKarsten Heimrich using namespace std; 5112fd6cc2SKarsten Heimrich 5212fd6cc2SKarsten Heimrich 5312fd6cc2SKarsten Heimrich struct NupCap : public BaseCap { 54a7dde370SMichael Pfeiffer NupCap(const string &label, bool isDefault, int nup) 55a7dde370SMichael Pfeiffer : 56a7dde370SMichael Pfeiffer BaseCap(label, isDefault), 57a7dde370SMichael Pfeiffer fNup(nup) 58a7dde370SMichael Pfeiffer {} 59a7dde370SMichael Pfeiffer 60961e35fbSMichael Pfeiffer int32 ID() const { return fNup; } 61f53abcbdSMichael Pfeiffer 62a7dde370SMichael Pfeiffer int fNup; 6312fd6cc2SKarsten Heimrich }; 6412fd6cc2SKarsten Heimrich 65a7dde370SMichael Pfeiffer 6612fd6cc2SKarsten Heimrich struct DitherCap : public BaseCap { 67a7dde370SMichael Pfeiffer DitherCap(const string &label, bool isDefault, 68a7dde370SMichael Pfeiffer Halftone::DitherType ditherType) 69a7dde370SMichael Pfeiffer : 70a7dde370SMichael Pfeiffer BaseCap(label, isDefault), 71a7dde370SMichael Pfeiffer fDitherType(ditherType) 72a7dde370SMichael Pfeiffer {} 73a7dde370SMichael Pfeiffer 74961e35fbSMichael Pfeiffer int32 ID() const { return fDitherType; } 75f53abcbdSMichael Pfeiffer 76a7dde370SMichael Pfeiffer Halftone::DitherType fDitherType; 7712fd6cc2SKarsten Heimrich }; 7812fd6cc2SKarsten Heimrich 7912fd6cc2SKarsten Heimrich 8012fd6cc2SKarsten Heimrich static const NupCap gNup1("1", true, 1); 8112fd6cc2SKarsten Heimrich static const NupCap gNup2("2", false, 2); 8212fd6cc2SKarsten Heimrich static const NupCap gNup4("4", false, 4); 8312fd6cc2SKarsten Heimrich static const NupCap gNup8("8", false, 8); 8412fd6cc2SKarsten Heimrich static const NupCap gNup9("9", false, 9); 8512fd6cc2SKarsten Heimrich static const NupCap gNup16("16", false, 16); 8612fd6cc2SKarsten Heimrich static const NupCap gNup25("25", false, 25); 8712fd6cc2SKarsten Heimrich static const NupCap gNup32("32", false, 32); 8812fd6cc2SKarsten Heimrich static const NupCap gNup36("36", false, 36); 8912fd6cc2SKarsten Heimrich 90a7dde370SMichael Pfeiffer 9112fd6cc2SKarsten Heimrich static const DitherCap gDitherType1("Crosshatch", false, Halftone::kType1); 9212fd6cc2SKarsten Heimrich static const DitherCap gDitherType2("Grid", false, Halftone::kType2); 9312fd6cc2SKarsten Heimrich static const DitherCap gDitherType3("Stipple", false, Halftone::kType3); 94a7dde370SMichael Pfeiffer static const DitherCap gDitherFloydSteinberg("Floyd-Steinberg", false, 95a7dde370SMichael Pfeiffer Halftone::kTypeFloydSteinberg); 9612fd6cc2SKarsten Heimrich 9712fd6cc2SKarsten Heimrich 98f53abcbdSMichael Pfeiffer const BaseCap *gNups[] = { 9912fd6cc2SKarsten Heimrich &gNup1, 10012fd6cc2SKarsten Heimrich &gNup2, 10112fd6cc2SKarsten Heimrich &gNup4, 10212fd6cc2SKarsten Heimrich &gNup8, 10312fd6cc2SKarsten Heimrich &gNup9, 10412fd6cc2SKarsten Heimrich &gNup16, 10512fd6cc2SKarsten Heimrich &gNup25, 10612fd6cc2SKarsten Heimrich &gNup32, 10712fd6cc2SKarsten Heimrich &gNup36 10812fd6cc2SKarsten Heimrich }; 10912fd6cc2SKarsten Heimrich 110a7dde370SMichael Pfeiffer 111f53abcbdSMichael Pfeiffer const BaseCap *gDitherTypes[] = { 11212fd6cc2SKarsten Heimrich &gDitherType1, 11312fd6cc2SKarsten Heimrich &gDitherType2, 11412fd6cc2SKarsten Heimrich &gDitherType3, 11512fd6cc2SKarsten Heimrich &gDitherFloydSteinberg 11612fd6cc2SKarsten Heimrich }; 11712fd6cc2SKarsten Heimrich 118a7dde370SMichael Pfeiffer 11912fd6cc2SKarsten Heimrich enum { 12012fd6cc2SKarsten Heimrich kMsgRangeAll = 'JSdl', 12112fd6cc2SKarsten Heimrich kMsgRangeSelection, 12212fd6cc2SKarsten Heimrich kMsgCancel, 12312fd6cc2SKarsten Heimrich kMsgOK, 12412fd6cc2SKarsten Heimrich kMsgQuality, 12512fd6cc2SKarsten Heimrich kMsgCollateChanged, 12612fd6cc2SKarsten Heimrich kMsgReverseChanged, 12712fd6cc2SKarsten Heimrich kMsgDuplexChanged, 128f53abcbdSMichael Pfeiffer kMsgNone = 0 12912fd6cc2SKarsten Heimrich }; 13012fd6cc2SKarsten Heimrich 131a7dde370SMichael Pfeiffer 13256c20e82SMichael Pfeiffer JobSetupView::JobSetupView(JobData* jobData, PrinterData* printerData, 13356c20e82SMichael Pfeiffer const PrinterCap *printerCap) 134a7dde370SMichael Pfeiffer : 135a7dde370SMichael Pfeiffer BView("jobSetup", B_WILL_DRAW), 136308f0e19SMichael Pfeiffer fCopies(NULL), 137308f0e19SMichael Pfeiffer fFromPage(NULL), 138308f0e19SMichael Pfeiffer fToPage(NULL), 13956c20e82SMichael Pfeiffer fJobData(jobData), 14056c20e82SMichael Pfeiffer fPrinterData(printerData), 14156c20e82SMichael Pfeiffer fPrinterCap(printerCap), 142308f0e19SMichael Pfeiffer fColorType(NULL), 143308f0e19SMichael Pfeiffer fDitherType(NULL), 144308f0e19SMichael Pfeiffer fGamma(NULL), 145308f0e19SMichael Pfeiffer fInkDensity(NULL), 146308f0e19SMichael Pfeiffer fHalftone(NULL), 147308f0e19SMichael Pfeiffer fAll(NULL), 148308f0e19SMichael Pfeiffer fCollate(NULL), 149308f0e19SMichael Pfeiffer fReverse(NULL), 150308f0e19SMichael Pfeiffer fPages(NULL), 151308f0e19SMichael Pfeiffer fPaperFeed(NULL), 152308f0e19SMichael Pfeiffer fDuplex(NULL), 153308f0e19SMichael Pfeiffer fNup(NULL), 154308f0e19SMichael Pfeiffer fAllPages(NULL), 155308f0e19SMichael Pfeiffer fOddNumberedPages(NULL), 156308f0e19SMichael Pfeiffer fEvenNumberedPages(NULL) 15712fd6cc2SKarsten Heimrich { 15812fd6cc2SKarsten Heimrich SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 15912fd6cc2SKarsten Heimrich } 16012fd6cc2SKarsten Heimrich 161a7dde370SMichael Pfeiffer 16212fd6cc2SKarsten Heimrich BRadioButton* 1635a695bceSMichael Pfeiffer JobSetupView::CreatePageSelectionItem(const char* name, const char* label, 16412fd6cc2SKarsten Heimrich JobData::PageSelection pageSelection) 16512fd6cc2SKarsten Heimrich { 1665a695bceSMichael Pfeiffer BRadioButton* button = new BRadioButton(name, label, NULL); 16712fd6cc2SKarsten Heimrich if (fJobData->getPageSelection() == pageSelection) { 16812fd6cc2SKarsten Heimrich button->SetValue(B_CONTROL_ON); 16912fd6cc2SKarsten Heimrich } 17012fd6cc2SKarsten Heimrich return button; 17112fd6cc2SKarsten Heimrich } 17212fd6cc2SKarsten Heimrich 173a7dde370SMichael Pfeiffer 17412fd6cc2SKarsten Heimrich void 17512fd6cc2SKarsten Heimrich JobSetupView::AllowOnlyDigits(BTextView* textView, int maxDigits) 17612fd6cc2SKarsten Heimrich { 17712fd6cc2SKarsten Heimrich int num; 17812fd6cc2SKarsten Heimrich for (num = 0; num <= 255; num++) { 17912fd6cc2SKarsten Heimrich textView->DisallowChar(num); 18012fd6cc2SKarsten Heimrich } 18112fd6cc2SKarsten Heimrich for (num = 0; num <= 9; num++) { 18212fd6cc2SKarsten Heimrich textView->AllowChar('0' + num); 18312fd6cc2SKarsten Heimrich } 18412fd6cc2SKarsten Heimrich textView->SetMaxBytes(maxDigits); 18512fd6cc2SKarsten Heimrich } 18612fd6cc2SKarsten Heimrich 187a7dde370SMichael Pfeiffer 18812fd6cc2SKarsten Heimrich void 18912fd6cc2SKarsten Heimrich JobSetupView::AttachedToWindow() 19012fd6cc2SKarsten Heimrich { 1915a695bceSMichael Pfeiffer // quality 1925a695bceSMichael Pfeiffer BBox* qualityBox = new BBox("quality"); 1935a695bceSMichael Pfeiffer qualityBox->SetLabel("Quality"); 19412fd6cc2SKarsten Heimrich 1955a695bceSMichael Pfeiffer // color 1965a695bceSMichael Pfeiffer fColorType = new BPopUpMenu("color"); 19712fd6cc2SKarsten Heimrich fColorType->SetRadioMode(true); 198f53abcbdSMichael Pfeiffer FillCapabilityMenu(fColorType, kMsgQuality, PrinterCap::kColor, 199f53abcbdSMichael Pfeiffer fJobData->getColor()); 2005a695bceSMichael Pfeiffer BMenuField* colorMenuField = new BMenuField("color", "Color:", fColorType); 20112fd6cc2SKarsten Heimrich fColorType->SetTargetForItems(this); 20212fd6cc2SKarsten Heimrich 203308f0e19SMichael Pfeiffer if (IsHalftoneConfigurationNeeded()) 204308f0e19SMichael Pfeiffer CreateHalftoneConfigurationUI(); 20512fd6cc2SKarsten Heimrich 2065a695bceSMichael Pfeiffer // page range 20712fd6cc2SKarsten Heimrich 2085a695bceSMichael Pfeiffer BBox* pageRangeBox = new BBox("pageRange"); 2095a695bceSMichael Pfeiffer pageRangeBox->SetLabel("Page Range"); 21012fd6cc2SKarsten Heimrich 2115a695bceSMichael Pfeiffer fAll = new BRadioButton("all", "Print all Pages", new BMessage(kMsgRangeAll)); 21212fd6cc2SKarsten Heimrich 2135a695bceSMichael Pfeiffer BRadioButton *range = new BRadioButton("selection", "Print selected Pages:", 2145a695bceSMichael Pfeiffer new BMessage(kMsgRangeSelection)); 21512fd6cc2SKarsten Heimrich 2165a695bceSMichael Pfeiffer fFromPage = new BTextControl("from", "From:", "", NULL); 21712fd6cc2SKarsten Heimrich fFromPage->SetAlignment(B_ALIGN_LEFT, B_ALIGN_RIGHT); 21812fd6cc2SKarsten Heimrich AllowOnlyDigits(fFromPage->TextView(), 6); 21912fd6cc2SKarsten Heimrich 2205a695bceSMichael Pfeiffer fToPage = new BTextControl("to", "To:", "", NULL); 22112fd6cc2SKarsten Heimrich fToPage->SetAlignment(B_ALIGN_LEFT, B_ALIGN_RIGHT); 22212fd6cc2SKarsten Heimrich AllowOnlyDigits(fToPage->TextView(), 6); 22312fd6cc2SKarsten Heimrich 22412fd6cc2SKarsten Heimrich int first_page = fJobData->getFirstPage(); 22512fd6cc2SKarsten Heimrich int last_page = fJobData->getLastPage(); 22612fd6cc2SKarsten Heimrich 22712fd6cc2SKarsten Heimrich if (first_page <= 1 && last_page <= 0) { 22812fd6cc2SKarsten Heimrich fAll->SetValue(B_CONTROL_ON); 22912fd6cc2SKarsten Heimrich } else { 2305a695bceSMichael Pfeiffer range->SetValue(B_CONTROL_ON); 23112fd6cc2SKarsten Heimrich if (first_page < 1) 23212fd6cc2SKarsten Heimrich first_page = 1; 23312fd6cc2SKarsten Heimrich if (first_page > last_page) 23412fd6cc2SKarsten Heimrich last_page = -1; 23512fd6cc2SKarsten Heimrich 23612fd6cc2SKarsten Heimrich BString oss1; 23712fd6cc2SKarsten Heimrich oss1 << first_page; 23812fd6cc2SKarsten Heimrich fFromPage->SetText(oss1.String()); 23912fd6cc2SKarsten Heimrich 24012fd6cc2SKarsten Heimrich BString oss2; 24112fd6cc2SKarsten Heimrich oss2 << last_page; 24212fd6cc2SKarsten Heimrich fToPage->SetText(oss2.String()); 24312fd6cc2SKarsten Heimrich } 24412fd6cc2SKarsten Heimrich 24512fd6cc2SKarsten Heimrich fAll->SetTarget(this); 2465a695bceSMichael Pfeiffer range->SetTarget(this); 24712fd6cc2SKarsten Heimrich 2485a695bceSMichael Pfeiffer // paper source 24912fd6cc2SKarsten Heimrich fPaperFeed = new BPopUpMenu(""); 25012fd6cc2SKarsten Heimrich fPaperFeed->SetRadioMode(true); 251f53abcbdSMichael Pfeiffer FillCapabilityMenu(fPaperFeed, kMsgNone, PrinterCap::kPaperSource, 252f53abcbdSMichael Pfeiffer fJobData->getPaperSource()); 2535a695bceSMichael Pfeiffer BMenuField* paperSourceMenufield = new BMenuField("paperSource", 2545a695bceSMichael Pfeiffer "Paper Source:", fPaperFeed); 25512fd6cc2SKarsten Heimrich 2565a695bceSMichael Pfeiffer // Pages per sheet 25712fd6cc2SKarsten Heimrich fNup = new BPopUpMenu(""); 25812fd6cc2SKarsten Heimrich fNup->SetRadioMode(true); 259f53abcbdSMichael Pfeiffer FillCapabilityMenu(fNup, kMsgNone, gNups, sizeof(gNups) / sizeof(gNups[0]), 260de18d919SMichael Pfeiffer (int)fJobData->getNup()); 2615a695bceSMichael Pfeiffer BMenuField* pagesPerSheet = new BMenuField("pagesPerSheet", 2625a695bceSMichael Pfeiffer "Pages Per Sheet:", fNup); 26312fd6cc2SKarsten Heimrich 2645a695bceSMichael Pfeiffer // duplex 26512fd6cc2SKarsten Heimrich if (fPrinterCap->isSupport(PrinterCap::kPrintStyle)) { 2665a695bceSMichael Pfeiffer fDuplex = new BCheckBox("duplex", "Duplex", 2675a695bceSMichael Pfeiffer new BMessage(kMsgDuplexChanged)); 26812fd6cc2SKarsten Heimrich if (fJobData->getPrintStyle() != JobData::kSimplex) { 26912fd6cc2SKarsten Heimrich fDuplex->SetValue(B_CONTROL_ON); 27012fd6cc2SKarsten Heimrich } 27112fd6cc2SKarsten Heimrich fDuplex->SetTarget(this); 27212fd6cc2SKarsten Heimrich } else { 27312fd6cc2SKarsten Heimrich fDuplex = NULL; 27412fd6cc2SKarsten Heimrich } 27512fd6cc2SKarsten Heimrich 2765a695bceSMichael Pfeiffer // copies 2775a695bceSMichael Pfeiffer fCopies = new BTextControl("copies", "Number of Copies:", "", NULL); 27812fd6cc2SKarsten Heimrich AllowOnlyDigits(fCopies->TextView(), 3); 27912fd6cc2SKarsten Heimrich 2805a695bceSMichael Pfeiffer BString copies; 2815a695bceSMichael Pfeiffer copies << fJobData->getCopies(); 2825a695bceSMichael Pfeiffer fCopies->SetText(copies.String()); 28312fd6cc2SKarsten Heimrich 2845a695bceSMichael Pfeiffer // collate 2855a695bceSMichael Pfeiffer fCollate = new BCheckBox("collate", "Collate", 2865a695bceSMichael Pfeiffer new BMessage(kMsgCollateChanged)); 28712fd6cc2SKarsten Heimrich if (fJobData->getCollate()) { 28812fd6cc2SKarsten Heimrich fCollate->SetValue(B_CONTROL_ON); 28912fd6cc2SKarsten Heimrich } 29012fd6cc2SKarsten Heimrich fCollate->SetTarget(this); 29112fd6cc2SKarsten Heimrich 2925a695bceSMichael Pfeiffer // reverse 2935a695bceSMichael Pfeiffer fReverse = new BCheckBox("reverse", "Reverse Order", 2945a695bceSMichael Pfeiffer new BMessage(kMsgReverseChanged)); 29512fd6cc2SKarsten Heimrich if (fJobData->getReverse()) { 29612fd6cc2SKarsten Heimrich fReverse->SetValue(B_CONTROL_ON); 29712fd6cc2SKarsten Heimrich } 29812fd6cc2SKarsten Heimrich fReverse->SetTarget(this); 29912fd6cc2SKarsten Heimrich 3005a695bceSMichael Pfeiffer // pages view 3015a695bceSMichael Pfeiffer // TODO make layout API compatible 3025a695bceSMichael Pfeiffer fPages = new PagesView(BRect(0, 0, 150, 40), "pages", B_FOLLOW_ALL, 3035a695bceSMichael Pfeiffer B_WILL_DRAW); 30412fd6cc2SKarsten Heimrich fPages->setCollate(fJobData->getCollate()); 30512fd6cc2SKarsten Heimrich fPages->setReverse(fJobData->getReverse()); 3065a695bceSMichael Pfeiffer fPages->SetExplicitMinSize(BSize(150, 40)); 3075a695bceSMichael Pfeiffer fPages->SetExplicitMaxSize(BSize(150, 40)); 30812fd6cc2SKarsten Heimrich 3095a695bceSMichael Pfeiffer // page selection 3105a695bceSMichael Pfeiffer BBox* pageSelectionBox = new BBox("pageSelection"); 31112fd6cc2SKarsten Heimrich pageSelectionBox->SetLabel("Page Selection"); 31212fd6cc2SKarsten Heimrich 3135a695bceSMichael Pfeiffer fAllPages = CreatePageSelectionItem("allPages", "All Pages", 3145a695bceSMichael Pfeiffer JobData::kAllPages); 3155a695bceSMichael Pfeiffer fOddNumberedPages = CreatePageSelectionItem("oddPages", 3165a695bceSMichael Pfeiffer "Odd-Numbered Pages", JobData::kOddNumberedPages); 3175a695bceSMichael Pfeiffer fEvenNumberedPages = CreatePageSelectionItem("evenPages", 3185a695bceSMichael Pfeiffer "Even-Numbered Pages", JobData::kEvenNumberedPages); 3195a695bceSMichael Pfeiffer 320*ae83b2f1SMichael Pfeiffer fPreview = new BCheckBox("preview", "Show preview before printing", NULL); 321*ae83b2f1SMichael Pfeiffer if (fJobData->getShowPreview()) 322*ae83b2f1SMichael Pfeiffer fPreview->SetValue(B_CONTROL_ON); 323*ae83b2f1SMichael Pfeiffer 3245a695bceSMichael Pfeiffer // separator line 3255a695bceSMichael Pfeiffer BBox *separator = new BBox("separator"); 3265a695bceSMichael Pfeiffer separator->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1)); 3275a695bceSMichael Pfeiffer 3285a695bceSMichael Pfeiffer // buttons 3295a695bceSMichael Pfeiffer BButton* cancel = new BButton("cancel", "Cancel", 3305a695bceSMichael Pfeiffer new BMessage(kMsgCancel)); 3315a695bceSMichael Pfeiffer BButton* ok = new BButton("ok", "OK", new BMessage(kMsgOK)); 3325a695bceSMichael Pfeiffer ok->MakeDefault(true); 3335a695bceSMichael Pfeiffer 334308f0e19SMichael Pfeiffer if (IsHalftoneConfigurationNeeded()) { 3355a695bceSMichael Pfeiffer BGroupView* halftoneGroup = new BGroupView(B_VERTICAL, 0); 3365a695bceSMichael Pfeiffer BGroupLayout* halftoneLayout = halftoneGroup->GroupLayout(); 3375a695bceSMichael Pfeiffer halftoneLayout->AddView(fHalftone); 338308f0e19SMichael Pfeiffer fHalftoneBox->AddChild(halftoneGroup); 339308f0e19SMichael Pfeiffer } 3405a695bceSMichael Pfeiffer 3415a695bceSMichael Pfeiffer BGridView* qualityGrid = new BGridView(); 3425a695bceSMichael Pfeiffer BGridLayout* qualityGridLayout = qualityGrid->GridLayout(); 3435a695bceSMichael Pfeiffer qualityGridLayout->AddItem(colorMenuField->CreateLabelLayoutItem(), 0, 0); 3445a695bceSMichael Pfeiffer qualityGridLayout->AddItem(colorMenuField->CreateMenuBarLayoutItem(), 1, 0); 345308f0e19SMichael Pfeiffer if (IsHalftoneConfigurationNeeded()) { 346308f0e19SMichael Pfeiffer qualityGridLayout->AddItem(fDitherMenuField->CreateLabelLayoutItem(), 347308f0e19SMichael Pfeiffer 0, 1); 348308f0e19SMichael Pfeiffer qualityGridLayout->AddItem(fDitherMenuField->CreateMenuBarLayoutItem(), 349308f0e19SMichael Pfeiffer 1, 1); 3505a695bceSMichael Pfeiffer qualityGridLayout->AddView(fGamma, 0, 2, 2); 3515a695bceSMichael Pfeiffer qualityGridLayout->AddView(fInkDensity, 0, 3, 2); 352308f0e19SMichael Pfeiffer qualityGridLayout->AddView(fHalftoneBox, 0, 4, 2); 353de18d919SMichael Pfeiffer } else { 354de18d919SMichael Pfeiffer AddDriverSpecificSettings(qualityGridLayout, 1); 355308f0e19SMichael Pfeiffer } 3565a695bceSMichael Pfeiffer qualityGridLayout->SetSpacing(0, 0); 3575a695bceSMichael Pfeiffer qualityGridLayout->SetInsets(5, 5, 5, 5); 3585a695bceSMichael Pfeiffer qualityBox->AddChild(qualityGrid); 3595a695bceSMichael Pfeiffer 3605a695bceSMichael Pfeiffer BGridView* pageRangeGrid = new BGridView(); 3615a695bceSMichael Pfeiffer BGridLayout* pageRangeLayout = pageRangeGrid->GridLayout(); 3625a695bceSMichael Pfeiffer pageRangeLayout->AddItem(fFromPage->CreateLabelLayoutItem(), 0, 0); 3635a695bceSMichael Pfeiffer pageRangeLayout->AddItem(fFromPage->CreateTextViewLayoutItem(), 1, 0); 3645a695bceSMichael Pfeiffer pageRangeLayout->AddItem(fToPage->CreateLabelLayoutItem(), 0, 1); 3655a695bceSMichael Pfeiffer pageRangeLayout->AddItem(fToPage->CreateTextViewLayoutItem(), 1, 1); 3665a695bceSMichael Pfeiffer pageRangeLayout->SetInsets(0, 0, 0, 0); 3675a695bceSMichael Pfeiffer pageRangeLayout->SetSpacing(0, 0); 3685a695bceSMichael Pfeiffer 3695a695bceSMichael Pfeiffer BGroupView* pageRangeGroup = new BGroupView(B_VERTICAL, 0); 3705a695bceSMichael Pfeiffer BGroupLayout* pageRangeGroupLayout = pageRangeGroup->GroupLayout(); 3715a695bceSMichael Pfeiffer pageRangeGroupLayout->AddView(fAll); 3725a695bceSMichael Pfeiffer pageRangeGroupLayout->AddView(range); 3735a695bceSMichael Pfeiffer pageRangeGroupLayout->AddView(pageRangeGrid); 3745a695bceSMichael Pfeiffer pageRangeGroupLayout->SetInsets(5, 5, 5, 5); 3755a695bceSMichael Pfeiffer pageRangeBox->AddChild(pageRangeGroup); 3765a695bceSMichael Pfeiffer 3775a695bceSMichael Pfeiffer BGridView* settings = new BGridView(); 3785a695bceSMichael Pfeiffer BGridLayout* settingsLayout = settings->GridLayout(); 3795a695bceSMichael Pfeiffer settingsLayout->AddItem(paperSourceMenufield->CreateLabelLayoutItem(), 0, 3805a695bceSMichael Pfeiffer 0); 3815a695bceSMichael Pfeiffer settingsLayout->AddItem(paperSourceMenufield->CreateMenuBarLayoutItem(), 1, 3825a695bceSMichael Pfeiffer 0); 3835a695bceSMichael Pfeiffer settingsLayout->AddItem(pagesPerSheet->CreateLabelLayoutItem(), 0, 1); 3845a695bceSMichael Pfeiffer settingsLayout->AddItem(pagesPerSheet->CreateMenuBarLayoutItem(), 1, 1); 3855a695bceSMichael Pfeiffer int row = 2; 3865a695bceSMichael Pfeiffer if (fDuplex != NULL) { 3875a695bceSMichael Pfeiffer settingsLayout->AddView(fDuplex, 0, row, 2); 3885a695bceSMichael Pfeiffer row ++; 3895a695bceSMichael Pfeiffer } 3905a695bceSMichael Pfeiffer settingsLayout->AddItem(fCopies->CreateLabelLayoutItem(), 0, row); 3915a695bceSMichael Pfeiffer settingsLayout->AddItem(fCopies->CreateTextViewLayoutItem(), 1, row); 3925a695bceSMichael Pfeiffer settingsLayout->SetSpacing(0, 0); 39312fd6cc2SKarsten Heimrich 39412fd6cc2SKarsten Heimrich 3955a695bceSMichael Pfeiffer BGroupView* pageSelectionGroup = new BGroupView(B_VERTICAL, 0); 3965a695bceSMichael Pfeiffer BGroupLayout* groupLayout = pageSelectionGroup->GroupLayout(); 3975a695bceSMichael Pfeiffer groupLayout->AddView(fAllPages); 3985a695bceSMichael Pfeiffer groupLayout->AddView(fOddNumberedPages); 3995a695bceSMichael Pfeiffer groupLayout->AddView(fEvenNumberedPages); 4005a695bceSMichael Pfeiffer groupLayout->SetInsets(5, 5, 5, 5); 4015a695bceSMichael Pfeiffer pageSelectionBox->AddChild(pageSelectionGroup); 40212fd6cc2SKarsten Heimrich 4035a695bceSMichael Pfeiffer SetLayout(new BGroupLayout(B_VERTICAL)); 4045a695bceSMichael Pfeiffer AddChild(BGroupLayoutBuilder(B_VERTICAL, 0) 4055a695bceSMichael Pfeiffer .AddGroup(B_HORIZONTAL, 10, 1.0f) 4065a695bceSMichael Pfeiffer .AddGroup(B_VERTICAL, 10, 1.0f) 4075a695bceSMichael Pfeiffer .Add(qualityBox) 4085a695bceSMichael Pfeiffer .Add(pageRangeBox) 4095a695bceSMichael Pfeiffer .AddGlue() 4105a695bceSMichael Pfeiffer .End() 4115a695bceSMichael Pfeiffer .AddGroup(B_VERTICAL, 0, 1.0f) 4125a695bceSMichael Pfeiffer .Add(settings) 4135a695bceSMichael Pfeiffer .AddStrut(5) 4145a695bceSMichael Pfeiffer .Add(fCollate) 4155a695bceSMichael Pfeiffer .Add(fReverse) 4165a695bceSMichael Pfeiffer .Add(fPages) 4175a695bceSMichael Pfeiffer .AddStrut(5) 4185a695bceSMichael Pfeiffer .Add(pageSelectionBox) 4195a695bceSMichael Pfeiffer .AddGlue() 4205a695bceSMichael Pfeiffer .End() 4215a695bceSMichael Pfeiffer .End() 422*ae83b2f1SMichael Pfeiffer .Add(fPreview) 4235a695bceSMichael Pfeiffer .AddGlue() 4245a695bceSMichael Pfeiffer .Add(separator) 4255a695bceSMichael Pfeiffer .AddGroup(B_HORIZONTAL, 10, 1.0f) 4265a695bceSMichael Pfeiffer .AddGlue() 4275a695bceSMichael Pfeiffer .Add(cancel) 4285a695bceSMichael Pfeiffer .Add(ok) 4295a695bceSMichael Pfeiffer .End() 4305a695bceSMichael Pfeiffer .SetInsets(0, 0, 0, 0) 4315a695bceSMichael Pfeiffer ); 43212fd6cc2SKarsten Heimrich 433308f0e19SMichael Pfeiffer UpdateHalftonePreview(); 43412fd6cc2SKarsten Heimrich 43512fd6cc2SKarsten Heimrich UpdateButtonEnabledState(); 43612fd6cc2SKarsten Heimrich } 43712fd6cc2SKarsten Heimrich 438a7dde370SMichael Pfeiffer 439308f0e19SMichael Pfeiffer bool 440308f0e19SMichael Pfeiffer JobSetupView::IsHalftoneConfigurationNeeded() 441308f0e19SMichael Pfeiffer { 442308f0e19SMichael Pfeiffer return fPrinterCap->isSupport(PrinterCap::kHalftone); 443308f0e19SMichael Pfeiffer } 444308f0e19SMichael Pfeiffer 445308f0e19SMichael Pfeiffer 446308f0e19SMichael Pfeiffer void 447308f0e19SMichael Pfeiffer JobSetupView::CreateHalftoneConfigurationUI() 448308f0e19SMichael Pfeiffer { 449308f0e19SMichael Pfeiffer // dither type 450308f0e19SMichael Pfeiffer fDitherType = new BPopUpMenu(""); 451308f0e19SMichael Pfeiffer fDitherType->SetRadioMode(true); 452308f0e19SMichael Pfeiffer FillCapabilityMenu(fDitherType, kMsgQuality, gDitherTypes, 453308f0e19SMichael Pfeiffer sizeof(gDitherTypes) / sizeof(gDitherTypes[0]), 454de18d919SMichael Pfeiffer (int)fJobData->getDitherType()); 455308f0e19SMichael Pfeiffer fDitherMenuField = new BMenuField("dithering", "Dot Pattern:", 456308f0e19SMichael Pfeiffer fDitherType); 457308f0e19SMichael Pfeiffer fDitherType->SetTargetForItems(this); 458308f0e19SMichael Pfeiffer 459308f0e19SMichael Pfeiffer // halftone preview view 460308f0e19SMichael Pfeiffer fHalftoneBox = new BBox("halftoneBox"); 461308f0e19SMichael Pfeiffer fHalftoneBox->SetBorder(B_PLAIN_BORDER); 462308f0e19SMichael Pfeiffer 463308f0e19SMichael Pfeiffer // TODO make layout compatible 464308f0e19SMichael Pfeiffer BSize size(240, 14 * 4); 465308f0e19SMichael Pfeiffer BRect rect(0, 0, size.width, size.height); 466308f0e19SMichael Pfeiffer fHalftone = new HalftoneView(rect, "halftone", 467308f0e19SMichael Pfeiffer B_FOLLOW_ALL, B_WILL_DRAW); 468308f0e19SMichael Pfeiffer fHalftone->SetExplicitMinSize(size); 469308f0e19SMichael Pfeiffer fHalftone->SetExplicitMaxSize(size); 470308f0e19SMichael Pfeiffer 471308f0e19SMichael Pfeiffer // gamma 472308f0e19SMichael Pfeiffer fGamma = new JSDSlider("gamma", "Gamma", new BMessage(kMsgQuality), 473308f0e19SMichael Pfeiffer -300, 300); 474308f0e19SMichael Pfeiffer 475308f0e19SMichael Pfeiffer fGamma->SetLimitLabels("Lighter", "Darker"); 476308f0e19SMichael Pfeiffer fGamma->SetValue((int32)(100 * log(fJobData->getGamma()) / log(2.0))); 477308f0e19SMichael Pfeiffer fGamma->SetHashMarks(B_HASH_MARKS_BOTH); 478308f0e19SMichael Pfeiffer fGamma->SetHashMarkCount(7); 479308f0e19SMichael Pfeiffer fGamma->SetModificationMessage(new BMessage(kMsgQuality)); 480308f0e19SMichael Pfeiffer fGamma->SetTarget(this); 481308f0e19SMichael Pfeiffer 482308f0e19SMichael Pfeiffer // ink density 483308f0e19SMichael Pfeiffer fInkDensity = new JSDSlider("inkDensity", "Ink Usage", 484308f0e19SMichael Pfeiffer new BMessage(kMsgQuality), 0, 127); 485308f0e19SMichael Pfeiffer 486308f0e19SMichael Pfeiffer fInkDensity->SetLimitLabels("Min", "Max"); 487308f0e19SMichael Pfeiffer fInkDensity->SetValue((int32)fJobData->getInkDensity()); 488308f0e19SMichael Pfeiffer fInkDensity->SetHashMarks(B_HASH_MARKS_BOTH); 489308f0e19SMichael Pfeiffer fInkDensity->SetHashMarkCount(10); 490308f0e19SMichael Pfeiffer fInkDensity->SetModificationMessage(new BMessage(kMsgQuality)); 491308f0e19SMichael Pfeiffer fInkDensity->SetTarget(this); 492308f0e19SMichael Pfeiffer } 493308f0e19SMichael Pfeiffer 494308f0e19SMichael Pfeiffer 49512fd6cc2SKarsten Heimrich void 496de18d919SMichael Pfeiffer JobSetupView::AddDriverSpecificSettings(BGridLayout* gridLayout, int row) 497f53abcbdSMichael Pfeiffer { 498de18d919SMichael Pfeiffer if (!fPrinterCap->isSupport(PrinterCap::kDriverSpecificCapabilities)) 499de18d919SMichael Pfeiffer return; 500de18d919SMichael Pfeiffer 501de18d919SMichael Pfeiffer int count = fPrinterCap->countCap(PrinterCap::kDriverSpecificCapabilities); 502de18d919SMichael Pfeiffer const BaseCap** capabilities = fPrinterCap->enumCap( 503de18d919SMichael Pfeiffer PrinterCap::kDriverSpecificCapabilities); 504de18d919SMichael Pfeiffer 505de18d919SMichael Pfeiffer for (int i = 0; i < count; i ++) { 506de18d919SMichael Pfeiffer const DriverSpecificCap* capability = static_cast<const DriverSpecificCap*>( 507de18d919SMichael Pfeiffer capabilities[i]); 508de18d919SMichael Pfeiffer 509de18d919SMichael Pfeiffer const char* label = capability->fLabel.c_str(); 510de18d919SMichael Pfeiffer BPopUpMenu* popUpMenu = new BPopUpMenu(label); 511de18d919SMichael Pfeiffer popUpMenu->SetRadioMode(true); 512de18d919SMichael Pfeiffer 513de18d919SMichael Pfeiffer PrinterCap::CapID category = static_cast<PrinterCap::CapID>( 514de18d919SMichael Pfeiffer capability->ID()); 515de18d919SMichael Pfeiffer 516de18d919SMichael Pfeiffer const BaseCap** categoryCapabilities = fPrinterCap->enumCap(category); 517de18d919SMichael Pfeiffer 518de18d919SMichael Pfeiffer int categoryCount = fPrinterCap->countCap(category); 519de18d919SMichael Pfeiffer 520de18d919SMichael Pfeiffer string value = GetDriverSpecificValue(category, capability->Key()); 521de18d919SMichael Pfeiffer PrinterCap::KeyPredicate predicate(value.c_str()); 522de18d919SMichael Pfeiffer 523de18d919SMichael Pfeiffer FillCapabilityMenu(popUpMenu, kMsgNone, categoryCapabilities, 524de18d919SMichael Pfeiffer categoryCount, predicate); 525de18d919SMichael Pfeiffer 526de18d919SMichael Pfeiffer BString menuLabel = label; 527de18d919SMichael Pfeiffer menuLabel << ":"; 528de18d919SMichael Pfeiffer BMenuField* menuField = new BMenuField(label, menuLabel.String(), 529de18d919SMichael Pfeiffer popUpMenu); 530de18d919SMichael Pfeiffer popUpMenu->SetTargetForItems(this); 531de18d919SMichael Pfeiffer 532de18d919SMichael Pfeiffer gridLayout->AddItem(menuField->CreateLabelLayoutItem(), 533de18d919SMichael Pfeiffer 0, row); 534de18d919SMichael Pfeiffer gridLayout->AddItem(menuField->CreateMenuBarLayoutItem(), 535de18d919SMichael Pfeiffer 1, row); 536de18d919SMichael Pfeiffer row ++; 537de18d919SMichael Pfeiffer 538de18d919SMichael Pfeiffer fDriverSpecificLists[category] = popUpMenu; 539de18d919SMichael Pfeiffer } 540f53abcbdSMichael Pfeiffer } 541f53abcbdSMichael Pfeiffer 542de18d919SMichael Pfeiffer 543de18d919SMichael Pfeiffer string 544de18d919SMichael Pfeiffer JobSetupView::GetDriverSpecificValue(PrinterCap::CapID category, 545de18d919SMichael Pfeiffer const char* key) 546de18d919SMichael Pfeiffer { 547de18d919SMichael Pfeiffer if (fJobData->HasDriverSpecificSetting(key)) 548de18d919SMichael Pfeiffer return fJobData->DriverSpecificSetting(key); 549de18d919SMichael Pfeiffer 550de18d919SMichael Pfeiffer const BaseCap* defaultCapability = fPrinterCap->getDefaultCap(category); 551de18d919SMichael Pfeiffer return defaultCapability->fKey; 552de18d919SMichael Pfeiffer } 553de18d919SMichael Pfeiffer 554de18d919SMichael Pfeiffer 555de18d919SMichael Pfeiffer template<typename Predicate> 556f53abcbdSMichael Pfeiffer void 557f53abcbdSMichael Pfeiffer JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message, 558de18d919SMichael Pfeiffer const BaseCap** capabilities, int count, Predicate& predicate) 559f53abcbdSMichael Pfeiffer { 560f53abcbdSMichael Pfeiffer bool marked = false; 561f53abcbdSMichael Pfeiffer 562f53abcbdSMichael Pfeiffer BMenuItem* firstItem = NULL; 563f53abcbdSMichael Pfeiffer BMenuItem* defaultItem = NULL; 564f53abcbdSMichael Pfeiffer BMenuItem* item = NULL; 565f53abcbdSMichael Pfeiffer while (count--) { 566f53abcbdSMichael Pfeiffer const BaseCap* capability = *capabilities; 567f53abcbdSMichael Pfeiffer if (message != kMsgNone) 568f53abcbdSMichael Pfeiffer item = new BMenuItem(capability->fLabel.c_str(), 569308f0e19SMichael Pfeiffer new BMessage(message)); 570f53abcbdSMichael Pfeiffer else 571f53abcbdSMichael Pfeiffer item = new BMenuItem(capability->fLabel.c_str(), NULL); 572f53abcbdSMichael Pfeiffer 573f53abcbdSMichael Pfeiffer menu->AddItem(item); 574f53abcbdSMichael Pfeiffer 575f53abcbdSMichael Pfeiffer if (firstItem == NULL) 576f53abcbdSMichael Pfeiffer firstItem = item; 577f53abcbdSMichael Pfeiffer 578f53abcbdSMichael Pfeiffer if (capability->fIsDefault) 579f53abcbdSMichael Pfeiffer defaultItem = item; 580f53abcbdSMichael Pfeiffer 581f53abcbdSMichael Pfeiffer 582de18d919SMichael Pfeiffer if (predicate(capability)) { 583f53abcbdSMichael Pfeiffer item->SetMarked(true); 584f53abcbdSMichael Pfeiffer marked = true; 585f53abcbdSMichael Pfeiffer } 586f53abcbdSMichael Pfeiffer 587f53abcbdSMichael Pfeiffer capabilities++; 588f53abcbdSMichael Pfeiffer } 589f53abcbdSMichael Pfeiffer 590f53abcbdSMichael Pfeiffer if (marked) 591f53abcbdSMichael Pfeiffer return; 592f53abcbdSMichael Pfeiffer 593f53abcbdSMichael Pfeiffer if (defaultItem != NULL) 594f53abcbdSMichael Pfeiffer defaultItem->SetMarked(true); 595f53abcbdSMichael Pfeiffer else if (firstItem != NULL) 596f53abcbdSMichael Pfeiffer firstItem->SetMarked(true); 597f53abcbdSMichael Pfeiffer } 598f53abcbdSMichael Pfeiffer 599f53abcbdSMichael Pfeiffer 600de18d919SMichael Pfeiffer void 601de18d919SMichael Pfeiffer JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message, 602de18d919SMichael Pfeiffer PrinterCap::CapID category, int id) 603de18d919SMichael Pfeiffer { 604de18d919SMichael Pfeiffer PrinterCap::IDPredicate predicate(id); 605de18d919SMichael Pfeiffer int count = fPrinterCap->countCap(category); 606de18d919SMichael Pfeiffer const BaseCap **capabilities = fPrinterCap->enumCap(category); 607de18d919SMichael Pfeiffer FillCapabilityMenu(menu, message, capabilities, count, predicate); 608de18d919SMichael Pfeiffer } 609de18d919SMichael Pfeiffer 610de18d919SMichael Pfeiffer 611de18d919SMichael Pfeiffer void 612de18d919SMichael Pfeiffer JobSetupView::FillCapabilityMenu(BPopUpMenu* menu, uint32 message, 613de18d919SMichael Pfeiffer const BaseCap** capabilities, int count, int id) 614de18d919SMichael Pfeiffer { 615de18d919SMichael Pfeiffer PrinterCap::IDPredicate predicate(id); 616de18d919SMichael Pfeiffer FillCapabilityMenu(menu, message, capabilities, count, predicate); 617de18d919SMichael Pfeiffer } 618de18d919SMichael Pfeiffer 619de18d919SMichael Pfeiffer 620f53abcbdSMichael Pfeiffer int 621f53abcbdSMichael Pfeiffer JobSetupView::GetID(const BaseCap** capabilities, int count, const char* label, 622f53abcbdSMichael Pfeiffer int defaultValue) 623f53abcbdSMichael Pfeiffer { 624f53abcbdSMichael Pfeiffer while (count--) { 625f53abcbdSMichael Pfeiffer const BaseCap* capability = *capabilities; 626f53abcbdSMichael Pfeiffer if (capability->fLabel == label) 627f53abcbdSMichael Pfeiffer return capability->ID(); 628f53abcbdSMichael Pfeiffer } 629f53abcbdSMichael Pfeiffer return defaultValue; 630f53abcbdSMichael Pfeiffer } 631f53abcbdSMichael Pfeiffer 632f53abcbdSMichael Pfeiffer 633f53abcbdSMichael Pfeiffer void 63412fd6cc2SKarsten Heimrich JobSetupView::UpdateButtonEnabledState() 63512fd6cc2SKarsten Heimrich { 63612fd6cc2SKarsten Heimrich bool pageRangeEnabled = fAll->Value() != B_CONTROL_ON; 63712fd6cc2SKarsten Heimrich fFromPage->SetEnabled(pageRangeEnabled); 63812fd6cc2SKarsten Heimrich fToPage->SetEnabled(pageRangeEnabled); 63912fd6cc2SKarsten Heimrich 64012fd6cc2SKarsten Heimrich bool pageSelectionEnabled = fDuplex == NULL || 64112fd6cc2SKarsten Heimrich fDuplex->Value() != B_CONTROL_ON; 64212fd6cc2SKarsten Heimrich fAllPages->SetEnabled(pageSelectionEnabled); 64312fd6cc2SKarsten Heimrich fOddNumberedPages->SetEnabled(pageSelectionEnabled); 64412fd6cc2SKarsten Heimrich fEvenNumberedPages->SetEnabled(pageSelectionEnabled); 64512fd6cc2SKarsten Heimrich } 64612fd6cc2SKarsten Heimrich 647a7dde370SMichael Pfeiffer 64812fd6cc2SKarsten Heimrich void 64956c20e82SMichael Pfeiffer JobSetupView::MessageReceived(BMessage* message) 65012fd6cc2SKarsten Heimrich { 65156c20e82SMichael Pfeiffer switch (message->what) { 65212fd6cc2SKarsten Heimrich case kMsgRangeAll: 65312fd6cc2SKarsten Heimrich case kMsgRangeSelection: 65412fd6cc2SKarsten Heimrich case kMsgDuplexChanged: 65512fd6cc2SKarsten Heimrich UpdateButtonEnabledState(); 65612fd6cc2SKarsten Heimrich break; 65712fd6cc2SKarsten Heimrich 65812fd6cc2SKarsten Heimrich case kMsgQuality: 659308f0e19SMichael Pfeiffer UpdateHalftonePreview(); 66012fd6cc2SKarsten Heimrich break; 66112fd6cc2SKarsten Heimrich 66212fd6cc2SKarsten Heimrich case kMsgCollateChanged: 66312fd6cc2SKarsten Heimrich fPages->setCollate(fCollate->Value() == B_CONTROL_ON); 66412fd6cc2SKarsten Heimrich break; 66512fd6cc2SKarsten Heimrich 66612fd6cc2SKarsten Heimrich case kMsgReverseChanged: 66712fd6cc2SKarsten Heimrich fPages->setReverse(fReverse->Value() == B_CONTROL_ON); 66812fd6cc2SKarsten Heimrich break; 66912fd6cc2SKarsten Heimrich } 67012fd6cc2SKarsten Heimrich } 67112fd6cc2SKarsten Heimrich 672a7dde370SMichael Pfeiffer 673308f0e19SMichael Pfeiffer void 674308f0e19SMichael Pfeiffer JobSetupView::UpdateHalftonePreview() 675308f0e19SMichael Pfeiffer { 676308f0e19SMichael Pfeiffer if (!IsHalftoneConfigurationNeeded()) 677308f0e19SMichael Pfeiffer return; 678308f0e19SMichael Pfeiffer 679308f0e19SMichael Pfeiffer fHalftone->preview(Gamma(), InkDensity(), DitherType(), 680308f0e19SMichael Pfeiffer Color() != JobData::kMonochrome); 681308f0e19SMichael Pfeiffer } 682308f0e19SMichael Pfeiffer 683308f0e19SMichael Pfeiffer 68412fd6cc2SKarsten Heimrich JobData::Color 685f53abcbdSMichael Pfeiffer JobSetupView::Color() 68612fd6cc2SKarsten Heimrich { 687f53abcbdSMichael Pfeiffer const char *label = fColorType->FindMarked()->Label(); 688f53abcbdSMichael Pfeiffer const BaseCap* capability = fPrinterCap->findCap(PrinterCap::kColor, label); 689f53abcbdSMichael Pfeiffer if (capability == NULL) 69012fd6cc2SKarsten Heimrich return JobData::kMonochrome; 691f53abcbdSMichael Pfeiffer 692f53abcbdSMichael Pfeiffer const ColorCap* colorCap = static_cast<const ColorCap*>(capability); 693f53abcbdSMichael Pfeiffer return colorCap->fColor; 69412fd6cc2SKarsten Heimrich } 69512fd6cc2SKarsten Heimrich 696a7dde370SMichael Pfeiffer 69712fd6cc2SKarsten Heimrich Halftone::DitherType 698f53abcbdSMichael Pfeiffer JobSetupView::DitherType() 69912fd6cc2SKarsten Heimrich { 700f53abcbdSMichael Pfeiffer const char *label = fDitherType->FindMarked()->Label(); 701f53abcbdSMichael Pfeiffer int id = GetID(gDitherTypes, sizeof(gDitherTypes) / sizeof(gDitherTypes[0]), 702f53abcbdSMichael Pfeiffer label, Halftone::kTypeFloydSteinberg); 703f53abcbdSMichael Pfeiffer return static_cast<Halftone::DitherType>(id); 70412fd6cc2SKarsten Heimrich } 70512fd6cc2SKarsten Heimrich 70612fd6cc2SKarsten Heimrich float 707f53abcbdSMichael Pfeiffer JobSetupView::Gamma() 70812fd6cc2SKarsten Heimrich { 70912fd6cc2SKarsten Heimrich const float value = (float)fGamma->Value(); 71012fd6cc2SKarsten Heimrich return pow(2.0, value / 100.0); 71112fd6cc2SKarsten Heimrich } 71212fd6cc2SKarsten Heimrich 713a7dde370SMichael Pfeiffer 71412fd6cc2SKarsten Heimrich float 715f53abcbdSMichael Pfeiffer JobSetupView::InkDensity() 71612fd6cc2SKarsten Heimrich { 71712fd6cc2SKarsten Heimrich const float value = (float)(127 - fInkDensity->Value()); 71812fd6cc2SKarsten Heimrich return value; 71912fd6cc2SKarsten Heimrich } 72012fd6cc2SKarsten Heimrich 721a7dde370SMichael Pfeiffer 722f53abcbdSMichael Pfeiffer JobData::PaperSource 723f53abcbdSMichael Pfeiffer JobSetupView::PaperSource() 724f53abcbdSMichael Pfeiffer { 725f53abcbdSMichael Pfeiffer const char *label = fPaperFeed->FindMarked()->Label(); 726f53abcbdSMichael Pfeiffer const BaseCap* capability = fPrinterCap->findCap(PrinterCap::kPaperSource, 727f53abcbdSMichael Pfeiffer label); 728f53abcbdSMichael Pfeiffer 729f53abcbdSMichael Pfeiffer if (capability == NULL) 730f53abcbdSMichael Pfeiffer capability = fPrinterCap->getDefaultCap(PrinterCap::kPaperSource); 731f53abcbdSMichael Pfeiffer return static_cast<const PaperSourceCap*>(capability)->fPaperSource; 732f53abcbdSMichael Pfeiffer 733f53abcbdSMichael Pfeiffer } 734f53abcbdSMichael Pfeiffer 73512fd6cc2SKarsten Heimrich bool 736*ae83b2f1SMichael Pfeiffer JobSetupView::UpdateJobData() 73712fd6cc2SKarsten Heimrich { 738*ae83b2f1SMichael Pfeiffer fJobData->setShowPreview(fPreview->Value() == B_CONTROL_ON); 739f53abcbdSMichael Pfeiffer fJobData->setColor(Color()); 740308f0e19SMichael Pfeiffer if (IsHalftoneConfigurationNeeded()) { 741f53abcbdSMichael Pfeiffer fJobData->setGamma(Gamma()); 742f53abcbdSMichael Pfeiffer fJobData->setInkDensity(InkDensity()); 743f53abcbdSMichael Pfeiffer fJobData->setDitherType(DitherType()); 744308f0e19SMichael Pfeiffer } 74512fd6cc2SKarsten Heimrich 74612fd6cc2SKarsten Heimrich int first_page; 74712fd6cc2SKarsten Heimrich int last_page; 74812fd6cc2SKarsten Heimrich 74912fd6cc2SKarsten Heimrich if (B_CONTROL_ON == fAll->Value()) { 75012fd6cc2SKarsten Heimrich first_page = 1; 75112fd6cc2SKarsten Heimrich last_page = -1; 75212fd6cc2SKarsten Heimrich } else { 75312fd6cc2SKarsten Heimrich first_page = atoi(fFromPage->Text()); 75412fd6cc2SKarsten Heimrich last_page = atoi(fToPage->Text()); 75512fd6cc2SKarsten Heimrich } 75612fd6cc2SKarsten Heimrich 75712fd6cc2SKarsten Heimrich fJobData->setFirstPage(first_page); 75812fd6cc2SKarsten Heimrich fJobData->setLastPage(last_page); 75912fd6cc2SKarsten Heimrich 760f53abcbdSMichael Pfeiffer fJobData->setPaperSource(PaperSource()); 76112fd6cc2SKarsten Heimrich 762f53abcbdSMichael Pfeiffer fJobData->setNup(GetID(gNups, sizeof(gNups) / sizeof(gNups[0]), 763f53abcbdSMichael Pfeiffer fNup->FindMarked()->Label(), 1)); 76412fd6cc2SKarsten Heimrich 76512fd6cc2SKarsten Heimrich if (fPrinterCap->isSupport(PrinterCap::kPrintStyle)) { 766f53abcbdSMichael Pfeiffer fJobData->setPrintStyle((B_CONTROL_ON == fDuplex->Value()) 767f53abcbdSMichael Pfeiffer ? JobData::kDuplex : JobData::kSimplex); 76812fd6cc2SKarsten Heimrich } 76912fd6cc2SKarsten Heimrich 77012fd6cc2SKarsten Heimrich fJobData->setCopies(atoi(fCopies->Text())); 77112fd6cc2SKarsten Heimrich 77256c20e82SMichael Pfeiffer fJobData->setCollate(B_CONTROL_ON == fCollate->Value()); 77356c20e82SMichael Pfeiffer fJobData->setReverse(B_CONTROL_ON == fReverse->Value()); 77412fd6cc2SKarsten Heimrich 77512fd6cc2SKarsten Heimrich JobData::PageSelection pageSelection = JobData::kAllPages; 77612fd6cc2SKarsten Heimrich if (fOddNumberedPages->Value() == B_CONTROL_ON) 77712fd6cc2SKarsten Heimrich pageSelection = JobData::kOddNumberedPages; 77812fd6cc2SKarsten Heimrich if (fEvenNumberedPages->Value() == B_CONTROL_ON) 77912fd6cc2SKarsten Heimrich pageSelection = JobData::kEvenNumberedPages; 78012fd6cc2SKarsten Heimrich fJobData->setPageSelection(pageSelection); 78112fd6cc2SKarsten Heimrich 782de18d919SMichael Pfeiffer std::map<PrinterCap::CapID, BPopUpMenu*>::iterator it = 783de18d919SMichael Pfeiffer fDriverSpecificLists.begin(); 784de18d919SMichael Pfeiffer for(; it != fDriverSpecificLists.end(); it++) { 785de18d919SMichael Pfeiffer PrinterCap::CapID category = it->first; 786de18d919SMichael Pfeiffer BPopUpMenu* popUpMenu = it->second; 787de18d919SMichael Pfeiffer const char* key = fPrinterCap->findCap( 788de18d919SMichael Pfeiffer PrinterCap::kDriverSpecificCapabilities, (int)category)->Key(); 789de18d919SMichael Pfeiffer const char* label = popUpMenu->FindMarked()->Label(); 790de18d919SMichael Pfeiffer const char* value = fPrinterCap->findCap(category, label)->Key(); 791de18d919SMichael Pfeiffer fJobData->SetDriverSpecificSetting(key, value); 792de18d919SMichael Pfeiffer } 793de18d919SMichael Pfeiffer 79412fd6cc2SKarsten Heimrich fJobData->save(); 79512fd6cc2SKarsten Heimrich return true; 79612fd6cc2SKarsten Heimrich } 79712fd6cc2SKarsten Heimrich 79812fd6cc2SKarsten Heimrich 79956c20e82SMichael Pfeiffer JobSetupDlg::JobSetupDlg(JobData* jobData, PrinterData* printerData, 80056c20e82SMichael Pfeiffer const PrinterCap* printerCap) 801a7dde370SMichael Pfeiffer : 802a7dde370SMichael Pfeiffer DialogWindow(BRect(100, 100, 200, 200), "PrintJob Setup", 803a7dde370SMichael Pfeiffer B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL, 8045a695bceSMichael Pfeiffer B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE 8055a695bceSMichael Pfeiffer | B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS) 80612fd6cc2SKarsten Heimrich { 80712fd6cc2SKarsten Heimrich SetResult(B_ERROR); 80812fd6cc2SKarsten Heimrich AddShortcut('W', B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED)); 80912fd6cc2SKarsten Heimrich 81056c20e82SMichael Pfeiffer fJobSetup = new JobSetupView(jobData, printerData, printerCap); 8115a695bceSMichael Pfeiffer SetLayout(new BGroupLayout(B_VERTICAL)); 8125a695bceSMichael Pfeiffer AddChild(BGroupLayoutBuilder(B_VERTICAL, 0) 8135a695bceSMichael Pfeiffer .Add(fJobSetup) 8145a695bceSMichael Pfeiffer .SetInsets(10, 10, 10, 10) 8155a695bceSMichael Pfeiffer ); 81612fd6cc2SKarsten Heimrich } 81712fd6cc2SKarsten Heimrich 818a7dde370SMichael Pfeiffer 81912fd6cc2SKarsten Heimrich void 82056c20e82SMichael Pfeiffer JobSetupDlg::MessageReceived(BMessage* message) 82112fd6cc2SKarsten Heimrich { 82256c20e82SMichael Pfeiffer switch (message->what) { 82312fd6cc2SKarsten Heimrich case kMsgOK: 824*ae83b2f1SMichael Pfeiffer fJobSetup->UpdateJobData(); 82512fd6cc2SKarsten Heimrich SetResult(B_NO_ERROR); 82612fd6cc2SKarsten Heimrich PostMessage(B_QUIT_REQUESTED); 82712fd6cc2SKarsten Heimrich break; 82812fd6cc2SKarsten Heimrich 82912fd6cc2SKarsten Heimrich case kMsgCancel: 83012fd6cc2SKarsten Heimrich PostMessage(B_QUIT_REQUESTED); 83112fd6cc2SKarsten Heimrich break; 83212fd6cc2SKarsten Heimrich 83312fd6cc2SKarsten Heimrich default: 83456c20e82SMichael Pfeiffer DialogWindow::MessageReceived(message); 83512fd6cc2SKarsten Heimrich break; 83612fd6cc2SKarsten Heimrich } 83712fd6cc2SKarsten Heimrich } 838