15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A Tk console widget for SQLite.  Invoke sqlitecon::create with a window name,
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# a prompt string, a title to set a new top-level window, and the SQLite
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# database handle.  For example:
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     sqlitecon::create .sqlcon {sql:- } {SQL Console} db
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A toplevel window is created that allows you to type in SQL commands to
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# be processed on the spot.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A limited set of dot-commands are supported:
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     .table
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     .schema ?TABLE?
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     .mode list|column|multicolumn|line
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     .exit
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# In addition, a new SQL function named "edit()" is created.  This function
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# takes a single text argument and returns a text result.  Whenever the
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the function is called, it pops up a new toplevel window containing a
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# text editor screen initialized to the argument.  When the "OK" button
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# is pressed, whatever revised text is in the text editor is returned as
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the result of the edit() function.  This allows text fields of SQL tables
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# to be edited quickly and easily as follows:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    UPDATE table1 SET dscr = edit(dscr) WHERE rowid=15;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Create a namespace to work in
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace eval ::sqlitecon {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # do nothing
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Create a console widget named $w.  The prompt string is $prompt.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The title at the top of the window is $title.  The database connection
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# object is $db
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::create {w prompt title db} {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w.t v
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[winfo exists $w]} {destroy $w}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[info exists v]} {unset v}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  toplevel $w
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm title $w $title
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm iconname $w $title
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame $w.mb -bd 2 -relief raised
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pack $w.mb -side top -fill x
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menubutton $w.mb.file -text File -menu $w.mb.file.m
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menubutton $w.mb.edit -text Edit -menu $w.mb.edit.m
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pack $w.mb.file $w.mb.edit -side left -padx 8 -pady 1
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set m [menu $w.mb.file.m -tearoff 0]
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $m add command -label {Close} -command "destroy $w"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlitecon::create_child $w $prompt $w.mb.edit.m
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(db) $db
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $db function edit ::sqlitecon::_edit
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This routine creates a console as a child window within a larger
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# window.  It also creates an edit menu named "$editmenu" if $editmenu!="".
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The calling function is responsible for posting the edit menu.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::create_child {w prompt editmenu} {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w.t v
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$editmenu!=""} {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set m [menu $editmenu -tearoff 0]
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $m add command -label Cut -command "sqlitecon::Cut $w.t"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $m add command -label Copy -command "sqlitecon::Copy $w.t"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $m add command -label Paste -command "sqlitecon::Paste $w.t"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $m add command -label {Clear Screen} -command "sqlitecon::Clear $w.t"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $m add separator
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $m add command -label {Save As...} -command "sqlitecon::SaveFile $w.t"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catch {$editmenu config -postcommand "sqlitecon::EnableEditMenu $w"}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scrollbar $w.sb -orient vertical -command "$w.t yview"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pack $w.sb -side right -fill y
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  text $w.t -font fixed -yscrollcommand "$w.sb set"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pack $w.t -side right -fill both -expand 1
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bindtags $w.t Sqlitecon
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(editmenu) $editmenu
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(history) 0
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(historycnt) 0
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(current) -1
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(prompt) $prompt
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(prior) {}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(plength) [string length $v(prompt)]
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(x) 0
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(y) 0
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(mode) column
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(header) on
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w.t mark set insert end
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w.t tag config ok -foreground blue
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w.t tag config err -foreground red
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w.t insert end $v(prompt)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w.t mark set out 1.0
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  after idle "focus $w.t"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <1> {sqlitecon::Button1 %W %x %y}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <B1-Motion> {sqlitecon::B1Motion %W %x %y}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <B1-Leave> {sqlitecon::B1Leave %W %x %y}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <B1-Enter> {sqlitecon::cancelMotor %W}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <ButtonRelease-1> {sqlitecon::cancelMotor %W}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <KeyPress> {sqlitecon::Insert %W %A}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Left> {sqlitecon::Left %W}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Control-b> {sqlitecon::Left %W}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Right> {sqlitecon::Right %W}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Control-f> {sqlitecon::Right %W}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <BackSpace> {sqlitecon::Backspace %W}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Control-h> {sqlitecon::Backspace %W}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Delete> {sqlitecon::Delete %W}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Control-d> {sqlitecon::Delete %W}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Home> {sqlitecon::Home %W}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Control-a> {sqlitecon::Home %W}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <End> {sqlitecon::End %W}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Control-e> {sqlitecon::End %W}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Return> {sqlitecon::Enter %W}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <KP_Enter> {sqlitecon::Enter %W}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Up> {sqlitecon::Prior %W}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Control-p> {sqlitecon::Prior %W}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Down> {sqlitecon::Next %W}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Control-n> {sqlitecon::Next %W}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <Control-k> {sqlitecon::EraseEOL %W}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <<Cut>> {sqlitecon::Cut %W}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <<Copy>> {sqlitecon::Copy %W}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <<Paste>> {sqlitecon::Paste %W}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bind Sqlitecon <<Clear>> {sqlitecon::Clear %W}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Insert a single character at the insertion cursor
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Insert {w a} {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w insert insert $a
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w yview insert
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Move the cursor one character to the left
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Left {w} {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scan [$w index insert] %d.%d row col
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$col>$v(plength)} {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w mark set insert "insert -1c"
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Erase the character to the left of the cursor
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Backspace {w} {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scan [$w index insert] %d.%d row col
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$col>$v(plength)} {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w delete {insert -1c}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Erase to the end of the line
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::EraseEOL {w} {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scan [$w index insert] %d.%d row col
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$col>=$v(plength)} {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w delete insert {insert lineend}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Move the cursor one character to the right
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Right {w} {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w mark set insert "insert +1c"
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Erase the character to the right of the cursor
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Delete w {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w delete insert
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Move the cursor to the beginning of the current line
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Home w {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scan [$w index insert] %d.%d row col
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w mark set insert $row.$v(plength)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Move the cursor to the end of the current line
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::End w {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w mark set insert {insert lineend}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Add a line to the history
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::addHistory {w line} {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$v(historycnt)>0} {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set last [lindex $v(history) [expr $v(historycnt)-1]]
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {[string compare $last $line]} {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lappend v(history) $line
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      incr v(historycnt)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set v(history) [list $line]
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set v(historycnt) 1
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(current) $v(historycnt)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Called when "Enter" is pressed.  Do something with the line
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# of text that was entered.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Enter w {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scan [$w index insert] %d.%d row col
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set start $row.$v(plength)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set line [$w get $start "$start lineend"]
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w insert end \n
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w mark set out end
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$v(prior)==""} {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set cmd $line
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set cmd $v(prior)\n$line
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[string index $cmd 0]=="." || [$v(db) complete $cmd]} {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    regsub -all {\n} [string trim $cmd] { } cmd2
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addHistory $w $cmd2
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set rc [catch {DoCommand $w $cmd} res]
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {![winfo exists $w]} return
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {$rc} {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $w insert end $res\n err
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } elseif {[string length $res]>0} {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $w insert end $res\n ok
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set v(prior) {}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w insert end $v(prompt)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set v(prior) $cmd
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    regsub -all {[^ ]} $v(prompt) . x
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w insert end $x
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w mark set insert end
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w mark set out {insert linestart}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w yview insert
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Execute a single SQL command.  Pay special attention to control
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# directives that begin with "."
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The return value is the text output from the command, properly
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# formatted.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::DoCommand {w cmd} {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set mode $v(mode)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set header $v(header)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[regexp {^(\.[a-z]+)} $cmd all word]} {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {$word==".mode"} {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      regexp {^.[a-z]+ +([a-z]+)} $cmd all v(mode)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return {}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } elseif {$word==".exit"} {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      destroy [winfo toplevel $w]
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return {}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } elseif {$word==".header"} {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      regexp {^.[a-z]+ +([a-z]+)} $cmd all v(header)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return {}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } elseif {$word==".tables"} {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set mode multicolumn
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set cmd {SELECT name FROM sqlite_master WHERE type='table'
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               UNION ALL
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               SELECT name FROM sqlite_temp_master WHERE type='table'}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $v(db) eval {PRAGMA database_list} {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if {$name!="temp" && $name!="main"} {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            append cmd "UNION ALL SELECT name FROM $name.sqlite_master\
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WHERE type='table'"
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append cmd  { ORDER BY 1}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } elseif {$word==".fullschema"} {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set pattern %
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      regexp {^.[a-z]+ +([^ ]+)} $cmd all pattern
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set mode list
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set header 0
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set cmd "SELECT sql FROM sqlite_master WHERE tbl_name LIKE '$pattern'
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               AND sql NOT NULL UNION ALL SELECT sql FROM sqlite_temp_master
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               WHERE tbl_name LIKE '$pattern' AND sql NOT NULL"
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $v(db) eval {PRAGMA database_list} {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if {$name!="temp" && $name!="main"} {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            append cmd " UNION ALL SELECT sql FROM $name.sqlite_master\
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WHERE tbl_name LIKE '$pattern' AND sql NOT NULL"
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } elseif {$word==".schema"} {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set pattern %
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      regexp {^.[a-z]+ +([^ ]+)} $cmd all pattern
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set mode list
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set header 0
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set cmd "SELECT sql FROM sqlite_master WHERE name LIKE '$pattern'
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               AND sql NOT NULL UNION ALL SELECT sql FROM sqlite_temp_master
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               WHERE name LIKE '$pattern' AND sql NOT NULL"
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $v(db) eval {PRAGMA database_list} {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if {$name!="temp" && $name!="main"} {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            append cmd " UNION ALL SELECT sql FROM $name.sqlite_master\
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        WHERE name LIKE '$pattern' AND sql NOT NULL"
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return \
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ".exit\n.mode line|list|column\n.schema ?TABLENAME?\n.tables"
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set res {}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$mode=="list"} {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $v(db) eval $cmd x {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set sep {}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      foreach col $x(*) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        append res $sep$x($col)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        set sep |
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append res \n
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {[info exists x(*)] && $header} {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set sep {}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set hdr {}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      foreach col $x(*) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        append hdr $sep$col
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        set sep |
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set res $hdr\n$res
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } elseif {[string range $mode 0 2]=="col"} {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set y {}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $v(db) eval $cmd x {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      foreach col $x(*) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if {![info exists cw($col)] || $cw($col)<[string length $x($col)]} {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           set cw($col) [string length $x($col)]
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lappend y $x($col)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {[info exists x(*)] && $header} {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set hdr {}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set ln {}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set dash ---------------------------------------------------------------
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append dash ------------------------------------------------------------
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      foreach col $x(*) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if {![info exists cw($col)] || $cw($col)<[string length $col]} {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           set cw($col) [string length $col]
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lappend hdr $col
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lappend ln [string range $dash 1 $cw($col)]
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set y [concat $hdr $ln $y]
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {[info exists x(*)]} {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set format {}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set arglist {}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set arglist2 {}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set i 0
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      foreach col $x(*) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lappend arglist x$i
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        append arglist2 " \$x$i"
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        incr i
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        append format "  %-$cw($col)s"
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set format [string trimleft $format]\n
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if {[llength $arglist]>0} {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        foreach $arglist $y "append res \[format [list $format] $arglist2\]"
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } elseif {$mode=="multicolumn"} {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set y [$v(db) eval $cmd]
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set max 0
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreach e $y {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if {$max<[string length $e]} {set max [string length $e]}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set ncol [expr {int(80/($max+2))}]
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {$ncol<1} {set ncol 1}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set nelem [llength $y]
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set nrow [expr {($nelem+$ncol-1)/$ncol}]
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set format "%-${max}s"
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for {set i 0} {$i<$nrow} {incr i} {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set j $i
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while 1 {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        append res [format $format [lindex $y $j]]
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        incr j $nrow
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if {$j>=$nelem} break
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        append res {  }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append res \n
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $v(db) eval $cmd x {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      foreach col $x(*) {append res "$col = $x($col)\n"}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append res \n
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return [string trimright $res]
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Change the line to the previous line
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Prior w {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$v(current)<=0} return
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  incr v(current) -1
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set line [lindex $v(history) $v(current)]
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlitecon::SetLine $w $line
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Change the line to the next line
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Next w {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$v(current)>=$v(historycnt)} return
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  incr v(current) 1
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set line [lindex $v(history) $v(current)]
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlitecon::SetLine $w $line
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Change the contents of the entry line
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::SetLine {w line} {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scan [$w index insert] %d.%d row col
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set start $row.$v(plength)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w delete $start end
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w insert end $line
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w mark set insert end
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w yview insert
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Called when the mouse button is pressed at position $x,$y on
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the console widget.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Button1 {w x y} {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global tkPriv
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(mouseMoved) 0
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(pressX) $x
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set p [sqlitecon::nearestBoundry $w $x $y]
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scan [$w index insert] %d.%d ix iy
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scan $p %d.%d px py
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$px==$ix} {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w mark set insert $p
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w mark set anchor $p
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  focus $w
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Find the boundry between characters that is nearest
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# to $x,$y
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::nearestBoundry {w x y} {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set p [$w index @$x,$y]
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set bb [$w bbox $p]
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {![string compare $bb ""]} {return $p}
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {($x-[lindex $bb 0])<([lindex $bb 2]/2)} {return $p}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w index "$p + 1 char"
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This routine extends the selection to the point specified by $x,$y
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::SelectTo {w x y} {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set cur [sqlitecon::nearestBoundry $w $x $y]
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[catch {$w index anchor}]} {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w mark set anchor $cur
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set anchor [$w index anchor]
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[$w compare $cur != $anchor] || (abs($v(pressX) - $x) >= 3)} {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {$v(mouseMoved)==0} {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $w tag remove sel 0.0 end
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set v(mouseMoved) 1
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[$w compare $cur < anchor]} {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set first $cur
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set last anchor
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set first anchor
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set last $cur
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$v(mouseMoved)} {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w tag remove sel 0.0 $first
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w tag add sel $first $last
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w tag remove sel $last end
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update idletasks
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Called whenever the mouse moves while button-1 is held down.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::B1Motion {w x y} {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(y) $y
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(x) $x
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlitecon::SelectTo $w $x $y
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Called whenever the mouse leaves the boundries of the widget
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# while button 1 is held down.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::B1Leave {w x y} {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(y) $y
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(x) $x
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlitecon::motor $w
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This routine is called to automatically scroll the window when
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the mouse drags offscreen.
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::motor w {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {![winfo exists $w]} return
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$v(y)>=[winfo height $w]} {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w yview scroll 1 units
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } elseif {$v(y)<0} {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w yview scroll -1 units
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlitecon::SelectTo $w $v(x) $v(y)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set v(timer) [after 50 sqlitecon::motor $w]
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This routine cancels the scrolling motor if it is active
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::cancelMotor w {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w v
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catch {after cancel $v(timer)}
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catch {unset v(timer)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Do a Copy operation on the stuff currently selected.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Copy w {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {![catch {set text [$w get sel.first sel.last]}]} {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     clipboard clear -displayof $w
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     clipboard append -displayof $w $text
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Return 1 if the selection exists and is contained
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# entirely on the input line.  Return 2 if the selection
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# exists but is not entirely on the input line.  Return 0
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if the selection does not exist.
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::canCut w {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set r [catch {
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scan [$w index sel.first] %d.%d s1x s1y
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scan [$w index sel.last] %d.%d s2x s2y
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scan [$w index insert] %d.%d ix iy
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }]
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$r==1} {return 0}
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$s1x==$ix && $s2x==$ix} {return 1}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 2
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Do a Cut operation if possible.  Cuts are only allowed
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if the current selection is entirely contained on the
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# current input line.
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Cut w {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[sqlitecon::canCut $w]==1} {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlitecon::Copy $w
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w delete sel.first sel.last
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Do a paste opeation.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Paste w {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[sqlitecon::canCut $w]==1} {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w delete sel.first sel.last
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[catch {selection get -displayof $w -selection CLIPBOARD} topaste]
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    && [catch {selection get -displayof $w -selection PRIMARY} topaste]} {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[info exists ::$w]} {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set prior 0
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreach line [split $topaste \n] {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if {$prior} {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlitecon::Enter $w
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        update
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set prior 1
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $w insert insert $line
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $w insert insert $topaste
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Enable or disable entries in the Edit menu
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::EnableEditMenu w {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upvar #0 $w.t v
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set m $v(editmenu)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$m=="" || ![winfo exists $m]} return
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch [sqlitecon::canCut $w.t] {
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0 {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $m entryconf Copy -state disabled
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $m entryconf Cut -state disabled
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1 {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $m entryconf Copy -state normal
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $m entryconf Cut -state normal
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    2 {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $m entryconf Copy -state normal
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $m entryconf Cut -state disabled
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Prompt the user for the name of a writable file.  Then write the
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# entire contents of the console screen to that file.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::SaveFile w {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set types {
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {{Text Files}  {.txt}}
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {{All Files}    *}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set f [tk_getSaveFile -filetypes $types -title "Write Screen To..."]
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$f!=""} {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {[catch {open $f w} fd]} {
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tk_messageBox -type ok -icon error -message $fd
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      puts $fd [string trimright [$w get 1.0 end] \n]
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      close $fd
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Erase everything from the console above the insertion line.
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::Clear w {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w delete 1.0 {insert linestart}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# An in-line editor for SQL
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc sqlitecon::_edit {origtxt {title {}}} {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for {set i 0} {[winfo exists .ed$i]} {incr i} continue
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set w .ed$i
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  toplevel $w
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm protocol $w WM_DELETE_WINDOW "$w.b.can invoke"
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm title $w {Inline SQL Editor}
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame $w.b
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pack $w.b -side bottom -fill x
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button $w.b.can -text Cancel -width 6 -command [list set ::$w 0]
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button $w.b.ok -text OK -width 6 -command [list set ::$w 1]
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button $w.b.cut -text Cut -width 6 -command [list ::sqlitecon::Cut $w.t]
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button $w.b.copy -text Copy -width 6 -command [list ::sqlitecon::Copy $w.t]
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button $w.b.paste -text Paste -width 6 -command [list ::sqlitecon::Paste $w.t]
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set ::$w {}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pack $w.b.cut $w.b.copy $w.b.paste $w.b.can $w.b.ok\
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     -side left -padx 5 -pady 5 -expand 1
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {$title!=""} {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label $w.title -text $title
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pack $w.title -side top -padx 5 -pady 5
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  text $w.t -bg white -fg black -yscrollcommand [list $w.sb set]
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pack $w.t -side left -fill both -expand 1
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scrollbar $w.sb -orient vertical -command [list $w.t yview]
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pack $w.sb -side left -fill y
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $w.t insert end $origtxt
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  vwait ::$w
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if {[set ::$w]} {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set txt [string trimright [$w.t get 1.0 end]]
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set txt $origtxt
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destroy $w
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return $txt
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
680