⛏️ index : haiku.git

/*
 * JobData.h
 * Copyright 1999-2000 Y.Takagi. All Rights Reserved.
 */

#ifndef __JOBDATA_H
#define __JOBDATA_H

#include <SupportDefs.h>
#include <GraphicsDefs.h>
#include <Rect.h>

#include <map>
#include <string>

#include "Halftone.h"
#include "MarginView.h" // for MarginUnit

class BMessage;
class PrinterCap;


using namespace std;

class DriverSpecificSettings
{
public:
	DriverSpecificSettings();
	DriverSpecificSettings(const DriverSpecificSettings& Settings);

	DriverSpecificSettings &operator=(const DriverSpecificSettings &Settings);

	void MakeEmpty();

	bool HasString(const char* key) const;
	const char* GetString(const char* key) const;
	void SetString(const char* key, const char* value);

	bool HasBoolean(const char* ekey) const;
	bool GetBoolean(const char* key) const;
	void SetBoolean(const char* key, bool value);

	bool HasInt(const char* ekey) const;
	int32 GetInt(const char* key) const;
	void SetInt(const char* key, int32 value);

	bool HasDouble(const char* ekey) const;
	double GetDouble(const char* key) const;
	void SetDouble(const char* key, double value);

	BMessage& Message();

private:
	BMessage fSettings;
};


class JobData {
public:
	enum Orientation {
		kPortrait,
		kLandscape
	};

