#!/usr/bin/perl #***************************************************************************** # # Copyright (c) 2002 Guillaume Cottenceau # Copyright (c) 2002-2007 Thierry Vignaud # Copyright (c) 2003, 2004, 2005 MandrakeSoft SA # Copyright (c) 2005-2007 Mandriva SA # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2, as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # #***************************************************************************** # # $Id$ use strict; use MDK::Common::Func 'any'; use lib qw(/usr/lib/libDrakX); use common; use Rpmdrake::init; use standalone; #- standalone must be loaded very first, for 'explanations', but after rpmdrake::init use rpmdrake; use Rpmdrake::gui; use Rpmdrake::rpmnew; use Rpmdrake::formatting; use Rpmdrake::pkg; use Rpmdrake::widgets; use mygtk2 qw(gtknew); #- do not import anything else, especially gtkadd() which conflicts with ugtk2 one use ugtk2 qw(:all); use Gtk2::Gdk::Keysyms; use Gtk2::SimpleList; $ugtk2::wm_icon = "title-$MODE"; our $w; my $treeview_dialog_run = 0; our $statusbar; warn_about_user_mode(); open_db(); my (%data, $initialized); sub refresh_packages_list { my ($list, $info, $button) = @_; # select packages to update: my @requested = sort @filtered_pkgs; # don't select kernel*-latest by default and the kernels they require: if (!$initialized) { $pkgs->{$_}{selected} = 0 foreach @requested; toggle($list, grep { !$pkgs->{$_}{pkg}->flag_skip } @requested); $initialized = 1; } my $i; @{$list->{data}} = map { $data{$_} = $i++; [ $pkgs->{$_}{selected}, join("\n", "$_", translate(rpm_summary($pkgs->{$_}{pkg}->summary))) ]; } grep { $pkgs->{$_}{pkg} } @requested; gtktext_insert($info, formatAlaTeX(N("The list of updates is empty. This means that either there is no available update for the packages installed on your computer, or you already installed all of them."))) if !@{$list->{data}}; $button->set_sensitive(scalar(@{$list->{data}})); } sub toggle { my ($list, @names) = @_; my $name = $names[0]; my $val = $pkgs->{$name}{selected}; my $old_status = $val ? 'to_install' : 'to_update'; my $done; $pkgs->{$name}{pkg}->set_flag_skip(0); toggle_nodes($w->{real_window}->window, $list->get_model, sub { my ($leaf, $state, $model) = @_; $done = 1; $list->{data}[$data{$leaf}][0] = $pkgs->{$name}{selected}; }, $old_status, @names); # handle canceling: $list->{data}[$data{$name}][0] = !$list->{data}[$data{$name}][0] if !$done; } sub get_name { my ($name) = @_; ($name) = $name =~ m!(.*)!; return $name; } $w = ugtk2->new(N("Software Management")); $w->{rwindow}->show_all if $::isEmbedded; sub run_treeview_dialog { my ($callback_action) = @_; my ($size_selected, %elems, $list, $info, $update_button); my (undef, $size_free) = MDK::Common::System::df('/usr'); $::main_window = $w->{real_window}; compute_main_window_size($w); gtkadd( $w->{window}, gtkpack_( gtknew('VBox', spacing => 3), 0, getbanner(), 0, gtknew('Title2', label => N("Here is the list of software package updates")), 1, create_vpaned( gtkadd( gtknew('Frame', border_width => 3, shadow_type => 'in'), gtknew('ScrolledWindow', width => $typical_width*0.9, height => 240, child => $list = Gtk2::SimpleList->new( " " . " " . " " => 'bool', #N("Selected") " " . "" . " " => 'markup', #N("Name") ), ), ), gtknew('ScrolledWindow', width => $typical_width*0.9, child => $info = Gtk2::Mdv::TextView->new, height => 110, ), resize1 => 1, ), 0, gtkset_size_request(Gtk2::HSeparator->new, -1, 5), 0, gtkpack_( gtknew('HBox', spacing => 20), 0, gtksignal_connect( Gtk2::Button->new(but_(N("Help"))), clicked => sub { rpmdrake::open_help($MODE) }, ), 0, gtksignal_connect( Gtk2::Button->new(but_(N("Select all"))), clicked => sub { return if !ref($::options->{toggle_all}); $::options->{toggle_all}->(1); }, ), 1, gtknew('Label'), 0, my $action_button = gtksignal_connect( $update_button = Gtk2::Button->new(but_(N("Update"))), clicked => sub { do_action({ tree_mode => 'all_updates' }, $callback_action); refresh_packages_list($list, $info, $update_button); }, ), 0, gtksignal_connect( Gtk2::Button->new(but_(N("Quit"))), clicked => sub { Gtk2->main_quit }, ), ), #0, $statusbar = Gtk2::Statusbar->new, ), ); $statusbar = Gtk2::Statusbar->new; $list->set_rules_hint(1); $list->set_headers_visible(0); $list->get_column(0)->set_fixed_width(24); $list->get_column(0)->set_sizing('fixed'); $list->get_column(1)->set_sizing('fixed'); $list->set_fixed_height_mode(1); $list->get_selection->signal_connect(changed => sub { my ($model, $iter) = $_[0]->get_selected; $model && $iter or return; gtktext_insert($info, get_info(get_name($model->get($iter, 1)), $w->{real_window}->window)); $info->scroll_to_iter($info->get_buffer->get_start_iter, 0, 0, 0, 0); }); $w->{rwindow}->set_default_size(-1, 500) if !$::isEmbedded; $w->{rwindow}->show_all; $w->{rwindow}->set_sensitive(0); $Rpmdrake::pkg::probe_only_for_updates = 1; # faster startup pkgs_provider({}, $default_list_mode, pure_updates => 1); # default mode refresh_packages_list($list, $info, $update_button); my $cell = ($list->get_column(0)->get_cell_renderers)[0]; $cell->signal_connect(toggled => sub { my ($cell, $text_path) = @_; my ($val, $name) = @{$list->{data}[$text_path]}; gtkset_mousecursor_wait($w->{real_window}->window); my $_guard = before_leaving(sub {gtkset_mousecursor_normal($w->{real_window}->window) }); $name = get_name($name); toggle($list, $name); gtkset_mousecursor_normal($w->{real_window}->window); }); $action_button->set_sensitive(0) if $>; $w->{rwindow}->set_sensitive(1); $treeview_dialog_run = 1; $w->main; } # -=-=-=---=-=-=---=-=-=-- main -=-=-=---=-=-=---=-=-=- do_merge_if_needed(); readconf(); init(); run_treeview_dialog(\&perform_installation); writeconf(); myexit(0);