The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Copyright 2010, 2011, 2012, 2013 Kevin Ryde

# This file is part of Math-Image.
#
# Math-Image 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 3, or (at your option) any
# later version.
#
# Math-Image 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 Math-Image.  If not, see <http://www.gnu.org/licenses/>.

package App::MathImage::Gtk2::Ex::ToolItem::ComboText::MenuView;
use 5.008;
use strict;
use warnings;
use Gtk2;
use Gtk2::Ex::MenuView 4; # v.4 for item_get_path()
use App::MathImage::Gtk2::Ex::ToolItem::ComboText::MenuItem;

# uncomment this to run the ### lines
#use Smart::Comments;

our $VERSION = 110;

use Glib::Object::Subclass
  'Gtk2::Ex::MenuView',
  signals => { item_create_or_update => \&_do_item_create_or_update };

sub INIT_INSTANCE {
  my ($self) = @_;
  $self->set (want_activate => 'no');
}

sub _do_item_create_or_update {
  my ($self, $item, $model, $path, $iter) = @_;
  ### ComboText MenuView _do_item_create_or_update(): "path=".$path->to_string
  my $str = $model->get ($iter, 0);
  if ($item) {
    $item->get_child->set_text ($str);
  } else {
    $item = App::MathImage::Gtk2::Ex::ToolItem::ComboText::MenuItem->new_with_label ($str);
  }
  return $item;
}

# from combobox change
sub set_active_iter {
  my ($self, $iter) = @_;
  ### ComboText-MenuView set_active_iter()...

  my $model;
  my $path = $iter
    && ($model = $self->get('model'))
      && $model->get_path($iter);
  $self->set_active_path($path);
}
sub set_active_path {
  my ($self, $path) = @_;
  #  $self->_current_item_at_path($path)
  $self->set_active_item ($self->item_at_path ($path));
}

# from item activate
sub set_active_item {
  my ($self, $item) = @_;
  ### ComboText-MenuView set_active_item(): defined $item && $item->get_child->get_text
  ###   old item: defined $self->{'active_item'} && $self->{'active_item'}->get_child->get_text

  # watch out for recurse from combobox 'changed' handler
  my $old_item = $self->{'active_item'};
  if (($old_item||0) == ($item||0)) {
    ### unchanged: ($old_item||0).'', ($item||0).''
    return;
  }
  Scalar::Util::weaken ($self->{'active_item'} = $item);

  if ($old_item) {
    $old_item->set_active (0);
  }
  if ($item) {
    $item->set_active (1);
  }
  if (my $toolitem = $self->{'toolitem'}) {
    if (my $combobox = $toolitem->get_child) {
      Gtk2::Ex::ComboBoxBits::set_active_path
          ($combobox, $item && $self->item_get_path($item));
    }
  }
}

1;
__END__