#!/usr/bin/perl
#*****************************************************************************
#
#  Copyright (c) 2002 Guillaume Cottenceau
#  Copyright (c) 2002-2007 Thierry Vignaud <tvignaud@mandriva.com>
#  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: MandrivaUpdate 225322 2007-08-02 20:02:01Z tv $

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();

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;
        my @selectable = grep { !$pkgs->{$_}{pkg}->flag_skip } @requested;
        toggle($list, @selectable) if @selectable;
        $initialized = 1;
    }

    my $i;
    @{$list->{data}} = map {
        $data{$_} = $i++;
        my $summary = translate(to_utf8(rpm_summary($pkgs->{$_}{pkg}->summary)));
        [ $pkgs->{$_}{selected}, join("\n", "<b>$_</b>",
                                      utf8::valid($summary) ? escape_text_for_TextView_markup_format($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!<b>(.*)</b>!;
     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;
                       toggle_all({ }, 1);
                   },
			),
               1, gtknew('Label'),
			0, my $action_button = gtksignal_connect(
			    $update_button = Gtk2::Button->new(but_(N("Update"))),
			    clicked => sub {
                                my $res = do_action({ tree_mode => 'all_updates' }, $callback_action);
                                $initialized = 0 if !$res;
                                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);
