1#  Setup dialog management
2
3package Prima::PS::Printer::Common;
4
5use strict;
6use warnings;
7use File::Path;
8use Prima::PS::Printer;
9use Prima::VB::VBLoader;
10use Prima::MsgBox;
11
12sub sdlg_export
13{
14	my ( $self, $p) = @_;
15	my $d = $self-> {setupDlg}-> TabbedNotebook1-> Notebook;
16	$p-> {color}      = $d-> Color-> index ? 1 : 0;
17	$p-> {portrait}   = $d-> Orientation-> index ? 0 : 1;
18	$p-> {scaling}    = $d-> Scaling-> value / 100;
19	$p-> {resolution} = $d-> Resolution-> value;
20	$p-> {page}       = $d-> PaperSize-> text;
21	return if $self->{is_pdf};
22
23	$p-> {copies}     = $d-> CopyCount-> text;
24	my $i  = $d-> VList-> items;
25	my $z = 0;
26	my %hk = map { $$_[0] => $z++ } @$i;
27	$p-> {devParms}   = { map { my $j = $i-> [ $hk{ $_}]; @$j[0,3] } keys %{$self-> {data}-> {devParms}}};
28	$p-> {isEPS} = $i-> [ $hk{IsEPS}]-> [3];
29	$p-> {spoolerType} = $Prima::PS::Printer::Common::spooler_types[$d-> Spool-> index];
30	$p-> {spoolerData} = $d-> Spool-> bring(( $p-> {spoolerType} eq 'lpr') ? 'LParams' : 'CmdLine')-> text;
31}
32
33sub sdlg_import
34{
35	my ( $self, $p) = @_;
36	my $d = $self-> {setupDlg}-> TabbedNotebook1-> Notebook;
37
38	$d-> Color->       index( $p-> {color} ? 1 : 0);
39	$d-> Orientation-> index( $p-> {portrait} ? 0 : 1);
40	$d-> Scaling->     value( int( $p-> {scaling} * 100));
41	$d-> Resolution->  value( int( $p-> {resolution}));
42	$d-> PaperSize->   text( $p-> {page});
43
44	return if $self->{is_pdf};
45
46	$d-> CopyCount->   value( int( $p-> {copies}));
47
48	my $i  = $d-> VList-> items;
49	my $z = 0;
50	my %hk = map { $$_[0] => $z++ } @$i;
51	for ( keys %{$p-> {devParms}}) {
52		my $j = $i-> [ $hk{$_}];
53		$j-> [3] = $p-> {devParms}-> {$_};
54	}
55
56	$i-> [ $hk{IsEPS}]-> [3] = $p-> {isEPS};
57
58	for ( @$i) {
59		if ( $$_[2] == 0) {
60			$$_[1] = $$_[3];
61		} elsif ( $$_[2] == 1) {
62			$$_[1] = $$_[3] ? 'Yes' : 'No';
63		} elsif ( $$_[2] == 2) {
64			my $i = $d-> ValueBox-> ValueBook-> VCombo-> items;
65			$$_[1] = $i-> [ $$_[3] ];
66		}
67	}
68
69	$p-> {spoolerType} = 'file' if $p-> {spoolerType} eq 'lpr' && !$Prima::PS::Printer::Common::unix;
70	my $sp = $d-> Spool;
71	$i = 0;
72	my %ix = map { $_ => $i++ } @Prima::PS::Printer::Common::spooler_types;
73	$sp-> index( $ix{$p-> {spoolerType}});
74	$sp-> CmdLine-> text( '');
75	$sp-> LParams-> text( '');
76	$sp-> bring( ($p-> {spoolerType} eq 'lpr') ? 'LParams' : 'CmdLine')-> text( $p-> {spoolerData});
77}
78
79
80sub sdlg_exec
81{
82	my ($self, $pdf) = @_;
83
84	unless ( defined $self-> {setupDlg}) {
85		$self-> {setupDlg} = Prima::VBLoad( 'Prima::PS::setup.fm',
86		'Form1'     => { visible => 0, centered => 1, designScale => [ 7, 16 ]},
87		'PaperSize' => { items => [ sort keys %Prima::PS::Printer::Common::pageSizes ], },
88		'OK'        => {
89			onClick => sub {
90				if ($self->{is_pdf}) {
91					$self-> sdlg_export( $self->{data} );
92					return $_[0]->owner->ok;
93				}
94
95				my $t = $_[0]-> owner-> TabbedNotebook1-> Notebook;
96				my $x = $t-> Profiles;
97				my $i = $x-> get_items( $x-> focusedItem);
98				$self-> sdlg_export( $self-> {vprinters}-> { $i});
99				if ( $i ne $self-> {current}) {
100					return if Prima::MsgBox::message_box(
101						$self-> {setupDlg}-> text,
102						"Current settings do not belong to printer \'$self->{current}\'. Procced anyway?",
103						mb::Warning|mb::OKCancel) != mb::OK;
104				}
105				unless ( exists $self-> {vprinters}-> {$self-> {current}}) {
106					Prima::MsgBox::message_box(  $self-> {setupDlg}-> text,
107					"Printer profile \'$self->{current}\' is not present. Please create one",
108					mb::Error|mb::OK);
109					return;
110				}
111			RETRY_SAVE:
112				if ( $self-> {bigChange}) {
113					my $res = Prima::MsgBox::message_box( $self-> {setupDlg}-> text,
114						"The printer profile configurations have been changed significantly. Would you like to save them?",
115						mb::Warning|mb::YesNoCancel);
116					if ( $res == mb::Yes) {
117						$t-> SaveBtn-> notify(q(Click));
118						goto RETRY_SAVE;
119					} elsif ( $res != mb::No) {
120						return;
121					}
122				}
123				$_[0]-> owner-> ok;
124			}
125		},
126		'Profiles' => { onSelectItem => sub {
127				my ( $me, $index, $state) = @_;
128				$index = $$index[0];
129				if ( defined $self-> {lastFocItem}) {
130					$self-> sdlg_export(
131						$self-> {vprinters}-> {
132							$me-> get_items( $self-> {lastFocItem})
133						}
134					);
135				}
136				$self-> sdlg_import(
137					$self-> {vprinters}-> { $me-> get_items( $index)}
138				);
139				$me-> owner-> VList-> notify(q(SelectItem),
140					[ $me-> owner-> VList-> focusedItem], 1
141				);
142				$self-> {lastFocItem} = $index;
143		}},
144		'AddBtn' => { onClick => sub {
145			my $x = $_[0]-> owner-> Profiles;
146			my $n = 1;
147			my $vp = $self-> {vprinters};
148			while ( 1) {
149				last unless exists $vp-> {"New <$n>"};
150				$n++;
151			}
152			$n = "New <$n>";
153			$vp-> {$n} = Prima::PS::Printer::deepcopy( $self-> {defaultData});
154			$x-> add_items( $n);
155			$self-> {bigChange} = 1;
156		}},
157		'DelBtn' => { onClick  => sub {
158			my $x = $_[0]-> owner-> Profiles;
159			my $f = $x-> focusedItem;
160			my $i = $x-> get_items( $f);
161			return if ( $i eq $self-> {current}) && ( Prima::MsgBox::message_box(
162				$self-> {setupDlg}-> text,
163				"This profile is for currently selected printer, and should not be deleted. Proceed anyway?",
164				mb::Warning|mb::OKCancel) != mb::OK);
165			if ( $x-> count == 1) {
166				Prima::message("At least one printer profile should be always present.");
167				return;
168			}
169			$x-> delete_items( $f);
170			delete $self-> {vprinters}-> {$i};
171			$self-> {bigChange} = 1;
172			$self-> {lastFocItem} = undef;
173			$x-> focusedItem( $f ? $f - 1 : 0);
174		}},
175		'RenameBtn' => { onClick => sub {
176			my $x = $_[0]-> owner-> Profiles;
177			my $i = $x-> get_items( $x-> focusedItem);
178		AGAIN:
179			my $n = Prima::MsgBox::input_box(
180				'Rename printer profile',
181				'Enter new name:', $i
182			);
183			return unless defined $n;
184			if (( $n ne $i) && exists ( $self-> {vprinters}-> {$n})) {
185				Prima::message( "Profile \'$n\' already exists");
186				goto AGAIN;
187			}
188			$self-> {vprinters}-> {$n} = $self-> {vprinters}-> {$i};
189			delete $self-> {vprinters}-> {$i};
190			my @i = @{$x-> items};
191			$i[$x-> focusedItem] = $n;
192			$x-> items( \@i);
193			$self-> {bigChange} = 1;
194		}},
195		'SaveBtn' => { onClick => sub {
196			my $n = $self-> {resFile};
197			my $x = $_[0]-> owner-> Profiles;
198			$self-> sdlg_export(
199				$self-> {vprinters}-> { $x-> get_items( $x-> focusedItem)}
200			);
201			unless ( -f $n) {
202				my $x = $n;
203				$x =~ s/[\\\/]?[^\\\/]+$//;
204				unless ( -d $x) {
205					File::Path::mkpath( $x);
206				}
207			}
208		SAVE:
209			unless ( open F, ">", $n) {
210				goto SAVE if Prima::MsgBox::message_box( $self-> {setupDlg}-> text,
211				"Error writing to '$n':$!", mb::Retry|mb::Cancel) == mb::Retry;
212				return;
213			}
214			print F "# Prima toolkit postscript printer configuration file\n{\n";
215			for ( keys %{$self-> {vprinters}}) {
216				my $z = $_;
217				$z =~ s/(\\|\')/\\$1/g;
218				print F "'$z' => {\n";
219				my $p = $self-> {vprinters}-> {$_};
220				for ( keys %$p) {
221					next if $_ eq 'devParms';
222					$z = $$p{$_};
223					$z =~ s/(\\|\')/\\$1/g;
224					print F "$_ => '$z',\n";
225				}
226				print F "devParms => {\n";
227				$p = $p-> {devParms};
228				for ( keys %$p) {
229					$z = $$p{$_};
230					$z =~ s/(\\|\')/\\$1/g;
231					print F "\t$_ => '$z',\n";
232				}
233				print F "}},\n";
234			}
235			print F "}\n";
236			close F;
237			$self-> {printers} = { map { $_ => Prima::PS::Printer::deepcopy($self-> {vprinters}-> {$_}) }
238				keys %{$self-> {vprinters}}};
239			$self-> {bigChange} = 0;
240		}},
241		'ImportBtn' => { onClick => sub {
242			my $c = Prima::MsgBox::input_box( "Import printer resources",
243				"Enter file name:", "/etc/printcap");
244			return unless defined $c;
245			my @imported = $self-> import_printers( 'vprinters', $c);
246			if ( @imported) {
247				if ( defined $imported[0]) {
248					$_[0]-> owner-> Profiles-> add_items( @imported);
249					$self-> {bigChange} = 1;
250				} else {
251					Prima::message( "Error opening '$c':$!");
252				}
253			} else {
254				Prima::message("No importable resources found");
255			}
256		}},
257		);
258		Prima::message("$@"), return unless $self-> {setupDlg};
259		unless ( $self-> {setupDlg}) { Prima::message( $@ ); return }
260		$self-> {setupDlg}-> TabbedNotebook1-> Notebook-> VList-> focusedItem( 0);
261
262		if ( $pdf ) {
263			$self->{setupDlg}->text('PDF Settings');
264			my $n = $self->{setupDlg}->TabbedNotebook1;
265			$n->delete_page($_) for 3,2,1;
266			$n->Notebook->Label2->destroy;
267			$n->Notebook->CopyCount->destroy;
268			$self->{is_pdf} = 1;
269		}
270	}
271
272	my $d = $self-> {setupDlg}-> TabbedNotebook1-> Notebook;
273	my $p = $self-> {data};
274
275	$self-> {bigChange} = 0;
276
277	unless ( $pdf ) {
278		$d-> Profiles-> focusedItem( -1);
279		$d-> Profiles-> items( [ keys %{$self-> {printers}}]);
280		$self-> {vprinters} = { map { $_ => Prima::PS::Printer::deepcopy($self-> {printers}-> {$_}) }
281			keys %{$self-> {printers}}};
282		my $index = 0;
283		for ( keys %{$self-> {printers}}) {
284			last if $_ eq $self-> {current};
285			$index++;
286		}
287		$self-> {lastFocItem} = undef;
288		$d-> Profiles-> focusedItem( $index);
289	}
290
291	$self-> sdlg_import( $p);
292	return if $self-> {setupDlg}-> execute != mb::OK;
293	$p = {};
294	$self-> sdlg_export( $p);
295	$self-> data( $p);
296}
297
2981;
299