WJG (06/12/08) Gtk+ allows multiple GtkTextViews widgets to display the contents of a common GtkTextBuffer. This feature is really useful if the programmer want to enable a user to simultaneously edit separate parts of a large text buffer. The following script shows how this is possible using Gnocl. Clicking the toggle button will switch the display from single to split edit modes.

#---------------
# textSpawn.tcl
#---------------
# Demonstrate gnocl::text textview spawining.
#---------------
# Created by William J Giddings
# 06/12/08
#---------------
# Notes:
# GtkPaned widgets are not as flexible as their Tk equivalents.
# They can only be divided into two and its orientation cannot
# be reconfigured during run-time. As child widgets are not easily
# released, force a release by assigning new child widgets.
#---------------
#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
package require Gnocl
set title "textSpawn"
# Repack the textwidget into a new paned widget, then repack the
# paned widget into the text's original container.
# args:
# parentText name of the textwidget to divide
# orientation orientation of the pane
proc splitView {textWidget {orientation vertical}} {
set sibling [$textWidget spawn ]
# create paned view
set parent [$textWidget parent]
set paned [gnocl::paned -orientation $orientation]
$parent configure -children $paned -fill {1 1} -expand 1
$paned configure -children [list $textWidget $sibling]
return $sibling
}
# Spawn a new textview prior to deletion of the paned widget.
# parentText name of the textwidget to divide
# orientation orientation of the pane
# args:
# textWidget name of widget to 'unsplit'
proc unSplitView { textWidget } {
set parent [$textWidget parent]
set grandParent [$parent parent]
# spawn a new textview
set newText [$textWidget spawn]
$grandParent configure -children $newText -fill {1 1} -expand 1
# delete the paned window and its contents
$parent delete
return $newText
}
# create maincontainer
set box(main) [gnocl::box -orientation vertical -align topLeft]
# create container for the text areas
set box(texts) [gnocl::box]
# create the base text
set text(1) [gnocl::text]
$box(texts) add $text(1) -fill {1 1} -expand 1
# create toolBar
set toolBar [gnocl::toolBar]
set split 0
$toolBar add widget [gnocl::toggleButton -variable split -text "Split" -onToggled {
if {$split} {
splitView $text(1)
} else {
set text(1) [unSplitView $text(1)] }
} ]
# pack the main container
$box(main) add $toolBar -fill {1 0} -expand 0
$box(main) add $box(texts) -fill {1 1} -expand 1
set main [gnocl::window -title $title -onDelete { exit } -child $box(main)]
gnocl::mainLoop