#!/usr/bin/perl

use strict;
use warnings;

use lib ".";
use PPD;
use PPD::PJL;
use PPD::Paper;
use PPD::Common;

set('FileVersion', '1.0');
set('PCFileName', 'XR7400.PPD');

set('Manufacturer', 'Xerox');
set('Product', 'Phaser 7400');
set('PSVersion', '(3016.101) 3');

# *DefaultOutputOrder: Normal
# *DefaultGuaranteedMaxSeparations: 4

set('Throughput', 35);
set('TTRasterizer', 'Type42');
set('Protocols', 'PJL BCP TBCP');
set('FileSystem', 1);

set('ColorDevice', 1);
set('DefaultColorSpace', 'CMYK');
set('AccurateScreensSupport', 1);

set('cupsProtocol', 'None');

# FIXME: JobPatchFile and magic there...

define_ui_group({ Key => 'Basic', Name => 'Basic options' });

option(&PPD::Common::Duplex);
option(&PPD::Common::Collate);

# FIXME: Jog

PPD::PJL::add_jcl();

PPD::Paper::add_papers({
	MinW => 254.6, MaxW => 930.3,
	MinH => 254.6, MaxH => 3456.5,
	MarginH => 14.456, MarginV => 14.456,
	PSPageSize => sub { my ($m) = @_; return sprintf("<< /PageSize [%d %d] >> setpagedevice", $m->{W}, $m->{H}); },
	# FIXME: LeadingEdge
});
switch_group('Media');

option({
	Key => 'MediaType',
	Name => 'Media Type',
	Choice => 'PickOne',
	Priority => 20,
	Values => gen_values("<< /MediaType (%s) >> setpagedevice",
			{ Key => 'None', PS => '<< /MediaType null >> setpagedevice', Default => 1 },
			"Paper",
			"HeavyPaper",
			"Transparency",
			"ThinCardStock",
			"ThickCardStock",
			"ThickCardStock",
			"ExtraThickCardStock",
			"Envelope",
			"Label",
			"Letterhead",
			"CoatedPaper",
			"Preprinted",
			"Prepunched",
			"ColoredPaper",
			"Special",
		),
});

option({
	Key => 'InputSlot',
	Name => 'Input Slot',
	Choice => 'PickOne',
	Priority => 30,
	Values => [
		{ Key => 'Auto', Name => 'Automatically Select', PS => "", Default => 1 },
		{ Key => 'ManualFeed', Name => 'Tray 1 with manual feed', PS => '<< /ManualFeed true /MediaPosition 0 /TraySwitch false >> setpagedevice' },
		{ Key => 'Tray1', Name => 'Tray 1', PS => '<< /ManualFeed false /MediaPosition 0 /TraySwitch false >> setpagedevice' },
		{ Key => 'Tray2', Name => 'Tray 2', PS => '<< /ManualFeed false /MediaPosition 1 /TraySwitch false >> setpagedevice' },
		{ Key => 'Tray3', Name => 'Tray 3', PS => '<< /ManualFeed false /MediaPosition 2 /TraySwitch false >> setpagedevice' },
	],
});

# FIXME: Move to output section, probably with Collate and Jog as well
option({
	Key => 'OutputBin',
	Name => 'Paper Destination',
	Choice => 'PickOne',
	Priority => 50,
	Values => [
		{ Key => 'TopBin', Name => 'Top Output Tray', PS => '<< /OutputType (Top Bin) >> setpagedevice' },
		{ Key => 'LeftOutputTray', Name => 'Left Output Tray', PS => '<< /OutputType (Left Side Bin) >> setpagedevice' },
	],
	Default => 'TopBin',
});

option({
	Key => 'RequiresPageRegion',
	Values => [{ Key => 'All', String => 'True' }],
	Default => undef,
});

# FIXME: Update
constrain(undef, 'InputSlot', 'MediaType', sub {
	my ($is, $mt) = @_;
	return !(($is eq 'Tray2' || $is eq 'Tray3') &&
		 ($mt eq 'Labels' || $mt eq 'Envelope'));
});

