#!/usr/bin/perl -w eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}' if 0; # not running under some shell use Tk; use Tk::DropSite qw(Sun); use Tk::DragDrop qw(Sun); require Tk::TextUndo; require Tk::FileSelect; require Tk::Menubar; use Tk::ErrorDialog; my $top = MainWindow->new(); $top->bind('Tk::TextUndo','<Alt-KeyPress>','NoOp'); $top->bind('Tk::TextUndo','<Escape>',['tag','remove','sel','1.0','end' +]); my $mb = $top->Menubar; $top->optionAdd('*TextUndo.Background' => '#fff5e1'); my $fs = $top->Component(FileSelect => 'fs',-width => 25, -height => +8, '-accept' => sub { my $file = shift ; return 0 if (-s $file && !(stat +(_))[12]); return 1 unless -e $file; return (-r $file) && (-T $file) +; }, Name => 'fs', -filter => '*'); my $t = $top->Scrolled(TextUndo, -wrap => 'none', -scrollbars => 'osre +'); my $dd = $t->DragDrop(-event => '<Meta-B1-Motion>'); $dd->configure(-startcommand => sub { return 1 unless (eval { $t->tagNextrange(sel => '1.0' +,'end')}); $dd->configure(-text => $t->get('sel.first','sel.last +')); }); $t->DropSite(-motioncommand => sub { my ($x,$y) = @_; $t->markSet(insert => "\@$x,$y"); }, -dropcommand => sub { my ($seln,$x,$y) = @_; $t->markSet(insert => "\@$x,$y"); $t->insert(insert => $t->SelectionGet(-selection => $ +seln)); } ); $mb->Menubutton(-text => '~File', -menuitems => [[Button => '~Open', -command => sub { my $file = $fs->Show(-popover => +$top, -create => 0, -verify => ['-r']); $t->Load($file) if (defined $fil +e); }]]); $mb->Menubutton(-text => '~File', -menuitems => [['Button' => '~Save', -command => [ $t , 'Save' ]], ['Button' => 'Save ~As', -command => sub { my $file = $fs->Show(-popover => $top, -cre +ate => 1, -verify => ['-w']); $t->Save($file) if (defined $file); }], ['Button' => '~Empty', -command => [ $t,'delete','1. +0','end']], '',['Button' => 'E~xit', -command => [ \&CheckSave, +$t ]], ]); $mb->Menubutton(-text => '~Edit', -menuitems => [ ['Button' => '~Undo', -command => [$t, 'undo']],'', ['Button' => '~Copy', -command => [$t, 'clipboardCop +y']], ['Button' => 'Cu~t', -command => [$t, 'clipboardCut +']], ['Button' => '~Paste', -command => [$t, 'clipboardPas +te']], '',['Button' => 'Select All', -command => [$t, 'selec +tAll']], ]); $mb->Menubutton(-text => '~Search', -menuitems => [ ['Button' => '~Find', -command => [\&AskFind, $t]], ['Button' => '~Replace', -command => [\&AskReplace, $ +t]], ]); $mb->Menubutton(-text => '~View', -menuitems => [ ['Button' => '~Line...', -command => [\&AskLine,$t]], ]); $mb->Menubutton(-text => '~Help', -side => 'right'); $t->pack(-expand => 1, -fill => 'both'); $top->protocol('WM_DELETE_WINDOW',[\&CheckSave,$t]); if (@ARGV) { if (! -e $ARGV[0]) { open(FILE,">$ARGV[0]") or die "Could not open $ARGV[0]: $!"; close(FILE) or die "There was trouble with $ARGV[0]: $!"; } $t->Load($ARGV[0]); } $t->bind('<F3>',\&DoFind); $t->update; $t->focus; MainLoop; sub CheckSave { my $t = shift; if ($t->numberChanges) { my $d = $t->toplevel->Dialog(-text => $t->FileName."\nFile has Chan +ged\nSave Edits ?", -buttons => ['Yes','No','Cancel'], -po +pover => $t); my $rep = $d->Show; return if $rep eq 'Cancel'; if ($rep eq 'Yes') { $t->Save or return; } } $t->toplevel->destroy; } my $str; sub DoFind { my $t = shift; $str = shift if (@_); my $posn = $t->index('insert+1c'); $t->tag('remove','sel','1.0','end'); local $_; while ($t->compare($posn,'<','end')) { my ($line,$col) = split(/\./,$posn); $_ = $t->get("$line.0","$posn lineend"); pos($_) = $col; if (/\G(.*)$str/g) { $col += length($1); $posn = "$line.$col"; $t->SetCursor($posn); $t->tag('add','sel',$posn,"$line.".pos($_)); $t->focus; return; } $posn = $t->index("$posn lineend + 1c"); } } sub AskFind { my ($t) = @_; unless (exists $t->{'AskFind'}) { my $d = $t->{'AskFind'} = $t->Toplevel(-popover => 'cursor', -popan +chor => 'nw'); $d->title('Find...'); $d->withdraw; $d->transient($t->toplevel); my $e = $d->Entry->pack; $e->bind('<Return>', sub { $d->withdraw; DoFind($t,$e->get); }); $d->protocol(WM_DELETE_WINDOW =>[withdraw => $d]); } $t->{'AskFind'}->Popup; $t->update; $t->{'AskFind'}->focusNext; } sub AskLine { my ($t) = @_; unless (exists $t->{'AskLine'}) { my $d = $t->{'AskLine'} = $t->Toplevel(-popover => 'cursor', -popan +chor => 'nw'); $d->title('Goto Line ...'); $d->withdraw; $d->transient($t->toplevel); my $e = $d->Entry->pack; $e->bind('<Return>', sub { my $e = shift; $d->withdraw; my $posn = $e->get.'.0'; $t->SetCursor($posn); $t->focus; }); $d->protocol(WM_DELETE_WINDOW =>[withdraw => $d]); } $t->{'AskLine'}->Popup; $t->update; $t->{'AskLine'}->focusNext; } __END__


cheers,
rass


In reply to Simple Text Editor using the tk Wrapper by rass

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.