[comment {-*- tcl -*- doctools manpage}]
[manpage_begin ctext n 3.1]
[copyright {George Peter Staplin <GeorgePS@XMission.com>}]
[moddesc {Ctext a text widget with highlighting support}]
[titledesc {Ctext a text widget with highlighting support}]
[require Tk]
[require ctext [opt 3.1]]
[description]

The [package ctext] package provides the ctext widget which
is an enhanced text widget with support for configurable syntax
highlighting and some extra commands.

[para]

Ctext overloads the text widget and provides
new commands, named [method highlight], [method copy], [method paste],[method cut],
[method append], and [method edit].  It also provides several
commands that allow you to define classes.
Each class corresponds to a tag in the widget.

[section COMMANDS]

[list_begin definitions]
[call [cmd ctext] [arg pathName] [opt [arg options]]]

Creates and configures a ctext widget.

[list_end]

[section {HIGHLIGHTING}]

Highlighting is controlled with text widget tags, that are called highlight classes. 
The [arg class] is a tag name and can be configured like any text widget tag.
Four types of highlight classes are supported. All highlight classes are automatically used
by the [method highlight] method of the widget. 

[list_begin definitions]

[call [cmd ::ctext::addHighlightClass] [arg pathName] [arg class] [arg color] [arg keywordlist]]

Add a highlighting class [arg class] to the ctext widget [arg pathName].
The highligthing will be done with the color [arg color]. All words in the [arg keywordlist] will be
highlighted.

[example {
	# highlight some tcl keywords
	::ctext::addHighlightClass .t tclkeywords red [list set info interp uplevel upvar]]
 }]

[call [cmd ::ctext::addHighlightClassWithOnlyCharStart] [arg pathName] [arg class] [arg color] [arg char]]

Add a highlighting class [arg class] to the ctext widget [arg pathName].
The highligthing will be done with the color [arg color]. All words starting with [arg char] will be
highlighted.

[example {
	::ctext::addHighlightClassWithOnlyCharStart .t vars blue \$
 }]

[call [cmd ::ctext::addHighlightClassForSpecialChars] [arg pathName] [arg class] [arg color] [arg charstring]]

Add a highlighting class [arg class] to the ctext widget [arg pathName].
The highligthing will be done with the color [arg color]. All chars in [arg charstring] will be
highlighted.

[call [cmd ::ctext::addHighlightClassForRegexp] [arg pathName] [arg class] [arg color] [arg pattern]]

Add a highlighting class [arg class] to the ctext widget [arg pathName].
The highligthing will be done with the color [arg color]. All text parts matching the regexp [arg pattern]
will be highligthed.

[call [cmd ::ctext::clearHighlightClasses] [arg pathName]]

Remove all highlight classes from the widget [arg pathName].

[call [cmd ::ctext::getHighlightClasses] [arg pathName]]

List all highlight classes for the widget [arg pathName].

[call [cmd ::ctext::deleteHighlightClass] [arg pathName] [arg class]]

Delete the highlight class [arg class] from the widget [arg pathName]

[call [cmd ::ctext::enableComments] [arg enable]]

Enable C comment highlighting. The [arg class] for c-style comments is [const _cComment].
The C comment highlighting is disabled by default.

[call [cmd ::ctext::disableComments] [arg enable]]

Disable C comment highlighting. 

[list_end]

[section {WIDGET COMMANDS}]

Each ctext widget created with the above command supports the following
commands and options in addition to the standard text widget commands and
options.

[list_begin definitions]

[call [arg pathName] [method highlight] [arg startIndex] [arg endIndex]]

Highlight the text between [arg startIndex] and [arg endIndex].

[call [arg pathName] [method fastdelete] [arg index1] [opt [arg index2]]]

Delete text range without updating the highlighting. Arguments
are identical to the [arg pathName] [method delete] command inherited from
the standard text widget.

[call [arg pathName] [method fastinsert] ]

Insert text without updating the highlighting. Arguments
are identical to the [arg pathName] [method insert] command inherited from
the standard text widget.

[call [arg pathName] [method copy] ]

Call [cmd tk_textCopy] for the ctext instance.

[call [arg pathName] [method cut] ]

Call [cmd tk_textCut] for the ctext instance.