constrain(undef, 'Duplex', 'MediaType', sub {
	my ($dp, $mt) = @_;
	return !($dp ne 'None' && $mt =~ /^(Labels|Transparency|Bond)$/);
});

# FIXME: Replace by XRXMismatch
#option({
#	Key => 'HPPaperPolicy',
#	Name => 'Fit to Page',
#	Choice => 'PickOne',
#	Priority => 10,
#	Values => [
#		{ Key => 'PromptUser', Name => 'PromptUser', PS => '', Default => 1 },
#		{ Key => 'NearestSizeAdjust', Name => 'Nearest Size and Scale', PS => '<< /Policies << /DeferredMediaSelection true /PageSize 3 >> >> setpagedevice' },
#		{ Key => 'NearestSizeNoAdjust', Name => 'Nearest Size and Crop', PS => '<< /Policies << /DeferredMediaSelection true /PageSize 5 >> >> setpagedevice' },
#	],
#});

define_ui_group({ Key => 'Quality', Name => 'Print Quality / Color' });

# FIXME: This was HP, replace by OutputMode, but probably need DefaultResolution anyway
option({
	Key => 'Resolution',
	Name => 'Printer Resolution',
	Choice => 'PickOne',
	Priority => 70,
	Section  => 'DocumentSetup',
	Values => [
		{ Key => '1200x1200dpi', Name => 'ProRes 1200', PS => '<< /HWResolution [1200 1200] /PreRenderingEnhance false >> setpagedevice' },
		{ Key => '600x600x2dpi', Name => 'FastRes 1200', PS => '<< /HWResolution [1200 1200] /PreRenderingEnhance true >> setpagedevice', Default => 1 },
		{ Key => '600x600dpi', Name => '600 DPI', PS => '<< /HWResolution [600 600] /PreRenderingEnhance false >> setpagedevice' },
	]
});

option({
	Key => 'OutputMode',
	Name => 'Print Quality',
	Choice => 'PickOne',
	Priority => 71,
	Values => [
		{ Key => 'Automatic', PS => 'true /RRCustomProcs /ProcSet findresource /setautopq get exec', Default => 1 },
		# FIXME: ValuesPerColorComponent etc.
		{ Key => 'Standard', PS => '<< /HWResolution [600 600] >> setpagedevice' },
		{ Key => 'Enhanced', PS => '<< /HWResolution [600 1200] >> setpagedevice' },
		{ Key => 'Photo', PS => '<< /HWResolution [600 600] >> setpagedevice' },
	],
});

# FIXME: XRXColor, XRXGrayLine, XRXLightness, XRXSaturation, XRXContrast
# FIXME: XRXCyanRed, XRXMagentaGreen, XRXYellowBlue, XRXApplyToCMYK
# FIXME: XRXSmoothing, XRXPrintingOptimization

