diff options
Diffstat (limited to 'support/autolatex/pm/AutoLaTeX/GUI/Gtk/Window.pm')
-rw-r--r-- | support/autolatex/pm/AutoLaTeX/GUI/Gtk/Window.pm | 426 |
1 files changed, 426 insertions, 0 deletions
diff --git a/support/autolatex/pm/AutoLaTeX/GUI/Gtk/Window.pm b/support/autolatex/pm/AutoLaTeX/GUI/Gtk/Window.pm new file mode 100644 index 0000000000..3199fd692b --- /dev/null +++ b/support/autolatex/pm/AutoLaTeX/GUI/Gtk/Window.pm @@ -0,0 +1,426 @@ +# Copyright (C) 2007-13 Stephane Galland <galland@arakhne.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# 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; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +=pod + +=head1 NAME + +AutoLaTeX::GUI::Gtk::Window - A GTK user interface + +=head1 DESCRIPTION + +AutoLaTeX::GUI::Gtk::Window is a Perl module, which permits to +display a Gtk user interface for AutoLaTeX. + +=head1 SYNOPSYS + +AutoLaTeX::GUI::Gtk->new() ; + +=head1 METHOD DESCRIPTIONS + +This section contains only the methods in Gtk.pm itself. + +=over + +=cut + +package AutoLaTeX::GUI::Gtk::Window; + +our @ISA = qw( AutoLaTeX::GUI::Gtk::WidgetUtil AutoLaTeX::GUI::AbstractGUI Gtk2::Window ); +our @EXPORT = qw(); +our @EXPORT_OK = qw(); + +require 5.014; +use strict; +use utf8; +use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION); +use Exporter; + +use Glib qw(TRUE FALSE); +use Gtk2 qw/-init -threads-init/; + +use AutoLaTeX::Core::Util; +use AutoLaTeX::Core::IntUtils; +use AutoLaTeX::GUI::AbstractGUI; +use AutoLaTeX::GUI::Gtk::WidgetUtil; +use AutoLaTeX::GUI::Gtk::ToolPanel; +use AutoLaTeX::GUI::Gtk::GeneralPanel; +use AutoLaTeX::GUI::Gtk::TranslatorPanel; + +#------------------------------------------------------ +# +# Global vars +# +#------------------------------------------------------ + +# Version number +my $VERSION = "7.0" ; + +#------------------------------------------------------ +# +# Functions +# +#------------------------------------------------------ + +=pod + +=item * new(\%\%\%\%) + +Contructor. + +Parameters are: + +=over 4 + +=item the current configuration extracted from the configuration files. + +=item the system configuration extracted from the configuration file. + +=item the user configuration extracted from the configuration file. + +=item the project configuration extracted from the configuration file. + +=back + +=cut +sub new(\%\%\%\%) : method { + my $proto = shift; + my $class = ref($proto) || $proto; + + my $self = bless($class->SUPER::new('toplevel'), $class) ; + + die("The first parameter of AutoLaTeX::GUI::Gtk::Window::new() should be a hastable\nIf you pass a %v variable, please use the \%v syntax instead.\n") + unless ((!defined($_[0]))||(isHash($_[0]))); + $self->attr('CONFIGURATIONS','FULL') = $_[0]; + + die("The second parameter of AutoLaTeX::GUI::Gtk::Window::new() should be a hastable\nIf you pass a %v variable, please use the \%v syntax instead.\n") + unless ((!defined($_[1]))||(isHash($_[1]))); + $self->attr('CONFIGURATIONS','SYSTEM') = $_[1]; + + die("The third parameter of AutoLaTeX::GUI::Gtk::Window::new() should be a hastable\nIf you pass a %v variable, please use the \%v syntax instead.\n") + unless ((!defined($_[2]))||(isHash($_[2]))); + $self->attr('CONFIGURATIONS','USER') = $_[2]; + + die("The forth parameter of AutoLaTeX::GUI::Gtk::Window::new() should be a hastable\nIf you pass a %v variable, please use the \%v syntax instead.\n") + unless ((!defined($_[3]))||(isHash($_[3]))); + $self->attr('CONFIGURATIONS','PROJECT') = $_[3]; + + # Set the windows attributes + $self->set_title (formatText(_T("AutoLaTeX {}"),getAutoLaTeXVersion())); + $self->connectSignal($self,'delete-event','onQuit'); + + return $self; +} + +=pod + +=item * setAdminUser($) + +Set if the current user is an administrator. + +=cut +sub setAdminUser($) : method { + my $self = shift; + $self->SUPER::setAdminUser($_[0]); + my $title = $self->get_title (); + if ($title =~ /^(.*?)\s*\*ADMINISTRATOR\*\s*$/) { + $title = "$1"; + } + if ($_[0]) { + $title .= " "._T("*ADMINISTRATOR*"); + } + $self->set_title ("$title"); +} + +=pod + +=item * makeNotebookTab($$) + +Replies the GTK component that could be used a a label inside notebook tabs. + +=over 4 + +=item the label of the tab + +=item the icon of the tab + +=back + +=cut +sub makeNotebookTab($$) : method { + my $self = shift; + my $tabname = shift; + + my $hbox = Gtk2::HBox->new (FALSE,2); + + my $iconwgt; + + if (@_>1) { + my $icon = $self->getIcon (shift); + my $animation = Gtk2::Gdk::PixbufSimpleAnim->new ( + $icon->get_width (), + $icon->get_height (), + 1); # Rate in fps + $animation->add_frame ($icon); + foreach my $iconName (@_) { + $icon = $self->getIcon ($iconName); + $animation->add_frame ($icon); + } + $iconwgt = Gtk2::Image->new_from_animation ($animation); + } + else { + $iconwgt = Gtk2::Image->new_from_pixbuf ($self->getIcon ($_[0])); + } + + $hbox->add ($iconwgt); + + my $labelwgt = Gtk2::Label->new ($tabname); + $hbox->add ($labelwgt); + $hbox->show_all (); + + return $hbox; +} + +=pod + +=item * savePanelContents() + +Save the content of the panels. + +=cut +sub savePanelContents() : method { + my $self = shift; + my $tab; + my @panels = ( + 'translatorConfiguration', + 'systemConfiguration', + 'userConfiguration', + 'projectConfiguration', + 'toolPanel', + ); + foreach my $k (@panels) { + $tab = $self->attr('NOTEBOOK_PANEL',"$k"); + if (($tab)&&($tab->can('savePanelContent'))) { + $tab->savePanelContent() + } + } +} + +=pod + +=item * initializeDialogContent() + +Initializing the dialog content before displaying. + +=cut +sub initializeDialogContent() : method { + my $self = shift; + + $self->SUPER::initializeDialogContent(); + + # Main layout + my $mainLayout = Gtk2::Table->new ( + 2, #rows + 1, #columns + FALSE); #non uniform + $self->add ($mainLayout); + + # Initialize the panel notebook + my $notebook = Gtk2::Notebook->new (); + $self->attr('NOTEBOOK') = $notebook; + $mainLayout->attach ($notebook, + 0,1,0,1, # left, right, top and bottom columns + ['fill','expand'],['fill','expand'], # x and y options + 5,5); # horizontal and vertical paddings + $self->connectSignal($notebook,'switch-page','onNotebookPageChanged'); + + # Close button + my $buttonAlignment = Gtk2::HButtonBox->new (); + $buttonAlignment->set_layout('end'); + + my $closeButton = Gtk2::Button->new_from_stock ('gtk-close'); + $self->connectSignal($closeButton,'clicked','onQuit'); + $buttonAlignment->add ($closeButton); + + $mainLayout->attach ($buttonAlignment, + 0,1,1,2, # left, right, top and bottom columns + ['fill','expand'],'shrink', # x and y options + 5,5); # horizontal and vertical paddings + + # Open the tool panel + my $toolTab = AutoLaTeX::GUI::Gtk::ToolPanel->new ($self->attr('CONFIGURATIONS','FULL')); + $toolTab->setAdminUser( $self->isAdminUser() ); + $self->attr('NOTEBOOK_PANEL','toolPanel') = $toolTab; + $notebook->append_page($toolTab, $self->makeNotebookTab( + _T("Tools"), "tools.png")); + + # Open the project configuration + if ($self->hasProject ()) { + my $projectConfTab = AutoLaTeX::GUI::Gtk::GeneralPanel->new ( + $self->attr('CONFIGURATIONS','PROJECT'), + 'getProjectConfigFilename'); + $projectConfTab->setAdminUser( $self->isAdminUser() ); + $self->attr('NOTEBOOK_PANEL','projectConfiguration') = $projectConfTab; + $notebook->append_page($projectConfTab, $self->makeNotebookTab( + _T("Project Configuration"), "projectLevel.png")); + } + + # Create the user configuration panel + my $userConfTab = AutoLaTeX::GUI::Gtk::GeneralPanel->new ( + $self->attr('CONFIGURATIONS','USER'), + 'getUserConfigFilename'); + $userConfTab->setAdminUser( $self->isAdminUser() ); + $self->attr('NOTEBOOK_PANEL','userConfiguration') = $userConfTab; + $notebook->append_page($userConfTab, $self->makeNotebookTab( + _T("User Configuration"), "userLevel.png")); + + # Open the system configuration only if root + if ($self->isAdminUser ()) { + my $systemConfTab = AutoLaTeX::GUI::Gtk::GeneralPanel->new ( + $self->attr('CONFIGURATIONS','SYSTEM'), + 'getSystemConfigFilename'); + $systemConfTab->setAdminUser( $self->isAdminUser() ); + $self->attr('NOTEBOOK_PANEL','systemConfiguration') = $systemConfTab; + $notebook->append_page($systemConfTab, $self->makeNotebookTab( + _T("System Configuration"), "systemLevel.png")); + } + + # Create the translator panel + my $translatorTab = AutoLaTeX::GUI::Gtk::TranslatorPanel->new ( + $self->attr('CONFIGURATIONS','FULL'), + $self->attr('CONFIGURATIONS','SYSTEM'), + $self->attr('CONFIGURATIONS','USER'), + $self->attr('CONFIGURATIONS','PROJECT'), + $self); + $translatorTab->setAdminUser( $self->isAdminUser() ); + $self->attr('NOTEBOOK_PANEL','translatorConfiguration') = $translatorTab; + +} + +=pod + +=item * doLoop() + +Do the GUI interaction loop. It means that the dialog +must be displayed now and ready for interaction. + +=cut +sub doLoop() : method { + my $self = shift; + $self->show_all; + my $quit = FALSE; + my $lastmsg = ''; + resetQuitGtkFlag(); + while (!mustQuitGtk()) { + while (Gtk2->events_pending()) { + Gtk2->main_iteration(); + } + notifySystemCommandListeners(); + } + +} + +=pod + +=item * destroyDialogContent() + +Destroying the dialog content after the application was quitted. + +=cut +sub destroyDialogContent() : method { + my $self = shift; + + $self->savePanelContents(); + + $self->SUPER::destroyDialogContent(); +} + +=pod + +=item * onTranslatorPanelStateChanged($$) + +Invoked when the translator panel has its state changed. + +=cut +sub onTranslatorPanelStateChanged($$) { + my $self = shift; + my $panel = shift; + my $conflict = shift; + + my $tabTitle; + if ($conflict) { + $tabTitle = $self->makeNotebookTab(_T("Translators"), "translators_err.png", "translators.png", "translators_err.png", "translators.png", "translators_err.png", "translators.png", "translators_err.png"); + } + else { + $tabTitle = $self->makeNotebookTab(_T("Translators"), "translators.png"); + } + + if ($self->hasattr('NOTEBOOK_PANEL','translatorConfiguration')) { + $self->attr('NOTEBOOK')->set_tab_label ( + $panel, + $tabTitle); + } + else { + $self->attr('NOTEBOOK')->append_page( + $panel, + $tabTitle); + } +} + +=pod + +=item * onTranslatorPanelStateChanged($$) + +Invoked when the translator panel has its state changed. + +=cut +sub onNotebookPageChanged($$) { + my $self = shift; + my $notebook = $_[0]; + my $newpagenum = $_[2]|| 0; + my $oldpagenum = $notebook->get_current_page (); + if ($oldpagenum>=0) { + my $pageObj = $notebook->get_nth_page ($oldpagenum); + if ($pageObj->can('savePanelContent')) { + printDbgFor(3,_T("Saving hidden notebook panel")); + $pageObj->savePanelContent (); + } + } +} + +1; +__END__ + +=back + +=head1 COPYRIGHT + +(c) Copyright 2007-13 Stephane Galland E<lt>galland@arakhne.orgE<gt>, under GPL. + +=head1 AUTHORS + +=over + +=item * + +Conceived and initially developed by Stéphane Galland E<lt>galland@arakhne.orgE<gt>. + +=back + +=head1 SEE ALSO + +L<autolatex> |