summaryrefslogtreecommitdiff
path: root/support/xtexshell/edit.tcl
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/xtexshell/edit.tcl
Initial commit
Diffstat (limited to 'support/xtexshell/edit.tcl')
-rw-r--r--support/xtexshell/edit.tcl1021
1 files changed, 1021 insertions, 0 deletions
diff --git a/support/xtexshell/edit.tcl b/support/xtexshell/edit.tcl
new file mode 100644
index 0000000000..319440d9d2
--- /dev/null
+++ b/support/xtexshell/edit.tcl
@@ -0,0 +1,1021 @@
+#******************************************************************************
+#***
+#*** This file is part of XTeXShell; see file xtexsh for details
+#*** Version 0.91 (21.2.94)
+#***
+#******************************************************************************
+
+proc XTeXEdit {} {
+
+#******************************************************************************
+#*** Editor
+#***
+#*** Open a new window
+#*** Load and edit the file $editfname. If $editfname == "", edit new file
+#***
+#*** Mode of editor is determined by variable editmode (TURBO, E2)
+#***
+#******************************************************************************
+
+ global col line
+ global editwin textbuf
+ global edit_font bold_font boldl_font fixboldl_font helvbold_font
+ global editfname editinfname
+ global editmod goto_command
+ global editins
+ global CMode trailing_spaces
+ global isColorX
+
+ set editwin ".mainwin.frame"
+ set editins "Insert"
+ set textbuf $editwin.txt
+ set editinfname [expr {[cequal "" $editfname] ? "(unnamed)" : $editfname} ]
+ set trailing_spaces 0
+
+#*** Check if there is already a XTeXEdit window
+
+ if {[winfo exists $textbuf]} {
+ DisplayInfo "There is already a XTeX-Edit window!\nPlease end other XTeX-Edit session first" "$boldl_font"
+ return
+ }
+
+#*** Check if file exists
+
+ if {![cequal "" $editfname] && ![file exists $editfname]} {
+ DisplayInfo "File: $editfname does not exist" "$boldl_font"
+ return
+ }
+
+#*** Generate frame
+
+ frame $editwin
+ pack $editwin -fill both -padx 3m -pady 2m
+
+#*** Generate text window with scrollbars
+
+ text $textbuf -relief raised -bd 2 -setgrid true -yscrollcommand "$editwin.sy set" \
+ -wrap none -font $edit_font -height 26 -width 85
+ scrollbar $editwin.sy -relief flat -orient vertical -command "$textbuf yview"
+
+ pack $editwin.sy -side right -fill y
+ pack $textbuf -expand yes -fill both
+
+#*** Generate menu bar
+
+ frame $editwin.menu -relief raised -borderwidth 1
+ pack $editwin.menu -side bottom -fill x
+
+ button $editwin.menu.file -text "Save&Quit" -command {SaveFile ""; EndXTeXEdit}
+ button $editwin.menu.save -text "Save" -command {SaveFile "" }
+ button $editwin.menu.saveas -text "Save As" -command {SaveFile "AS"}
+ button $editwin.menu.reread -text "Reload" -command {ReLoadFile}
+ button $editwin.menu.include -text "Include" -command {ReadFile ""}
+ button $editwin.menu.quit -text "Quit" -command {EndXTeXEdit}
+ pack $editwin.menu.file $editwin.menu.save $editwin.menu.saveas $editwin.menu.reread \
+ $editwin.menu.include -side left -padx 3m -pady 1m -ipadx 0.6m
+ pack $editwin.menu.quit -side right -padx 3m -pady 1m -ipadx 0.6m
+
+#*** Generate Info Line
+
+ set col 0
+ set line 0
+ set CMode ""
+ resetmodflag
+
+ frame $editwin.info -relief raised -borderwidth 1
+ pack $editwin.info -side bottom -fill x
+
+ label $editwin.info.lab1 -text "Position: "
+ entry $editwin.info.col -relief sunken -textvariable col -width 5 -font $helvbold_font
+ entry $editwin.info.line -relief sunken -textvariable line -width 5 -font $helvbold_font
+
+ label $editwin.info.lab2 -textvariable CMode -width 3 -font $helvbold_font -relief flat
+ label $editwin.info.lab3 -text "File:" -width 3 -font $helvbold_font
+ label $editwin.info.fname -textvariable editinfname -font $helvbold_font
+ label $editwin.info.ins -textvariable editins -width 7 -font $helvbold_font
+ label $editwin.info.mod -textvariable editmod -width 3 -font $helvbold_font
+
+ pack $editwin.info.lab1 $editwin.info.line $editwin.info.col $editwin.info.lab2 -side left -padx 3m -pady 1m
+ pack $editwin.info.fname $editwin.info.lab3 $editwin.info.ins $editwin.info.mod -side right -padx 1m -pady 1m
+
+ if {$isColorX} {
+ $textbuf tag configure srchfound -font $edit_font -underline 1 \
+ -foreground red
+ } else {
+ $textbuf tag configure srchfound -font $edit_font \
+ -background black -foreground white
+ }
+
+ set goto_command ""
+
+#*** Read file
+
+ if {![cequal "" $editfname]} {
+ ReadFile $editfname
+ resetmodflag
+ }
+
+ update
+ GotoXY $textbuf "1.0"
+
+#*** Handle Key Events
+
+ bind $textbuf <Any-Enter> {focus $textbuf}
+ bind $textbuf <Control-KeyPress> {ControlKey "%K"}
+ bind $textbuf <KeyPress> {if {[clength $CMode]} {ControlKey %K} else {InsChar $textbuf %A}}
+ bind $textbuf <Return> {set CMode ""; InsChar $textbuf "\n"}
+ bind $textbuf <BackSpace> {BsChar $textbuf}
+ bind $textbuf <Delete> {DelChar $textbuf}
+ bind $textbuf <Tab> {TabChar $textbuf}
+ bind $textbuf <Shift-Tab> {ShiftTab $textbuf}
+ bind $textbuf <Insert> {toginsmode}
+ bind $textbuf <Home> {GotoXY $textbuf [$textbuf index "insert linestart"]}
+ bind $textbuf <Up> {GotoXY $textbuf [$textbuf index insert-1l] $col}
+ bind $textbuf <Left> {GotoXY $textbuf [$textbuf index insert-1c]}
+ bind $textbuf <Right> {GotoXY $textbuf [$textbuf index insert+1c]}
+ bind $textbuf <Down> {GotoXY $textbuf [$textbuf index insert+1l] $col}
+ bind $textbuf <End> {EatSpaces $textbuf $line.$col; GotoXY $textbuf [$textbuf index "insert lineend"]}
+ bind $textbuf <Control-Home> {setmodflag; $textbuf delete "insert linestart" insert; GotoXY $textbuf [$textbuf index insert]}
+ bind $textbuf <Control-End> {setmodflag; $textbuf delete insert "insert lineend"; GotoXY $textbuf [$textbuf index insert]}
+ bind $textbuf <Prior> {GotoXY $textbuf [$textbuf index insert-25l] $col}
+ bind $textbuf <Next> {GotoXY $textbuf [$textbuf index insert+25l] $col}
+ bind $textbuf <Control-Prior> {GotoXY $textbuf [$textbuf index insert-100000l] $col}
+ bind $textbuf <Control-Next> {GotoXY $textbuf [$textbuf index insert+100000l] $col}
+
+ bind $textbuf <Control-F1> {set word [%W get "insert wordstart" "insert wordend"]
+ HyperHelp $word
+ }
+
+#*** New Column / Line Request
+
+ bind $editwin.info.col <Return> {GotoXY $textbuf $line.$col $col}
+ bind $editwin.info.line <Return> {GotoXY $textbuf $line.$col $col}
+
+#*** Handle Mouse Events
+
+ bind $textbuf <1> {But11 %W %x %y}
+ bind $textbuf <Double-1> {But12 %W %x %y}
+ bind $textbuf <Triple-1> {But13 %W %x %y}
+ bind $textbuf <B1-Motion> {tk_textSelectTo %W @%x,%y}
+ bind $textbuf <Shift-1> {ButS11 %W %x %y}
+ bind $textbuf <Shift-B1-Motion> {tk_textSelectTo %W @%x,%y}
+ bind $textbuf <2> {%W scan mark -%y}
+ bind $textbuf <Double-2> {InsSelection %W}
+ bind $textbuf <B2-Motion> {%W scan dragto -%y}
+ bind $textbuf <3> {%W index @%X,%Y
+ set word [%W get "@%x,%y wordstart" "@%x,%y wordend"]
+ HyperHelp $word
+ }
+
+ tk_bindForTraversal Text
+}
+
+
+proc ControlKey {char} {
+
+#*** This function handles Control-Key Sequences
+
+ global ch CMode
+ set ch [string tolower "$char"]
+
+ uplevel 1 {
+
+#*** Normal Control-Events
+
+ if {[cequal $CMode ""]} {
+ switch "$ch" {
+ "k" {set CMode "^K"}
+ "q" {set CMode "^Q"}
+ "h" {BsChar $textbuf}
+ "y" {setmodflag; $textbuf delete "insert linestart" "insert lineend+1c"; GotoXY $textbuf [$textbuf index "insert"]}
+ "l" -
+ "f" {EditSrch "CONTINUE"}
+ }
+ return
+ }
+
+#*** We are in a Ctrl-K or Ctrl-Q state
+
+ if {[cequal $CMode "^K"]} {
+ switch "$ch" {
+ "b" {$textbuf mark set anchor insert}
+ "k" {tk_textSelectTo $textbuf "insert-1c"}
+ "c" {InsSelection $textbuf}
+ "m" -
+ "v" {MoveSelection $textbuf}
+ "y" {DelSelection $textbuf}
+ "r" {ReadFile ""}
+ "w" {WriteFile {[selection get]} ""}
+ "s" {$editwin.menu.save invoke}
+ "d" {$editwin.menu.file invoke}
+ "f" {EditSrch ""}
+ "a" {EditSrch "REPLACE"}
+ }
+ }
+ if {[cequal $CMode "^Q"]} {
+ switch "$ch" {
+ "f" {EditSrch ""}
+ "a" {EditSrch "REPLACE"}
+ }
+ }
+ set CMode ""
+ }
+}
+
+#*****************************************************************************
+#****** Functions to enter Text or characters into editor ********************
+#*****************************************************************************
+
+proc InsChar {textbuf char} {
+
+ global col line
+ global editwrap editwrapcol edittrans edittrlist
+ global editins
+
+ if {[ctype ord $char] > 0} {
+ setmodflag
+
+#*** Character Translation
+
+ if {$edittrans} {
+ set pos [lsearch -exact $edittrlist "\_$char\_"]
+ if {$pos > -1} {
+ set char [lindex $edittrlist [expr $pos+1]]
+ }
+ }
+
+
+#*** Delete Mode ?
+
+ if {[cequal $editins "Delete"]} {
+ set len [clength "$char"]
+ set rlen [clength [$textbuf get $line.$col "$line.$col lineend"]]
+ if {$rlen < $len} {
+ set len $rlen
+ }
+
+ $textbuf delete $line.$col "$line.$col+$len c"
+ $textbuf insert $line.$col "$char"
+ } else {
+
+#*** Insert character in text. Check for Wrap-Mode
+
+ $textbuf insert $line.$col "$char"
+
+ if {$col > $editwrapcol && $editwrap && [string first $char " \n"]<0} {
+ set col [string last " " [$textbuf get "insert linestart" "insert"]]
+ incr col
+ if {$col>0} {$textbuf insert $line.$col "\n"}
+ }
+ }
+
+#*** Set cursor
+
+ GotoXY $textbuf [$textbuf index insert]
+ }
+}
+
+proc InsertText {textbuf text} {
+
+#*** Insert text into editor. Move cursor to end of text
+
+ global col line
+
+ setmodflag
+ $textbuf insert $line.$col "$text"
+ GotoXY $textbuf [$textbuf index insert]
+}
+
+proc InsertEditor {text} {
+
+#*** Insert text into editor, but only if editor exists.
+#*** Remove all tabs and replace by spaces. Do not move cursor
+
+ global edittab textbuf boldl_font
+
+ if {![EditChkOpen]} {return}
+ set pos [$textbuf index insert]
+ InsertText $textbuf "$text"
+
+#*** Now search through text in 512 byte blocks for tabs and replace them
+#*** This routine must be very fast !!!!!
+
+ if {[string first "\t" $text] >= 0} {
+ DisplayMsg "Text contains Tabs.\n Replacing Tabs.\n Please Wait..." $boldl_font
+ for {set sblock 0} {1 < [clength [$textbuf get "0.0 + $sblock c" "0.0 + $sblock c + 2c"]]} {incr sblock 512} {
+ while {1} {
+ set tpos [string first "\t" [$textbuf get "0.0 + $sblock c" "0.0 + $sblock c + 512 c"]]
+ if {$tpos < 0} {break}
+
+ incr sblock $tpos
+ $textbuf mark set insert "0.0 + $sblock c"
+ $textbuf delete insert
+
+ set col [lindex [split [$textbuf index insert] "."] 1]
+ $textbuf insert insert [replicate " " [expr [expr $edittab * ($col / $edittab + 1)] - $col]]
+ }
+ }
+ }
+
+#*** Set Cursor position
+
+ GotoXY $textbuf $pos
+}
+
+#*****************************************************************************
+#****** Functions to change cursor position **********************************
+#*****************************************************************************
+
+proc GotoXY {textbuf pos {wcol -1}} {
+
+#*** Move Cursor to position pos.
+#*** If wcol>=0, goto column wcol. If column wcol does not exist
+#*** because the line is shorter, insert spaces at end of line
+#*** until wcol is reached. Remove extra spaces when cursor is moved to
+#*** the next line.
+
+ global col line
+ global goto_command
+
+#*** Calculate new position
+
+ set npos [$textbuf index "$pos"]
+ set nline [lindex [split $npos "."] 0]
+ set ncol [lindex [split $npos "."] 1]
+
+#*** Execute goto_command command
+
+ eval $goto_command
+ set goto_command ""
+
+#*** before the line changes, eat up ending spaces (if any)
+
+ if {$line != $nline} {
+ EatSpaces $textbuf $line.$col
+ }
+
+#*** Set Cursor
+
+ while {1} {
+ $textbuf insert $npos ""
+ $textbuf mark set insert $npos
+
+#*** Get Cursor position
+
+ set col [lindex [split [$textbuf index insert] "."] 1]
+ set line [lindex [split [$textbuf index insert] "."] 0]
+
+#*** If wcol >=0, check if new column=wcol. If not, insert spaces until
+#*** column==wcol. This is important for cursor up/down if line length
+#*** is smaller than the requested column
+
+ if {$wcol >= 0 && $col < $wcol} {
+ set xpos [$textbuf index "$nline.0 lineend"]
+ $textbuf mark set insert $xpos
+
+ set len [expr $wcol - [lindex [split $xpos "."] 1]]
+ $textbuf insert insert [replicate " " $len]
+ set npos "$nline.$wcol"
+ set wcol -1
+ continue
+ }
+
+#*** Redisplay text window if neccessary
+
+ $textbuf yview -pickplace insert
+ focus $textbuf
+ break
+ }
+}
+
+proc EatSpaces {textbuf pos} {
+
+#*** Eat all spaces at the end of line pos (YUMM, YUMM)
+
+ set line [$textbuf get "$pos linestart" "$pos lineend"]
+ set len [expr [clength $line] - [clength [string trimright $line]]]
+
+ if {$len>0} {
+ $textbuf delete "$pos lineend -$len c" "$pos lineend"
+ }
+}
+
+#*****************************************************************************
+#****** Handle key events ****************************************************
+#*****************************************************************************
+
+proc TabChar {textbuf} {
+
+ global edittab editins line col
+
+ set newcol [expr $edittab * ($col / $edittab + 1)]
+
+ if {[cequal "Insert" $editins]} {
+ InsertText $textbuf [replicate " " [expr $newcol - $col]]
+ } else {
+ GotoXY $textbuf $line.$newcol $newcol
+ }
+}
+
+proc ShiftTab {textbuf} {
+
+ global edittab line col
+
+ set newcol [expr $edittab * (($col-1) / $edittab)]
+ GotoXY $textbuf $line.$newcol
+}
+
+
+proc DelChar {textbuf} {
+
+ global col line
+
+ setmodflag
+ $textbuf delete $line.$col
+}
+
+proc BsChar {textbuf} {
+
+ if {![cequal "1.0" [$textbuf index insert]]} {
+ setmodflag
+ GotoXY $textbuf [$textbuf index insert-1c]
+ $textbuf delete insert
+ }
+}
+
+proc DelSelection {textbuf} {
+
+ setmodflag
+ $textbuf delete sel.first sel.last
+}
+
+proc InsSelection {textbuf} {
+
+
+ setmodflag
+ $textbuf insert insert [selection get]
+ GotoXY $textbuf [$textbuf index insert]
+}
+
+proc MoveSelection {textbuf} {
+
+ setmodflag
+ InsSelection $textbuf
+ DelSelection $textbuf
+}
+
+proc But11 {textbuf x y} {
+ set tk_priv(selectMode) char
+ $textbuf mark set insert @$x,$y
+ $textbuf mark set anchor insert
+ if {[lindex [$textbuf config -state] 4] == "normal"} {focus $textbuf}
+ GotoXY $textbuf [$textbuf index insert]
+}
+
+proc But12 {textbuf x y} {
+ set tk_priv(selectMode) word
+ $textbuf mark set anchor "@$x,$y wordstart"
+ tk_textSelectTo $textbuf "@$x,$y wordend-1c"
+}
+
+proc But13 {textbuf x y} {
+ set tk_priv(selectMode) line
+ $textbuf mark set anchor "@$x,$y linestart"
+ tk_textSelectTo $textbuf "@$x,$y lineend"
+}
+
+proc ButS11 {textbuf x y} {
+ tk_textResetAnchor $textbuf @$x,$y
+ tk_textSelectTo $textbuf @$x,$y
+}
+
+
+#*****************************************************************************
+#****** Check editor status **************************************************
+#*****************************************************************************
+
+proc EditChkOpen {{mode 1}} {
+
+#*** Check if editor open.
+#*** If not, (if mode=1 display warning message) and return false
+
+ global textbuf boldl_font
+
+ if {![info exists textbuf] || ![winfo exists $textbuf]} {
+ if {$mode == 1} {
+ DisplayInfo "Function does not work because you haven't startet the XTeX-editor yet" $boldl_font
+ }
+ return 0
+ }
+ return 1
+}
+
+#******************************************************************************
+#*** Flags for modification of editor window **********************************
+#******************************************************************************
+
+proc setmodflag {} {
+
+#*** Set Flag for modification
+
+ global editmod
+ if {[cequal $editmod ""]} {
+ set editmod "Mod"
+ }
+}
+
+proc resetmodflag {} {
+
+#*** Reset Modification flag
+
+ global editmod
+ set editmod ""
+}
+
+proc Qmodflag {} {
+
+#*** Is modification flag set ?
+
+ global editmod
+
+ if {![EditChkOpen 0]} {return 0}
+ return [string compare $editmod ""]
+}
+
+proc toginsmode {} {
+
+#*** Toggle Insert Flag and
+
+ global editins
+
+ if {[cequal "Insert" $editins]} {
+ set editins "Delete"
+ } else {
+ set editins "Insert"
+ }
+}
+
+#******************************************************************************
+#*** File I/O *****************************************************************
+#******************************************************************************
+
+proc ReadFile {fname} {
+
+#*** Include a file at current cursor position
+#*** if fname == "", then ask for file name
+
+ global boldl_font textbuf
+
+#*** Do we have an open edit window ?
+
+ if {![EditChkOpen]} {return}
+
+#*** Yes. Do we have a valid filename? if fname="" then ask for filename
+
+ if {[cequal $fname ""]} {
+ set fname [FileSelBox OPEN]
+ if {[cequal $fname ""]} {return}
+ }
+
+#*** Now read file
+
+ set fd [open $fname "r"]
+ InsertEditor [read $fd]
+ close $fd
+}
+
+proc ReLoadFile {} {
+
+#*** Quit current File view and Re-Read file
+
+ global boldl_font
+ global editfname textbuf
+
+#*** Do we have an open edit window and did we load a file or was it a new file?
+
+ if {![EditChkOpen] || [cequal "" $editfname]} {return}
+
+#*** Ask user if he wants the file reload and load file
+
+ set retval [DisplayQuest "Re-Read file:\n\nCancel current editor window and Re-Read file?" \
+ $boldl_font "Yes" "No"]
+ if {$retval==1} {
+ $textbuf delete 0.0 end
+ ReadFile $editfname
+ resetmodflag
+ }
+}
+
+proc WriteFile {range fname} {
+
+#*** Rename fname to fname~. Write range to file fname
+#*** If fname == "", than ask for FileName
+#*** return filename if operation successful, "" if error
+
+ global textbuf boldl_font
+ global line col
+
+ if {[cequal $fname ""]} {
+ set fname [FileSelBox CREATE]
+ if {[cequal $fname ""]} {return ""}
+ }
+
+ if {[file exists "$fname"]} {
+ catch {frename "$fname" "$fname~"}
+ }
+
+ set fd [open $fname "w"]
+ if {$fd <= 0} {
+ DisplayInfo "Can't open file\n$fname\nfor writing!\nOperation aborted!" $boldl_font
+ return ""
+ }
+
+ DisplayMsg "Writing to file\n $fname.\n Please wait..." $boldl_font
+
+ eval puts $fd $range
+ close $fd
+
+ sleep 1; #*** Wait and remove message in GotoXY function
+ GotoXY $textbuf $line.$col
+
+ return "$fname"
+}
+
+proc SaveFile {Mode} {
+
+#*** Save file in editor. Mode="": Use editfname. Mode=="AS": Ask for filename
+
+ global textbuf editfname editinfname
+
+#*** Do we have an open edit window ?
+
+ if {![EditChkOpen]} {return}
+
+#*** Get filename
+
+ if {[cequal $Mode ""]} {
+ set retval [WriteFile {[$textbuf get 0.0 end]} "$editfname"]
+ } else {
+ set retval [WriteFile {[$textbuf get 0.0 end]} ""]
+ }
+
+#*** Write file
+
+ if {![cequal $retval ""]} {
+ resetmodflag
+ set editfname "$retval"
+ set editinfname "$retval"
+ }
+}
+
+#******************************************************************************
+#*** Search / Replace**********************************************************
+#******************************************************************************
+
+proc EditSrch {func} {
+
+#*** Search/Replace Text
+#*** func== "" : Display Search mask and search
+#*** func== "REPLACE" : Display Replace mask and replace
+#*** func== "CONTINUE" : Continue previous operation
+
+ global srch_win
+ global srch_mode srch_str srch_rep srch_case srch_prompt srch_dir srch_mode srch_pos
+ global srch_act srch_scope textbuf
+ global textbuf
+
+ if {![EditChkOpen]} {return}
+
+ if {![cequal $func "CONTINUE"] || ![info exists srch_pos]} {
+ set srch_mode [expr ![cequal $func "REPLACE"]]
+
+#*** Create Search / Replace Window
+
+ set srch_win [CreateTopWin search "CREATE"]
+ if {$srch_mode} {set title "Search"}
+ if {!$srch_mode} {set title "Replace"}
+ wm title $srch_win $title
+ wm iconname $srch_win $title
+
+#*** Create Frames which are used to place the entries on the screen
+
+ frame $srch_win.srch -relief flat -border 1
+ frame $srch_win.bot -relief raised -border 1
+ frame $srch_win.opt1 -relief flat -border 1
+ frame $srch_win.opt2 -relief flat -border 1
+ frame $srch_win.opt3 -relief flat -border 1
+ pack $srch_win.bot -side bottom -expand yes -fill both
+
+#*** Search / Replace text entry
+
+ pack $srch_win.srch -anchor w -side top -expand yes
+ label $srch_win.srch.txt -text "Text to find "
+ entry $srch_win.srch.var -relief sunken -textvariable srch_str -width 40
+ pack $srch_win.srch.txt $srch_win.srch.var -side left -anchor w -expand yes -fill x -padx 3m -pady 1m
+ bind $srch_win.srch.var <Return> {$srch_win.bot.ok invoke}
+ bind $srch_win.srch.var <Tab> { }
+
+ if {!$srch_mode} {
+ frame $srch_win.rep -relief flat -border 1
+ pack $srch_win.rep -anchor w -side top -expand yes
+ label $srch_win.rep.txt -text "Replace with"
+ entry $srch_win.rep.var -relief sunken -textvariable srch_rep -width 40
+ pack $srch_win.rep.txt $srch_win.rep.var -side left -anchor w -expand yes -fill x -padx 3m -pady 1m
+ bind $srch_win.srch.var <Return> {focus $srch_win.rep.var}
+ bind $srch_win.srch.var <Tab> {focus $srch_win.rep.var}
+ bind $srch_win.rep.var <Return> {$srch_win.bot.ok invoke}
+ bind $srch_win.rep.var <Tab> { }
+ }
+
+#*** Options entry
+
+ pack $srch_win.opt1 $srch_win.opt2 $srch_win.opt3 -side left -expand yes -padx 3m -pady 2m
+
+ label $srch_win.opt1.txt -text "Options"
+ checkbutton $srch_win.opt1.case -relief flat -text "Case-sensitive" -variable srch_case
+ if {!$srch_mode} {
+ checkbutton $srch_win.opt1.prompt -relief flat -text "Prompt on Replace" -variable srch_prompt
+ $srch_win.opt1.prompt select
+ } else {
+ label $srch_win.opt1.prompt -text " "
+ }
+ pack $srch_win.opt1.txt $srch_win.opt1.case $srch_win.opt1.prompt -side top -anchor w
+
+ label $srch_win.opt2.txt -text "Direction"
+ radiobutton $srch_win.opt2.forw -relief flat -text "Forward" -variable srch_dir -value "FORWARD"
+ radiobutton $srch_win.opt2.back -relief flat -text "Backward" -variable srch_dir -value "BACKWARD"
+ pack $srch_win.opt2.txt $srch_win.opt2.forw $srch_win.opt2.back -side top -anchor w
+ $srch_win.opt2.forw invoke
+
+ label $srch_win.opt3.txt -text "Scope"
+ radiobutton $srch_win.opt3.cur -relief flat -text "From Cursor" -variable srch_scope -value "CURSOR"
+ radiobutton $srch_win.opt3.scop -relief flat -text "Entire File" -variable srch_scope -value "FILE"
+ pack $srch_win.opt3.txt $srch_win.opt3.cur $srch_win.opt3.scop -side top -anchor w
+ $srch_win.opt3.cur invoke
+
+#*** Menu Buttons at the top of the window
+
+ button $srch_win.bot.ok -text "OK" -command {set srch_act "1"; destroy $srch_win}
+ button $srch_win.bot.all -text "Change All" -command {set srch_act "ALL"; destroy $srch_win}
+ button $srch_win.bot.cancel -text "Cancel" -command {set srch_act ""; destroy $srch_win; return}
+ button $srch_win.bot.help -text "Help" -command {}
+ pack $srch_win.bot.ok -padx 3m -pady 3m -side left -expand yes -fill x
+ if {!$srch_mode} {
+ pack $srch_win.bot.all -padx 3m -pady 3m -side left -expand yes -fill x
+ }
+ pack $srch_win.bot.cancel $srch_win.bot.help -padx 3m -pady 3m -side left -expand yes -fill x
+
+#*** Wait until user selected action
+
+ focus $srch_win.srch.var
+ tkwait visibility $srch_win
+ grab -global $srch_win
+ tkwait window $srch_win
+ focus $textbuf
+
+ if {[cequal $srch_act ""]} {return}
+
+#*** Initialize some variables
+
+ set srch_dir [cequal "FORWARD" $srch_dir]
+
+#*** Search / Replace from Top / End of file ? Set srch_pos
+
+ if {[cequal $srch_scope "FILE"]} {
+ if {$srch_dir} {
+ set srch_pos 0
+ } else {
+ set srch_pos [string length [$textbuf get 0.0 end]]
+ }
+ SrchRep
+ focus $textbuf
+ return
+ }
+
+ }
+
+#*** Srch / Replace from Cursor ? Set srch_pos to current cursor
+
+ set srch_pos [string length [$textbuf get 0.0 insert]]
+ if {$srch_dir} {
+ incr srch_pos
+ }
+
+ SrchRep
+ focus $textbuf
+}
+
+
+proc SrchRep {} {
+
+#*** Search / Replace
+#*** srch_mode: true: Search, false: Replace
+#*** srch_str: String to search
+#*** srch_rep: String to replace
+#*** srch_case: Case sensitive ?
+#*** srch_prompt: Prompt on replace ?
+#*** srch_dir: true = forward, false = backward
+#*** srch_act: "1" Search next "ALL" Replace all
+#*** srch_pos: Position (in chars) where to start with search
+
+ global srch_mode srch_str srch_rep srch_case srch_prompt srch_dir srch_mode srch_pos srch_act
+ global textbuf line col goto_command
+ global boldl_font
+
+ set rep_num 0; #*** Number of replacements
+
+#*** Get Search-String to str. If case independant search, convert to upper
+
+ set str "$srch_str"
+ if {!$srch_case} {set str [string toupper "$str"]}
+ set str_len [clength $str]
+
+ while (1) {
+
+#*** Copy Text-Range to search to text... If case independant, convert to upper case...
+#*** Search entry. If found, set pos to position in textbuf, srch_pos to position for
+#*** next search / replace
+
+ if {$srch_dir} {
+ set text [$textbuf get "0.0 + $srch_pos chars" end]
+ } else {
+ set text [$textbuf get "0.0" "0.0 + $srch_pos chars"]
+ }
+
+ if {!$srch_case} {set text [string toupper "$text"]}
+
+ if {$srch_dir} {
+ set pos [string first "$str" "$text"]
+ set curpos [expr $srch_pos+$pos]
+ } else {
+ set pos [string last "$str" "$text"]
+ set curpos $pos
+ }
+
+
+#*** No entry found ? Tell User if Search-Mode. If Replace-Mode, everything is fine...
+
+ if {$pos < 0} {
+ if {$rep_num == 0} {
+ DisplayInfo "Search:\n$str\n not found" $boldl_font
+ } else {
+ DisplayMsg "Replace:\n$rep_num\nreplacements made" $boldl_font
+ sleep 1
+ }
+ set srch_pos 1000000
+ focus $textbuf
+ GotoXY $textbuf $line.$col
+ return
+ }
+
+#*** Entry found, set cursor to word and highlight
+
+ GotoXY $textbuf "0.0 + $curpos chars"
+ $textbuf tag add srchfound insert "insert+$str_len c"
+ update
+ lvarcat goto_command "$textbuf tag remove srchfound 0.0 end;"
+
+#*** Return if Search-Mode
+
+ if {$srch_mode} {return}
+
+#*** Next Srch / Replace from Cursor! Set srch_pos to current cursor
+
+ set srch_pos [string length [$textbuf get 0.0 insert]]
+ if {$srch_dir} {
+ incr srch_pos
+ }
+
+#*** Prompt before replace ? ...
+
+ if {$srch_prompt} {
+ set retval [DisplayQuest "Search String found! Replace?" $boldl_font "Yes" "No" "Go" "Quit"]
+ if {$retval == 4} {return}
+ if {$retval == 3} {set srch_prompt 0}
+ if {$retval == 2} {continue}
+ }
+
+#*** Now replace String
+
+ $textbuf delete insert "insert + $str_len chars"
+ InsertEditor "$srch_rep"
+ setmodflag
+ incr rep_num
+ if {![cequal "ALL" $srch_act]} {
+ return
+ }
+ }
+}
+
+
+#******************************************************************************
+#*** Edit: Select editor and edit file ****************************************
+#******************************************************************************
+
+proc Edit fname {
+
+#*** Call Editor
+#*** fname = "\n" : Display file selector box and let user choose a file to edit
+#*** fname = "" : Create a new file
+#*** default : Edit file fname
+
+ global editfname editinfname editor editwin
+ global editfilelist
+ global boldl_font
+
+#*** The XTeX built-in editor can handle only one file at a time.
+#*** Check if XTeX editor is selected and if there is already a modified file in the editor
+
+ set editor [string tolower $editor]
+
+ if {[cequal $editor "xtex"] && [info exists editwin] && [winfo exists $editwin]} {
+ while {[Qmodflag]} {
+ set retval [DisplayQuest "Warning!!!\n\nData in editor window\nhas not been saved!\n\nDo you want to save it now?\nFile:\n $editinfname" \
+ "$boldl_font" "Save" "Save As" "Don't save" "Return to editor"]
+ switch $retval {
+ 1 { SaveFile "" }
+ 2 { SaveFile "AS" }
+ 3 { break }
+ 4 { return }
+ }
+ }
+ destroy $editwin
+ }
+
+#*** Check if filename makes sense
+
+ switch $fname {
+ "\n" { set fname [FileSelBox OPENCREATE]
+ if {[cequal $fname ""]} {return}
+ }
+ default {}
+ }
+
+#*** Append filename to ReOpen menu if filename is not there yet
+
+ if {![info exists editfilelist]} {set editfilelist ""}
+
+ if {![cequal "" $fname] && [lsearch $editfilelist $fname]==-1} {
+ .menu.file.m.reopen add command -label "$fname" -underline 0 -command "Edit $fname"
+ lappend editfilelist "$fname"
+ }
+
+ set editfname $fname
+
+ if {$editor=="xtex"} {
+ XTeXEdit
+ } else {
+ global command_editor_$editor
+ eval set command \$command_editor_$editor
+ while {1} {
+ set pos [string first ":" "$command"]
+ if {$pos==-1} {break}
+
+ set sstr [expr {$pos ? [crange "$command" 0 "$pos-1" ] : ""}]
+ set estr [crange "$command" "$pos+1" end]
+ set mstr [string tolower [ctoken estr " .,:"]]
+
+ if {[cequal "$mstr" "fnamewoext"]} {
+ set mstr [strip_extension $fname]
+ set filenameneeded 1
+ }
+ if {[cequal "$mstr" "fname"]} {
+ set mstr $fname
+ set filenameneeded 1
+ }
+ set command [format "%s%s%s" "$sstr" "$mstr" "$estr"]
+ }
+ eval exec $command &
+ }
+}
+
+#******************************************************************************
+#*** Quit was selected. Are the files saved ? *********************************
+#******************************************************************************
+
+proc EndXTeXEdit {} {
+
+ global boldl_font
+ global editwin editfname editinfname editmdfied
+
+ if {[info exists editwin] && [winfo exists $editwin]} {
+ while {[Qmodflag]} {
+ set retval [DisplayQuest "Warning!!!\n\nData in editor window\nhas not been saved!\n\nDo you want to save it now?\nFile:\n $editinfname" \
+ "$boldl_font" "Save" "Save As" "Really Quit"]
+ switch $retval {
+ 1 { SaveFile "" }
+ 2 { SaveFile "AS" }
+ 3 { break;}
+ }
+ }
+ destroy $editwin
+ set editfname ""
+ }
+}
+
+
+
+
+
+
+