	enum Paper {
		kLetter = 1,            //   1  Letter 8 1/2 x 11 in
		kLetterSmall,           //   2  Letter Small 8 1/2 x 11 in
		kTabloid,               //   3  Tabloid 11 x 17 in
		kLedger,                //   4  Ledger 17 x 11 in
		kLegal,                 //   5  Legal 8 1/2 x 14 in
		kStatement,             //   6  Statement 5 1/2 x 8 1/2 in
		kExecutive,             //   7  Executive 7 1/4 x 10 1/2 in
		kA3,                    //   8  A3 297 x 420 mm
		kA4,                    //   9  A4 210 x 297 mm
		kA4Small,               //  10  A4 Small 210 x 297 mm
		kA5,                    //  11  A5 148 x 210 mm
		kB4,                    //  12  B4 (JIS) 250 x 354
		kB5,                    //  13  B5 (JIS) 182 x 257 mm
		kFolio,                 //  14  Folio 8 1/2 x 13 in
		kQuarto,                //  15  Quarto 215 x 275 mm
		k10X14,                 //  16  10x14 in
		k11X17,                 //  17  11x17 in
		kNote,                  //  18  Note 8 1/2 x 11 in
		kEnv9,                  //  19  Envelope #9 3 7/8 x 8 7/8
		kEnv10,                 //  20  Envelope #10 4 1/8 x 9 1/2
		kEnv11,                 //  21  Envelope #11 4 1/2 x 10 3/8
		kEnv12,                 //  22  Envelope #12 4 \276 x 11
		kEnv14,                 //  23  Envelope #14 5 x 11 1/2
		kCSheet,                //  24  C size sheet
		kDSheet,                //  25  D size sheet
		kESheet,                //  26  E size sheet
		kEnvDL,                 //  27  Envelope DL 110 x 220mm
		kEnvC5,                 //  28  Envelope C5 162 x 229 mm
		kEnvC3,                 //  29  Envelope C3  324 x 458 mm
		kEnvC4,                 //  30  Envelope C4  229 x 324 mm
		kEnvC6,                 //  31  Envelope C6  114 x 162 mm
		kEnvC65,                //  32  Envelope C65 114 x 229 mm
		kEnvB4,                 //  33  Envelope B4  250 x 353 mm
		kEnvB5,                 //  34  Envelope B5  176 x 250 mm
		kEnvB6,                 //  35  Envelope B6  176 x 125 mm
		kEnvItaly,              //  36  Envelope 110 x 230 mm
		kEnvMonarch,            //  37  Envelope Monarch 3.875 x 7.5 in
		kEnvPersonal,           //  38  6 3/4 Envelope 3 5/8 x 6 1/2 in
		kFanFoldUS,             //  39  US Std Fanfold 14 7/8 x 11 in
		kFanFoldStdGerman,      //  40  German Std Fanfold 8 1/2 x 12 in
		kFanFoldLglGerman,      //  41  German Legal Fanfold 8 1/2 x 13 in
		kIsoB4,                 //  42  B4 (ISO) 250 x 353 mm
		kJapanesePostcard,      //  43  Japanese Postcard 100 x 148 mm
		k9X11,                  //  44  9 x 11 in
		k10X11,                 //  45  10 x 11 in
		k15X11,                 //  46  15 x 11 in
		kEnvInvite,             //  47  Envelope Invite 220 x 220 mm
		kReserved48,            //  48  RESERVED--DO NOT USE
		kReserved49,            //  49  RESERVED--DO NOT USE
		kLetterExtra,	        //  50  Letter Extra 9 \275 x 12 in
		kLegalExtra, 	        //  51  Legal Extra 9 \275 x 15 in
		kTabloidExtra,	        //  52  Tabloid Extra 11.69 x 18 in
		kA4Extra,     	        //  53  A4 Extra 9.27 x 12.69 in
		kLetterTransverse,      //  54  Letter Transverse 8 \275 x 11 in
		kA4Transverse,          //  55  A4 Transverse 210 x 297 mm
		kLetterExtraTransverse, //  56  Letter Extra Transverse 9\275 x 12 in
		kAPlus,                 //  57  SuperA/SuperA/A4 227 x 356 mm
		kBPlus,                 //  58  SuperB/SuperB/A3 305 x 487 mm
		kLetterPlus,            //  59  Letter Plus 8.5 x 12.69 in
		kA4Plus,                //  60  A4 Plus 210 x 330 mm
		kA5Transverse,          //  61  A5 Transverse 148 x 210 mm
		kB5Transverse,          //  62  B5 (JIS) Transverse 182 x 257 mm
		kA3Extra,               //  63  A3 Extra 322 x 445 mm
		kA5Extra,               //  64  A5 Extra 174 x 235 mm
		kB5Extra,               //  65  B5 (ISO) Extra 201 x 276 mm
		kA2,                    //  66  A2 420 x 594 mm
		kA3Transverse,          //  67  A3 Transverse 297 x 420 mm
		kA3ExtraTransverse,     //  68  A3 Extra Transverse 322 x 445 mm
		kDBLJapanesePostcard,   //  69  Japanese Double Postcard 200 x 148 mm
		kA6,                    //  70  A6 105 x 148 mm
		kJEnvKaku2,             //  71  Japanese Envelope Kaku #2
		kJEnvKaku3,             //  72  Japanese Envelope Kaku #3
		kJEnvChou3,             //  73  Japanese Envelope Chou #3
		kJEnvChou4,             //  74  Japanese Envelope Chou #4
		kLetterRotated,         //  75  Letter Rotated 11 x 8 1/2 11 in
		kA3Rotated,             //  76  A3 Rotated 420 x 297 mm
		kA4Rotated,             //  77  A4 Rotated 297 x 210 mm
		kA5Rotated,             //  78  A5 Rotated 210 x 148 mm
		kB4JISRotated,          //  79  B4 (JIS) Rotated 364 x 257 mm
		kB5JISRotated,          //  80  B5 (JIS) Rotated 257 x 182 mm
		kJapanesePostcardRotated, //  81 Japanese Postcard Rotated 148 x 100 mm
		kDBLJapanesePostcardRotated, // 82 Double Japanese Postcard Rotated 148 x 200 mm
		kA6Rotated,             //  83  A6 Rotated 148 x 105 mm
		kJEnvKaku2Rotated,      //  84  Japanese Envelope Kaku #2 Rotated
		kJEnvKaku3Rotated,      //  85  Japanese Envelope Kaku #3 Rotated
		kJEnvChou3Rotated,      //  86  Japanese Envelope Chou #3 Rotated
		kJEnvChou4Rotated,      //  87  Japanese Envelope Chou #4 Rotated
		kB6JIS,                 //  88  B6 (JIS) 128 x 182 mm
		kB6JISRotated,          //  89  B6 (JIS) Rotated 182 x 128 mm
		k12X11,                 //  90  12 x 11 in
		kJEnvYou4,              //  91  Japanese Envelope You #4
		kJEnvYou4Rotated,       //  92  Japanese Envelope You #4 Rotated
		kP16K,                  //  93  PRC 16K 146 x 215 mm
		kP32K,                  //  94  PRC 32K 97 x 151 mm
		kP32KBig,               //  95  PRC 32K(Big) 97 x 151 mm
		kPEnv1,                 //  96  PRC Envelope #1 102 x 165 mm
		kPEnv2,                 //  97  PRC Envelope #2 102 x 176 mm
		kPEnv3,                 //  98  PRC Envelope #3 125 x 176 mm
		kPEnv4,                 //  99  PRC Envelope #4 110 x 208 mm
		kPEnv5,                 // 100  PRC Envelope #5 110 x 220 mm
		kPEnv6,                 // 101  PRC Envelope #6 120 x 230 mm
		kPEnv7,                 // 102  PRC Envelope #7 160 x 230 mm
		kPEnv8,                 // 103  PRC Envelope #8 120 x 309 mm
		kPEnv9,                 // 104  PRC Envelope #9 229 x 324 mm
		kPEnv10,                // 105  PRC Envelope #10 324 x 458 mm
		kP16KRotated,           // 106  PRC 16K Rotated
		kP32KRotated,           // 107  PRC 32K Rotated
		kP32KBIGRotated,        // 108  PRC 32K(Big) Rotated
		kPEnv1Rotated,          // 109  PRC Envelope #1 Rotated 165 x 102 mm
		kPEnv2Rotated,          // 110  PRC Envelope #2 Rotated 176 x 102 mm
		kPEnv3Rotated,          // 111  PRC Envelope #3 Rotated 176 x 125 mm
		kPEnv4Rotated,          // 112  PRC Envelope #4 Rotated 208 x 110 mm
		kPEnv5Rotated,          // 113  PRC Envelope #5 Rotated 220 x 110 mm
		kPEnv6Rotated,          // 114  PRC Envelope #6 Rotated 230 x 120 mm
		kPEnv7Rotated,          // 115  PRC Envelope #7 Rotated 230 x 160 mm
		kPEnv8Rotated,          // 116  PRC Envelope #8 Rotated 309 x 120 mm
		kPEnv9Rotated,          // 117  PRC Envelope #9 Rotated 324 x 229 mm
		kPEnv10Rotated,         // 118  PRC Envelope #10 Rotated 458 x 324 mm
		kUserDefined = 256
	};

	enum PaperSource {
		kAuto,          // 7	o
		kManual,        // 4	o
		kUpper,         // 1	o
		kMiddle,        // 3	o
		kLower,         // 2	o
//		kOnlyOne,       // 1	x
//		kEnvelope,      // 5	o
//		kEnvManual,     // 6	x
//		kTractor,       // 8	x
//		kSmallFmt,      // 9	x
//		kLargeFmt,      // 10	x
//		kLargeCapacity, // 11	x
//		kCassette,      // 14	x
//		kFormSource,    // 15	x
		kCassette1 = 21,
		kCassette2,
		kCassette3,
		kCassette4,
		kCassette5,
		kCassette6,
		kCassette7,
		kCassette8,
		kCassette9,
		kUser = 256     // device specific bins start here
	};

	enum PrintStyle {
		kSimplex,
		kDuplex,
		kBooklet
	};
	
	enum BindingLocation {
		kLongEdgeLeft,
		kLongEdgeRight,
		kShortEdgeTop,
		kShortEdgeBottom,
		kLongEdge  = kLongEdgeLeft,
		kShortEdge = kShortEdgeTop
	};
	
	enum PageOrder {
		kAcrossFromLeft,
		kDownFromLeft,
		kAcrossFromRight,
		kDownFromRight,
		kLeftToRight = kAcrossFromLeft,
		kRightToLeft = kAcrossFromRight
	};

/*
	enum Quality {
		kDraft  = -1,
		kLow    = -2,
		kMedium = -3,
		kHigh   = -4
	};
*/
	enum Color {
		kMonochrome = 1,
		kColor,
		// Some PCL6 printers do not support compressed data
		// in color mode.
		kColorCompressionDisabled
	};

	enum SettingType {
		kPageSettings,
		kJobSettings
	};
	
	enum PageSelection {
		kAllPages,
		kOddNumberedPages,
		kEvenNumberedPages
	};

				JobData(BMessage* message, const PrinterCap* printerCap,
					SettingType type);
				~JobData();

				JobData(const JobData& jobData);
	JobData&	operator=(const JobData& jobData);

	void		Load(BMessage* message, const PrinterCap* printerCap,
					SettingType type);
	void		Save(BMessage* message = NULL);

	bool		GetShowPreview() const;
	void		SetShowPreview(bool showPreview);

	Paper		GetPaper() const;
	void		SetPaper(Paper paper);

	int32		GetResolutionID() const;
	void		SetResolutionID(int32 resolution);

	int32		GetXres() const;
	void		SetXres(int32 xres);

	int32		GetYres() const;
	void		SetYres(int32 yres);

	Orientation	GetOrientation() const;
	void		SetOrientation(Orientation orientation);

	float		GetScaling() const;
	void		SetScaling(float scaling);

	const BRect&	GetPaperRect() const;
	void 			SetPaperRect(const BRect& paperRect);

