summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl/lib/Tk/demos/widtrib/Gedi.pl
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlperl/lib/Tk/demos/widtrib/Gedi.pl')
-rw-r--r--Master/tlpkg/tlperl/lib/Tk/demos/widtrib/Gedi.pl429
1 files changed, 429 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl/lib/Tk/demos/widtrib/Gedi.pl b/Master/tlpkg/tlperl/lib/Tk/demos/widtrib/Gedi.pl
new file mode 100644
index 00000000000..ff847000e05
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Tk/demos/widtrib/Gedi.pl
@@ -0,0 +1,429 @@
+# Gedi master advanced text editor.
+
+use Tk::TextEdit;
+
+use vars qw/$TOP/;
+
+my $TOP;
+my $text_frame;
+my $counter_frame;
+my $textwindow;
+my $current_line_label;
+my $total_line_label;
+my $current_column_label;
+my $insert_overstrike_mode_label;
+my $about_pop_up_reference;
+my $menu;
+my $help_menu;
+
+sub about_pop_up
+{
+ my $name = ref($about_pop_up_reference);
+ if (defined($about_pop_up_reference))
+ {
+ $about_pop_up_reference->raise;
+ $about_pop_up_reference->focus;
+ }
+ else
+ {
+ my $pop = $TOP->Toplevel();
+ $pop->title("About");
+
+ $pop->Label(-text=>"Gedi (Gregs EDItor)")->pack();
+ $pop->Label(-text=>"Ver. 1.0")->pack();
+ $pop->Label(-text=>"Copyright 1999")->pack();
+ $pop->Label(-text=>"Greg London")->pack();
+ $pop->Label(-text=>"All Rights Reserved.")->pack();
+ $pop->Label(-text=>"This program is free software.")->pack();
+ $pop->Label(-text=>"You can redistribute it and/or")->pack();
+ $pop->Label(-text=>"modify it under the same terms")->pack();
+ $pop->Label(-text=>"as Perl itself.")->pack();
+ $pop->Label(-text=>"Special Thanks to")->pack();
+ $pop->Label(-text=>"Nick Ing-Simmons.")->pack();
+
+ my $button_ok = $pop->Button(-text=>'OK',
+ -command => sub {$pop->destroy();
+ $about_pop_up_reference = undef;
+ } )
+ ->pack();
+ $pop->resizable('no','no');
+ $about_pop_up_reference = $pop;
+ }
+}
+
+
+sub update_indicators
+{
+ my ($line,$column)= split(/\./,$textwindow->index('insert'));
+ $current_line_label->configure (-text=> "line: $line");
+ $current_column_label->configure (-text=> "column: $column");
+
+ my ($last_line,$last_col) = split(/\./,$textwindow->index('end'));
+ $total_line_label->configure (-text=> "total lines: $last_line");
+
+ my $mode = $textwindow->OverstrikeMode;
+ my $overstrke_insert='Insert Mode';
+ if ($mode)
+ {$overstrke_insert='Overstrike Mode';}
+ $insert_overstrike_mode_label->configure
+ (-text=> "$overstrke_insert");
+
+ my $filename = $textwindow->FileName;
+ $filename = 'NoName' unless(defined($filename));
+ my $edit_flag='';
+ if($textwindow->numberChanges)
+ {$edit_flag='edited';}
+ $TOP->configure(-title => "Gedi $edit_flag $filename");
+ $textwindow->idletasks;
+
+}
+
+
+
+
+
+
+sub Gedi {
+ my($demo) = @_;
+ $TOP = $MW->WidgetDemo(
+ -name => $demo,
+ -text => 'Gedi master advanced text editor ',
+ -geometry_manager => 'grid',
+ -title => 'GEDI Text Editor',
+ -iconname => 'GEDI',
+ );
+
+$TOP->withdraw;
+
+$text_frame = $TOP->Frame->pack
+ (-anchor=>'nw', -expand=>'yes', -fill => 'both'); # autosizing
+$counter_frame = $TOP->Frame->pack(-anchor=>'nw');
+
+$textwindow = $text_frame->Scrolled(
+ 'TextEdit',
+ exportselection => 'true', # 'sel' tag is associated with selections
+ # initial height, if it isnt 1, then autosizing fails
+ # once window shrinks below height
+ # and the line counters go off the screen.
+ # seems to be a problem with the Tk::pack command;
+# height => 40,
+ -background => 'white',
+ -wrap=> 'none',
+ -setgrid => 'true', # use this for autosizing
+ -scrollbars =>'se')
+ -> pack(-expand => 'yes' , -fill => 'both'); # autosizing
+
+$TOP->protocol('WM_DELETE_WINDOW'=>
+ sub{$textwindow->ConfirmExit;}
+ );
+
+$SIG{INT} = sub {$textwindow->ConfirmExit;};
+
+$current_line_label = $counter_frame
+ -> Label(-text=>'line: 1')
+ -> grid(-row=>1,-column=>1, -sticky=>'nw' );
+
+$total_line_label = $counter_frame
+ -> Label(-text=>'total lines: 1')
+ -> grid(-row=>2,-column=>1, -sticky=>'nw' );
+
+$current_column_label = $counter_frame
+ -> Label(-text=>'column: 0')
+ -> grid(-row=>3,-column=>1, -sticky=>'nw' );
+
+$insert_overstrike_mode_label = $counter_frame
+ -> Label(-text=>' ')
+ -> grid(-row=>5,-column=>1, -sticky=>'nw' );
+
+$textwindow->SetGUICallbacks (
+ [
+ \&update_indicators,
+ sub{$textwindow->HighlightAllPairsBracketingCursor}
+ ]
+);
+
+$menu = $textwindow->menu;
+
+$TOP->configure(-menu => $menu);
+
+$help_menu = $menu->cascade(-label=>'~Help', -tearoff => 0, -menuitems => [
+ [Command => 'A~bout', -command => \&about_pop_up]
+ ]);
+
+
+#$TOP->minsize(30,1);
+#$TOP->geometry("80x24");
+
+while(<DATA>)
+ {$textwindow->insert('insert',$_);}
+$textwindow->ResetUndo;
+
+$textwindow->CallNextGUICallback;
+
+# adjust height
+$TOP->update;
+my $menuheight = ($TOP->wrapper)[1];
+my $TOPheight = 30 + $TOP->reqheight + $menuheight;
+if ($TOP->screenheight < $TOPheight) {
+ $textwindow->GeometryRequest($textwindow->reqwidth, $textwindow->reqheight - ($TOPheight - $TOP->screenheight));
+}
+$TOP->deiconify;
+
+}
+
+
+__DATA__
+
+Tk800.015 contains many modifications to the
+text based modules, as well as new text modules
+and an application that uses them all.
+Text.pm, TextUndo.pm, TextEdit.pm, and gedi
+have all been updated since the release prior
+to Tk800.015.
+
+This demo contains a rundown of all the features
+of the text modules, and
+
+What is available in the text modules?
+================================================
+
+Text.pm
+========
+
+Text.pm is the base text editing module.
+Beyond the core functionality of typing text,
+Text.pm has built in menu support for basic
+editing features such as Find/Replace text,
+Copy/Cut/Paste, Goto Line Number, and What
+Line Number queries.
+
+These functions are available simply by right
+clicking the mouse over the text area. Doing
+so will cause a pop-up menu to appear which will
+contain cascading menus to give access to all of
+these new functions.
+
+Many of these functions will create their own
+pop-up windows. Find/Replace will create a pop-up
+window which contains an entry for text to
+find, an entry for replace text, a number of
+radio buttons to control options such as
+case sensitivity, and several command buttons to
+perform functions such as Find, Find All,
+Replace, Replace All.
+
+All of these features have corresponding methods
+built into the Text widget. This allows the basic
+functions to be built into the widget, and also
+allows added features to be built on the lower
+level methods as needed. No one should have to
+reinvent the wheel when it comes to text editing
+features.
+
+Insert and Overstrike modes are also supported
+in the Text.pm module. Pressing the <Insert>
+key will toggle modes back and forth.
+
+Column based copy/cut/paste features are also
+available in the Text.pm module. They are bound
+to the following keys:
+
+<F1> clipboardColumnCopy
+<F2> clipboardColumnCut
+<F3> clipboardColumnPaste
+
+Currently, column based operations are beta versions.
+They compensate for tabs, but they will not behave
+properly unless the text is all the same font, and
+is the same width per character.
+
+Hopefully some future version of Text.pm will correct
+for this deficiency.
+
+Column paste should work with overstrike mode.
+
+
+TextUndo.pm
+=============
+
+TextUndo.pm is the second level module, being
+derived from the Text.pm module. As it's name
+implies, TextUndo supports "UNDO" capability.
+It now also supports "REDO" capability.
+
+Undo/redo works on user typed commands and
+also programmatically, so that any application
+that causes text to be inserted or deleted
+can be undone/redone, whether it was directly
+typed by the user or indirectly through another
+method.
+
+The undo/redo functions support tags, so that
+if you delete text with tags, undo will re-insert
+the text and re-tag it as well. This will eventually
+allow the text modules to support more sophisticated
+word processing type features. Such functionality
+should be available in a future release of the
+text modules.
+
+The TextUndo.pm module also has several added
+features to support file based operations.
+File based methods include ->Save, ->Load, and
+->Include. All methods take a filename as a
+parameter. These methods will create a progress
+widget to indicate the progress of the operation.
+
+The other feature of the TextUndo.pm module
+is the ConfirmDiscard method. This method checks to
+see if the text has been modified since it was
+last saved. If it has been modified, and the
+it will create a pop-up menu asking the user
+if they want to save the text to a file before
+exiting. This method can easily be tied into
+the exit routines, and signal handlers, to provide
+a consistent "save before exit?" feel.
+
+TextEdit.pm
+=============
+
+The TextEdit.pm is a new module in prototype version
+which adds further features to the text modules.
+TextEdit is based off of the TextUndo module,
+and so has all of the features of TextUndo and
+Text.
+
+Features of the TextEdit.pm module include
+parenthesis matching. The module looks at the
+current cursor position and then tries to find
+the parenthesis that bracket the cursor.
+Character pairs that are searched for are:
+() {} [] "" ''
+
+It also checks the position of the pairs to
+try to highlight bad positions. The module
+assumes that if the pairs are not on the same
+line or not on the same column, then there
+might be a missing parenthesis somewhere.
+Characters that appear to not align are
+highlighted in red.
+
+(quotations must start and end on the same line)
+
+
+PARENTHISIS MATCHING DEMO:
+move the cursor to the x between the quotes
+on the line below:
+
+
+{
+ ( )
+ ( { }
+ [
+ ' ">> x <<" '
+ [] ]
+ )
+
+}
+
+PARENTHESIS MISMATCHING DEMO:
+move the cursor to the x between the quotes
+on the line below:
+
+
+{
+ ( )
+ ( <<RED possible error { }
+ [
+ ' ">> x <<" '
+ [] ]
+ ) <<RED possible error
+
+}
+
+
+
+Another feature of the TextEdit module is support
+for application level indicators which reflect
+the status of certain internals. The line and
+column position of the cursor, the total length
+of the file, whether the widget is in insert or
+overstrike mode. Anytime anything occurs that could
+affect these values, a user supplied callback
+is invoked. This callback is supplied by the
+application so that the application can update
+whatever indicators it uses, however it implements
+them.
+
+One other feature of the TextEdit.pm module is
+block level text indention and block level text
+commenting. If a block of text is selected,
+that text can be indented or unindented wiht
+a single keystroke. It can also be commented
+out or uncommented as well. The keystroke bindings
+that support this are:
+
+<F5> IndentSelectedLines
+<F6> UnindentSelectedLines
+
+<F7> CommentSelectedLines
+<F8> UncommentSelectedLines
+
+These bindings only operate on the currently
+selected text. The indent string and the comment
+string can be programmed to be anything, but
+defaults to "\t" (tab) for indent and "#" for
+comments.
+
+(currently the widget hash is used to store these values.
+$w->{'INDENT_STRING'} and $w->{'LINE_COMMENT_STRING'}
+At some point in the future, this will be changed to
+use configure options to set these values.
+any application that changes these values should do
+so in such a way that when the TextEdit module changes,
+the application can be easily changed to handle this)
+
+
+
+gedi application
+=====================
+gedi is short for Greg's EDItor.
+The "g" is soft, pronounced like a "j".
+
+The gedi application uses all of the features of
+the text modules, Text, TextUndo, and TextEdit.
+It supplies TextEdit with a callback to update
+the indicator displays. This information includes
+the current cursor position, insert/overstrike
+mode, length of the file, filename, and whether
+the file has been edited or not.
+
+The bottom of this display contains
+line number
+column number
+total lines
+insert/overstrike mode.
+
+The title bar contains
+filename
+and if the file has been edited, the word "edited".
+
+Where gedi is installed depends on your system,
+but it is part of the tarkit for Tk800.015 and above.
+
+gedi was created to be put a perl editor in with the
+perl tar kit.
+
+NOTE: THIS IS NOT THE ACTUAL GEDI APPLICATION, BUT
+A DEMO SET UP TO BE SIMILAR IN NATURE TO THE GEDI
+APPLICATION. THE ACTUAL GEDI APPLICATION IS PART OF
+THE TK800.015 TARKIT. WHERE IT IS LOCATED ON YOUR
+SYSTEM WILL VARY DEPENDING ON YOUR SYSTEM. ONCE
+YOU LOCATE THE GEDI APPLICATION, PUT IT IN YOUR
+EXECUTABLE PATH, AND YOU WILL BE ABLE TO USE IT AS
+A TEXT EDITOR.
+
+
+
+
+
+