package MTools::Comp::MFocuser; # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU LGPL Libray 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 Library General Public License for more details. # # You should have received a copy of the GNU Library 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, # or refer to http://www.gnu.org/copyleft/lgpl.html # ################################################################## # L'objet MFocuser permet de gerer le focus entre plusieurs objets # # Parametres : # * @targets : objets entre lesquels est gere le focus # Fonctions : # * add : permet de prendre en compte un nouvel objet # * setFocused : force le focus sur un objet use strict; use MTools; use vars qw /@ISA/; BEGIN { @ISA = qw /MTools::MObjet/; } use Tk; sub new { my ($class, @targets) = @_; my $self = new MTools::MObjet (); bless $self, $class; $self -> recordProperty (focused => undef); $self -> recordEvent ('GET_FOCUS'); $self -> recordEvent ('SET_FOCUS'); if (defined @targets) { $self -> {__targets} = \@targets; } for (my $i; $i < @targets; $i++) { $targets [$i] -> binding ('GET_FOCUS', ['setFocused', $self]); } $self -> binding ('SET_FOCUS', ['setFocused', $self]); return $self; } sub add { my ($self, $tg) = @_; push (@{$self -> {__targets}}, $tg); $tg -> binding ('GET_FOCUS', ['setFocused', $self]); } sub remove { my ($self, $tg) = @_; if (!defined $self -> {__targets}) {return;} my @tgs = @{$self -> {__targets}}; for (my $i = 0; $i < @tgs; $i++) { if ($tgs [$i] == $tg) { splice (@{$self -> {__targets}}, $i, 1); return; } } } sub setFocused { my ($self, $tg) = @_; $self -> mconfigure (focused => $tg); if (!defined $self -> {__targets}) {return;} my @tgs = @{$self -> {__targets}}; my $from_children = 0; for (my $i = 0; $i < @tgs; $i++) { if ($tgs [$i] ne $tg) { $tgs [$i] -> notify ('SET_FOCUS'); } else { $from_children = 1; } } if ($from_children) { $self -> notify ('GET_FOCUS', $self); } } 1;