	const BRect&	GetScaledPaperRect() const;
	void  			SetScaledPaperRect(const BRect& paperRect);

	const BRect&	GetPrintableRect() const;
	void 			SetPrintableRect(const BRect& printableRect);

	const BRect&	GetScaledPrintableRect() const;
	void			SetScaledPrintableRect(const BRect& printableRect);

	const BRect&	GetPhysicalRect() const;
	void 			SetPhysicalRect(const BRect& PhysicalRect);

	const BRect&	GetScaledPhysicalRect() const;
	void			SetScaledPhysicalRect(const BRect& PhysicalRect);

	int32			GetNup() const;
	void			SetNup(int32 nup);

	bool			GetReverse() const;
	void			SetReverse(bool reverse);

	int32			GetFirstPage() const;
	void			SetFirstPage(int32 firstPage);

	int32			GetLastPage() const;
	void			SetLastPage(int32 lastPage);

	// libprint supports only B_RGB32
	color_space		GetSurfaceType() const;

	float			GetGamma() const;
	void			SetGamma(float gamma);

	float			GetInkDensity() const;
	void			SetInkDensity(float inkDensity);

	PaperSource		GetPaperSource() const;
	void			SetPaperSource(PaperSource paperSource);

	int32			GetCopies() const;
	void			SetCopies(int32 copies);

	bool			GetCollate() const;
	void			SetCollate(bool collate);

	PrintStyle		GetPrintStyle() const;
	void			SetPrintStyle(PrintStyle printStyle);

	BindingLocation	GetBindingLocation() const;
	void			SetBindingLocation(BindingLocation bindingLocation);

	PageOrder		GetPageOrder() const;
	void			SetPageOrder(PageOrder pageOrder);
	
	Color			GetColor() const;
	void			SetColor(Color color);
	
	Halftone::DitherType	GetDitherType() const;
	void					SetDitherType(Halftone::DitherType ditherType);
	
	PageSelection	GetPageSelection() const;
	void			SetPageSelection(PageSelection pageSelection);
	
	MarginUnit		GetMarginUnit() const;
	void			SetMarginUnit(MarginUnit marginUnit);

	DriverSpecificSettings& 		Settings();
	const DriverSpecificSettings&	Settings() const;

private:
	bool        fShowPreview;
	Paper       fPaper;
	int32       fResolutionID;
	int32       fXRes;
	int32       fYRes;
	Orientation fOrientation;
	float       fScaling;
	BRect       fPaperRect;
	BRect       fScaledPaperRect;
	BRect       fPrintableRect;
	BRect       fScaledPrintableRect;
	BRect       fPhysicalRect;
	BRect       fScaledPhysicalRect;
	int32       fNup;
	int32       fFirstPage;
	int32       fLastPage;
	float       fGamma;      // 1 identiy, < 1 brigther, > 1 darker
	float       fInkDensity; // [0, 255] lower means higher density
	PaperSource fPaperSource;
	int32       fCopies;
	bool        fCollate;
	bool        fReverse;
	PrintStyle  fPrintStyle;
	BindingLocation fBindingLocation;
	PageOrder   fPageOrder;
	SettingType fSettingType;
	BMessage    *fMsg;
	Color       fColor;
	Halftone::DitherType fDitherType;
	PageSelection        fPageSelection;
	MarginUnit  fMarginUnit;
	DriverSpecificSettings fDriverSpecificSettings;
};


inline bool
JobData::GetShowPreview() const
{
	return fShowPreview;
}

inline void
JobData::SetShowPreview(bool showPreview)
{
	fShowPreview = showPreview;
}


inline JobData::Paper
JobData::GetPaper() const
{
	return fPaper;
}


inline void
JobData::SetPaper(Paper paper)
{
	fPaper = paper;
}


inline int32
JobData::GetResolutionID() const
{
	return fResolutionID;
}


inline void
JobData::SetResolutionID(int32 resolution)
{
	fResolutionID = resolution;
}


inline int32
JobData::GetXres() const
{
	return fXRes;
}


inline void
JobData::SetXres(int32 xres)
{
	fXRes = xres;
}


inline int32
JobData::GetYres() const
{
	return fYRes;
}


inline void
JobData::SetYres(int32 yres)
{
	fYRes = yres;
};


inline JobData::Orientation
JobData::GetOrientation() const
{
	return fOrientation;
}


inline void
JobData::SetOrientation(Orientation orientation)
{
	fOrientation = orientation;
}


inline float
JobData::GetScaling() const
{
	return fScaling;
}


