# $Id: Help.pm,v 1.3 2001/03/31 09:48:39 muhri Exp $
# -*- perl -*-
package Pronto::Help;
use strict;
use SelfLoader;
1;
__DATA__
sub help_win {
if ($main::HTMLWIDGET eq "text") {
&main::err_dialog(_("You must be using an HTML widget to access Pronto's help"));
return 1;
}
my ($widget, $node, $x, $y, $filemenu, $bar) = @_;
my ($help_window, $window, $bg, $toolbar, $tb_back, $tb_prev, $vbox, $html_view, $body, $root_menu, $rm_file, $file_menu, $fm_top, $fm_prev, $fm_close);
$help_window=new Gtk::Window("toplevel");
$help_window->set_title(_("Help Viewer"));
$help_window->signal_connect("destroy" => sub { $help_window->destroy; });
$help_window->signal_connect("delete_event" => \&Gtk::false);
if (defined $x and defined $y) { $help_window->set_default_size($x,$y)
} else {
$help_window->set_default_size('685','400'); }
$help_window->set_policy(1,1,0);
$help_window->show;
$window = $help_window->window;
$bg = $help_window->style->bg('normal');
$vbox= new Gtk::VBox('0','0');
$vbox->show;
$help_window->add($vbox);
$root_menu = new Gtk::MenuBar;
$rm_file=new Gtk::MenuItem(_("File"));
$rm_file->show;
if (not defined $filemenu) { $root_menu->show; }
$root_menu->append($rm_file);
$file_menu = new Gtk::Menu;
$rm_file->set_submenu($file_menu);
$fm_top = new Gtk::MenuItem(_("Top"));
$fm_top->show;
$file_menu->append($fm_top);
$fm_prev = new Gtk::MenuItem(_("Previous Node"));
$fm_prev->show;
$file_menu->append($fm_prev);
$fm_close = new Gtk::MenuItem(_("Close"));
$fm_close->signal_connect("activate" => sub { $help_window->destroy; });
$fm_close->show;
$file_menu->append($fm_close);
$file_menu->show;
$vbox->pack_start($root_menu,0,0,0);
$toolbar= new Gtk::Toolbar('horizontal', 'both');
$toolbar->set_button_relief('none');
$toolbar->set_tooltips($main::prefs{'ToolTips'});
$toolbar->border_width('2');
$vbox->pack_start($toolbar,0,0,0);
if (not defined $bar) {$toolbar->show;}
$tb_back = $toolbar->append_item(_("Back"),_("Click here to go back a node"), "",&main::new_pixmap("$main::prefs{'PixmapDir'}/back.xpm", $window, $bg));
$tb_prev = $toolbar->append_item(_("Top"),_("Click here to jump to the top node"), "",&main::new_pixmap("$main::prefs{'PixmapDir'}/top.xpm", $window, $bg));
if ($main::HTMLWIDGET eq "GtkHTML" || $main::HTMLWIDGET eq "CscHTML") {
if ($main::HTMLWIDGET eq "GtkHTML") {
$html_view = new Gtk::HTML;
} elsif ($main::HTMLWIDGET eq "CscHTML") {
$html_view = new Csc::HTML;
}
$html_view->signal_connect('url_requested' => \&load_help_url);
$html_view->signal_connect('link_clicked' => \&help_link_clicked);
$html_view->signal_connect('title_changed' => sub {$help_window->set_title($html_view->get_title())});
$html_view->set_editable(0);
$html_view->enable_debug(0);
my $sw = new Gtk::ScrolledWindow(undef, undef);
$sw->set_policy('automatic', 'automatic');
$sw->show;
$sw->add($html_view);
$vbox->pack_start($sw,1,1,0);
$html_view->realize;
$html_view->show;
} else {
$html_view = new Gtk::XmHTML;
$html_view->set_anchor_buttons(0);
$html_view->set_allow_body_colors(1);
$html_view->set_hilight_on_enter(0);
$html_view->set_allow_font_switching(1);
$html_view->set_allow_images(1);
$html_view->set_strict_checking(1);
$html_view->set_anchor_target_underline_type (1);
$html_view->set_anchor_underline_type (1);
$html_view->set_anchor_visited_underline_type(1);
$html_view->signal_connect('activate' => \&help_link_clicked);
$html_view->show;
$vbox->pack_start($html_view,1,1,0);
}
$tb_back->signal_connect("clicked" => \&view_url, $html_view, $node, 2);
$tb_prev->signal_connect("clicked" => \&view_url, $html_view, $node, 1);
$fm_top->signal_connect("activate" => \&view_url, $html_view, $node, 1);
$fm_prev->signal_connect("activate" => \&view_url, $html_view, $node, 2);
&view_url(undef, $html_view, $node, 1);
return 1;
}
sub view_url {
my ($widget, $html_view, $node, $flag) = @_;
my ($tmp);
if ($flag == 1) {
undef @{$html_view->{'history'}};
} elsif ($flag == 2) {
if (defined @{$html_view->{'history'}}) {
$tmp = pop @{$html_view->{'history'}};
if ($tmp) { $node = $tmp; }
} else {
return 1;
}
} else {
if (defined $html_view->{'current'}) {
push @{$html_view->{'history'}}, $html_view->{'current'};
}
}
$html_view->{'current'} = $node;
my $tmpfile = "$main::prefs{'DocDir'}/$node";
if (open(FILE,"<$tmpfile")) {
undef $/;
my $body = <FILE>;
close(FILE);
$/ = "\n";
$body =~ s/<--!version-->/$main::version/g; # find version tag
$body =~ s/<img src=\"(.+)\">/<img src=\"$main::prefs{'DocDir'}\/$1\">/g;
if ($main::HTMLWIDGET eq "GtkHTML" || $main::HTMLWIDGET eq "CscHTML") {
my $file = "$main::prefs{'MailDir'}/help.html";
open(TEMP,">$file");
print TEMP $body;
close(TEMP);
&load_help_url($html_view, $file, $html_view->begin);
} else {
$html_view->source($body);
}
}
return 1;
}
sub help_link_clicked {
my (@fields, $address, $url, $widget, $info);
if ($main::HTMLWIDGET eq "GtkHTML" || $main::HTMLWIDGET eq "CscHTML") {
($widget, $url) = @_;
} else {
($widget, $info) = @_;
$url = $info->{'href'};
}
if ($url =~ /^mailto:(.+)/) {
$address = $1;
$fields[0] = $address;
$fields[1] = "";
$fields[2] = "";
&Pronto::Compose::init_msg_window(0, undef, \@fields);
} elsif ($url =~ /^sub:(.+)/) { # its a special sub url.. lets run the sub...
no strict 'refs';
my $sub = $1;
&{$sub};
} else {
&view_url(undef, $widget, $url, 3);
}
return 1;
}
sub load_help_url {
my ($html, $url, $handle) = @_;
my ($d);
my $io = new IO::File($url);
$io->read($d, 1000000);
$html->write($handle, $d);
$io->close;
$html->end($handle, 'ok');
}
syntax highlighted by Code2HTML, v. 0.9.1