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