# As reported by the printer
fonts( <<'AMEN' );
AlbertusMT: Standard "(001.001)" Standard ROM
AlbertusMT-Italic: Standard "(001.001)" Standard ROM
AlbertusMT-Light: Standard "(001.001)" Standard ROM
AntiqueOlive-Bold: Standard "(001.002)" Standard ROM
AntiqueOlive-Compact: Standard "(001.002)" Standard ROM
AntiqueOlive-Italic: Standard "(001.002)" Standard ROM
AntiqueOlive-Roman: Standard "(001.002)" Standard ROM
Apple-Chancery: Standard "(001.002)" Standard ROM
Arial-BoldItalicMT: Standard "(001.003)" Standard ROM
Arial-BoldMT: Standard "(001.003)" Standard ROM
Arial-ItalicMT: Standard "(001.003)" Standard ROM
ArialMT: Standard "(001.003)" Standard ROM
ArialNarrowCyrMT: Special "(001.004)" Special ROM
ArialNarrowCyrMT-Bold: Special "(001.004)" Special ROM
AvantGarde-Book: Standard "(003.000)" Standard ROM
AvantGarde-BookOblique: Standard "(003.000)" Standard ROM
AvantGarde-Demi: Standard "(003.000)" Standard ROM
AvantGarde-DemiOblique: Standard "(003.000)" Standard ROM
Bodoni: Standard "(001.003)" Standard ROM
Bodoni-Bold: Standard "(001.003)" Standard ROM
Bodoni-BoldItalic: Standard "(001.003)" Standard ROM
Bodoni-Italic: Standard "(001.003)" Standard ROM
Bodoni-Poster: Standard "(001.003)" Standard ROM
Bodoni-PosterCompressed: Standard "(001.002)" Standard ROM
Bookman-Demi: Standard "(003.000)" Standard ROM
Bookman-DemiItalic: Standard "(003.000)" Standard ROM
Bookman-Light: Standard "(003.000)" Standard ROM
Bookman-LightItalic: Standard "(003.000)" Standard ROM
Carta: Special "(001.001)" Special ROM
Chicago: Standard "(001.000)" Standard ROM
Clarendon: Standard "(001.002)" Standard ROM
Clarendon-Bold: Standard "(001.002)" Standard ROM
Clarendon-Light: Standard "(001.002)" Standard ROM
CooperBlack: Standard "(001.004)" Standard ROM
CooperBlack-Italic: Standard "(001.004)" Standard ROM
Copperplate-ThirtyThreeBC: Standard "(001.003)" Standard ROM
Copperplate-ThirtyTwoBC: Standard "(001.003)" Standard ROM
Coronet-Regular: Standard "(001.002)" Standard ROM
Courier: Standard "(004.000)" Standard ROM
Courier-Bold: Standard "(004.000)" Standard ROM
Courier-BoldOblique: Standard "(004.000)" Standard ROM
Courier-Oblique: Standard "(004.000)" Standard ROM
Eurostile: Standard "(001.003)" Standard ROM
Eurostile-Bold: Standard "(001.002)" Standard ROM
Eurostile-BoldExtendedTwo: Standard "(001.003)" Standard ROM
Eurostile-ExtendedTwo: Standard "(001.003)" Standard ROM
Geneva: Standard "(001.000)" Standard ROM
GillSans: Standard "(001.003)" Standard ROM
GillSans-Bold: Standard "(001.002)" Standard ROM
GillSans-BoldCondensed: Standard "(001.002)" Standard ROM
GillSans-BoldItalic: Standard "(001.003)" Standard ROM
GillSans-Condensed: Standard "(001.002)" Standard ROM
GillSans-ExtraBold: Standard "(001.002)" Standard ROM
GillSans-Italic: Standard "(001.003)" Standard ROM
GillSans-Light: Standard "(001.002)" Standard ROM
GillSans-LightItalic: Standard "(001.003)" Standard ROM
Goudy: Standard "(001.004)" Standard ROM
Goudy-Bold: Standard "(001.003)" Standard ROM
Goudy-BoldItalic: Standard "(001.003)" Standard ROM
Goudy-ExtraBold: Standard "(001.002)" Standard ROM
Goudy-Italic: Standard "(001.003)" Standard ROM
Helvetica: Standard "(003.000)" Standard ROM
Helvetica-Bold: Standard "(003.000)" Standard ROM
Helvetica-BoldOblique: Standard "(003.000)" Standard ROM
Helvetica-Condensed: Standard "(003.000)" Standard ROM
Helvetica-Condensed-Bold: Standard "(003.000)" Standard ROM
Helvetica-Condensed-BoldObl: Standard "(003.000)" Standard ROM
Helvetica-Condensed-Oblique: Standard "(003.000)" Standard ROM
Helvetica-Narrow: Standard "(003.000)" Standard ROM
Helvetica-Narrow-Bold: Standard "(003.000)" Standard ROM
Helvetica-Narrow-BoldOblique: Standard "(003.000)" Standard ROM
Helvetica-Narrow-Oblique: Standard "(003.000)" Standard ROM
Helvetica-Oblique: Standard "(003.000)" Standard ROM
HoeflerText-Black: Standard "(001.000)" Standard ROM
HoeflerText-BlackItalic: Standard "(001.000)" Standard ROM
HoeflerText-Italic: Standard "(001.000)" Standard ROM
HoeflerText-Ornaments: Special "(001.001)" Special ROM
HoeflerText-Regular: Standard "(001.000)" Standard ROM
JoannaMT: Standard "(001.001)" Standard ROM
JoannaMT-Bold: Standard "(001.001)" Standard ROM
JoannaMT-BoldItalic: Standard "(001.001)" Standard ROM
JoannaMT-Italic: Standard "(001.001)" Standard ROM
LetterGothic: Standard "(001.005)" Standard ROM
LetterGothic-Bold: Standard "(001.007)" Standard ROM
LetterGothic-BoldSlanted: Standard "(001.006)" Standard ROM
LetterGothic-Slanted: Standard "(001.005)" Standard ROM
LubalinGraph-Book: Standard "(001.004)" Standard ROM
LubalinGraph-BookOblique: Standard "(001.004)" Standard ROM
LubalinGraph-Demi: Standard "(001.004)" Standard ROM
LubalinGraph-DemiOblique: Standard "(001.004)" Standard ROM
Marigold: Standard "(001.001)" Standard ROM
MonaLisa-Recut: Standard "(001.001)" Standard ROM
Monaco: Standard "(001.001)" Standard ROM
NewCenturySchlbk-Bold: Standard "(003.000)" Standard ROM
NewCenturySchlbk-BoldItalic: Standard "(003.000)" Standard ROM
NewCenturySchlbk-Italic: Standard "(003.000)" Standard ROM
NewCenturySchlbk-Roman: Standard "(003.000)" Standard ROM
NewYork: Standard "(001.000)" Standard ROM
Optima: Standard "(001.006)" Standard ROM
Optima-Bold: Standard "(001.007)" Standard ROM
Optima-BoldItalic: Standard "(001.001)" Standard ROM
Optima-Italic: Standard "(001.001)" Standard ROM
Oxford: Standard "(001.001)" Standard ROM
Palatino-Bold: Standard "(003.000)" Standard ROM
Palatino-BoldItalic: Standard "(003.000)" Standard ROM
Palatino-Italic: Standard "(003.000)" Standard ROM
Palatino-Roman: Standard "(003.000)" Standard ROM
StempelGaramond-Bold: Standard "(001.003)" Standard ROM
StempelGaramond-BoldItalic: Standard "(001.003)" Standard ROM
StempelGaramond-Italic: Standard "(001.003)" Standard ROM
StempelGaramond-Roman: Standard "(001.003)" Standard ROM
Symbol: Special "(001.008)" Special ROM
Tekton: Standard "(001.002)" Standard ROM
Times-Bold: Standard "(003.000)" Standard ROM
Times-BoldItalic: Standard "(003.000)" Standard ROM
Times-Italic: Standard "(003.000)" Standard ROM
Times-Roman: Standard "(003.000)" Standard ROM
TimesNewRomanPS-BoldItalicMT: Standard "(001.003)" Standard ROM
TimesNewRomanPS-BoldMT: Standard "(001.004)" Standard ROM
TimesNewRomanPS-ItalicMT: Standard "(001.003)" Standard ROM
TimesNewRomanPSMT: Standard "(001.003)" Standard ROM
Univers: Standard "(001.004)" Standard ROM
Univers-Bold: Standard "(001.004)" Standard ROM
Univers-BoldExt: Standard "(001.001)" Standard ROM
Univers-BoldExtObl: Standard "(001.001)" Standard ROM
Univers-BoldOblique: Standard "(001.004)" Standard ROM
Univers-Condensed: Standard "(001.003)" Standard ROM
Univers-CondensedBold: Standard "(001.002)" Standard ROM
Univers-CondensedBoldOblique: Standard "(001.002)" Standard ROM
Univers-CondensedOblique: Standard "(001.003)" Standard ROM
Univers-Extended: Standard "(001.001)" Standard ROM
Univers-ExtendedObl: Standard "(001.001)" Standard ROM
Univers-Light: Standard "(001.004)" Standard ROM
Univers-LightOblique: Standard "(001.004)" Standard ROM
Univers-Oblique: Standard "(001.004)" Standard ROM
Wingdings: Special "(001.001)" Special ROM
Wingdings-Regular: Special "(001.001)" Special ROM
ZapfChancery-MediumItalic: Standard "(003.000)" Standard ROM
ZapfDingbats: Special "(002.000)" Special ROM
AMEN

generate();