package mdkapplet_gui; ################################################################################ # Mandriva Online # # # # Copyright (C) 2003-2010 Mandriva # # # # Daouda Lo # # Thierry Vignaud # # # # 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. # ################################################################################ use strict; use feature 'state'; use lib qw(/usr/lib/libDrakX); use common; our @ISA = qw(Exporter); our @EXPORT = qw( @common %local_config $localdir $localfile $width fill_n_run_portable_dialog iso8601_date_to_locale new_link_button new_portable_dialog setVar ); our @EXPORT_OK = qw( $powerpack_ad run_ask_credentials_dialog run_no_rights_dialog open_ask_powerpack_dialog ); use mygtk2 qw(gtknew); #- do not import gtkadd which conflicts with ugtk2 version use ugtk2 qw(:all); use mdkonline qw(); # you don't want to polute the namespace use interactive; use interactive::gtk; use lib qw(/usr/lib/libDrakX/drakfirsttime); ugtk2::add_icon_path("/usr/share/mdkonline/pixmaps/"); our $localdir = "$ENV{HOME}/.MdkOnline"; our $localfile = "$localdir/mdkonline"; #compatibility mkdir_p($localdir) if !-d $localdir; -e "$ENV{HOME}/.mdkonline" and system("mv", "$ENV{HOME}/.mdkonline", $localfile); # make it work on 2008.X: eval { interactive::gtk::add_padding(Gtk2::Label->new) }; if ($@) { *interactive::gtk::add_padding = sub { $_[0] }; } our %local_config; read_local_config(); our $width = 500; our @common = ( # explicitely wrap (for 2008.1): line_wrap => 1, # workaround infamous 6 years old gnome bug #101968: width => $width - 50, ); # List of widgets advertising Powerpack our $powerpack_ad = [ gtknew('Label_Left', text => N("Mandriva Powerpack brings you the best of Linux experience for desktop: stability and efficiency of open source solutions together with exclusive softwares and Mandriva official support."), @common), gtknew('HButtonBox', layout => 'center', children_tight => [ new_link_button( 'http://www2.mandriva.com/linux/features/', N("Mandriva Linux Features") ) ]), gtknew('Label_Left', text => 'You can order now access for Powerpack', ), gtknew('HButtonBox', layout => 'center', children_tight => [ new_link_button( 'http://store.mandriva.com/pwp/', N("Online subscription") ) ]), ]; sub new_portable_dialog { my ($title) = @_; ugtk2->new($title, width => $width + 20); } sub fill_n_run_portable_dialog { my ($w, $widgets) = @_; # use wizard button order (for both 2008.1 & 2009.0): { local $::isWizard = 1; local $w->{pop_it} = 0; local $::isInstall = 1; my %children; if ($::isEmbedded) { my (@children_tight, $child); @children_tight = @$widgets; $child = pop @children_tight; %children = ( children => [ (map { (0, $_) } @children_tight), 1, gtknew('Label'), 0, $child, ] ); } else { %children = (children_tight => $widgets); } gtkadd($w->{window}, gtknew('VBox', %children)); } $w->{ok}->grab_focus; $w->main; } sub new_link_button { my ($url, $text) = @_; my $link = Gtk2::LinkButton->new($url, $text); $link->set_uri_hook(sub { my (undef, $url) = @_; run_program::raw({ detach => 1, setuid => get_parent_uid() }, 'www-browser', $url); }); $link; } sub read_local_config() { %local_config = getVarsFromSh($localfile); } sub setVar { my ($var, $st) = @_; my %s = getVarsFromSh($localfile); $s{$var} = $st; setVarsInSh($localfile, \%s); read_local_config(); } sub iso8601_date_to_locale { my ($date) = @_; return $date if $date !~ /(\d\d\d\d)-?(\d\d)-?(\d\d)/; require POSIX; POSIX::strftime("%x", 0, 0, 0, $3, $2-1, $1-1900); } # %options keys: # # 'top_extra': reference to a list of widgets to shown on top of dialog. # sub run_ask_credentials_dialog { my ($title, $description, $callback, %options) = @_; my $w = new_portable_dialog($title); my $password_text; state $email_text; my $password_w = gtknew('Entry'); my $email_w = gtknew('Entry', text => $email_text); my $ok_clicked; $password_w->set_visibility(0); $w->{ok_clicked} = sub { $password_text = $password_w->get_text; $email_text = $email_w->get_text; $ok_clicked = 1; Gtk2->main_quit; }; my @widgets = ( if_(!$::isEmbedded, mdkonline::get_banner($title)), if_($options{top_extra}, @{ $options{top_extra} }, gtknew('HSeparator'), ), gtknew('Label_Left', text => $description, @common), gtknew('HButtonBox', layout => 'start', children_tight => [ interactive::gtk::add_padding( new_link_button( 'https://my.mandriva.com/info', N("More information on your user account") ) ) ]), gtknew('Table', col_spacings => 5, row_spacings => 5, children => [ [ N("Your email"), $email_w ], [ N("Your password"), $password_w ] ]), gtknew('HButtonBox', layout => 'start', children_tight => [ interactive::gtk::add_padding( new_link_button( 'https://my.mandriva.com/reset/password/', N("Forgotten password") ) ) ]), ugtk2::create_okcancel($w, N("Next"), N("Cancel")), ); fill_n_run_portable_dialog($w, \@widgets); if ($ok_clicked) { $ok_clicked = 0; if ($email_text && $password_text) { $callback->($email_text, $password_text); } else { interactive->vnew->ask_warn( N("Error"), N("Password and email cannot be empty.") ); goto &run_ask_credentials_dialog; } } } sub run_no_rights_dialog { my ($title, $info, $info_url) = @_; my $w = new_portable_dialog($title); my @widgets = ( mdkonline::get_banner($title), gtknew('Label_Left', text => $info, @mdkapplet_gui::common), gtknew('HButtonBox', layout => 'start', children_tight => [ interactive::gtk::add_padding( new_link_button($info_url, N("More Information")) ) ]), create_okcancel($w, N("Close"), undef) ); fill_n_run_portable_dialog($w, \@widgets); } # Returns a string of user's choice: 'powerpack' or 'free'. sub open_ask_powerpack_dialog { my ($current_product, $new_version) = @_; # Setup powerpack offering radio buttons... my @radio_widgets; my $rbutton; # pwp/flash users will be offered powerpack by default my $want_powerpack = $current_product =~ /powerpack|flash/i; for my $product ($want_powerpack ? ('powerpack', 'free') : ('free', 'powerpack')) { my $info = mdkonline::get_product_info($product); $rbutton = Gtk2::RadioButton->new_with_label($rbutton ? $rbutton->get_group : undef, $info->{name}); $rbutton->signal_connect('toggled', sub { my ($button, $is_pwp) = @_; $want_powerpack = $is_pwp unless not $button->get_active(); }, $product eq 'powerpack'); push @radio_widgets, [ $rbutton, $info->{description} ]; } # Setup dialog widgets... my $title = N("Choose your upgrade version"); my $w = new_portable_dialog($title); my @widgets = (mdkonline::get_banner($current_product =~ /powerpack/i ? N("Your Powerpack access has ended") : $title), gtknew('Label_Left', text => N("%s is now available, you can upgrade to:", $new_version), @common), gtknew('Table', children => \@radio_widgets, row_spacings => 10), ugtk2::create_okcancel($w, N("Next"), N("Cancel")), ); fill_n_run_portable_dialog($w, \@widgets) or return undef; return $want_powerpack; }