1/*
2 * JobSetupDlg.cpp
3 * Copyright 1999-2000 Y.Takagi. All Rights Reserved.
4 */
5
6#ifndef __JOBSETUPDLG_H
7#define __JOBSETUPDLG_H
8
9#include <View.h>
10#include <map>
11
12#include "DialogWindow.h"
13
14#include "JobData.h"
15#include "Halftone.h"
16#include "JSDSlider.h"
17#include "PrinterCap.h"
18
19class BCheckBox;
20class BGridLayout;
21class BPopUpMenu;
22class BRadioButton;
23class BSlider;
24class BTextControl;
25class BTextView;
26class HalftoneView;
27class JobData;
28class PagesView;
29class PrinterCap;
30class PrinterData;
31
32
33template<typename T, typename R>
34class Range
35{
36public:
37	Range();
38	Range(const char* label, const char* key, const R* range, BSlider* slider);
39	const char* Key() const;
40	T Value();
41	void UpdateLabel();
42
43private:
44	const char* fLabel;
45	const char* fKey;
46	const R* fRange;
47	BSlider* fSlider;
48};
49
50
51template<typename T, typename R>
52Range<T, R>::Range()
53	:
54	fKey(NULL),
55	fRange(NULL),
56	fSlider(NULL)
57{
58}
59
60
61template<typename T, typename R>
62Range<T, R>::Range(const char* label, const char* key, const R* range,
63	BSlider* slider)
64	:
65	fLabel(label),
66	fKey(key),
67	fRange(range),
68	fSlider(slider)
69{
70
71}
72
73
74template<typename T, typename R>
75const char*
76Range<T, R>::Key() const
77{
78	return fKey;
79}
80
81
82template<typename T, typename R>
83T
84Range<T, R>::Value()
85{
86	return static_cast<T>(fRange->Lower() +
87		(fRange->Upper() - fRange->Lower()) * fSlider->Position());
88}
89
90
91template<typename T, typename R>
92void
93Range<T, R>::UpdateLabel()
94{
95	BString label = fLabel;
96	label << " (" << Value() << ")";
97	fSlider->SetLabel(label.String());
98}
99
100
101typedef Range<int32, IntRangeCap> IntRange;
102typedef Range<double, DoubleRangeCap> DoubleRange;
103
104class JobSetupView : public BView {
105public:
106					JobSetupView(JobData* jobData, PrinterData* printerData,
107						const PrinterCap* printerCap);
108	virtual	void	AttachedToWindow();
109	virtual void	MessageReceived(BMessage* message);
110			bool	UpdateJobData();
111
112private:
113			void	UpdateButtonEnabledState();
114			bool	IsHalftoneConfigurationNeeded();
115			void	CreateHalftoneConfigurationUI();
116			void	AddDriverSpecificSettings(BGridLayout* gridLayout, int row);
117			void	AddPopUpMenu(const DriverSpecificCap* capability,
118						BGridLayout* gridLayout, int& row);
119			void	AddCheckBox(const DriverSpecificCap* capability,
120						BGridLayout* gridLayout, int& row);
121			void	AddIntSlider(const DriverSpecificCap* capability,
122						BGridLayout* gridLayout, int& row);
123			void	AddDoubleSlider(const DriverSpecificCap* capability,
124						BGridLayout* gridLayout, int& row);
125			string	GetDriverSpecificValue(PrinterCap::CapID category,
126						const char* key);
127			template<typename Predicate>
128			void	FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
129						const BaseCap** capabilities, int count,
130						Predicate& predicate);
131			void	FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
132						PrinterCap::CapID category, int id);
133			void	FillCapabilityMenu(BPopUpMenu* menu, uint32 message,
134						const BaseCap** capabilities, int count, int id);
135			int		GetID(const BaseCap** capabilities, int count,
136						const char* label, int defaultValue);
137			BRadioButton* CreatePageSelectionItem(const char* name,
138						const char* label,
139						JobData::PageSelection pageSelection);
140			void	AllowOnlyDigits(BTextView* textView, int maxDigits);
141			void	UpdateHalftonePreview();
142			void	UpdateIntSlider(BMessage* message);
143			void	UpdateDoubleSlider(BMessage* message);
144
145			JobData::Color			Color();
146			Halftone::DitherType	DitherType();
147			float					Gamma();
148			float					InkDensity();
149			JobData::PaperSource	PaperSource();
150
151
152	BTextControl*		fCopies;
153	BTextControl*		fFromPage;
154	BTextControl*		fToPage;
155	JobData*			fJobData;
156	PrinterData*		fPrinterData;
157	const PrinterCap*	fPrinterCap;
158	BPopUpMenu*			fColorType;
159	BPopUpMenu*			fDitherType;
160	BMenuField*			fDitherMenuField;
161	JSDSlider*			fGamma;
162	JSDSlider*			fInkDensity;
163	HalftoneView*		fHalftone;
164	BBox*				fHalftoneBox;
165	BRadioButton*		fAll;
166	BCheckBox*			fCollate;
167	BCheckBox*			fReverse;
168	PagesView*			fPages;
169	BPopUpMenu*			fPaperFeed;
170	BCheckBox*			fDuplex;
171	BPopUpMenu*			fNup;
172	BRadioButton*		fAllPages;
173	BRadioButton*		fOddNumberedPages;
174	BRadioButton*		fEvenNumberedPages;
175	std::map<PrinterCap::CapID, BPopUpMenu*>	fDriverSpecificPopUpMenus;
176	std::map<string, BCheckBox*>				fDriverSpecificCheckBoxes;
177	std::map<PrinterCap::CapID, IntRange>		fDriverSpecificIntSliders;
178	std::map<PrinterCap::CapID, DoubleRange>	fDriverSpecificDoubleSliders;
179	BCheckBox*			fPreview;
180};
181
182class JobSetupDlg : public DialogWindow {
183public:
184					JobSetupDlg(JobData* jobData, PrinterData* printerData,
185						const PrinterCap* printerCap);
186	virtual	void	MessageReceived(BMessage* message);
187
188private:
189	JobSetupView*	fJobSetup;
190};
191
192#endif	/* __JOBSETUPDLG_H */
193