inline void
JobData::SetScaling(float scaling)
{
	fScaling = scaling;
}


inline const BRect&
JobData::GetPaperRect() const
{
	return fPaperRect;
}


inline void
JobData::SetPaperRect(const BRect &rect)
{
	fPaperRect = rect;
}


inline const BRect&
JobData::GetScaledPaperRect() const
{
	return fScaledPaperRect;
}


inline void
JobData::SetScaledPaperRect(const BRect &rect)
{
	fScaledPaperRect = rect;
}


inline const BRect &
JobData::GetPrintableRect() const
{
	return fPrintableRect;
}


inline void
JobData::SetPrintableRect(const BRect &rect)
{
	fPrintableRect = rect;
}


inline const BRect&
JobData::GetScaledPrintableRect() const
{
	return fScaledPrintableRect;
}


inline void
JobData::SetScaledPrintableRect(const BRect &rect)
{
	fScaledPrintableRect = rect;
}


inline const BRect&
JobData::GetPhysicalRect() const
{
	return fPhysicalRect;
}


inline void
JobData::SetPhysicalRect(const BRect &rect)
{
	fPhysicalRect = rect;
}


inline const BRect&
JobData::GetScaledPhysicalRect() const
{
	return fScaledPhysicalRect;
}



inline void
JobData::SetScaledPhysicalRect(const BRect &rect)
{
	fScaledPhysicalRect = rect;
}


inline int32
JobData::GetNup() const
{
	return fNup;
}


inline void
JobData::SetNup(int32 nup)
{
	fNup = nup;
}


inline bool
JobData::GetReverse() const
{
	return fReverse;
}


inline void
JobData::SetReverse(bool reverse)
{
	fReverse = reverse;
}


inline int32
JobData::GetFirstPage() const
{
	return fFirstPage;
}


inline void
JobData::SetFirstPage(int32 firstPage)
{
	fFirstPage = firstPage;
}


inline int32
JobData::GetLastPage() const
{
	return fLastPage;
}


inline void
JobData::SetLastPage(int32 lastPage)
{
	fLastPage = lastPage;
}


color_space
inline JobData::GetSurfaceType() const
{
	return B_RGB32;
}


inline float
JobData::GetGamma() const
{
	return fGamma;
}


inline void
JobData::SetGamma(float gamma)
{
	fGamma = gamma;
}


inline float
JobData::GetInkDensity() const
{
	return fInkDensity;
}


inline void
JobData::SetInkDensity(float inkDensity)
{
	fInkDensity = inkDensity;
}


inline JobData::PaperSource
JobData::GetPaperSource() const
{
	return fPaperSource;
}


inline void
JobData::SetPaperSource(PaperSource paperSource)
{
	fPaperSource = paperSource;
};


inline int32
JobData::GetCopies() const
{
	return fCopies;
}


inline void
JobData::SetCopies(int32 copies)
{
	fCopies = copies;
}


inline bool
JobData::GetCollate() const
{
	return fCollate;
}


inline void
JobData::SetCollate(bool collate)
{
	fCollate = collate;
}


inline JobData::PrintStyle
JobData::GetPrintStyle() const
{
	return fPrintStyle;
}


inline void
JobData::SetPrintStyle(PrintStyle print_style)
{
	fPrintStyle = print_style;
}


inline JobData::BindingLocation
JobData::GetBindingLocation() const
{
	return fBindingLocation;
}


inline void
JobData::SetBindingLocation(BindingLocation binding_location)
{
	fBindingLocation = binding_location;
}


inline JobData::PageOrder
JobData::GetPageOrder() const { return fPageOrder; }


inline void
JobData::SetPageOrder(PageOrder page_order)
{
	fPageOrder = page_order;
}


inline JobData::Color
JobData::GetColor() const
{
	return fColor;
}


inline void
JobData::SetColor(Color color)
{
	fColor = color;
}


inline Halftone::DitherType
JobData::GetDitherType() const
{
	return fDitherType;
}


inline void
JobData::SetDitherType(Halftone::DitherType dither_type)
{
	fDitherType = dither_type;
}


inline JobData::PageSelection
JobData::GetPageSelection() const
{
	return fPageSelection;
}


inline void
JobData::SetPageSelection(PageSelection pageSelection)
{
	fPageSelection = pageSelection;
}


inline MarginUnit
JobData::GetMarginUnit() const
{
	return fMarginUnit;
}


inline void
JobData::SetMarginUnit(MarginUnit marginUnit)
{
	fMarginUnit = marginUnit;
}

#endif	/* __JOBDATA_H */