summaryrefslogtreecommitdiff
path: root/systems/texlive/tlnet/tlpkg/installer/install-menu-perltk.pl
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /systems/texlive/tlnet/tlpkg/installer/install-menu-perltk.pl
Initial commit
Diffstat (limited to 'systems/texlive/tlnet/tlpkg/installer/install-menu-perltk.pl')
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/install-menu-perltk.pl1291
1 files changed, 1291 insertions, 0 deletions
diff --git a/systems/texlive/tlnet/tlpkg/installer/install-menu-perltk.pl b/systems/texlive/tlnet/tlpkg/installer/install-menu-perltk.pl
new file mode 100644
index 0000000000..06c2829b47
--- /dev/null
+++ b/systems/texlive/tlnet/tlpkg/installer/install-menu-perltk.pl
@@ -0,0 +1,1291 @@
+#!/usr/bin/env perl
+# $Id: install-menu-perltk.pl 48774 2018-09-27 15:05:00Z preining $
+#
+# Copyright 2008-2014 Norbert Preining
+# Copyright 2008 Reinhard Kotucha
+# This file is licensed under the GNU General Public License version 2
+# or any later version.
+
+use strict;
+$^W = 1;
+
+my $svnrev = '$Revision: 48774 $';
+$svnrev =~ m/: ([0-9]+) /;
+$::menurevision = ($1 ? $1 : 'unknown');
+
+require Tk;
+require Tk::Dialog;
+require Tk::DialogBox;
+require Tk::PNG;
+require Tk::BrowseEntry;
+
+use utf8;
+no utf8;
+
+our %vars;
+our $opt_in_place;
+our $tlpdb;
+our @collections_std;
+our $texlive_release;
+our @media_available;
+our $media;
+
+our $MENU_INSTALL = 0;
+our $MENU_ABORT = 1;
+our $MENU_QUIT = 2;
+our $MENU_ALREADYDONE = 3;
+
+my $return = $MENU_INSTALL;
+
+our $LANG;
+our %TRANS;
+require("TeXLive/trans.pl");
+load_translations();
+
+require("$::installerdir/tlpkg/installer/texdirsel.pl");
+
+# @fileassocdesc also defined in install-tl
+$::fileassocdesc[0] = __("None");
+$::fileassocdesc[1] = __("Only new");
+$::fileassocdesc[2] = __("All");
+
+$::letterdesc[0] = __('A4');
+$::letterdesc[1] = __('letter');
+
+$::deskintdesc[0] = __("No shortcuts");
+$::deskintdesc[1] = __("TeX Live menu");
+if (win32() && is_seven()) { $::deskintdesc[2] = __("Launcher entry"); }
+
+# generic option strings:
+$::yesno[0] = __('No');
+$::yesno[1] = __('Yes');
+
+our $mw;
+my $subframe;
+my $mainwindow;
+my $bin_toggle_button;
+my $scheme_toggle_button;
+my $collection_toggle_button;
+my $portable_toggle_button;
+my $texdir_toggle_button;
+my $paper_toggle_button;
+my $write_eighteen_toggle_button;
+my $format_toggle_button;
+my $doc_files_toggle_button;
+my $src_files_toggle_button;
+my $texworks_toggle_button;
+my $load_remote_button;
+my $adjustrepo_toggle_button;
+my $bintextbutton;
+my $schemebutton;
+my $tmflocalbutton;
+my $tmfsysvarbutton;
+my $tmfsysconfigbutton;
+my $tmfhomebutton;
+my $pathbutton;
+my $deskintbutton;
+my $assocbutton;
+my $adminbutton;
+my $installbutton;
+my $collectionstext;
+my $texmflocaltext;
+my $texmfsysvartext;
+my $texmfsysconfigtext;
+my $texmfhometext;
+my $texdirtext;
+my $optletterstate;
+my $optfmtstate;
+my $optsrcstate;
+my $optdocstate;
+my $portableyesno;
+my $letteryesno;
+my $fmtyesno;
+my $srcyesno;
+my $deskintyesno;
+my $pathadjyesno;
+my $fileassocyesno;
+my $editoryesno;
+my $adminallyesno;
+my $docyesno;
+my $restrictedyesno;
+my $adjustrepoyesno;
+
+my $sep = ($^O =~ /^MSWin32/) ? "\\" : "/";
+
+$::run_menu = \&run_menu_perltk;
+
+
+####################################################################
+# From here on only function definitions
+# ##################################################################
+
+sub setup_perltk_local_strings {
+ $portableyesno = $::yesno[$vars{'instopt_portable'}];
+ $letteryesno = $::letterdesc[$vars{'instopt_letter'}];
+ $fmtyesno = $::yesno[$vars{'tlpdbopt_create_formats'}];
+ $srcyesno = $::yesno[$vars{'tlpdbopt_install_srcfiles'}];
+ $deskintyesno = $::deskintdesc[$vars{'tlpdbopt_desktop_integration'}];
+ $pathadjyesno = $::yesno[$vars{'instopt_adjustpath'}];
+ $fileassocyesno = $::fileassocdesc[$vars{'tlpdbopt_file_assocs'}];
+ $editoryesno = $::yesno[$vars{'collection-texworks'}];
+ $adminallyesno = $::yesno[$vars{'tlpdbopt_w32_multi_user'}];
+ $docyesno = $::yesno[$vars{'tlpdbopt_install_docfiles'}];
+ $restrictedyesno = $::yesno[$vars{'instopt_write18_restricted'}];
+ $adjustrepoyesno = $::yesno[$vars{'instopt_adjustrepo'}];
+}
+
+sub menu_abort {
+ $return = $MENU_ABORT;
+ $mainwindow->destroy;
+}
+
+sub menu_do_it {
+ $return = $MENU_INSTALL;
+ $mainwindow->destroy;
+}
+
+sub disable_buttons {
+ change_button_state('disabled');
+}
+sub enable_buttons {
+ change_button_state('normal');
+}
+
+sub change_button_state {
+ my $what = shift;
+ $installbutton->configure(-state => $what);
+ $tmflocalbutton->configure(-state => $what);
+ $tmfsysvarbutton->configure(-state => $what);
+ $tmfsysconfigbutton->configure(-state => $what);
+ $tmfhomebutton->configure(-state => $what);
+ $bin_toggle_button->configure(-state => $what);
+ $scheme_toggle_button->configure(-state => $what);
+ $collection_toggle_button->configure(-state => $what);
+ $portable_toggle_button->configure(-state => $what);
+ $texdir_toggle_button->configure(-state => $what);
+ $paper_toggle_button->configure(-state => $what);
+ $write_eighteen_toggle_button->configure(-state => $what);
+ $format_toggle_button->configure(-state => $what);
+ $adjustrepo_toggle_button->configure(-state => $what);
+ $pathbutton->configure(-state => $what);
+ $doc_files_toggle_button->configure(-state => $what)
+ if defined($doc_files_toggle_button);
+ $src_files_toggle_button->configure(-state => $what)
+ if defined($src_files_toggle_button);
+ $texworks_toggle_button->configure(-state => $what)
+ if defined($texworks_toggle_button);
+}
+
+sub run_menu_perltk {
+ if ($::opt_select_repository) {
+ } else {
+ do_remote_init();
+ setup_perltk_local_strings();
+ calc_depends();
+ }
+ $mainwindow = Tk::MainWindow->new;
+ $mainwindow->protocol('WM_DELETE_WINDOW' => \&menu_abort);
+
+ # Taco once reported for 2010 that using these scrolled pane
+ # on Windows just died
+ # with the proliferation of netbooks and a new perl installed
+ # let us try to go back to using scrolled pane on both unix and windows
+ require Tk::Pane;
+ $subframe = $mainwindow->Scrolled("Frame", -scrollbars => "oe");
+ $mw = $subframe->Frame;
+
+ # image frame on the left
+ my $fl = $mw->Frame(-background => "#0078b8");
+ my $img = $fl->Photo(-format => 'png',
+ -file => "$::installerdir/tlpkg/installer/texlive.png");
+ $fl->Label(-image => $img, -background => "#0078b8")
+ ->pack(-expand => 1, -fill => "y");
+ $fl->Label(
+ -text => "v$::installerrevision/$::menurevision",
+ -background => "#0078b8")->pack;
+
+ # data frame on the right
+ my $fr = $mw->Frame;
+ $fl->pack(-side => 'left', -expand => 1, -fill => "y");
+ $fr->pack(-side => 'right');
+
+
+ my $row = 1;
+ $fr->Label(
+ -text => __("TeX Live %s Installation", $TeXLive::TLConfig::ReleaseYear))
+ ->grid(-row => $row, -column => 1, -columnspan => 3);
+
+ if ($::opt_select_repository) {
+ $row++;
+ my @mirror_list;
+ my @netlst;
+ my @loclst;
+ if ($#media_available >= 0) {
+ for my $l (@media_available) {
+ my ($a, $b) = split ('#', $l);
+ if ($a eq 'local_compressed' || $a eq 'local_uncompressed') {
+ push @loclst, " $b";
+ } elsif ($a eq 'NET') {
+ push @netlst, " " . __("Command line repository") . ": $b";
+ } else {
+ tlwarn("Unknown media $l\n");
+ }
+ }
+ if ($#loclst >= 0) {
+ push @mirror_list, __("LOCAL REPOSITORIES");
+ push @mirror_list, @loclst;
+ }
+ }
+ push @mirror_list, __("NETWORK REPOSITORIES");
+ push @mirror_list,
+ " " . __("Default remote repository") . ": http://mirror.ctan.org";
+ push @mirror_list, @netlst;
+ push @mirror_list, TeXLive::TLUtils::create_mirror_list();
+ my $mirror_entry;
+ $fr->Label(
+ -text => __('Select repository'),
+ -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->BrowseEntry(
+ -state => 'readonly',
+ -listheight => 12,
+ -listwidth => 400,
+ -width => 35,
+ -autolistwidth => 1,
+ -choices => \@mirror_list,
+ -browsecmd =>
+ sub {
+ if ($mirror_entry !~ m/^ /) {
+ $mirror_entry = "";
+ } elsif ($mirror_entry =~ m!(http|ftp)://!) {
+ $mirror_entry =
+ TeXLive::TLUtils::extract_mirror_entry($mirror_entry);
+ } else {
+ $mirror_entry =~ s/^\s*//;
+ # $mirror_entry =
+ # TeXLive::TLUtils::extract_mirror_entry($mirror_entry);
+ }
+ },
+ -variable => \$mirror_entry)
+ ->grid(-row => $row, -column => 2, -sticky => 'w');
+ $load_remote_button = $fr->Button(-text => __("Load"),
+ -command => sub {
+ $::init_remote_needed = 1;
+ my $mfull = $mirror_entry;
+ only_load_remote($mfull);
+ if (!only_load_remote($mfull)) {
+ $fr->Dialog(-title => __("Warning"),
+ -text => __('Could not load remote TeX Live Database:') . $mfull
+ . "\n\n" .
+ __('Please select a different mirror.'),
+ -buttons => [ __("Ok") ])->Show;
+ $mirror_entry = "";
+ } elsif (!do_version_agree()) {
+ $fr->Dialog(
+ -title => __("Warning"),
+ -text => __(
+ 'The TeX Live versions of the local installation and the repository being accessed are not compatible:
+ local: %s
+ repository: %s
+Please select a different mirror.',
+ $TeXLive::TLConfig::ReleaseYear, $texlive_release),
+ -buttons => [ __("Ok") ])->Show;
+ $mirror_entry = "";
+ } else {
+ $load_remote_button->configure(-state => 'disable');
+ final_remote_init($mfull);
+ setup_perltk_local_strings();
+ calc_depends();
+ menu_update_texts();
+ enable_buttons();
+ }
+ })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+ }
+ if (!$opt_in_place) {
+
+ $row++;
+ $fr->Label(-text => "------- " . __("Basic Information") . " -------")
+ ->grid(-row => $row, -column => 1, -columnspan => 3);
+
+ # binary system line
+ if (!win32()) {
+ $row++;
+ $fr->Label(-text => __('Binary system(s)'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $bintextbutton = $fr->Label(-anchor => 'w');
+ $bintextbutton->grid(-row => $row, -column => 2, -padx => "2m");
+ $bin_toggle_button = $fr->Button(
+ -text => __("Change"), -command => sub { menu_select_binsystems(); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+ }
+
+ $row++;
+
+ # scheme line
+ $fr->Label(-text => __('Selected scheme'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $schemebutton = $fr->Label(-anchor => 'w');
+ $schemebutton->grid(-row => $row, -column => 2, -padx => "2m");
+ $scheme_toggle_button = $fr->Button(
+ -text => __("Change"), -command => sub { menu_select_scheme(); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ $row++;
+
+ # further customization
+ $fr->Label(-text => "------- " . __("Further Customization") . " -------")
+ ->grid(-row => $row, -column => 1,-columnspan => 3);
+
+ $row++;
+ # collection line
+ $fr->Label(-text => __('Installation collections'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $collection_toggle_button = $fr->Button(
+ -text => __("Change"),
+ -command => sub { menu_select_standard_collections(); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ $row++;
+ $collectionstext = $fr->Label();
+ $collectionstext->grid(-row => $row, -column => 1, -columnspan => 3);
+ }
+
+ $row++;
+ # further customization
+ $fr->Label(-text => "------- " . __("Directory setup") . " -------")
+ ->grid(-row => $row, -column => 1, -columnspan => 3);
+
+ $row++;
+ $fr->Label(-text => __('Portable setup'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$portableyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $portable_toggle_button = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub { toggle_portable(); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ $row++;
+ # texdir line
+ $fr->Label(-text => __('TEXDIR (the main TeX directory)'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $texdirtext = $fr->Label(-anchor => 'w')
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ if (!$opt_in_place) {
+ $texdir_toggle_button = $fr->Button(
+ -text => __("Change"), -command => \&change_path)
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+ }
+
+
+ $row++;
+ # texmflocal line
+ $fr->Label(
+ -text => __('TEXMFLOCAL (directory for site-wide local files)'),
+ -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $texmflocaltext = $fr->Label(-anchor => 'w')
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $tmflocalbutton = $fr->Button(
+ -text => __("Change"),
+ -command => sub { menu_edit_vars_value("TEXMFLOCAL"); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ $row++;
+ # texmfsysvar line
+ $fr->Label(
+ -text => __('TEXMFSYSVAR (directory for autogenerated data)'),
+ -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $texmfsysvartext = $fr->Label(-anchor => 'w')
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $tmfsysvarbutton = $fr->Button(
+ -text => __("Change"),
+ -command => sub { menu_edit_vars_value("TEXMFSYSVAR"); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ $row++;
+ # texmfsysconfig line
+ $fr->Label(
+ -text => __('TEXMFSYSCONFIG (directory for local config)'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $texmfsysconfigtext = $fr->Label(-anchor => 'w')
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $tmfsysconfigbutton = $fr->Button(
+ -text => __("Change"),
+ -command => sub { menu_edit_vars_value("TEXMFSYSCONFIG"); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ $row++;
+ # texmfhome line
+ $fr->Label(
+ -text => __('TEXMFHOME (directory for user-specific files)'),
+ -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $texmfhometext = $fr->Label(-anchor => 'w')
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $tmfhomebutton = $fr->Button(
+ -text => __("Change"),
+ -command => sub { menu_edit_vars_value("TEXMFHOME"); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ if ($vars{'instopt_portable'}) {
+ for my $b (
+ $tmflocalbutton, $tmfsysvarbutton, $tmfsysconfigbutton, $tmfhomebutton) {
+ $b->configure(-state => 'disabled')
+ }
+ }
+
+ $row++;
+ # Options
+ $fr->Label(-text => "------- " . __("Options") . " -------")
+ ->grid(-row => $row, -column => 1, -columnspan => 3);
+
+ $row++;
+ # optpaper
+ $fr->Label(-text => __('Default paper size'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$letteryesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $paper_toggle_button = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub {
+ toggle_and_set_opt_variable(
+ \$vars{'instopt_letter'}, \$letteryesno, \@::letterdesc); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ $row++;
+ $fr->Label(
+ -text => __('Allow execution of restricted list of programs via \write18'),
+ -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$restrictedyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $write_eighteen_toggle_button = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub {
+ toggle_and_set_opt_variable(
+ \$vars{'instopt_write18_restricted'},
+ \$restrictedyesno); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ $row++;
+ $fr->Label(
+ -text => __('Create all format files'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$fmtyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $format_toggle_button = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub {
+ toggle_and_set_opt_variable(\$vars{'tlpdbopt_create_formats'}, \$fmtyesno); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ if ($vars{'doc_splitting_supported'} and !$opt_in_place) {
+ $row++;
+ $fr->Label(-text => __('Install font/macro doc tree'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$docyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $doc_files_toggle_button = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub {
+ toggle_and_set_opt_variable(\$vars{'tlpdbopt_install_docfiles'}, \$docyesno); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+ }
+
+ if ($vars{'src_splitting_supported'} and !$opt_in_place) {
+ $row++;
+ $fr->Label(-text => __('Install font/macro source tree'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$srcyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $src_files_toggle_button = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub {
+ toggle_and_set_opt_variable(\$vars{'tlpdbopt_install_srcfiles'}, \$srcyesno); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+ }
+
+ $row++;
+ $fr->Label(
+ -text => (win32()) ? __('Adjust PATH setting in registry') :
+ __('Create symlinks in system directories'),
+ -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$pathadjyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ if (unix()) {
+ $pathbutton = $fr->Button(
+ -text => __("Change"), -command => sub { menu_select_symlink(); });
+ } else {
+ $pathbutton = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub {
+ toggle_and_set_opt_variable(\$vars{'instopt_adjustpath'}, \$pathadjyesno); });
+ }
+ $pathbutton->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ if ($::opt_all_options || win32()) {
+ $row++;
+ $fr->Label(-text => __('Add menu shortcuts'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$deskintyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $deskintbutton = $fr->Button(
+ -text => __("Change"),
+ -command => sub {
+ toggle_and_set_opt_variable(
+ \$vars{'tlpdbopt_desktop_integration'},
+ \$deskintyesno, \@::deskintdesc); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ $row++;
+ $fr->Label(-text => __('Change file associations'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$fileassocyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $assocbutton = $fr->Button(
+ -text => __("Change"),
+ -command => sub {
+ toggle_and_set_opt_variable(
+ \$vars{'tlpdbopt_file_assocs'}, \$fileassocyesno, \@::fileassocdesc); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+
+ if ($::opt_all_options || admin()) {
+ $row++;
+ $fr->Label(-text => __('Installation for all users'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$adminallyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $adminbutton = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub {
+ toggle_and_set_opt_variable(
+ \$vars{'tlpdbopt_w32_multi_user'}, \$adminallyesno); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+ }
+
+ $row++;
+ $fr->Label(-text => __('Install TeXworks front end'), -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$editoryesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ if (!$opt_in_place) {
+ $texworks_toggle_button = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub {
+ toggle_and_set_opt_variable(
+ \$vars{'collection-texworks'}, \$editoryesno); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+ }
+ }
+ if ($media ne 'NET') {
+ $row++;
+ $fr->Label(
+ -text => __('After install, set CTAN as source for package updates'),
+ -anchor => 'w')
+ ->grid(-row => $row, -column => 1, -sticky => 'w');
+ $fr->Label(-anchor => 'w', -textvariable => \$adjustrepoyesno)
+ ->grid(-row => $row, -column => 2, -padx => "2m");
+ $adjustrepo_toggle_button = $fr->Button(
+ -text => __("Toggle"),
+ -command => sub {
+ toggle_and_set_opt_variable(
+ \$vars{'instopt_adjustrepo'}, \$adjustrepoyesno); })
+ ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+ }
+
+ if ($vars{'instopt_portable'}) {
+ for $b ($pathbutton, $deskintbutton, $assocbutton, $adminbutton) {
+ $b->configure(-state => 'disabled') if $b;
+ }
+ }
+
+ # install/cancel buttons
+ my $f3 = $fr->Frame;
+ $f3->Button(
+ -text => __("About"),
+ -command => sub {
+ my $sw = $mw->DialogBox(-title => __("About"),
+ -buttons => [ __("Ok") ]);
+ $sw->add("Label", -text => "
+TeX Live $TeXLive::TLConfig::ReleaseYear
+Please see http://www.tug.org/texlive
+GUI installer
+Copyright 2009-$TeXLive::TLConfig::ReleaseYear The TeX Live Team
+Licensed under the GNU General Public License version 2 or higher
+
+In case of problems, please contact: texlive\@tug.org"
+ )->pack(-ipadx => "2m", -ipady => "2m");
+ $sw->Show;
+ })->pack(-side => 'left', -padx => "2m", -pady => "2m");
+
+
+
+ $installbutton = $f3->Button(
+ -text => __("Install TeX Live"),
+ -command => \&menu_do_it
+ )->pack(-side => 'left', -padx => "2m", -pady => "2m")->focus();
+ my $quitbutton = $f3->Button(
+ -text => __("Quit"),
+ -command => \&menu_abort
+ )->pack(-side => 'right', -padx => "2m", -pady => "2m");
+ $mw->bind('<Escape>', [ $quitbutton, 'Invoke' ]);
+ #my $wizardbutton = $f3->Button(
+ # -text => __("Wizard"),
+ # -command => sub {
+ # $mainwindow->destroy;
+ # require("installer/install-menu-wizard.pl");
+ # setup_hooks_wizard();
+ # $return = run_menu_wizard();
+ # })->pack(-side => 'right', -padx => "2m", -pady => "2m");
+ $row++;
+ $f3->grid(-row => $row, -column => 1, -columnspan => 3);
+ if (!$::opt_select_repository) {
+ menu_update_texts();
+ } else {
+ disable_buttons();
+ }
+ $fr->gridColumnconfigure(2, -minsize => 300);
+ $mw->pack(-expand => 1, -fill => "both");
+ $mw->update;
+ my $rh = $mw->reqheight;
+ my $rw = $mw->reqwidth;
+ my $maxheight = $mainwindow->screenheight() - 20;
+ debug(
+ "Requested height: $rh, requested width: $rw, max height: $maxheight\n");
+ if ($rh > $maxheight) {
+ $rh = $maxheight;
+ $rw += 20; # for the scrollbar = =
+ }
+ $subframe->configure(-height => $rh, -width=>$rw);
+ $subframe->pack(-expand => 1, -fill => "both");
+ $mainwindow->configure(-height => $rh, -width=>$rw);
+ $mainwindow->geometry("=${rw}x${rh}");
+ #$mw->pack(-expand => 1, -fill => "both");
+
+ if (win32() && pre_warn($mainwindow)) { return $MENU_ABORT; }
+
+ Tk::MainLoop();
+ return($return);
+}
+
+sub pre_warn {
+ my $parent = shift;
+ require TeXLive::TLWinGoo;
+ my ($b_quit, $b_cont) = (__('Quit'), __('Continue'));
+ my $wrn = __(
+ 'In case of trouble, try disabling your virus scanner during installation.');
+ if (!admin()) {
+ $wrn .= "\n\n".
+ __("The installer does not have adminstrative permissions;\nso can only install for current user.");
+ if (is_vista()) {
+ $wrn .= "\n\n".
+ __("Right-click install-tl-advanced and select \"run as administrator\"\n if you want to install for all users.");
+ }
+ }
+ my $ans = $parent->Dialog(
+ -title => __("TeX Live %s Installation", $TeXLive::TLConfig::ReleaseYear),
+ -text => $wrn,
+ -default_button => $b_cont,
+ -buttons => [$b_quit, $b_cont])->Show();
+ return $ans eq $b_quit;
+}
+
+# this sub will not be called if $opt_in_place
+sub menu_edit_texdir {
+ my $key = shift;
+ our $addyear = 1;
+ our $addtexlive = 1;
+ my $val = $vars{$key};
+ our $currsel;
+ our $entry;
+ sub update_label {
+ my $t = $currsel;
+ $t .= "/texlive" if ($addtexlive);
+ $t .= "/$texlive_release" if ($addyear);
+ $entry->configure(-text => "$t");
+ }
+ my $hint_var;
+ if ($key ne 'TEXMFHOME') {
+ $hint_var = win32() ? $ENV{'USERPROFILE'} : $ENV{'HOME'};
+ } else {
+ $hint_var = win32() ? '%USERPROFILE%' : '$HOME';
+ }
+ if ($val =~ m!^(.*)/texlive/$texlive_release$!) {
+ $currsel = "$1";
+ $addyear = 1;
+ $addtexlive = 1;
+ } elsif ($val =~ m!^(.*)/$texlive_release$!) {
+ $currsel = "$1";
+ $addyear = 1;
+ $addtexlive = 0;
+ } elsif ($val =~ m!^(.*)/texlive$!) {
+ $currsel = "$1";
+ $addyear = 0;
+ $addtexlive = 1;
+ } else {
+ $addyear = 0;
+ $addtexlive = 0;
+ $currsel = $val;
+ }
+ my $sw = $mainwindow->Toplevel(-title => __("Change variable value"));
+ $sw->transient($mainwindow);
+ $sw->grab();
+ $sw->Label(-text => __("Enter path for %s (use ~ for %s)", $key, $hint_var))
+ ->pack(-padx => "2m", -pady => "2m");
+ $entry = $sw->Entry(-width => 60)->pack(-padx => "2m", -pady => "2m");
+ my $f = $sw->Frame;
+ my $c1 = $f->Checkbutton(
+ -text => 'Add "texlive"',
+ -variable => \$addtexlive,
+ -command => \&update_label);
+ my $c2 = $f->Checkbutton(
+ -text => "Add \"$texlive_release\"", -variable => \$addyear,
+ -command => \&update_label);
+ my $foo = $sw->Scrolled(
+ "DirTree", -scrollbars => "osoe",
+ -browsecmd => sub { my ($d) = @_; $currsel = $d; update_label(); },
+ -directory => "$currsel");
+ my $ff = $sw->Frame;
+ my $ok = $ff->Button(
+ -text => __("Ok"),
+ -command => sub {
+ $val = $entry->get;
+ callback_edit_directories($key,$val);
+ $sw->destroy; });
+ my $cancel = $ff->Button(
+ -text => __("Cancel"),
+ -command => sub { $sw->destroy; });
+ update_label();
+ $c1->pack(-side => "left", -padx => "2m", -pady => "2m");
+ $c2->pack(-side => "right", -padx => "2m", -pady => "2m");
+ $f->pack;
+ $foo->pack(-fill => "both", -expand => 1);
+ $ok->pack(-side => 'left' , -padx => "2m", -pady => "2m");
+ $cancel->pack(-side => 'right', -padx => "2m", -pady => "2m");
+ $ff->pack;
+ # bindings
+ $sw->bind('<Return>' => [ $ok, 'Invoke']);
+ $sw->bind('<Escape>' => [ $cancel, 'Invoke']);
+}
+
+sub menu_edit_vars_value {
+ my $key = shift;
+ my $sw = $mainwindow->Toplevel(-title => __("Change variable value"));
+ $sw->transient($mainwindow);
+ $sw->grab();
+ my $val = $vars{$key};
+ my $hint_var;
+ if ($key ne 'TEXMFHOME') {
+ $hint_var = win32() ? $ENV{'USERPROFILE'} : $ENV{'HOME'};
+ } else {
+ $hint_var = win32() ? '%USERPROFILE%' : '$HOME';
+ }
+ $sw->Label(-text => __("Enter path for %s (use ~ for %s)", $key, $hint_var))
+ ->pack(-padx => "2m", -pady => "2m");
+ my $entry = $sw->Entry(-text => native_slashify($val), -width => 60);
+ $entry->pack(-padx => "2m", -pady => "2m")->focus();
+ my $f = $sw->Frame;
+ my $okbutton = $f->Button(
+ -text => __("Ok"),
+ -command => sub {
+ $val = forward_slashify($entry->get);
+ callback_edit_directories($key,$val) ;
+ $sw->destroy })
+ ->pack(-side => 'left', -padx => "2m", -pady => "2m");
+ my $cancelbutton = $f->Button(
+ -text => __("Cancel"),
+ -command => sub { $sw->destroy })
+ ->pack(-side => 'right', -padx => "2m", -pady => "2m");
+ $f->pack(-expand => 'x');
+ # bindings
+ $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
+ $sw->bind('<Escape>' => [ $cancelbutton, 'Invoke']);
+}
+
+
+sub menu_select_scheme {
+ my $sw = $mainwindow->Toplevel(-title => __('Selected scheme'));
+ $sw->transient($mainwindow);
+ $sw->grab();
+ my @schemes;
+ foreach my $pkg ($tlpdb->list_packages) {
+ my $tlpobj = $tlpdb->{'tlps'}{$pkg};
+ if ($tlpobj->category eq "Scheme") {
+ push @schemes, $pkg;
+ $vars{"$pkg"}=($vars{'selected_scheme'} eq $pkg)? 1:0;
+ }
+ }
+ my @scheme_order = schemes_ordered_for_presentation();
+ push @scheme_order, "scheme-custom";
+ my $selected = $vars{'selected_scheme'};
+ $sw->Label(-text => __("Selected scheme"))
+ ->pack(-padx => "2m", -pady => "2m");
+ my $f2 = $sw->Frame;
+ foreach my $scheme (@scheme_order) {
+ my $desc;
+ if ($scheme ne "scheme-custom") {
+ my $tlpobj = $tlpdb->get_package("$scheme");
+ $desc = $tlpobj->shortdesc;
+ } else {
+ $desc = __("custom selection of collections");
+ }
+ my $b;
+ $b = $f2->Radiobutton(
+ -variable => \$selected, -value => $scheme,
+ -text => __($desc),
+ -justify => 'left', -wraplength => 500)
+ ->pack(-anchor => 'w', -pady => "1m");
+ if ($selected eq $scheme) {
+ $b->focus();
+ }
+ }
+ $f2->pack;
+ my $f3 = $sw->Frame;
+ my $okbutton = $f3->Button(
+ -text => __("Ok"),
+ -command => sub { callback_select_scheme($selected) ; $sw->destroy })
+ ->pack(-side => 'left', -padx => "2m", -pady => "2m");
+ my $cancelbutton = $f3->Button(
+ -text => __("Cancel"), -command => sub { $sw->destroy })
+ ->pack(-side => 'left', -padx => "2m", -pady => "2m");
+ $f3->pack(-expand => 'x');
+ $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
+ $sw->bind('<Escape>' => [ $cancelbutton, 'Invoke']);
+}
+
+sub menu_select_standard_collections {
+ my $sw = $mainwindow->Toplevel(-title => __('Installation collections'));
+ $sw->transient($mainwindow);
+ $sw->grab();
+ my $fb = $sw->Frame;
+ my $fc = $sw->Frame;
+ my $fd = $sw->Frame;
+ my $f1 = $fb->Frame;
+ my $f2 = $fb->Frame;
+ my $f3 = $fb->Frame;
+ my %lvars = %vars;
+ $sw->Label(-text => __("Select the collections to be installed"))
+ ->pack(-padx => "2m", -pady => "2m");
+ my $onethirdcol = $#collections_std / 3;
+ my $twothirdcol = 2 * $onethirdcol;
+ my $i = 0;
+ foreach my $coll (sort @collections_std) {
+ my $tlpobj = $tlpdb->get_package("$coll");
+ if ($i < $onethirdcol) {
+ $f1->Checkbutton(
+ -variable => \$lvars{$coll}, -text => __($tlpobj->shortdesc))
+ ->pack(-anchor => 'w');
+ } elsif ($i < $twothirdcol) {
+ $f2->Checkbutton(
+ -variable => \$lvars{$coll}, -text => __($tlpobj->shortdesc))
+ ->pack(-anchor => 'w');
+ } else {
+ $f3->Checkbutton(
+ -variable => \$lvars{$coll}, -text => __($tlpobj->shortdesc))
+ ->pack(-anchor => 'w');
+ }
+ $i++;
+ }
+ $f1->pack(-side => 'left', -padx => "2m", -pady => "2m");
+ $f2->pack(-side => 'left', -padx => "2m", -pady => "2m");
+ $f3->pack(-side => 'left', -padx => "2m", -pady => "2m");
+ $fb->pack(-padx => "2m", -pady => "2m");
+ $fc->pack(-side => 'left', -expand => 'x', -padx => "2m", -pady => "2m");
+ $fc->Button(
+ -text => __("Select All"),
+ -command => sub { select_collections(\%lvars, @collections_std) })
+ ->pack(-side => 'left', -padx => "2m", -pady => "2m")->focus();
+ $fc->Button(
+ -text => __("Deselect All"),
+ -command => sub { deselect_collections(\%lvars, @collections_std) })
+ ->pack(-side => 'right', -padx => "2m", -pady => "2m");
+ $fd->pack(-side => 'left', -expand => 'x', -padx => "2m", -pady => "2m");
+ my $okbutton = $fd->Button(-text => __("Ok"),
+ -command => sub {
+ # we call the update only if something has changed
+ my $changed = 0;
+ for my $k (keys %lvars) {
+ if ($vars{$k} ne $lvars{$k}) {
+ $changed = 1;
+ last;
+ }
+ }
+ if ($changed) {
+ %vars = %lvars;
+ callback_select_collection();
+ }
+ $sw->destroy;
+ })->pack(-side => 'left', -padx => "2m", -pady => "2m");
+ my $cancelbutton = $fd->Button(
+ -text => __("Cancel"), -command => sub { $sw->destroy })
+ ->pack(-side => 'right', -padx => "2m", -pady => "2m");
+ $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
+ $sw->bind('<Escape>' => [ $cancelbutton, 'Invoke']);
+}
+
+sub menu_select_symlink {
+ our ($lbin,$lman,$linfo);
+ our $osym = $vars{'instopt_adjustpath'};
+ our ($binlab,$binb,$manlab,$manb,$infolab,$infob);
+ sub set_unset_buttons {
+ $lbin = ($osym ? $vars{'tlpdbopt_sys_bin'} : '');
+ $linfo = ($osym ? $vars{'tlpdbopt_sys_info'} : '');
+ $lman = ($osym ? $vars{'tlpdbopt_sys_man'} : '');
+ if ($osym) {
+ $binb->configure (-state => 'normal');
+ $manb->configure (-state => 'normal');
+ $infob->configure(-state => 'normal');
+ } else {
+ $infob->configure(-state => 'disabled');
+ $manb->configure (-state => 'disabled');
+ $binb->configure (-state => 'disabled');
+ }
+ }
+ sub return_callback {
+ if ($osym) {
+ my $home = getenv('HOME');
+ $home = getenv('USERPROFILE') if (win32());
+ $home ||= '~';
+ $lbin =~ s/^~/$home/;
+ $linfo =~ s/^~/$home/;
+ $lman =~ s/^~/$home/;
+ $vars{'tlpdbopt_sys_bin'} = $lbin;
+ $vars{'tlpdbopt_sys_info'} = $linfo;
+ $vars{'tlpdbopt_sys_man'} = $lman;
+ }
+ toggle_and_set_opt_variable(\$vars{'instopt_adjustpath'}, \$osym);
+ $pathadjyesno = $osym;
+ }
+ my $sw = $mainwindow->Toplevel(
+ -title => __('Create symlinks in system directories'));
+ $sw->transient($mainwindow);
+ $sw->grab();
+ $sw->Checkbutton(
+ -variable => \$osym,
+ -text => __("create symlinks in standard directories"),
+ -command => sub { set_unset_buttons(); } )
+ ->grid(-column => 1, -row => 1, -columnspan => 2, -padx => "2m");
+ $binlab = $sw->Label(-text => __("binaries to"));
+ $binb = $sw->Entry(-textvariable => \$lbin);
+ $manlab = $sw->Label(-text => __("manpages to"));
+ $manb = $sw->Entry(-textvariable => \$lman);
+ $infolab = $sw->Label(-text => __("info to"));
+ $infob = $sw->Entry(-textvariable => \$linfo);
+ $binlab->grid(-row => 2, -column => 1, -sticky => "w", -padx => "2m");
+ $binb->grid(-row => 2, -column => 2, -sticky => "ew", -padx => "2m");
+ $manlab->grid(-row => 3, -column => 1, -sticky => "w", -padx => "2m");
+ $manb->grid(-row => 3, -column => 2, -sticky => "ew", -padx => "2m");
+ $infolab->grid(-row => 4, -column => 1, -sticky => "w", -padx => "2m");
+ $infob->grid(-row => 4, -column => 2, -sticky => "ew", -padx => "2m");
+ set_unset_buttons();
+ my $f2 = $sw->Frame; $f2->grid(-column => 1, -columnspan => 2, -row => 5);
+ my $okbutton = $f2->Button(
+ -text => __("Ok"), -command => sub { return_callback(); $sw->destroy })
+ ->pack(-side => 'left');
+ my $cancelbutton = $f2->Button(-text => __("Cancel"),
+ -command => sub { $sw->destroy })->pack(-side => 'right');
+ $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
+ $sw->bind('<Escape>' => [ $cancelbutton, 'Invoke']);
+}
+
+sub menu_select_binsystems {
+ my $f2r;
+ my $f2;
+ my $sw = $mainwindow->Toplevel(-title => __('Binary system(s)'));
+ $sw->transient($mainwindow);
+ $sw->grab();
+ my @diskarchs = ();
+ foreach my $key (keys %vars) {
+ if ($key=~/binary_(.*)/) {
+ push @diskarchs, $1;
+ }
+ }
+ $sw->Label(-text => __("Select arch-os"))->pack(-padx => "2m", -pady => "2m");
+ $f2 = $sw->Frame;
+ my $f2l = $f2->Frame;
+ foreach my $sys (sort TeXLive::TLUtils::sort_archs @diskarchs) {
+ $f2l->Checkbutton(-variable => \$vars{"binary_$sys"},
+ -command => sub { check_on_removal($sw, $sys); },
+ -text => platform_desc($sys))->pack(-anchor => 'w');
+ }
+ $f2l->pack(-side => 'left');
+ $f2->pack(-padx => "2m", -pady => "2m");
+ my $f3 = $sw->Frame;
+ my $okbutton = $f3->Button(
+ -text => __("Ok"),
+ -command => sub { callback_select_systems() ; $sw->destroy })
+ ->pack(-side => 'left', -padx => "2m", -pady => "2m");
+ my $cancelbutton = $f3->Button(
+ -text => __("Cancel"),
+ -command => sub { $sw->destroy })
+ ->pack(-side => 'right', -padx => "2m", -pady => "2m");
+ $f3->pack(-expand => 'x');
+ $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
+ $sw->bind('<Escape>' => [ $cancelbutton, 'Invoke']);
+}
+
+sub check_on_removal {
+ my $arch_frame = shift;
+ my $a = shift;
+ if (!$vars{"binary_$a"} && $a eq $vars{'this_platform'}) {
+ # removal not supported
+ $vars{"binary_$a"} = 1;
+ $arch_frame->Dialog(
+ -title => __("Warning"),
+ -text => __("Removals of the main platform not possible!"),
+ -buttons => [ __("Ok") ])->Show;
+ }
+}
+
+
+sub menu_set_text {
+ my $w = shift;
+ my $t = shift;
+ # if in_place or portable not a complete interface
+ $w->configure(-text => $t, @_) if $w;
+}
+
+sub menu_set_schemebutton_text {
+ menu_set_text($schemebutton, "$vars{'selected_scheme'}");
+}
+
+sub menu_set_binbutton_text {
+ if (!win32()) {
+ if ($vars{'n_systems_selected'} == 1) {
+ my $selsys;
+ foreach my $key (keys %vars) {
+ if ($key=~/binary_(.*)/) {
+ if ($vars{$key}) {
+ $selsys = $1;
+ # we have only one system selected, stop here
+ last;
+ }
+ }
+ }
+ menu_set_text($bintextbutton, $selsys);
+ } else {
+ menu_set_text(
+ $bintextbutton, __(
+ "%s out of %s", $vars{'n_systems_selected'},
+ $vars{'n_systems_available'}));
+ }
+ }
+}
+
+sub menu_set_collections_text {
+ menu_set_text($collectionstext, __("%s collections out of %s",
+ $vars{'n_collections_selected'}, $vars{'n_collections_available'})
+ . " (" . __("disk space required:") . " $vars{'total_size'} MB)");
+}
+
+sub menu_set_pathes_text {
+ if (TeXLive::TLUtils::texdir_check($vars{'TEXDIR'})) {
+ menu_set_text(
+ $texdirtext, native_slashify($vars{'TEXDIR'}),
+ -foreground => "black");
+ } else {
+ menu_set_text(
+ $texdirtext,
+ __("(default not allowed or not writable - please change!)"),
+ -foreground => "red");
+ }
+ menu_set_text($texmflocaltext, native_slashify($vars{'TEXMFLOCAL'}));
+ if ((-w $vars{'TEXMFSYSVAR'}) || (-w dirname($vars{'TEXMFSYSVAR'}))) {
+ menu_set_text(
+ $texmfsysvartext, native_slashify($vars{'TEXMFSYSVAR'}),
+ -foreground => "black");
+ } elsif ("$vars{'TEXMFSYSVAR'}" =~ m;^$vars{'TEXDIR'};) {
+ if (TeXLive::TLUtils::texdir_check($vars{'TEXDIR'})) {
+ menu_set_text(
+ $texmfsysvartext, native_slashify($vars{'TEXMFSYSVAR'}),
+ -foreground => "black");
+ } else {
+ menu_set_text(
+ $texmfsysvartext, __("(please change TEXDIR first!)"),
+ -foreground => "red");
+ }
+ } else {
+ menu_set_text(
+ $texmfsysvartext, __("(default not writable - please change!)"));
+ }
+ if ((-w $vars{'TEXMFSYSCONFIG'}) || (-w dirname($vars{'TEXMFSYSCONFIG'}))) {
+ menu_set_text(
+ $texmfsysconfigtext, native_slashify($vars{'TEXMFSYSCONFIG'}),
+ -foreground => "black");
+ } elsif ("$vars{'TEXMFSYSCONFIG'}" =~ m;^$vars{'TEXDIR'};) {
+ if (TeXLive::TLUtils::texdir_check($vars{'TEXDIR'})) {
+ menu_set_text(
+ $texmfsysconfigtext, native_slashify($vars{'TEXMFSYSCONFIG'}),
+ -foreground => "black");
+ } else {
+ menu_set_text(
+ $texmfsysconfigtext, __("(please change TEXDIR first!)"),
+ -foreground => "red");
+ }
+ } else {
+ menu_set_text(
+ $texmfsysconfigtext, __("(default not writable - please change!)"));
+ }
+ menu_set_text($texmfhometext, native_slashify($vars{'TEXMFHOME'}));
+}
+
+
+sub menu_update_texts {
+ menu_set_pathes_text;
+ menu_set_collections_text;
+ menu_set_binbutton_text;
+ menu_set_schemebutton_text;
+ $optletterstate = $::letterdesc[$vars{'instopt_letter'}];
+ $optfmtstate = ($vars{'tlpdbopt_create_formats'} ? __("Yes") : __("No"));
+ $optsrcstate = ($vars{'tlpdbopt_install_srcfiles'} ? __("Yes") : __("No"));
+ $optdocstate = ($vars{'tlpdbopt_install_docfiles'} ? __("Yes") : __("No"));
+}
+
+sub callback_select_scheme {
+ my $s = shift;
+ select_scheme($s);
+ $editoryesno = ($vars{'collection-texworks'} ? __("Yes") : __("No"));
+ menu_update_texts();
+}
+
+sub callback_select_collection {
+ # special case for collection-texworks:
+ $editoryesno = ($vars{'collection-texworks'} ? __("Yes") : __("No"));
+ calc_depends();
+ select_scheme("scheme-custom");
+ update_numbers();
+ menu_update_texts();
+}
+
+sub callback_select_systems() {
+ if ($vars{"binary_win32"}) {
+ $vars{"collection-wintools"} = 1;
+ } else {
+ $vars{"collection-wintools"} = 0;
+ }
+ calc_depends();
+ update_numbers();
+ menu_update_texts();
+}
+
+sub callback_change_texdir {
+ my $val = shift;
+ callback_edit_directories('TEXDIR', $val);
+}
+
+sub callback_edit_directories {
+ my ($key,$val) = @_;
+ my $home = getenv('HOME');
+ if (win32()) {
+ $home = getenv('USERPROFILE');
+ $home =~ s!\\!/!g;
+ }
+ $home ||= '~';
+ $val =~ s!\\!/!g;
+ $vars{$key} = $val;
+ $vars{'TEXDIR'} =~ s/^~/$home/;
+ $vars{'TEXMFLOCAL'} =~ s/^~/$home/;
+ $vars{'TEXMFSYSVAR'} =~ s/^~/$home/;
+ $vars{'TEXMFSYSCONFIG'} =~ s/^~/$home/;
+ # only if we set TEXDIR we set the others in parallel
+ my $texdirnoslash;
+ if ($key eq "TEXDIR") {
+ if ($vars{'TEXDIR'}=~/^(.*)\/$texlive_release$/) {
+ $texdirnoslash = $1;
+ $vars{'TEXMFLOCAL'}="$texdirnoslash/texmf-local";
+ $vars{'TEXMFSYSVAR'}="$texdirnoslash/$texlive_release/texmf-var";
+ $vars{'TEXMFSYSCONFIG'}="$texdirnoslash/$texlive_release/texmf-config";
+ } elsif ($vars{'TEXDIR'}=~/^(.*)$/) {
+ $texdirnoslash = $1;
+ $texdirnoslash =~ s!/$!!;
+ $vars{'TEXMFLOCAL'}="$texdirnoslash/texmf-local";
+ $vars{'TEXMFSYSVAR'}="$texdirnoslash/texmf-var";
+ $vars{'TEXMFSYSCONFIG'}="$texdirnoslash/texmf-config";
+ }
+ }
+ menu_update_texts();
+}
+
+sub callback_edit_var() {
+ my ($key,$val) = @_;
+ $vars{$key} = $val;
+ menu_update_texts();
+}
+
+#sub dump_vars_stdout {
+# foreach my $k (keys %vars) {
+# print "DEBUG: vars{$k} = $vars{$k}\n";
+# }
+#}
+
+sub toggle_portable {
+ my $td = $vars{'TEXDIR'};
+ my $b;
+ if ($vars{'instopt_portable'}) {
+ $vars{'instopt_portable'} = 0;
+ $portableyesno = __('No');
+ # enable some buttons
+ for $b (
+ $tmflocalbutton, $tmfsysvarbutton, $tmfsysconfigbutton, $tmfhomebutton) {
+ $b->configure(-state => 'normal');
+ }
+ for $b ($pathbutton, $deskintbutton, $assocbutton, $adminbutton) {
+ $b->configure(-state => 'normal') if $b;
+ }
+ } else {
+ $vars{'instopt_portable'} = 1;
+ $portableyesno = __('Yes');
+ # disable some buttons. These should get a name first.
+ for $b (
+ $tmflocalbutton, $tmfsysvarbutton, $tmfsysconfigbutton, $tmfhomebutton) {
+ $b->configure(-state => 'disabled');
+ }
+ $vars{'instopt_adjustpath'} = 0;
+ $vars{'tlpdbopt_desktop_integration'} = 0;
+ $vars{'tlpdbopt_file_assocs'} = 0;
+ $vars{'tlpdbopt_w32_multi_user'} = 0;
+ $deskintyesno = __("No");
+ $pathadjyesno = __("No");
+ $fileassocyesno = __("None");
+ $adminallyesno = __("No");
+ for $b ($pathbutton, $deskintbutton, $assocbutton, $adminbutton) {
+ $b->configure(-state => 'disabled') if $b;
+ }
+ }
+ set_texlive_default_dirs(); # this sub tests for portable and in_place
+ $mw -> messageBox(
+ -title => __('Warning'),
+ -message =>
+ __("Portable option changed;\nDirectories have been reinitialized"),
+ -type => 'OK', -icon => 'warning');
+ menu_set_pathes_text();
+ # same for some options
+}
+
+sub toggle_and_set_opt_variable {
+ # $varsref: the variable to be changed
+ # $toggleref: the string representation of the value of $varsref;
+ # $choicesref: array ref of possible values for $toggleref
+ my ($varsref, $toggleref, $choicesref) = @_;
+ $choicesref = \@::yesno unless defined $choicesref;
+
+ my $n_opts = @$choicesref;
+ $$varsref += 1;
+ $$varsref = 0 if $$varsref >= $n_opts;
+ $$toggleref = $$choicesref[$$varsref];
+ calc_depends();
+ menu_update_texts();
+}
+
+1;
+
+__END__
+
+### Local Variables:
+### perl-indent-level: 2
+### tab-width: 2
+### indent-tabs-mode: nil
+### End:
+# vim:set tabstop=2 expandtab: #