diff options
author | Norbert Preining <preining@logic.at> | 2009-12-15 14:55:06 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2009-12-15 14:55:06 +0000 |
commit | 6616b6780cff53f09ab22d95d3c266230f0c8d31 (patch) | |
tree | 6bca98fcd08be03c2c4857ab84401e201633760f | |
parent | 9065c184404fe21540ec59074d350a86593bd427 (diff) |
many changes
git-svn-id: svn://tug.org/texlive/trunk@16414 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r-- | Master/tlpkg/dev/tlmgrgui2.pl | 955 |
1 files changed, 471 insertions, 484 deletions
diff --git a/Master/tlpkg/dev/tlmgrgui2.pl b/Master/tlpkg/dev/tlmgrgui2.pl index fcc71932255..c21882d9fab 100644 --- a/Master/tlpkg/dev/tlmgrgui2.pl +++ b/Master/tlpkg/dev/tlmgrgui2.pl @@ -28,427 +28,507 @@ use Tk::ItemStyle; use TeXLive::TLUtils qw(setup_programs platform_desc win32 debug); use TeXLive::TLConfig; +# +# stuff defined in tlmgr.pl that needs to be our-ed our $Master; our $tlmediatlpdb; our $tlmediasrc; +our $localtlmedia; our $localtlpdb; - -# defined in tlmgr.pl our $location; +our %opts; +our @update_function_list; my $tlpdb_location; my $cmdline_location; +my @critical_updates = (); # -our %opts; +# shortcuts for padding, expand/fill, and pack sides, anchors +my @p_ii = qw/-padx 2m -pady 2m/; +my @p_iii= qw/-padx 3m -pady 3m/; +my @x_x = qw/-expand 1 -fill x/; +my @x_y = qw/-expand 1 -fill y/; +my @x_xy= qw/-expand 1 -fill both/; +my @left = qw/-side left/; +my @right= qw/-side right/; +my @bot = qw/-side bottom/; +my @a_w = qw/-anchor w/; +my @a_c = qw/-anchor c/; +my @htype = qw/-relief ridge/; + # # the list of packages as shown by TixGrid # my %Packages; -our $mw; +my $mw; +my $tlmgrrev; +my $menu; +my $menu_file; +my $menu_options; +my $menu_actions; +my $menu_help; -sub update_status_box { - update_status(join(" ", @_)); - $mw->update; -} - -sub init_hooks { - push @::info_hook, \&update_status_box; - push @::warn_hook, \&update_status_box; - push @::debug_hook, \&update_status_box; - push @::ddebug_hook, \&update_status_box; - push @::dddebug_hook, \&update_status_box; -} +# +# GUI elements +# +my $g; # the scrolled list of packages +my $lighttext; +my $darktext; +my $match_entry; +my $loaded_button; -sub update_status { - my ($p) = @_; - $::progressw->insert("end", "$p"); - $::progressw->see("end"); -} +# +# communication between filters and the rest +my $status_all = 0; +my $status_only_installed = 1; +my $status_only_not_installed = 2; +my $status_only_updated = 3; +my $status_value = 0; +my $show_packages = 1; +my $show_collections = 1; +my $show_schemes = 1; +my $match_string = 0; +my $selection_value = 0; # prepare for loading of lang.pl which expects $::lang and $::opt_lang $::opt_lang = $opts{"gui-lang"} if (defined($opts{"gui-lang"})); - require("TeXLive/trans.pl"); -our @update_function_list; -$mw = MainWindow->new; -$mw->title("TeX Live Manager $TeXLive::TLConfig::ReleaseYear"); -$mw->withdraw; +my @archsavail; +my @archsinstalled; +my %archs; +my $currentarch; -# -# default layout definitions -# -# priority 20 = widgetDefault -# see Mastering Perl/Tk, 16.2. Using the Option Database -$mw->optionAdd("*Button.Relief", "ridge", 20); -# -# does not work, makes all buttons exactely 10, which is not a good idea -# I would like to have something like MinWidth 10... -#$mw->optionAdd("*Button.Width", "10", 20); -# -# shortcuts for padding, expand/fill, and pack sides, anchors -my @p_ii = qw/-padx 2m -pady 2m/; -my @p_iii= qw/-padx 3m -pady 3m/; -my @x_x = qw/-expand 1 -fill x/; -my @x_y = qw/-expand 1 -fill y/; -my @x_xy= qw/-expand 1 -fill both/; -my @left = qw/-side left/; -my @right= qw/-side right/; -my @bot = qw/-side bottom/; -my @a_w = qw/-anchor w/; -my @a_c = qw/-anchor c/; +my @fileassocdesc; +$fileassocdesc[0] = __("None"); +$fileassocdesc[1] = __("Only new"); +$fileassocdesc[2] = __("All"); +my %defaults; +my %changeddefaults; + +my %papers; +my %currentpaper; +my %changedpaper; +my %init_paper_subs; +$init_paper_subs{"xdvi"} = \&init_paper_xdvi; +$init_paper_subs{"pdftex"} = \&init_paper_pdftex; +$init_paper_subs{"dvips"} = \&init_paper_dvips; +$init_paper_subs{"context"} = \&init_paper_context; +$init_paper_subs{"dvipdfm"} = \&init_paper_dvipdfm; +$init_paper_subs{"dvipdfmx"} = \&init_paper_dvipdfmx; -# create a progress bar window -$::progressw = $mw->Scrolled("ROText", -scrollbars => "e", -height => 4); -$::progressw->pack(-fill => "x", @bot); +guimain(); +############# MAIN FUNCTION ########################## -my @critical_updates = (); +sub guimain { + build_initial_gui(); + init_hooks(); + + info(__("Loading local TeX Live Database\nThis may take some time, please wait!") . "\n"); + + $localtlmedia = TeXLive::TLMedia->new ( $Master ); + die("cannot setup TLMedia in $Master") unless (defined($localtlmedia)); + $localtlpdb = $localtlmedia->tlpdb; + die("cannot find tlpdb!") unless (defined($localtlpdb)); + + $tlpdb_location = $localtlpdb->option("location"); + if (defined($opts{"location"})) { + $cmdline_location = $opts{"location"}; + } + + + push @update_function_list, \&check_location_on_ctan; + push @update_function_list, \&init_install_media; + + setup_programs("$Master/tlpkg/installer", $localtlmedia->platform); + + # + # check that we can actually save the database + # + if (check_on_writable()) { + $::we_can_save = 1; + } else { + $::we_can_save = 0; + # here we should pop up a warning window!!! + } + $::action_button_state = ($::we_can_save ? "normal" : "disabled"); + + $tlmgrrev = give_version(); + chomp($tlmgrrev); + + setup_menu_system(); + do_rest_of_gui(); + setup_list(); + update_grid(); -init_hooks(); + if ($opts{"load"}) { + $location = $tlpdb_location; + update_loaded_location_string(); + run_update_functions(); + } -info(__("Loading local TeX Live Database\nThis may take some time, please wait!") . "\n"); -our $localtlmedia = TeXLive::TLMedia->new ( $Master ); -die("cannot setup TLMedia in $Master") unless (defined($localtlmedia)); -$localtlpdb = $localtlmedia->tlpdb; -die("cannot find tlpdb!") unless (defined($localtlpdb)); + info(__("Completed") . ".\n"); + $mw->deiconify; -our @main_list; -$tlpdb_location = $localtlpdb->option("location"); -if (defined($opts{"location"})) { - $cmdline_location = $opts{"location"}; + if (!$::we_can_save) { + my $no_write_warn = $mw->Dialog(-title => "warning", + -text => __("You don't have permissions to change the installation in any way,\nspecifically, the directory %s is not writable.\nPlease run this program as administrator, or contact your local admin.\n\nMost buttons will be disabled.", "$Master/tlpkg/"), + -buttons => [ __("Ok") ])->Show(); + } + + Tk::MainLoop(); } -push @update_function_list, \&check_location_on_ctan; -push @update_function_list, \&init_install_media; +############## GUI ######################## -setup_programs("$Master/tlpkg/installer", $localtlmedia->platform); +sub build_initial_gui { + $mw = MainWindow->new; + $mw->title("TeX Live Manager $TeXLive::TLConfig::ReleaseYear"); + $mw->withdraw; -# -# check that we can actually save the database -# -if (check_on_writable()) { - $::we_can_save = 1; -} else { - $::we_can_save = 0; - # here we should pop up a warning window!!! + # + # default layout definitions + # + # priority 20 = widgetDefault + # see Mastering Perl/Tk, 16.2. Using the Option Database + $mw->optionAdd("*Button.Relief", "ridge", 20); + # + # does not work, makes all buttons exactely 10, which is not a good idea + # I would like to have something like MinWidth 10... + #$mw->optionAdd("*Button.Width", "10", 20); + + # create a progress bar window + $::progressw = $mw->Scrolled("ROText", -scrollbars => "e", -height => 4); + $::progressw->pack(-fill => "x", @bot); } -$::action_button_state = ($::we_can_save ? "normal" : "disabled"); - -my $tlmgrrev = give_version(); -chomp($tlmgrrev); - -#our $top = $mw->Frame; - -my $menu = $mw->Menu(); -my $menu_file = $menu->Menu(); -my $menu_options = $menu->Menu(); -my $menu_actions = $menu->Menu(); -my $menu_help = $menu->Menu(); -$menu->add('cascade', -label => __("File"), -menu => $menu_file); -$menu->add('cascade', -label => __("Options"), -menu => $menu_options); -$menu->add('cascade', -label => __("Actions"), -menu => $menu_actions); -# on win32 people expect to have the Help button on the right side -if (win32()) { $menu->add('separator'); } -$menu->add('cascade', -label => __("Help"), -menu => $menu_help); -#$menu->add('separator'); -#$menu->add('command', -label => __("Loaded repository:") . __("none"), -# -command => sub { $location = $tlpdb_location; -# update_loaded_location_string(); -# run_update_functions(); -# }); -# -activebackground => $menu->cget(-background)); -# -# FILE MENU -# -$menu_file->add('command', - -label => __("Load default repository:") . " $tlpdb_location", - -command => sub { - $location = $tlpdb_location; - update_loaded_location_string(); - run_update_functions(); - }); -if (defined($cmdline_location)) { - $menu_file->add('command', -label => __("Load cmd line repository:") . " $cmdline_location", - -command => sub { - $location = $cmdline_location; +sub do_rest_of_gui { + # This needs to come first as we call update_grid rather early + #my $list_frame = $mw->Labelframe(-text => "Packages"); + my $list_frame = $mw->Frame; + $g = $list_frame->Scrolled('HList', -scrollbars => "se", -bd => 0, + -command => \&show_extended_info, # does not work, double click! + -columns => 5, -header => 1, + -borderwidth => 1, #-padx => 0, -pady => 0, + -separator => "/", + -selectmode => "none"); + + $loaded_button = $mw->Button(-text => __("Loaded repository:") . __(" none"), + -relief => 'flat', + -command => sub { $location = $tlpdb_location; update_loaded_location_string(); - run_update_functions(); + run_update_functions(); }); -} -$menu_file->add('command', -label => __("Load default net repository:") . " $TeXLiveURL", - -command => sub { - $location = $TeXLiveURL; - update_loaded_location_string(); - run_update_functions(); - }); -$menu_file->add('command', -label => __("Load other repository ..."), - -command => \&cb_edit_location); -$menu_file->add('separator'); -$menu_file->add('command', -label => __("Quit"), - -command => sub { $mw->destroy; exit(0); }); + $loaded_button->pack(-anchor => 'e', -padx => 0, -pady => 0, + -ipadx => 0, -ipady => 0); + + my $top_frame = $mw->Labelframe(-text => __("Display configuration")); + $top_frame->pack(-fill => 'x', -padx => '2m'); + + my $filter_frame = $top_frame->Frame(); + $filter_frame->pack; + + my $filter_status = $filter_frame->Labelframe(-text => __("Status")); + $filter_status->pack(@left, @p_ii); + + $filter_status->Radiobutton(-text => __("all"), -command => \&update_grid, + -variable => \$status_value, -value => $status_all)->pack(@a_w); + $filter_status->Radiobutton(-text => __("installed"), -command => \&update_grid, + -variable => \$status_value, -value => $status_only_installed)->pack(@a_w); + $filter_status->Radiobutton(-text => __("not installed"), -command => \&update_grid, + -variable => \$status_value, -value => $status_only_not_installed)->pack(@a_w); + $filter_status->Radiobutton(-text => __("updates"), -command => \&update_grid, + -variable => \$status_value, -value => $status_only_updated)->pack(@a_w); + + my $filter_category = $filter_frame->Labelframe(-text => __("Category")); + $filter_category->pack(@left, @x_y, @p_ii); + $filter_category->Checkbutton(-text => __("packages"), -command => \&update_grid, + -variable => \$show_packages)->pack(@a_w); + $filter_category->Checkbutton(-text => __("collections"), -command => \&update_grid, + -variable => \$show_collections)->pack(@a_w); + $filter_category->Checkbutton(-text => __("schemes"), -command => \&update_grid, + -variable => \$show_schemes)->pack(@a_w); + + my $filter_match = $filter_frame->Labelframe(-text => __("Match")); + $filter_match->pack(@left, @x_y, @p_ii); + $filter_match->Checkbutton(-text => __("pattern:"), + -command => \&update_grid, + -variable => \$match_string)->pack(@a_w); + $match_entry = + $filter_match->Entry(-width => 15, -validate => 'key', + )->pack(@a_w, -padx => '2m', @x_x); + + $match_entry->configure(-validate => 'key', + -validatecommand => sub { my $new_val = shift; + if (!$new_val) { + $match_string = 0; + } else { + $match_string = 1; + } + update_grid(); return 1; }); + + my $filter_selection = $filter_frame->Labelframe(-text => __("Selection")); + $filter_selection->pack(@left, @x_y, @p_ii); + $filter_selection->Radiobutton(-text => "all", -command => \&update_grid, + -variable => \$selection_value, -value => 0)->pack(@a_w); + $filter_selection->Radiobutton(-text => __("selected"), + -command => \&update_grid, -variable => \$selection_value, -value => 1) + ->pack(@a_w); + $filter_selection->Radiobutton(-text => __("not selected"), + -command => \&update_grid, -variable => \$selection_value, -value => 2) + ->pack(@a_w); + + + my $filter_button = $filter_frame->Frame; + $filter_button->pack(@left, @x_y, @p_ii); + $filter_button->Button(-text => __("Select all"), + -command => [ \&update_grid, 1 ])->pack(@x_x, @a_c); + $filter_button->Button(-text => __("Select none"), + -command => [ \&update_grid, 0 ])->pack(@x_x, @a_c); + + $filter_button->Button(-text => __("Reset filters"), + -command => sub { $status_value = $status_all; + $show_packages = 1; $show_collections = 1; + $show_schemes = 1; + $selection_value = 0; + $match_string = 0; + update_grid(); + })->pack(@x_x, @a_c); + + ########## Packages ####################### + $list_frame->pack(@x_xy, @p_ii); + $g->pack(qw/-expand 1 -fill both -padx 3 -pady 3/); + $g->focus; + + $lighttext = $g->ItemStyle('text', -background => 'gray90', + -selectbackground => 'gray90', -selectforeground => 'blue'); + $darktext = $g->ItemStyle('text', -background => 'gray70', + -selectbackground => 'gray70', -selectforeground => 'blue'); + + + $g->headerCreate(0, @htype, -itemtype => 'text', -text => ""); + $g->headerCreate(1, @htype, -itemtype => 'text', -text => __("Package name")); + $g->headerCreate(2, @htype, -itemtype => 'text', -text => __("Local rev. (ver.)")); + $g->headerCreate(3, @htype, -itemtype => 'text', -text => __("Remote rev. (ver.)")); +$g->headerCreate(4, @htype, -itemtype => 'text', -text => __("Short description")); -# -# OPTIONS MENU -# -$menu_options->add('command', -label => __("General ..."), - -command => sub { do_general_settings(); }); -$menu_options->add('command', -label => __("Paper ..."), - -command => sub { do_paper_settings(); }); -if (!win32()) { - $menu_options->add('command', -label => __("Architectures ..."), - -command => sub { do_arch_settings(); }); -} -$menu_options->add('separator'); -$menu_options->add('checkbutton', -label => __("Debug"), - -onvalue => ($::opt_verbosity == 0 ? 1 : $::opt_verbosity), - -variable => \$::opt_verbosity); + $g->columnWidth(0, 40); + $g->columnWidth(2, -char => 20); + $g->columnWidth(3, -char => 20); -# -# Actions menu -# -$menu_actions->add('command', -label => __("Update filename database"), - -state => $::action_button_state, - -command => sub { - $mw->Busy(-recurse => 1); - info("Running mktexlsr, this may take some time ...\n"); - info(`mktexlsr 2>&1`); - $mw->Unbusy; - }); -$menu_actions->add('command', -label => __("Rebuild all formats"), - -state => $::action_button_state, - -command => sub { - $mw->Busy(-recurse => 1); - info("Running fmtutil-sys --all, this may take some time ...\n"); - for my $l (`fmtutil-sys --all 2>&1`) { - info($l); - $mw->update; - } - $mw->Unbusy; - }); -$menu_actions->add('command', -label => __("Update font map database"), - -state => $::action_button_state, - -command => sub { - $mw->Busy(-recurse => 1); - info("Running updmap-sys, this may take some time ...\n"); - for my $l (`updmap-sys 2>&1`) { - info($l); - $mw->update; - } - $mw->Unbusy; - }); - -if (!win32()) { - $menu_actions->add('command', - -label => __("Handle symlinks in system dirs") . " ...", - -state => $::action_button_state, - -command => \&cb_handle_symlinks); -} -if (!win32()) { - $menu_actions->add('separator'); - $menu_actions->add('command', -label => __("Remove TeX Live %s ...", $TeXLive::TLConfig::ReleaseYear), - -state => $::action_button_state, - -command => sub { - my $sw = $mw->DialogBox(-title => __("Remove TeX Live %s", $TeXLive::TLConfig::ReleaseYear), - -buttons => [ __("Ok"), __("Cancel") ], - -cancel_button => __("Cancel"), - -command => sub { - my $b = shift; - if ($b eq __("Ok")) { - system("tlmgr", "uninstall", "--force"); - $mw->Dialog(-text => __("Complete removal completed"), -buttons => [ __("Ok") ])->Show; - $mw->destroy; - exit(0); - } - }); - $sw->add("Label", -text => __("Really remove (uninstall) the COMPLETE TeX Live %s installation?\nYour last chance to change your mind!", $TeXLive::TLConfig::ReleaseYear))->pack(@p_iii); - $sw->Show; - }); -} - + my $bot_frame = $mw->Frame; + $bot_frame->pack(-fill => 'x', @p_ii); + my $actions_frame = $bot_frame->Frame; + $actions_frame->pack(); -# -# HELP MENU -$menu_help->add('command', -label => __("About"), - -command => sub { - my $sw = $mw->DialogBox(-title => __("About"), - -buttons => [ __("Ok") ]); - $sw->add("Label", -text => "TeX Live Manager (GUIv2) -$tlmgrrev -Copyright 2009 Norbert Preining + my $with_all_frame = $actions_frame->Frame; + $with_all_frame->pack(@left, -padx => '5m'); + $with_all_frame->Button(-text => __('Update all installed'), + -state => $::action_button_state, + -command => sub { update_all_packages(); } + )->pack(@a_c,@left,@p_ii); -Licensed under the GNU General Public License version 2 or higher -In case of problems, please contact: texlive\@tug.org" - )->pack(@p_iii); - $sw->Show; - }); - + my $with_sel_frame = $actions_frame->Frame; + $with_sel_frame->pack(@left, -padx => '5m'); -$mw->configure(-menu => $menu); -our $back_f1 = $mw->Frame(); + # + # disable the with filter applied or not applied, it is too complicated, or? + # -# pack .top .back -side top -fill both -expand 1 -#$top->pack(-fill => 'x', @p_ii); -$back_f1->pack(@x_xy); + $with_sel_frame->Button(-text => __('Update'), + -state => $::action_button_state, + -command => sub { update_selected_packages(); } + )->pack(@left, @p_ii); + $with_sel_frame->Button(-text => __('Install'), + -state => $::action_button_state, + -command => sub { install_selected_packages(); } + )->pack(@left, @p_ii); + $with_sel_frame->Button(-text => __('Remove'), + -state => $::action_button_state, + -command => sub { remove_selected_packages(); } + )->pack(@left, @p_ii); + $with_sel_frame->Button(-text => __('Backup'), + -state => $::action_button_state, + -command => sub { backup_selected_packages(); } + )->pack(@left, @p_ii); +} -#require ("do_listframe.pl"); -######### SHOULD GO INTO A SEPARTE FILE ######################## -# This needs to come first as we call update_grid rather early -#my $list_frame = $back_f1->Labelframe(-text => "Packages"); -my $list_frame = $back_f1->Frame; -my $g = $list_frame->Scrolled('HList', -scrollbars => "se", -bd => 0, - -command => \&show_extended_info, # does not work, double click! - -columns => 7, -header => 1, - -borderwidth => 1, #-padx => 0, -pady => 0, - -separator => "/", - -selectmode => "none"); +########### LOGGING ETC FUNCTIONS ############# -my $loaded_button = $back_f1->Button(-text => __("Loaded repository:") . __(" none"), - -relief => 'flat', - -command => sub { $location = $tlpdb_location; - update_loaded_location_string(); - run_update_functions(); - }); -$loaded_button->pack(-anchor => 'e', -padx => 0, -pady => 0, -ipadx => 0, -ipady => 0); -# install screen -my $top_frame = $back_f1->Labelframe(-text => __("Display configuration")); -$top_frame->pack(@x_x, -padx => '2m'); +sub update_status_box { + update_status(join(" ", @_)); + $mw->update; +} -my $filter_frame = $top_frame->Frame(); -$filter_frame->pack; +sub init_hooks { + push @::info_hook, \&update_status_box; + push @::warn_hook, \&update_status_box; + push @::debug_hook, \&update_status_box; + push @::ddebug_hook, \&update_status_box; + push @::dddebug_hook, \&update_status_box; +} -my $filter_status = $filter_frame->Labelframe(-text => __("Status")); -$filter_status->pack(@left, @p_ii); +sub update_status { + my ($p) = @_; + $::progressw->insert("end", "$p"); + $::progressw->see("end"); +} -my $status_all = 0; -my $status_only_installed = 1; -my $status_only_not_installed = 2; -my $status_only_updated = 3; -my $status_value = 0; -$filter_status->Radiobutton(-text => __("all"), -command => \&update_grid, - -variable => \$status_value, -value => $status_all)->pack(@a_w); -$filter_status->Radiobutton(-text => __("installed"), -command => \&update_grid, - -variable => \$status_value, -value => $status_only_installed)->pack(@a_w); -$filter_status->Radiobutton(-text => __("not installed"), -command => \&update_grid, - -variable => \$status_value, -value => $status_only_not_installed)->pack(@a_w); -$filter_status->Radiobutton(-text => __("updates"), -command => \&update_grid, - -variable => \$status_value, -value => $status_only_updated)->pack(@a_w); - -my $filter_category = $filter_frame->Labelframe(-text => __("Category")); -$filter_category->pack(@left, @x_y, @p_ii); -my $show_packages = 1; -my $show_collections = 1; -my $show_schemes = 1; -$filter_category->Checkbutton(-text => __("packages"), -command => \&update_grid, - -variable => \$show_packages)->pack(@a_w); -$filter_category->Checkbutton(-text => __("collections"), -command => \&update_grid, - -variable => \$show_collections)->pack(@a_w); -$filter_category->Checkbutton(-text => __("schemes"), -command => \&update_grid, - -variable => \$show_schemes)->pack(@a_w); - -my $filter_match = $filter_frame->Labelframe(-text => __("Match")); -$filter_match->pack(@left, @x_y, @p_ii); -my $match_string = 0; -$filter_match->Checkbutton(-text => __("pattern:"), - -command => \&update_grid, - -variable => \$match_string)->pack(@a_w); -my $match_entry = - $filter_match->Entry(-width => 15, -validate => 'key', - )->pack(@a_w, -padx => '2m', @x_x); - -$match_entry->configure(-validate => 'key', - -validatecommand => sub { my $new_val = shift; - if (!$new_val) { - $match_string = 0; - } else { - $match_string = 1; - } - update_grid(); return 1; }); +############# GUI CALLBACKS ################## + +sub setup_menu_system { + $menu = $mw->Menu(); + $menu_file = $menu->Menu(); + $menu_options = $menu->Menu(); + $menu_actions = $menu->Menu(); + $menu_help = $menu->Menu(); + $menu->add('cascade', -label => __("File"), -menu => $menu_file); + $menu->add('cascade', -label => __("Options"), -menu => $menu_options); + $menu->add('cascade', -label => __("Actions"), -menu => $menu_actions); + # on win32 people expect to have the Help button on the right side + if (win32()) { $menu->add('separator'); } + $menu->add('cascade', -label => __("Help"), -menu => $menu_help); -my $filter_selection = $filter_frame->Labelframe(-text => __("Selection")); -$filter_selection->pack(@left, @x_y, @p_ii); -my $selection_value = 0; -$filter_selection->Radiobutton(-text => "all", -command => \&update_grid, - -variable => \$selection_value, -value => 0)->pack(@a_w); -$filter_selection->Radiobutton(-text => __("selected"), - -command => \&update_grid, -variable => \$selection_value, -value => 1) - ->pack(@a_w); -$filter_selection->Radiobutton(-text => __("not selected"), - -command => \&update_grid, -variable => \$selection_value, -value => 2) - ->pack(@a_w); - - -my $filter_button = $filter_frame->Frame; -#my $filter_button = $filter_frame->Labelframe(-text => __("Action")); -$filter_button->pack(@left, @x_y, @p_ii); -#$filter_button->Button(-text => __("Apply filters"), -# -command => sub { update_grid(); })->pack(@a_c, @p_ii); -$filter_button->Button(-text => __("Select all"), - -command => [ \&update_grid, 1 ])->pack(@x_x, @a_c); -$filter_button->Button(-text => __("Select none"), - -command => [ \&update_grid, 0 ])->pack(@x_x, @a_c); - -$filter_button->Button(-text => __("Reset filters"), - -command => sub { $status_value = $status_all; - $show_packages = 1; $show_collections = 1; - $show_schemes = 1; - $selection_value = 0; - $match_string = 0; - update_grid(); - })->pack(@x_x, @a_c); - -########## Packages ####################### -#my $list_frame = $back_f1->Labelframe(-text => __("Packages"); -$list_frame->pack(@x_xy, @p_ii); -#my $g = $list_frame->Scrolled('HList', -scrollbars => "se", -bd => 0, -# -command => \&show_extended_info, # does not work, double click! -# -columns => 7, -header => 1, -# -separator => "/", -# -selectmode => "none"); -$g->pack(qw/-expand 1 -fill both -padx 3 -pady 3/); -$g->focus; - -my $lighttext = $g->ItemStyle('text', -background => 'gray90', - -selectbackground => 'gray90', -selectforeground => 'blue'); -my $darktext = $g->ItemStyle('text', -background => 'gray70', - -selectbackground => 'gray70', -selectforeground => 'blue'); + # + # FILE MENU + # + $menu_file->add('command', + -label => __("Load default repository:") . " $tlpdb_location", + -command => sub { + $location = $tlpdb_location; + update_loaded_location_string(); + run_update_functions(); + }); + if (defined($cmdline_location)) { + $menu_file->add('command', -label => __("Load cmd line repository:") . " $cmdline_location", + -command => sub { + $location = $cmdline_location; + update_loaded_location_string(); + run_update_functions(); + }); + } + $menu_file->add('command', -label => __("Load default net repository:") . " $TeXLiveURL", + -command => sub { + $location = $TeXLiveURL; + update_loaded_location_string(); + run_update_functions(); + }); + $menu_file->add('command', -label => __("Load other repository ..."), + -command => \&cb_edit_location); + $menu_file->add('separator'); + $menu_file->add('command', -label => __("Quit"), + -command => sub { $mw->destroy; exit(0); }); -my @htype = qw/-relief ridge/; + # + # OPTIONS MENU + # + $menu_options->add('command', -label => __("General ..."), + -command => sub { do_general_settings(); }); + $menu_options->add('command', -label => __("Paper ..."), + -command => sub { do_paper_settings(); }); + if (!win32()) { + $menu_options->add('command', -label => __("Architectures ..."), + -command => sub { do_arch_settings(); }); + } + $menu_options->add('separator'); + $menu_options->add('checkbutton', -label => __("Debug"), + -onvalue => ($::opt_verbosity == 0 ? 1 : $::opt_verbosity), + -variable => \$::opt_verbosity); -#my $all_none; -#$all_none = $g->Checkbutton(-command => [\&update_grid, $all_none->{'Value'} ]); -#$g->headerCreate(0, @htype, -itemtype => 'window', -widget => $all_none); -#my $f = $g->Frame(); -#my $bi = $f->Button(-padx => 1, -pady => 3, -# -text => 'all', -command => [ \&update_grid, 1 ]); -#my $bii= $f->Button(-padx => 1, -pady => 3, -# -text => 'none', -command => [ \&update_grid, 0 ]); -#$bi->pack(@left); -#$bii->pack(@right); -#$g->headerCreate(0, @htype, -itemtype => 'window', -widget => $f); -$g->headerCreate(0, @htype, -itemtype => 'text', -text => ""); -$g->headerCreate(1, @htype, -itemtype => 'text', -text => __("Package name")); -$g->headerCreate(2, @htype, -itemtype => 'text', -text => __("Local rev. (ver.)")); -$g->headerCreate(3, @htype, -itemtype => 'text', -text => __("Remote rev. (ver.)")); -$g->headerCreate(4, @htype, -itemtype => 'text', -text => __("Short description")); + # + # Actions menu + # + $menu_actions->add('command', -label => __("Update filename database"), + -state => $::action_button_state, + -command => sub { + $mw->Busy(-recurse => 1); + info("Running mktexlsr, this may take some time ...\n"); + info(`mktexlsr 2>&1`); + $mw->Unbusy; + }); + $menu_actions->add('command', -label => __("Rebuild all formats"), + -state => $::action_button_state, + -command => sub { + $mw->Busy(-recurse => 1); + info("Running fmtutil-sys --all, this may take some time ...\n"); + for my $l (`fmtutil-sys --all 2>&1`) { + info($l); + $mw->update; + } + $mw->Unbusy; + }); + $menu_actions->add('command', -label => __("Update font map database"), + -state => $::action_button_state, + -command => sub { + $mw->Busy(-recurse => 1); + info("Running updmap-sys, this may take some time ...\n"); + for my $l (`updmap-sys 2>&1`) { + info($l); + $mw->update; + } + $mw->Unbusy; + }); -$g->columnWidth(0, 40); -$g->columnWidth(2, -char => 20); -$g->columnWidth(3, -char => 20); + if (!win32()) { + $menu_actions->add('command', + -label => __("Handle symlinks in system dirs") . " ...", + -state => $::action_button_state, + -command => \&cb_handle_symlinks); + } + if (!win32()) { + $menu_actions->add('separator'); + $menu_actions->add('command', -label => __("Remove TeX Live %s ...", $TeXLive::TLConfig::ReleaseYear), + -state => $::action_button_state, + -command => sub { + my $sw = $mw->DialogBox(-title => __("Remove TeX Live %s", $TeXLive::TLConfig::ReleaseYear), + -buttons => [ __("Ok"), __("Cancel") ], + -cancel_button => __("Cancel"), + -command => sub { + my $b = shift; + if ($b eq __("Ok")) { + system("tlmgr", "uninstall", "--force"); + $mw->Dialog(-text => __("Complete removal completed"), -buttons => [ __("Ok") ])->Show; + $mw->destroy; + exit(0); + } + }); + $sw->add("Label", -text => __("Really remove (uninstall) the COMPLETE TeX Live %s installation?\nYour last chance to change your mind!", $TeXLive::TLConfig::ReleaseYear))->pack(@p_iii); + $sw->Show; + }); + } + + + + # + # HELP MENU + $menu_help->add('command', -label => __("About"), + -command => sub { + my $sw = $mw->DialogBox(-title => __("About"), + -buttons => [ __("Ok") ]); + $sw->add("Label", -text => "TeX Live Manager (GUIv2) +$tlmgrrev +Copyright 2009 Norbert Preining -setup_list(); -update_grid(); +Licensed under the GNU General Public License version 2 or higher +In case of problems, please contact: texlive\@tug.org" + )->pack(@p_iii); + $sw->Show; + }); + + + $mw->configure(-menu => $menu); +} sub show_extended_info { my $p = shift; @@ -511,24 +591,28 @@ sub show_extended_info { } $tf->Label(-text => __("Warning: Catalogue versions might be lagging behind or be simply wrong."))->grid(-stick => "nw", -columnspan => 2); - our @further_a = (); - our @further_b = (); + our %further_a; + our %further_b; + + @{$further_a{$p}} = (); + @{$further_b{$p}} = (); sub add_filelist_text { + my $p = shift; my $text = shift; my @files = @_; if (@files) { my $t = ""; for my $f (@files) { $t .= "$f\n"; } $t =~ s/\n$//; - push @further_a, $tf->Label(-text => $text); + push @{$further_a{$p}}, $tf->Label(-text => $text); if ($#files >= 4) { my $foo = $tf->Scrolled('ROText', -scrollbars => "oe", -height => 5, -width => 50, -wrap => 'word', -relief => 'flat'); $foo->insert("1.0", $t); - push @further_b, $foo; + push @{$further_b{$p}}, $foo; } else { - push @further_b, + push @{$further_b{$p}}, $tf->Label(-wraplength => '500', -justify => 'left', -text => $t); } } @@ -543,16 +627,16 @@ sub show_extended_info { push @deps, $d; } } - add_filelist_text(__("Depends:"), @deps); + add_filelist_text($p, __("Depends:"), @deps); if ($do_arch) { my @archs = $localtlpdb->available_architectures; @arch_deps = map { "$p.$_"; } @archs; - push @further_a, $tf->Label(-text => __("Binaries' dependencies:")); - push @further_b, $tf->Label(-text => join('\n',@arch_deps)); + push @{$further_a{$p}}, $tf->Label(-text => __("Binaries' dependencies:")); + push @{$further_b{$p}}, $tf->Label(-text => join('\n',@arch_deps)); } - add_filelist_text(__("Runfiles:"), $tlp->runfiles); - add_filelist_text(__("Docfiles:"), $tlp->docfiles); - add_filelist_text(__("Srcfiles:"), $tlp->srcfiles); + add_filelist_text($p, __("Runfiles:"), $tlp->runfiles); + add_filelist_text($p, __("Docfiles:"), $tlp->docfiles); + add_filelist_text($p, __("Srcfiles:"), $tlp->srcfiles); my @binf = $tlp->allbinfiles; if ($do_arch) { for my $bp (@arch_deps) { @@ -564,7 +648,7 @@ sub show_extended_info { } } } - add_filelist_text(__("Binfiles:"), @binf); + add_filelist_text($p, __("Binfiles:"), @binf); my $f = $tf->Frame; my $fb = $f->Button(-padx => 0, -pady => 0, @@ -578,20 +662,20 @@ sub show_extended_info { sub { $showdetails = not($showdetails); if ($showdetails) { - for my $i (0..$#further_a) { - $further_a[$i]->grid($further_b[$i], -sticky => "nw"); + for my $i (0..$#{$further_a{$p}}) { + ${$further_a{$p}}[$i]->grid(${$further_b{$p}}[$i], -sticky => "nw"); } } else { - for my $i (0..$#further_a) { - $further_a[$i]->gridForget($further_b[$i]); + for my $i (0..$#{$further_a{$p}}) { + ${$further_a{$p}}[$i]->gridForget(${$further_b{$p}}[$i]); } } }); $bf->Button(-text => __("Ok"), -width => 10, - -command => sub { for (@further_a) { $_->destroy; }; - for (@further_b) { $_->destroy; }; + -command => sub { for (@{$further_a{$p}}) { $_->destroy; }; + for (@{$further_b{$p}}) { $_->destroy; }; $sw->destroy; })->pack; } @@ -718,66 +802,7 @@ sub MatchesFilters { return 1; } - -####### actions frame - -#my $bot_frame = $back_f1->Labelframe(-text => "Actions"); -my $bot_frame = $back_f1->Frame; -$bot_frame->pack(@x_x, @p_ii); - -my $actions_frame = $bot_frame->Frame; -$actions_frame->pack(); - -#my $with_all_frame = $actions_frame->Labelframe(-text => __("with all")); -my $with_all_frame = $actions_frame->Frame; -$with_all_frame->pack(@left, -padx => '5m'); -$with_all_frame->Button(-text => __('Update all installed'), - -state => $::action_button_state, - -command => sub { update_all_packages(); } - )->pack(@a_c,@left,@p_ii); - -#my $with_sel_frame = $actions_frame->Labelframe(-text => __("with selected")); -my $with_sel_frame = $actions_frame->Frame; -$with_sel_frame->pack(@left, -padx => '5m'); - - -# -# disable the with filter applied or not applied, it is too complicated, or? -# -# THIS VARIABLE HAS TO BE KEPT == 1 because the apply action checks -# for that value!!! -my $action_apply_filter = 1; -#$with_sel_frame->Label(-text => "with filters")->pack(@left, @p_ii); -# -#$with_sel_frame->Radiobutton(-text => "applied", -# -variable => \$action_apply_filter, -value => 1)->pack(@left, @p_ii); -#$with_sel_frame->Radiobutton(-text => "not applied", -# -variable => \$action_apply_filter, -value => 0)->pack(@left, @p_ii); -# - -$with_sel_frame->Button(-text => __('Update'), - -state => $::action_button_state, - -command => sub { update_selected_packages(); } - )->pack(@left, @p_ii); -$with_sel_frame->Button(-text => __('Install'), - -state => $::action_button_state, - -command => sub { install_selected_packages(); } - )->pack(@left, @p_ii); -$with_sel_frame->Button(-text => __('Remove'), - -state => $::action_button_state, - -command => sub { remove_selected_packages(); } - )->pack(@left, @p_ii); -$with_sel_frame->Button(-text => __('Backup'), - -state => $::action_button_state, - -command => sub { backup_selected_packages(); } - )->pack(@left, @p_ii); - -######################## ARCH ########################### - -my @archsavail; -my @archsinstalled; -my %archs; -my $currentarch; +############# ARCH HANDLING ##################### sub init_archs { if (!defined($tlmediatlpdb)) { @@ -857,14 +882,8 @@ sub apply_arch_changes { } } -########## CONFIG ################### -# -my @fileassocdesc; -$fileassocdesc[0] = __("None"); -$fileassocdesc[1] = __("Only new"); -$fileassocdesc[2] = __("All"); -my %defaults; -my %changeddefaults; + +######### CONFIG HANDLING ############# sub init_defaults_setting { for my $key (keys %TeXLive::TLConfig::TLPDBOptions) { @@ -1043,10 +1062,9 @@ sub apply_settings_changes { $localtlpdb->save; } -######## PAPER ######### -my %papers; -my %currentpaper; -my %changedpaper; + + +########## PAPER HANDLING ################# sub init_paper_xdvi { if (!win32()) { @@ -1077,13 +1095,6 @@ sub init_paper_dvipdfmx { $currentpaper{"dvipdfmx"} = ${$papers{"dvipdfmx"}}[0]; } -my %init_paper_subs; -$init_paper_subs{"xdvi"} = \&init_paper_xdvi; -$init_paper_subs{"pdftex"} = \&init_paper_pdftex; -$init_paper_subs{"dvips"} = \&init_paper_dvips; -$init_paper_subs{"context"} = \&init_paper_context; -$init_paper_subs{"dvipdfm"} = \&init_paper_dvipdfm; -$init_paper_subs{"dvipdfmx"} = \&init_paper_dvipdfmx; sub init_all_papers { for my $p (keys %init_paper_subs) { @@ -1305,28 +1316,8 @@ sub select_file_assocs { } - -################ END FUNCTIONS - -if ($opts{"load"}) { - $location = $tlpdb_location; - update_loaded_location_string(); - run_update_functions(); -} - - -info(__("Completed") . ".\n"); -$mw->deiconify; - - -if (!$::we_can_save) { - my $no_write_warn = $mw->Dialog(-title => "warning", - -text => __("You don't have permissions to change the installation in any way,\nspecifically, the directory %s is not writable.\nPlease run this program as administrator, or contact your local admin.\n\nMost buttons will be disabled.", "$Master/tlpkg/"), - -buttons => [ __("Ok") ])->Show(); -} - -Tk::MainLoop(); - + +############################ sub init_install_media { my $newroot = $location; @@ -1388,11 +1379,7 @@ sub SelectedPackages { # first select those that are for my $p (keys %Packages) { next if !$Packages{$p}{'selected'}; - if ($action_apply_filter) { - if (MatchesFilters($p)) { - push @ret, $p; - } - } else { + if (MatchesFilters($p)) { push @ret, $p; } } |