xref: /haiku/src/libs/print/libprint/JobSetupDlg.cpp (revision ae83b2f10afce1b76e6b5d5ad5e3594cc443c04e)
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