Re: GTK & Perl
- From: Sascha Ziemann <szi aibon ping de>
- To: gtk-list redhat com
- Subject: Re: GTK & Perl
- Date: 02 Jul 1998 08:40:27 +0200
Alberto Manuel Brandao Simoes <mc23801@ci.uminho.pt> writes:
| Can someone help me finding an simple example of a program
| using ondly perl and GTK+? Thanks, and good work!
#! /usr/bin/perl
##
## A simple Serach and Replace Tool
##
## Copyright (C) 1998 Sascha Ziemann
##
## Copying: GPL
##
use Gtk;
#
# Callbacks
#
sub destroy_window {
my($widget, $windowref, $w2) = @_;
$$windowref = undef;
$w2 = undef if defined $w2;
0;
}
sub file_selection_ok {
my($widget, $fs) = @_;
if (-d $fs->get_filename) {
$directory_entry->set_text ($fs->get_filename);
destroy $fs;
} else {
Gtk->print ("Select a directory\n");
}
}
sub select_dir {
Gtk->print("+++ select dir\n");
if (not defined $fs_window) {
$fs_window = new Gtk::FileSelection "Select Directory";
$fs_window->position(-mouse);
$fs_window->signal_connect("destroy", \&destroy_window, \$fs_window);
$fs_window->signal_connect("delete_event", \&destroy_window, \$fs_window);
$fs_window->ok_button->signal_connect("clicked", \&file_selection_ok, $fs_window);
$fs_window->cancel_button->signal_connect("clicked", sub { destroy $fs_window });
}
if (!visible $fs_window) {
show $fs_window;
} else {
destroy $fs_window;
}
}
@files = ();
sub filter_files {
$dirname = $directory_entry->get_text;
$filter = $filter_entry->get_text;
$filter =~ s/\./\\./g; # FIXME: this might be not enough
$filter =~ s/\*/.*/g;
opendir (DIR, $dirname);
@files = grep { /^$filter$/ && -f "$dirname/$_" } readdir(DIR);
closedir (DIR);
$text->freeze;
$text->realize;
$text->backward_delete($text->get_point);
foreach $file (@files) {
$text->insert(undef, $text->style->black, undef, $file ."\n");
}
$text->thaw;
}
sub run_search {
$search_regx = $search_entry->get_text;
$text->freeze;
$text->realize;
$text->backward_delete($text->get_point);
$dirname = $directory_entry->get_text;
foreach $file (@files) {
open (FILE, "$dirname/$file");
$lineno = 0;
while (<FILE>) {
if (/$search_regx/) {
$text->insert(undef, $text->style->black, undef,
"$file:$lineno: ");
@line_parts = split (/($search_regx)/);
$delim = 0;
foreach $part (@line_parts) {
if ($delim) {
$text->insert(undef, $text->style->white,
$text->style->black,
$part);
} else {
$text->insert(undef, $text->style->black, undef,
$part);
}
$delim = !$delim;
}
}
$lineno++;
}
close (FILE);
}
$text->thaw;
}
sub run_replace {
$search_regx = $search_entry->get_text;
$replace_expr = $replace_entry->get_text;
$dirname = $directory_entry->get_text;
foreach $file (@files) {
open (FILE, "$dirname/$file");
@lines = <FILE>;
close (FILE);
open (FILE, "> $dirname/$file");
foreach (@lines) {
s/$search_regx/$replace_expr/g;
print FILE;
}
close (FILE);
}
$text->freeze;
$text->realize;
$text->backward_delete($text->get_point);
$text->thaw;
}
#
# Inits
#
init Gtk;
#
# Window, main vbox and table
#
$window = new Gtk::Widget "GtkWindow",
GtkWindow::type => -toplevel,
GtkWindow::title => "Search & Replace",
GtkWindow::allow_grow => 1,
GtkWindow::allow_shrink => 1,
GtkContainer::border_width => 10,
GtkObject::signal::destroy => \&Gtk::main_quit,
GtkObject::signal::delete_event => \&Gtk::false;
$vbox = new_child $window "GtkVBox",
GtkBox::spacing => 5,
GtkWidget::visible => 1;
$table = new Gtk::Table (4, 3, 0);
$table->set_row_spacings(5);
$table->set_col_spacings(5);
$table->border_width(0);
$vbox->pack_start($table, 0, 0, 0);
$table->show;
#
# Directory row
#
$directory_label = new Gtk::Label "Directory: ";
$directory_label->set_alignment(0, 0.5);
$table->attach($directory_label, 0, 1, 0, 1,
{expand=>0, fill=>0},
{expand=>0, fill=>0},
0, 0);
$directory_label->show;
$directory_entry = new Gtk::Entry;
$directory_entry->set_text (".");
$table->attach($directory_entry, 1, 2, 0, 1,
{expand=>1, fill=>1},
{expand=>1, fill=>1},
0, 0);
$directory_entry->show;
$select_button = new Gtk::Widget "GtkButton",
GtkButton::label => "Select",
GtkObject::signal::clicked => \&select_dir;
$table->attach($select_button, 2, 3, 0, 1,
{expand=>0, fill=>0},
{expand=>0, fill=>0},
0, 0);
$select_button->show;
#
# Filter row
#
$filter_label = new Gtk::Label "Filter: ";
$filter_label->set_alignment(0, 0.5);
$table->attach($filter_label, 0, 1, 1, 2,
{expand=>0, fill=>0},
{expand=>0, fill=>0},
0, 0);
$filter_label->show;
$filter_entry = new Gtk::Entry;
$filter_entry->set_text ("*.html");
$table->attach($filter_entry, 1, 2, 1, 2,
{expand=>1, fill=>1},
{expand=>1, fill=>1},
0, 0);
$filter_entry->show;
$filter_button = new Gtk::Widget "GtkButton",
GtkButton::label => "Filter",
GtkObject::signal::clicked => \&filter_files;
$table->attach($filter_button, 2, 3, 1, 2,
{expand=>0, fill=>0},
{expand=>0, fill=>0},
0, 0);
$filter_button->show;
#
# Search row
#
$search_label = new Gtk::Label "Search: ";
$search_label->set_alignment(0, 0.5);
$table->attach($search_label, 0, 1, 2, 3,
{expand=>0, fill=>0},
{expand=>0, fill=>0},
0, 0);
$search_label->show;
$search_entry = new Gtk::Entry;
$search_entry->set_text ("http://www");
$table->attach($search_entry, 1, 2, 2, 3,
{expand=>1, fill=>1},
{expand=>1, fill=>1},
0, 0);
show $search_entry;
$search_button = new Gtk::Widget "GtkButton",
GtkButton::label => "Search",
GtkObject::signal::clicked => \&run_search;
$table->attach($search_button, 2, 3, 2, 3,
{expand=>0, fill=>0},
{expand=>0, fill=>0},
0, 0);
show $search_button;
#
# Replace row
#
$replace_label = new Gtk::Label "Replace: ";
$replace_label->set_alignment(0, 0.5);
$table->attach($replace_label, 0, 1, 3, 4,
{expand=>0, fill=>0},
{expand=>0, fill=>0},
0, 0);
show $replace_label;
$replace_entry = new Gtk::Entry;
$replace_entry->set_text ("ftp://ftp");
$table->attach($replace_entry, 1, 2, 3, 4,
{expand=>1, fill=>1},
{expand=>1, fill=>1},
0, 0);
show $replace_entry;
$replace_button = new Gtk::Widget "GtkButton",
GtkButton::label => "Replace",
GtkObject::signal::clicked => \&run_replace;
$table->attach($replace_button, 2, 3, 3, 4,
{expand=>0, fill=>0},
{expand=>0, fill=>0},
0, 0);
show $replace_button;
#
# Text box
#
$text_table = new Gtk::Table(2,2,0);
$text_table->set_row_spacing(0,2);
$text_table->set_col_spacing(0,2);
$vbox->pack_start($text_table,1,1,0);
$text_table->show;
$text = new Gtk::Text(undef,undef);
$text_table->attach_defaults($text, 0,1,0,1);
show $text;
$hscrollbar = new Gtk::HScrollbar($text->hadj);
$text_table->attach($hscrollbar, 0, 1,1,2,[-expand,-fill],[-fill],0,0);
$hscrollbar->show;
$vscrollbar = new Gtk::VScrollbar($text->vadj);
$text_table->attach($vscrollbar, 1, 2,0,1,[-fill],[-expand,-fill],0,0);
$vscrollbar->show;
$text->freeze;
$text->realize;
$text->insert(undef, $text->style->black, undef,
"\n Be carefully! This is ALPHA stuff!\n" .
"\n Okay Baby - let's hit me!\n" .
"\n You have to filter befor you can search\n");
$text->thaw;
#
# let's go
#
show $window;
main Gtk;
--
http://www.ping.de/sites/aibon/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]