Tk-TextHighlight

 view release on metacpan or  search on metacpan

lib/Tk/TextHighlight.pm  view on Meta::CPAN

package Tk::TextHighlight;

use vars qw($VERSION);
$VERSION = '2.2';
use Tk qw(Ev);
use strict;
use Storable;
use File::Basename;

my $blockHighlight = 0;     #USED TO PREVENT RECURSIVE CALLS TO RE-HIGHLIGHT!
my $nodoEvent = 0;          #USED TO PREVENT REPEATING (RUN-AWAY) SCROLLING!
our ($readonly, $TEXTWIDGET, $haveSuperText);

#NOTE:  TextHighlight SUPPORTS USING EITHER SuperText, OR TextUndo (ROText IF USING ROTextOnly SYMLINK).
#       SuperText USES Text (NOT TextUndo).  THE OPTIONAL ROSuperText SYMLINK (uses ROText)
#		IS *NOT* (AND CAN NOT BE) USED HERE!
BEGIN {
	$haveSuperText = 0;
	$readonly = (__FILE__ =~ /RO/o) ? 1 : 0;
	$TEXTWIDGET = 'Tk::Text::SuperText';  #FIRST TRY SuperText:
	my $evalstr = "use $TEXTWIDGET; \$haveSuperText = 1; 1";
	eval $evalstr;
	unless ($haveSuperText) {  #IF SuperText NOT INSTALLED, THEN TRY TextUndo (or ROText):
		$TEXTWIDGET = $readonly ? 'Tk::ROText' : 'Tk::TextUndo';
		$evalstr = "use $TEXTWIDGET; \$haveSuperText = 1; 1";
		eval $evalstr;
	}
	die "e:TextHighlight could not load required widget ($TEXTWIDGET) ($@)!\n"  if ($@);
	$evalstr = "use base ('Tk::Derived', '$TEXTWIDGET')";
	eval $evalstr;
	die "e:TextHighlight could not load base widget ($TEXTWIDGET) ($@)!\n"  if ($@);
};

Construct Tk::Widget 'TextHighlight';

my %syntaxcomments = (  #ALTERNATE COMMENT CHARACTERS FOR SELECTED LANGUAGES (CAN ADD MORE HERE):
	'Kate::C' => '/*',
	'Kate::C++' => '/*',
	'Kate::CPP' => '/*',
	'HTML' => '<!--',
	'Kate::HTML' => '<!--',
	'Kate::Modula-2' => '(*',
	'Kate::Pascal' => '(*',
	'Kate::XML' => '<!--',
);

sub Populate {
	my ($cw,$args) = @_;
	$args->{'-noPopupMenu'} = 0  unless (defined $args->{'-noPopupMenu'});
	$cw->{'-noPopupMenu'} = $args->{'-noPopupMenu'};
	#REMOVE ARGS THAT SUBWIDGETS CAN'T HANDLE:
	my $superargsOK; #THIS INITIALIZATION REQUIRES 2 LINES (my $superargsOK = $args) IS REFERENCE & WILL OVERWRITE LATTER!:
	%{$superargsOK} = %{$args};
	foreach my $badarg (qw(-autoindent -smartindent -match -matchoptions -indentchar
			-disablemenu -commentchar -colorinf -colored -syntax -rules -updatecall 
			-noRulesMenu -noSyntaxMenu -noRulesEditMenu -noSaveRulesMenu -noPlugInit 
			-noPopupMenu -highlightInBackground -syntaxcomments)) {
		delete ($superargsOK->{$badarg})  if (defined($superargsOK->{$badarg}));
	}
	if ($TEXTWIDGET =~ /SuperText/) {
		#ADD ONE THAT IS DIFFERENT (OVERRIDDEN BY OURS):
		$superargsOK->{'-matchingcouples'} = $args->{'-match'}  if (defined $args->{'-match'});
	} else {
		foreach my $badarg (qw(-matchingcouples -showmatching -ansicolor)) {
			delete ($superargsOK->{$badarg})  if (defined($superargsOK->{$badarg}));
			delete ($args->{$badarg})  if (defined($args->{$badarg}));  #-ansicolor MUST ALSO BE REMOVED HERE - DON'T KNOW WHY?!
		}
	}

	$cw->SUPER::Populate($superargsOK);

	my %configSpecs = (
		-autoindent => [qw/PASSIVE autoindent Autoindent/, 0],
		-smartindent => [qw/PASSIVE undef undef/, 1],
		-match => [qw/PASSIVE match Match/, '[]{}()'],
		-matchoptions	=> [qw/METHOD matchoptions Matchoptions/, 
			[-foreground => 'yellow', -background => 'red']], #SuperText'S IS white ON blue, BUT CLASHES W/TOO MANY RULES.
		-indentchar => [qw/PASSIVE indentchar Indentchar/, "\t"],
		-disablemenu => [qw/PASSIVE disablemenu Disablemenu/, 0],
		-commentchar => [qw/PASSIVE commentchar Commentchar/, "#"],
		-syntaxcomments => [qw/PASSIVE undef undef/, 0],    #JWT: ADDED v2 FEATURE.
		-colorinf => [qw/PASSIVE undef undef/, []],
		-colored => [qw/PASSIVE undef undef/, 0],
		-syntax	=> [qw/PASSIVE syntax Syntax/, 'None'],
		-rules	=> [qw/PASSIVE undef undef/, undef],
		-rulesdir	=> [qw/PASSIVE rulesdir Rulesdir/, ''],
		-updatecall	=> [qw/PASSIVE undef undef/, sub {}],
		-noRulesMenu => [qw/PASSIVE undef undef/, 0],       #JWT: ADDED FEATURE.
		-noSyntaxMenu => [qw/PASSIVE undef undef/, 0],      #JWT: ADDED FEATURE.



( run in 0.688 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )