#!/usr/bin/perl -w # # Copyright (C) 2003 by muppet. # # This library is free software; you can redistribute it and/or modify it under # the terms of the GNU Library General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # This library 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 library; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA. # # $Header: $ # use strict; use Gtk2 -init; use Gtk2::Gdk::Keysyms; package Gtk2::MultilineEntry; use Data::Dumper; use constant TRUE => 1; use constant FALSE => 0; use Glib::Object::Subclass Gtk2::TextView::, interfaces => [ Gtk2::CellEditable:: ], ; sub set_text { shift->get_buffer->set_text (shift); } sub get_text { my $buffer = shift->get_buffer; $buffer->get_text ($buffer->get_start_iter, $buffer->get_end_iter, TRUE); } sub START_EDITING { warn "start editing\n"; } sub EDITING_DONE { warn "editing done\n"; } sub REMOVE_WIDGET { warn "remove widget\n"; } ############################################################################### package Gtk2::CellRendererMultiline; use constant TRUE => 1; use constant FALSE => 0; use Glib::Object::Subclass "Gtk2::CellRendererText", ; __PACKAGE__->_install_overrides; sub on_get_size { shift->parent_get_size (@_) } sub on_render { shift->parent_render (@_) } sub on_start_editing { my ($cell, $event, $view, $path, $background_area, $cell_area, $flags) = @_; my $entry = Gtk2::MultilineEntry->new; $entry->set_text ($cell->get ('text')); $entry->grab_focus; $entry->signal_connect (key_press_event => sub { my ($widget, $event) = @_; if (($event->keyval == $Gtk2::Gdk::Keysyms{Return} || $event->keyval == $Gtk2::Gdk::Keysyms{KP_Enter}) and not $event->state & 'control-mask') { $cell->signal_emit (edited => $path, $entry->get_text); $entry->destroy; return TRUE; } return FALSE; }); $entry->show; return $entry; } ############################################################################### package main; use constant TRUE => 1; use constant FALSE => 0; my $window = Gtk2::Window->new; $window->set_title ("Multiline CellRenderer"); $window->signal_connect (delete_event => sub { Gtk2->main_quit; }); my $model = Gtk2::ListStore->new (qw(Glib::String)); my $view = Gtk2::TreeView->new ($model); foreach ('this is a test', "here's some text\nwith newlines in\nain't it cool\nno rubbish bin", "try editing with both\nrenderers.", "in the custom one\nuse Ctrl+Enter to\nadd a new line") { $model->set ($model->append, 0 => $_); } sub cell_edited { my ($cell, $path, $new_value) = @_; my $iter = Gtk2::TreePath->new_from_string ($path); $model->set ($model->get_iter ($iter), 0 => $new_value); } my $renderer = Gtk2::CellRendererMultiline->new; $renderer->set (editable => TRUE); $renderer->signal_connect (edited => \&cell_edited); my $column = Gtk2::TreeViewColumn->new_with_attributes ("custom renderer", $renderer, text => 0); $view->append_column ($column); $renderer = Gtk2::CellRendererText->new; $renderer->set (editable => TRUE); $renderer->signal_connect (edited => \&cell_edited); $column = Gtk2::TreeViewColumn->new_with_attributes ("standard renderer", $renderer, text => 0); $view->append_column ($column); $window->add ($view); $window->show_all; Gtk2->main;