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