[call [arg pathName] [method paste] ]

Call [cmd tk_textPaste] for the ctext instance.

[call [arg pathName] [method append] ]

Append the current selection to the clipboard.

[list_end]


[section {WIDGET OPTIONS}]

[list_begin tkoption]

[tkoption_def -linemap "" ""]

Creates a line number list on the left of the widget

[tkoption_def -linemapfg "" ""]

Changes the foreground of the linemap.
The default is the same color as the main text 
widget.

[tkoption_def -linemapbg "" ""]

Changes the background of the linemap.
The default is the same color as the main text 
widget.

[tkoption_def -linemap_select_fg "" ""]

Changes the selected 
line foreground.  The default is black.

[tkoption_def -linemap_select_bg "" ""]

Changes the selected line 
background.  The default is yellow.
	
[tkoption_def -linemap_mark_command "" ""]

Calls a procedure or command 
with the [arg pathName] of the ctext window, the [arg type] which is 
either [const marked] or [const unmarked], and finally the line 
number selected.  

The proc prototype is: 
[example {
proc linemark_cmd {win type line}.  
}]

See also 
ctext_test_interactive.tcl

[tkoption_def -highlight "" ""]

Takes a boolean value which defines
whether or not to highlight text which is inserted 
or deleted.  The default is 1.

[tkoption_def -linemap_markable "" ""]

Takes a boolean value which
specifies whether or not lines in the linemap
are markable with the mouse.  The default is 1.

[list_end]

[section EXAMPLE]
[example {
	package require Tk
	package require ctext 
	
	proc main {} {
	pack [frame .f] -fill both -expand 1
	pack [scrollbar .f.s -command {.f.t yview}] -side right -fill y

	pack [ctext .f.t -bg black -fg white -insertbackground yellow \
		-yscrollcommand {.f.s set}] -fill both -expand 1

	ctext::addHighlightClass .f.t widgets purple [list ctext button label text frame toplevel \
		scrollbar checkbutton canvas listbox menu menubar menubutton \
		radiobutton scale entry message tk_chooseDir tk_getSaveFile \
		tk_getOpenFile tk_chooseColor tk_optionMenu]

	ctext::addHighlightClass .f.t flags orange [list -text -command -yscrollcommand \
		-xscrollcommand -background -foreground -fg -bg \
		-highlightbackground -y -x -highlightcolor -relief -width \
		-height -wrap -font -fill -side -outline -style -insertwidth \
		-textvariable -activebackground -activeforeground -insertbackground \
		-anchor -orient -troughcolor -nonewline -expand -type -message \
		-title -offset -in -after -yscroll -xscroll -forward -regexp -count \
		-exact -padx -ipadx -filetypes -all -from -to -label -value -variable \
		-regexp -backwards -forwards -bd -pady -ipady -state -row -column \
		-cursor -highlightcolors -linemap -menu -tearoff -displayof -cursor \
		-underline -tags -tag]

	ctext::addHighlightClass .f.t stackControl red {proc uplevel namespace while for foreach if else}
	ctext::addHighlightClassWithOnlyCharStart .f.t vars mediumspringgreen "\$"
	ctext::addHighlightClass .f.t variable_funcs gold {set global variable unset}
	ctext::addHighlightClassForSpecialChars .f.t brackets green {[]{}}
	ctext::addHighlightClassForRegexp .f.t paths lightblue {\.[a-zA-Z0-9\_\-]+}
	ctext::addHighlightClassForRegexp .f.t comments khaki {#[^\n\r]*}
	.f.t fastinsert end [info body main]
	
	pack [frame .f1] -fill x

	.f.t highlight 1.0 end
	
	pack [button .f1.exit -text Exit -command exit] -side left

	pack [entry .e] -side bottom -fill x
	.e insert end "ctext::deleteHighlightClass .f.t "
	bind .e <Return> {eval [.e get]}
	}
	main
	
}]

Further examples are in the source package for ctext.

[section THANKS]
Kevin Kenny, Neil Madden, Jeffrey Hobbs, Richard Suchenwirth, 
Johan Bengtsson, Mac Cody, Günther, and Andreas Sievers.

[see_also text re_syntax]
[keywords text widget "syntax highlighting"]
[manpage_end]
