#!/usr/bin/wish8.0
# Tcltexed | Version 2.8 | 02. Nov 2006 | Martin Strauss
set Tcltexed_Version 2.8
# A plaintext-editor for LaTeX based on scriptlanguage tcl/tk (8.x)
#
# Copyright (C) 1999 - Martin Strauss -
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
# My email-adress : [email protected]
#######################################################################
# Begin of Tcltexed
#######################################################################
set basepath "[file dirname [info script]]/.."
#######################################################################
# If it doesn't work by it's own please enter here the right
# installationpath to the base of tcltexed (not to the executable)
# and uncommend the next line
set basepath /usr/local/app/tcltexed-2.8
#######################################################################
# You propably aren't interested to mix my files locations ???
set menupath $basepath/lib/menu
set txtpath $basepath/txt
set hlppath $basepath/hlp
set gifpath $basepath/gif
set bhtpath $basepath/bht
set etcpath $basepath/etc
set libpath $basepath/lib
#######################################################################
# Where to save options, this should work in the most cases
# without interferring
switch $tcl_platform(platform) unix {
set inifile $env(HOME)/.tcltexed
set spellfileown $env(HOME)/.tcltexed_spell
set spellfile $etcpath/tcltexed.sp
} windows {
switch $tcl_platform(os) "Windows 95" {
 set inifile $etcpath/tcltexed.ini
 set spellfileown $etcpath/tcltexed_own.sp
 set spellfile $etcpath/tcltexed.sp
} "Windows NT" {
 set inifile $env(USERPROFILE)/tcltexed.ini
 set spellfileown $env(USERPROFILE)/tcltexed.sp
 set spellfile $etcpath/tcltexed.sp
}
}
#######################################################################
# If your colors make problems like ignoring all grey colors etc
# try to set this flag to 1, if it works with 0 it will be faster
set COLOR_flag 0
###############################################################
# If you get tired of the welcome-message on the beginning
# set the value of readme_flag to 0 (else back to 1)
set readme_flag 1
# but you will use this window later anyway ...
###############################################################
# If you want to have the stdout messages of latex/dvips shown
# as default, then change this flag to 1
set log_flag 0
#######################################################################
#######################################################################
# defaultvalue for the language
# englisch 0 , german 1 , indonesia 2, brazilian 3
set language 0

#######################################################################
##########################################################################
# extern Commands make for sure you've the rigth path here
switch $tcl_platform(platform) unix {
# unix und linux Programme
set latex_exec "latex"
set xdvi_exec "xdvi"
set dvips_exec "dvips"
set ghostview_exec "ghostview"
set makeindex_exec "makeindex"
set ispell_exec "ispell"
} windows {
# Windows 9x and NT
set latex_exec  "latex"
set xdvi_exec "yap"
set dvips_exec "dvips"
set ghostview_exec "C:/gstools/gsview/gsview32"
set makeindex_exec "makeindex"
set ispell_exec "ispell"
} default {exit}
# interested Mac users should contact me !

##########################################################################
####### There is no point to "repair" anything beyond this line ##########
##########################################################################
# Maximal length of the memory in bytes spend for the UNDO function
# for each window.
set max_undo 10240
#######################################################################
# nown packetes, first named the file (.bth) to load, then the name to
# display
set PLISTE [list latex latex latex_math "+math" latex_other "+more" picture "+picture" tabelle "+tabular/array" notiz "+footnote/marginpar" latex209 "+latex 2.09" amsmath amsmath amssymb amssymb amsfonts amsfonts amscd amscd amsthm amsthm epsf epsf graphics "graphics/x"]
#######################################################################
# "My Own", number of selfdefined buttons
set myown_max 10
#######################################################################
# complition by mouse, number of lines shown at once
set erg2_max 10
#######################################################################
# help on LaTeX-commands, number of lines shown at once
set wlatex_max 20
#######################################################################
# help on Tcltexed, number of lines shown at once
set wTcltexed_max 6
#######################################################################
# number of chars after a line is forced to break
set line_breaking_chars 80
#######################################################################

#######################################################################
# a short test looking if you set your mainpath right
if {![file exists $basepath/bin/tcltexed.tcl]} {
wm withdraw .
tk_messageBox -icon error -message "[info script] Tcltexed\nWrong path configuration !\nPlease read the INSTALL file !\n Currently the basepath is set to\n $basepath\nbut I can't find my data there."
exit
}
#######################################################################
# default font size
set tft_size 12
#######################################################################
# event Delete sei BackSpace
set Delete2BackSpace_flag 0
#######################################################################
# What not to have within a word to spell
# [-0123456789&$^\[\]?\\+*/%=_]
set spell_not "\[-0123456789&$^\\\[\\\]\\\\+*/%=_\]"
set spell_yes "\[ \n\t.,:;!?\\\[\\\]\{\}()\]"
# number of lines shown at once for nearly matched words
set wspell_max 10
#######################################################################
# switch between this letters
set umlaut_with    {\
\\\"a � \\\"A � \\\"o � \\\"O � \\\"u � \\\"U �\
\\c\{C\} � \\'e � \\^a � \\`a �\
\\c\{c\} � \\"e � \\^e � \\`e � \\'E �\
\\^o � \\`o � \\^u � \\`u � \\'a � \\'o � \\'u � \\~n � \\~N �\
}
foreach {i j} {\\\\ss � \\\\aa � \\\\\\\"\\\\i � \\\\\\\^\\\\i � \\\\\\\`\\\\i � \\\\\\\'\\\\i � \\\\AA � \\\\ae � \\\\AE �} {
set umlaut_with "$umlaut_with \"$i \" $j \\{$i\\} $j \"$i\\\\ \" \"$j \" $i\\\\ $j\\\\ $i\\n $j\\n $i\\t $j\\t"
}
set umlaut_without {\
� \\\"a � \\\"A � \\\"o � \\\"O � \\\"u � \\\"U �\
\\c\{C\} � \\'e � \\^a � \\`a �\
\\c\{c\} � \\"e � \\^e � \\`e � \\'E �\
\\^o � \\`o � \\^u � \\`u � \\'a � \\'o � \\'u � \\~n � \\~N\
}
foreach {i j} {\\\\ss � \\\\aa � \\\\\\\"\\\\i � \\\\\\\^\\\\i � \\\\\\\`\\\\i � \\\\\\\'\\\\i � \\\\AA � \\\\ae � \\\\AE �} {
set umlaut_without "$umlaut_without $j\\t $i\\t $j\\n $i\\n $j\\\\ $i\\\\ \"$j \" \"$i\\\\ \" $j \"$i \""
}
set umlautgerman_with    {\"a � \"A � \"o � \"O � \"u � \"U � \"s �}
set umlautgerman_without {� \"a � \"A � \"o � \"O � \"u � \"U � \"s}
#######################################################################
# which ispell dictionary for which language ?
set ispell_dictionary(0) english
set ispell_dictionary(1) deutsch
set ispell_dictionary(2) indo-spell
set ispell_dictionary(3) brazilian
##########################################################################
##########################################################################
# You won't believe it what happens if you ... so leave it the way it is #
##########################################################################
# Testwindow
# eval "toplevel .test\nlabel .test.t1\nlabel .test.t2\npack .test.t1 .test.t2"

# Editor
set EDITORNUMMER 0
# Focus
set FocusEditorFlag 0
set FocusEditor ""
# Filenamen
set FilenameArray(scratch) "scratch"
set ModifiedArray(scratch) 0
set UpToDateArray(scratch) 0
set GotoArray(scratch) ""
set UndoArray(scratch) ""
# Block
set BlockBeginFlag 0
set BlockEndFlag 0
set BlockEditor ""
# Projekt
set MasterFlag 0
set Master ""
set Masterfile ""
image create photo MasterBildSlaveOn -file "$gifpath/slaveon.gif"
image create photo MasterBildSlaveOff -file "$gifpath/slaveoff.gif"
image create photo MasterBildMasterOn -file "$gifpath/masteron.gif"
image create photo MasterBildMasterOff -file "$gifpath/masteroff.gif"
# Search
set wsearch_gb 1
# Klammern automatische
set KlammerFlag 1
# fuer .wlatex ein ABC
set ABC [list A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z]
# Syntax
set syntax_flag 1
# Startverzeichnis in das gespeichert wird
set directory [pwd]
# Spelling
set spell_flag 1
# help
set hlpfile ""
#######################################################################
# tclversion mindestens 8
if {[lindex [split tk_version .] 0] < 8} {
exit
}
#######################################################################
# tag Farben
# wrong Spelling
set SpellColorRed "#800000"
# Syntax Highlightning
set SyntaxColorBlue Blue
set SyntaxColorRed Red
set SyntaxColorGreen "#007300"
# LaTeX-Befehlsergaenzung
set ErgaenzungGray Gray
# Block
set BlockColor "#e0e0e0"
#######################################################################
# set several default values
source $libpath/arg.tcl

#######################################################################
proc I {name befehl txt back} {
global T I_befehl I_txt I_back I_state I_flag I_file
switch $I_flag 2 {
 if [info exists I_befehl($name)] {
  tk_messageBox -message $T(BHTERROR1)$I_file$T(BHTERROR2)$name$T(BHTERROR3)$befehl -icon error -type ok
 } {
  set I_befehl($name) $befehl
  set I_txt($name) $txt
  set I_back($name) $back
  }
} 0 {
  unset I_state($name)
} 1 {
 set I_state($name) 1
}
}
#######################################################################
# Options
source $libpath/options.tcl

LoadOptions
#######################################################################
# set several default fonts
font create tft -family Courier -size $tft_size

#######################################################################
# language
source $libpath/translate$language.tcl
#######################################################################
# virtuelle events
source $libpath/events.tcl

#######################################################################
# Umdefinition des Defaultverhaltens fuer Text-variablen
source $libpath/bindings.tcl

#######################################################################
# Default Color
source $libpath/color.tcl

#######################################################################
# line breaking
source $libpath/linebreak.tcl

#######################################################################
# Oh no, again someone very nosey around !
#######################################################################
# Mainwindow
frame .mb

set LISTE [glob $menupath/*.itm]
set MenuModus 1
set MenuItemList ""
source $menupath/menu
foreach i $LISTE {
source $i
lappend ItemList $i
lappend MenuItemList "$ItemList"
}
frame .mb.menu
foreach i [lsort $MenuItemList] {
if [lindex $i 1] {
 .mb.menu.button[lindex $i 0].m add command  -label [lindex [lindex $i 2] $language] -command "makeWindow .menu[lindex $i 0]Item[lindex $i 1] \"[lindex $i 3]\""
} else {
 menubutton .mb.menu.button[lindex $i 0]  -text [lindex [lindex $i 2] $language] -relief raised -menu .mb.menu.button[lindex $i 0].m
 menu .mb.menu.button[lindex $i 0].m
 pack .mb.menu.button[lindex $i 0] -side left -padx 2m -fill x -expand yes
}
}



menubutton .mb.button1  -text $T(MW-File) -relief raised -menu .mb.button1.m
menubutton .mb.button2  -text $T(MW-Edit) -relief raised -menu .mb.button2.m
menubutton .mb.button3  -text $T(MW-Options) -relief raised -menu .mb.button3.m
menubutton .mb.button4  -text $T(MW-Help) -relief raised -menu .mb.button4.m

pack .mb.button1 .mb.button2 .mb.button3 .mb.menu .mb.button4 -side left  -padx 2m -fill x -expand yes

menu .mb.button1.m
menu .mb.button2.m
menu .mb.button3.m
menu .mb.button4.m


# Neues EditorFenster
mb.button1.m add command  -label $T(MW-New) -command {NewFile}
mb.button1.m add command  -label $T(MW-Load) -command {LoadFile}
mb.button1.m add command  -label $T(MW-Append) -command {
if $FocusEditorFlag then {AppendFile $FocusEditor}
}
mb.button1.m add command  -label $T(MW-Save) -command {
if $FocusEditorFlag then {SaveFile $FocusEditor}
}
mb.button1.m add command  -label $T(MW-SaveAs) -command {
if $FocusEditorFlag then {SaveAsFile $FocusEditor}
}
mb.button1.m add command  -label $T(MW-Quit) -command {ALLQUIT}

mb.button2.m add command  -label $T(MW-Clear) -command {CLEAR}
menu .mb.button2.m.m1
mb.button2.m.m1 add command  -label $T(LB-all) -command \
{if {$FocusEditorFlag} {Line_breaking_switch $FocusEditor.te.edit1 all}}
mb.button2.m.m1 add command  -label $T(LB-section) -command {if $FocusEditorFlag {Line_breaking_switch $FocusEditor.te.edit1 section}}
mb.button2.m.m1 add command  -label $T(LB-line) -command {if $FocusEditorFlag {Line_breaking_switch $FocusEditor.te.edit1 line}}
mb.button2.m.m1 add command  -label $T(LB-unall) -command {if $FocusEditorFlag {Line_breaking_switch $FocusEditor.te.edit1 unall}}
mb.button2.m.m1 add command  -label $T(LB-unsection) -command {if $FocusEditorFlag {Line_breaking_switch $FocusEditor.te.edit1 unsection}}
mb.button2.m.m1 add command  -label $T(LB-unline) -command {if $FocusEditorFlag {Line_breaking_switch $FocusEditor.te.edit1 unline}}
mb.button2.m add cascade -label $T(LB-breakline) -menu .mb.button2.m.m1
mb.button2.m add command  -label $T(MW-Spelling) -command \
{if $FocusEditorFlag {spell $FocusEditor.te.edit1 show 1.0 end}}
mb.button2.m add command  -label $T(MW-Spell) -command {if $FocusEditorFlag {spell $FocusEditor.te.edit1 add 1.0 end}}
mb.button2.m add command  -label $T(MW-Umlaut_with) -command {umlaut $umlaut_with}
mb.button2.m add command  -label $T(MW-Umlaut_without) -command {umlaut $umlaut_without}
mb.button2.m add command  -label $T(MW-UmlautGerman_with) -command {umlaut $umlautgerman_with}
mb.button2.m add command  -label $T(MW-UmlautGerman_without) -command {umlaut $umlautgerman_without}
mb.button2.m add command  -label $T(MW-Search) -command {InitSearch}
mb.button2.m add command  -label $T(MW-MyOwn) -command {InitMyOwn}

mb.button3.m add checkbutton -variable KlammerFlag  -label $T(MW-AutoKlammerZu)
mb.button3.m add checkbutton -variable syntax_flag -label $T(MW-Syntax)
mb.button3.m add checkbutton -variable log_flag -label $T(MW-log)
menu .mb.button3.m.m1
foreach {i n} $PLISTE {
set I_file $bhtpath/$i.bht
set I_flag 2
source $bhtpath/$i.bht
.mb.button3.m.m1 add checkbutton -variable Package($i) -label $n -command "set I_file $bhtpath/\$i.bht\nset I_flag \$Package($i)\nsource $bhtpath/$i.bht"
}
set LISTE [lsort [array names I_befehl]]
set wlatex_LISTE ""
foreach i $ABC {
lappend wlatex_LISTE [lsearch -glob $LISTE $i*]
}
unset LISTE
mb.button3.m add cascade -label $T(MW-Packages) -menu .mb.button3.m.m1
menu .mb.button3.m.m2
mb.button3.m.m2 add radiobutton -variable language -value 0 -label $T(MW-english) -command {tk_messageBox -message $T(MW-language-msg)}
mb.button3.m.m2 add radiobutton -variable language -value 1 -label $T(MW-german) -command {tk_messageBox -message $T(MW-language-msg)}
mb.button3.m.m2 add radiobutton -variable language -value 2 -label $T(MW-indonesia) -command {tk_messageBox -message $T(MW-language-msg)}
mb.button3.m.m2 add radiobutton -variable language -value 3 -label $T(MW-bre) -command {tk_messageBox -message $T(MW-language-msg)}
mb.button3.m add cascade -label $T(MW-language) -menu .mb.button3.m.m2
menu .mb.button3.m.m3

foreach i {6 8 10 12 14 16 18 20 22 24} {
 .mb.button3.m.m3 add radiobutton -variable tft_size -value $i -label $i -command "font configure tft -size $i"
}
mb.button3.m add cascade -label $T(MW-size) -menu .mb.button3.m.m3
mb.button3.m add command -label $T(MW-SaveOptions) -command {SaveOptions}

mb.button4.m add command -label $T(MW-Version) -command {InitVersion}
mb.button4.m add command -label $T(MW-Tcltexed) -command {InitTcltexed}
mb.button4.m add command -label $T(MW-LaTeX) -command {InitListen}

wm resizable . 0 0
wm protocol . WM_DELETE_WINDOW {ALLQUIT}
#######################################################################
proc CLEAR {} {
global FocusEditorFlag T FocusEditor
if $FocusEditorFlag then {
 if {[winfo exists .wclear] == 0} then {
  set sp [tk_messageBox -icon question -message $T(MW-Clear-msg) -type okcancel]
  switch $sp ok {
   $FocusEditor.te.edit1 delete 1.0 end
}}}}

proc ALLQUIT {} {
global ModifiedArray T
set Flag 1
set ID [array startsearch ModifiedArray]
while {[array anymore ModifiedArray $ID] && $Flag} {
 if $ModifiedArray([array nextelement ModifiedArray $ID]) then {
  set Flag 0
 }
}
array donesearch ModifiedArray $ID
if {$Flag == 0} then {
 switch [tk_messageBox -message $T(ALLQUIT1) -icon question -type yesnocancel] yes {
  switch [tk_messageBox -message $T(ALLQUIT2) -icon question -type yesnocancel] yes {
   set ID [array startsearch ModifiedArray]
   while {[array anymore ModifiedArray $ID]} {
    set E [array nextelement ModifiedArray $ID]
    if $ModifiedArray($E) then {
     set ed [string range $E 0 [expr [string length $E] - 10]]
     focus $ed
     SaveFile $ed
   }}
   set Flag 1
   set ID [array startsearch ModifiedArray]
   while {[array anymore ModifiedArray $ID] && $Flag} {
    if $ModifiedArray([array nextelement ModifiedArray $ID]) then {
     set Flag 0
    }
   }
   if $Flag then {destroy .}
  } no {
   set Flag 1
   set ID [array startsearch ModifiedArray]
   while {[array anymore ModifiedArray $ID] && $Flag} {
    set E [array nextelement ModifiedArray $ID]
    if $ModifiedArray($E) then {
     set ed [string range $E 0 [expr [string length $E] - 10]]
     focus $ed
     switch [tk_messageBox -parent $ed -message $T(ALLQUIT3)[wm title $ed] -icon question -type yesnocancel] yes {
      SaveFile $ed
     } no {} cancel {
      set Flag 0
     }
   }}
   if $Flag then {destroy .}
  } cancel {}
 } no {destroy .} cancel {}
} else {destroy .}
spell_save
}
#######################################################################
proc makeWindow {NAME S} {
global T language
global packstring
if {[winfo exists $NAME] == 0} then {
 set MenuModus 0
 toplevel $NAME
 set packstring ""
 source $S
 button $NAME.q -text $T(Quit) -command "destroy $NAME"
 pack  $NAME.q
 bind $NAME <Control-c> {
  destroy %W
 }
 bind $NAME <<Help>> "set ksp \[winfo containing -displayof $NAME \[winfo pointerx $NAME\] \[winfo pointery $NAME\]\]\n if {\$ksp != \"\"} then {event generate \$ksp <<HelpHelp>>}"

 bind $NAME <Button-3> "set ksp \[winfo containing -displayof $NAME \[winfo pointerx $NAME\] \[winfo pointery $NAME\]\]\n if {\$ksp != \"\"} then {event generate \$ksp <<HelpHelp>>}"

 wm resizable $NAME 0 0
 COLOR $NAME
} else {focus $NAME}
}



pack .mb   -pady 2m -fill x
COLOR .
#######################################################################
















#######################################################################
proc Master {E} {
global MasterFlag Master
if $MasterFlag then {
 if [string compare $Master $E] then {
  $Master.todo.master configure -image MasterBildSlaveOff
  set Master $E
  $Master.todo.master configure -image MasterBildMasterOn
 } else {
  set MasterFlag 0
  $Master.todo.master configure -image MasterBildSlaveOn
}} else {
 set MasterFlag 1
 set Master $E
 $Master.todo.master configure -image MasterBildMasterOn
}
}
proc MasterFocus {NEW OLD} {
global MasterFlag Master
global FocusEditorFlag FocusEditor
if $MasterFlag then {
 if [string compare $Master $NEW] then {
  $NEW.todo.master configure -image MasterBildSlaveOn
 } else {
  $NEW.todo.master configure -image MasterBildMasterOn
 }
 if $FocusEditorFlag then {
  if [string compare $NEW $OLD] then {
   if [string compare $Master $OLD] then {
    $OLD.todo.master configure -image MasterBildSlaveOff
   } else {
    $OLD.todo.master configure -image MasterBildMasterOff
 }}}
} else {
 $NEW.todo.master configure -image MasterBildSlaveOn
 if [string compare $NEW $OLD] then {
  if $FocusEditorFlag then { $OLD.todo.master configure -image MasterBildSlaveOff}
 }}
set FocusEditorFlag 1
set FocusEditor $NEW
}
proc MasterBefehl {E BEFEHL} {
global latex_exec xdvi_exec dvips_exec ghostview_exec makeindex_exec ispell_exec
global MasterFlag Master
global FilenameArray UpToDateArray
global tcl_platform
global ispell_dictionary language
global log_flag
if $MasterFlag then {
 set Q $Master
} else {
 set Q $E
}
# Entfernt die Endung des Quellfiles (.tex)
set FILE [string range $FilenameArray($Q) 0 [expr [string length $FilenameArray($Q)] - 5]]

# Setzt Pfad fuer die Bearbeitung
set nowpath [pwd]
cd [file dirname $FilenameArray($Q)]

switch $tcl_platform(platform) unix {
 switch $BEFEHL latex {
  SaveFile $E
  # Entfernt die Endung des Quellfiles (.tex)
  set FILE [string range $FilenameArray($Q) 0 [expr [string length $FilenameArray($Q)] - 5]]
  # Setzt Pfad fuer die Bearbeitung
  set nowpath [pwd]
  cd [file dirname $FilenameArray($Q)]
  catch {exec xterm -e $latex_exec "$FILE.tex"} error
  if { $log_flag } then {
   if [file exists $FILE.log] then {
    set f [open $FILE.log r]
    set error [read $f]
    set t [close $f]
   }
  }
  if [file exists $FILE.idx] then {
   catch {exec xterm -e $makeindex_exec "$FILE.idx"} error2
   set error "$error\n\n$error2"
  }
  if { $log_flag } then {
   Init_wmsg $Q "$error"
  }
 } xdvi {
  catch {exec $xdvi_exec "$FILE.dvi" &} error
 } dvips {
  catch {set error [exec $dvips_exec "$FILE.dvi" -o "$FILE.ps"]} error
  if { $log_flag } then {
   Init_wmsg $Q "$error"
  }
 } ghostview {
  catch {exec $ghostview_exec "$FILE.ps" &} error
 } ispell {
  SaveFile $E
  catch {exec xterm -e $ispell_exec -t -d $ispell_dictionary($language) "$FILE.tex"} error
  ReLoadFileArg $E "$FILE.tex"
 }
} windows {
 switch $BEFEHL latex {
  SaveFile $E
  # Entfernt die Endung des Quellfiles (.tex)
  set FILE [string range $FilenameArray($Q) 0 [expr [string length $FilenameArray($Q)] - 5]]
  # Setzt Pfad fuer die Bearbeitung
  set nowpath [pwd]
  cd [file dirname $FilenameArray($Q)]
  catch {exec xterm -e $latex_exec "$FILE.tex"} error
  catch {exec $latex_exec "$FILE.tex"} error
  if [file exists $FILE.idx] then {
   catch {exec $makeindex_exec "$FILE.idx"} error2
   set error "$error\n\n$error2"
  }
  Init_wmsg $Q "$error"
 } xdvi {
  catch {exec $xdvi_exec "$FILE.dvi" &} error
 } dvips {
  catch {exec $dvips_exec "$FILE.dvi" -o "$FILE.ps"} error
  Init_wmsg $Q "$error"
 } ghostview {
  catch {exec $ghostview_exec "$FILE.ps" &} error
 } ispell {
 }
} default {}

# Setzt Pfad zurueck
cd $nowpath
}
proc Init_wmsg {E error} {
 global T

 if ![winfo exists $E.wmsg] then {
  toplevel $E.wmsg
  frame $E.wmsg.f
  scrollbar $E.wmsg.f.vscroll -relief sunken -command "$E.wmsg.f.l yview"

  text $E.wmsg.f.l -yscroll "$E.wmsg.f.vscroll set"
  pack $E.wmsg.f.vscroll  -side right -fill y
  pack $E.wmsg.f.l -expand yes -fill both
  button $E.wmsg.butQ -text $T(quit) -command "destroy $E.wmsg"

  pack $E.wmsg.f $E.wmsg.butQ
  wm title $E.wmsg $T(wmsg-titel)
  COLOR $E.wmsg
  bind $E.wmsg.f.l <Button> "Line_wmsg $E"
 }
 $E.wmsg.f.l configure -state normal
 $E.wmsg.f.l delete 1.0 end
 $E.wmsg.f.l insert 1.0 $error
 $E.wmsg.f.l configure -state disabled
 $E.wmsg.f.l see end
 focus $E.wmsg
}
proc Line_wmsg E {
 if {[string compare [$E.wmsg.f.l get "insert linestart"] "!"]==0} {
  set lpos [$E.wmsg.f.l index "insert linestart + 1 l"]
 } {
  set lpos [$E.wmsg.f.l search -backwards -regexp "^l\\..* .*" insert]
}
$E.wmsg.f.l see $lpos
set txt [$E.wmsg.f.l get $lpos "$lpos lineend"]
if [string match "l.* *" $txt] {
 set pos [string first " " $txt]
 $E.te.edit1 mark set insert "[string range $txt 2 [expr $pos -1]].[expr [string length $txt] - $pos]"
 event generate $E.te.edit1 <<Position_tail>> -when tail
 update
}
}
proc EDITORQUIT {E} {
global ModifiedArray T
if $ModifiedArray($E.te.edit1) then {
  set sp [tk_messageBox -message $T(EDITORQUIT) -icon question -type yesnocancel]
  switch $sp yes {
   SaveFile $E
   destroy $E
  } no {
   destroy $E
  }
} else {destroy $E}
}
#######################################################################
# Are i am in the inquisitation ??? What are you looking for ?
#######################################################################
proc EDITOR {} {
global FilenameArray UpToDateArray EDITORNUMMER ModifiedArray GotoArray UndoArray FocusEditor T
global BeginFlag BeginRealy
global erg_flag tcl_platform
global SpellColorRed BlockColor SyntaxColorGreen SyntaxColorRed SyntaxColorBlue ErgaenzungGray
global Delete2BackSpace_flag
global have_ispell_flag
incr EDITORNUMMER
set E ".editor$EDITORNUMMER"
set FilenameArray($E) scratch
set UpToDateArray($E) 0
set UndoArray($E.te.edit1) ""
set BeginFlag($E.te.edit1) 0
set BeginRealy($E.te.edit1) 0
set erg_flag($E.te.edit1) 0
set GotoArray($E.te.edit1) ""
set var$E.wcurser ""
toplevel $E
frame $E.todo
button $E.todo.master -image MasterBildSlaveOn -command "Master $E"

button $E.todo.save -text $T(Save) -command "SaveFile $E"

button $E.todo.saveas -text $T(SaveAs) -command "SaveAsFile $E"

button $E.todo.latex -text $T(EDITOR-latex) -command "MasterBefehl $E latex"
button $E.todo.xdvi -text $T(EDITOR-xdvi) -command "MasterBefehl $E xdvi"
button $E.todo.dvips -text $T(EDITOR-dvips) -command "MasterBefehl $E dvips"
button $E.todo.gv -text $T(EDITOR-ghostview) -command "MasterBefehl $E ghostview"
button $E.todo.ispell -text $T(EDITOR-ispell) -command "MasterBefehl $E ispell"

button $E.todo.pos -text "$T(EDITOR-ZS) END" -width 12 -command "Init_curser $E"
button $E.todo.syntax -text $T(EDITOR-Syntax) -command "Syntax $E.te.edit1 1.0 end"
button $E.todo.quit -text $T(Quit) -command "EDITORQUIT $E"

pack $E.todo.master $E.todo.save $E.todo.saveas $E.todo.latex $E.todo.xdvi $E.todo.dvips $E.todo.gv $E.todo.ispell $E.todo.syntax $E.todo.quit $E.todo.pos -side left -fill x
pack $E.todo -fill x

frame $E.te -relief raised -borderwidth 2
scrollbar $E.te.vscroll -relief sunken -command "$E.te.edit1 yview"
text $E.te.edit1 -font tft -yscroll "$E.te.vscroll set"

pack $E.te.vscroll  -side right -fill y
pack $E.te.edit1 -expand yes -fill both
pack $E.te  -expand yes -fill both
bind $E.te.edit1 <Control-d> {}
bind $E <Enter> "UpToDateFile $E"
bind $E.te.edit1 <<Help>> {HelpTo %W}
bind $E.te.edit1 <Control-k><x> "SaveFile $E"
bind $E.te.edit1 <Control-k><d> "SaveAsFile $E"
bind $E <FocusIn> "erg_proc $E.te.edit1 \n MasterFocus $E \$FocusEditor"
MasterFocus $E $FocusEditor
if {$Delete2BackSpace_flag == 0} {
 bind $E.te.edit1 <Delete> {
  if $erg_flag(%W) then {
   proc_undo %W
   set erg_flag(%W) 0
   break
  } else {
   undo_switch %W {Save SelSave DeleteKey UndoMax}
   Syntax %W "insert linestart" "insert lineend"
  }
 }
 bind $E.te.edit1 <BackSpace> {
  undo_switch %W {Save SelSave BackSpaceKey UndoMax}
  Syntax %W "insert linestart" "insert lineend"
  event generate $FocusEditor.te.edit1 <<Position_tail>> -when tail
 }
} else {
 bind $E.te.edit1 <Delete> {
  if $erg_flag(%W) then {
    proc_undo %W
    set erg_flag(%W) 0
    break
  } else {
   undo_switch %W {Save SelSave BackSpaceKey UndoMax}
   Syntax %W "insert linestart" "insert lineend"
   event generate $FocusEditor.te.edit1 <<Position_tail>> -when tail
   if {[%W tag nextrange sel 1.0 end] != ""} {
       %W delete sel.first sel.last
   } elseif [%W compare insert != 1.0] {
       %W delete insert-1c
       %W see insert
   }
  }
  break
 }
 bind $E.te.edit1 <BackSpace> {
  event generate %W <Delete>
  break
 }
}
set ModifiedArray($E.te.edit1) 0
bind $E.te.edit1 <<Position>> "event generate $E.te.edit1 <<Position_tail>> -when tail"
bind $E.te.edit1 <<Position_tail>> "$E.todo.pos configure -text \"$T(EDITOR-ZS) \[$E.te.edit1 index insert\]\"\nif \[winfo exists $E.wcurser\] {$E.wcurser.pos configure -text \"$T(EDITOR-ZS) \[$E.te.edit1 index insert\]\"}"
bind  $E.te.edit1 <<Modified>> {
 set ModifiedArray(%W) 1
}
bind $E.te.edit1 <<ERG>> {
 ergaenzung %W
}
bind $E.te.edit1 <<BeginFlag>> {
 set BeginFlag(%W) 0
 erg_proc %W
 event generate $FocusEditor.te.edit1 <<Position_tail>> -when tail
}
bind $E.te.edit1 <<proc_undo>> {
 undo_switch %W Save
 event generate $FocusEditor.te.edit1 <<BeginFlag>>
}
bind $E.te.edit1 <F2> "SaveFile $E"
bind $E.te.edit1 <F3> {LoadFile}
bind $E.te.edit1 <F4> "$E.te.edit1 see insert"
bind $E.te.edit1 <F9> "MasterBefehl $E latex"
bind $E.te.edit1 <Alt-x> {ALLQUIT}
bind $E.te.edit1 <Alt-BackSpace> "pop_menu $E.te.edit1 Undo"
bind $E.te.edit1 <Shift-Delete> "pop_menu $E.te.edit1 Cut"
bind $E.te.edit1 <Control-Insert> "pop_menu $E.te.edit1 Copy"
bind $E.te.edit1 <Shift-Insert> "pop_menu $E.te.edit1 Paste"
bind $E.te.edit1 <Control-Delete> "pop_menu $E.te.edit1 Clear"
bind $E.te.edit1 <Control-l> {
 if [winfo exists .wsearch] then {
  .wsearch.f1.but2 invoke
 }
}
bind $E.te.edit1 <Control-w> {ergaenzung2 %W}
wm protocol $E WM_DELETE_WINDOW "EDITORQUIT $E"
menu $E.pop_menu
$E.pop_menu add command -label $T(pop_menu-Undo) -command "pop_menu $E.te.edit1 Undo"
$E.pop_menu add separator
$E.pop_menu add command -label $T(pop_menu-Cut) -command "pop_menu $E.te.edit1 Cut"
$E.pop_menu add command -label $T(pop_menu-Copy) -command "pop_menu $E.te.edit1 Copy"
$E.pop_menu add command -label $T(pop_menu-Paste) -command "pop_menu $E.te.edit1 Paste"
$E.pop_menu add command -label $T(pop_menu-Clear) -command "pop_menu $E.te.edit1 Clear"
$E.pop_menu add separator
$E.pop_menu add command -label $T(pop_menu-Spell) -command "pop_menu $E.te.edit1 Spell"
$E.pop_menu add separator
$E.pop_menu add command -label $T(pop_menu-Block) -command "pop_menu $E.te.edit1 Block"
$E.pop_menu add command -label $T(pop_menu-plus) -command "pop_menu $E.te.edit1 AusKomm"
$E.pop_menu add command -label $T(pop_menu-minus) -command "pop_menu $E.te.edit1 AusKommRueck"
$E.pop_menu add command -label $T(pop_menu-more) -command "ergaenzung2 $E.te.edit1"
if {[lindex [split [info tclversion] .] 0] > 7} {
 switch $tcl_platform(platform) unix {
 } windows {
  $E configure -menu $E.pop_menu
}}
bind $E.te.edit1 <Button-3> "tk_popup $E.pop_menu \[winfo pointerx $E\] \[winfo pointery $E\]"
bind $E.te.edit1 <ssharp> {
 if {[%W tag nextrange sel 1.0 end] != ""} {
  undo_switch %W Save
  %W insert sel.last "\}"
  %W tag add undo sel.last sel.last+1c
  %W mark set insert sel.first
  %W insert insert "\{\\"
  %W tag add undo insert-2c insert
  %W tag remove sel 1.0 end
  undo_switch %W {Save UndoMul}
  break
 }
}
$E.te.edit1 tag add spell 1.0 1.0
$E.te.edit1 tag add syntax_blue 1.0 1.0
$E.te.edit1 tag add syntax_red 1.0 1.0
$E.te.edit1 tag add syntax_green 1.0 1.0
$E.te.edit1 tag add BlockTag 1.0 1.0
$E.te.edit1 tag add erg_tag 1.0 1.0
$E.te.edit1 tag raise spell
$E.te.edit1 tag raise syntax_red
$E.te.edit1 tag raise syntax_green
$E.te.edit1 tag raise syntax_blue
$E.te.edit1 tag raise BlockTag
$E.te.edit1 tag raise erg_tag
$E.te.edit1 tag raise sel
$E.te.edit1 tag configure spell -foreground $SpellColorRed
$E.te.edit1 tag configure syntax_blue -foreground $SyntaxColorBlue
$E.te.edit1 tag configure syntax_green -foreground $SyntaxColorGreen
$E.te.edit1 tag configure syntax_red -foreground $SyntaxColorRed
$E.te.edit1 tag configure BlockTag -background $BlockColor
$E.te.edit1 tag configure erg_tag -background $ErgaenzungGray
$E.te.edit1 tag bind spell <Double-ButtonPress> "spell $E.te.edit1 add 1.0 end"
focus $E.te.edit1
COLOR $E
$E.te.edit1 configure -background White
return $E
}

proc pop_menu {E Fall} {
global BlockBeginFlag BlockEndFlag BlockEditor BlockColor UndoArray
switch $Fall Cut {
  undo_switch $E {SelSave UndoMax}
  tk_textCut $E
  Syntax $E "insert linestart" "insert lineend"
} Copy {
 tk_textCopy $E
}  Paste {
 set ksp [$E index {insert linestart}]
 undo_switch $E {Save SelSave UndoBegin}
 if {[$E tag nextrange sel 1.0 end] != ""} {
  $E delete sel.first sel.last
 }
 tk_textPaste $E
 undo_switch $E {UndoEnd SelMul UndoMax}
 Syntax $E $ksp "insert lineend"
} Clear {
 if {[$E tag nextrange sel 1.0 end] != ""} {
  undo_switch $E {SelSave UndoMax}
  $E delete sel.first sel.last
  Syntax $E "insert linestart" "insert lineend"
 }
} Spell {
 spell $E show 1.0 end
} Block {
 if {[$E tag nextrange sel 1.0 end] != ""} {
  if {$BlockBeginFlag && $BlockEndFlag} then {$BlockEditor tag remove BlockTag 1.0 end}
  set BlockBeginFlag 1
  set BlockEndFlag 1
  set BlockEditor $E
  $E mark set BlockBegin [$E index sel.first]
  $E mark set BlockEnd [$E index sel.last]
  $E mark gravity BlockEnd left
  $E tag add BlockTag BlockBegin BlockEnd
 }
} AusKomm {
 if {[$E tag nextrange sel 1.0 end] != ""} {
  AusKomm $E sel.first sel.last
 }
} AusKommRueck {
 if {[$E tag nextrange sel 1.0 end] != ""} {
  AusKommRueck $E sel.first sel.last
 }
} Undo {
 proc_undo $E
}
}

######################################################################
# file routines (load save new saveas append)
source $libpath/file.tcl

#######################################################################
# Setzt backslash's fuer eine Stringuebergabe ein
source $libpath/backslash.tcl

#######################################################################
# search routine
source $libpath/search.tcl

#######################################################################
# search routine
source $libpath/umlaut.tcl

########################################################################
########################################################################
# spelling
source $libpath/spelling.tcl
spell_load

#######################################################################
# pack-hilfe fuer buttons
set packstring ""
proc addpack {T} {
global packstring
lappend packstring $T
}
#######################################################################
# picture-button
proc FRLIAN {FRAME LISTE ANZ START} {
global txtpath gifpath hlppath
global I_befehl I_txt I_back
set ii 1
set fr 1
frame $FRAME.$START$fr
set i infty
foreach i $LISTE {
 set x [backslash $I_befehl($i)]
 button $FRAME.$START$fr.but$i -image [Bild $i] -command "if \$FocusEditorFlag then {focus \$FocusEditor.te.edit1 \nset ksp \[\$FocusEditor.te.edit1 index \"insert linestart\"\]\n undo_switch \$FocusEditor.te.edit1 {Save UndoBegin}\n\$FocusEditor.te.edit1 insert insert \"$x\"\nundo_switch \$FocusEditor.te.edit1 {UndoEnd Save}\n\$FocusEditor.te.edit1 mark set insert \"insert - $I_back($i) chars\"\n Syntax \$FocusEditor.te.edit1 \$ksp \"insert lineend\"\n  event generate \$FocusEditor.te.edit1 <<Modified>>}"
 bind $FRAME.$START$fr.but$i <<Help>> "Help $i"
 bind $FRAME.$START$fr.but$i <<HelpHelp>> "Help $i"
 if {$ii == $ANZ} then {
  set ii 0
  incr fr
  frame $FRAME.$START$fr
 }
 incr ii
}
set ii 1
set fr 1
foreach i $LISTE {
 pack $FRAME.$START$fr.but$i -side left
 if {$ii == $ANZ} then {
  pack $FRAME.$START$fr -side top
  set ii 0
  incr fr
 }
 incr ii
}
pack $FRAME.$START$fr -side top
}

#######################################################################
# text-button
proc buttonmake {NAME buttonmakecount latex} {
global I_befehl I_txt I_back
set t "[backslash "$I_befehl($latex)"]"


button $NAME.but$buttonmakecount -text $I_txt($latex)  -command "if \$FocusEditorFlag then {\n focus \$FocusEditor.te.edit1 \n set ksp \[\$FocusEditor.te.edit1 index \"insert linestart\"\]\n undo_switch \$FocusEditor.te.edit1 {Save UndoBegin}\n\$FocusEditor.te.edit1 insert insert \"$t\"\nundo_switch \$FocusEditor.te.edit1 {UndoEnd Save}\n\$FocusEditor.te.edit1 mark set insert \"insert - $I_back($latex) chars\"\n Syntax \$FocusEditor.te.edit1 \$ksp \"insert lineend\"\n event generate \$FocusEditor.te.edit1 <<Modified>>}"
bind $NAME.but$buttonmakecount <<Help>> "Help $latex"
bind $NAME.but$buttonmakecount <<HelpHelp>> "Help $latex"
addpack $NAME.but$buttonmakecount
}

#######################################################################
# myown Buttons
proc InitMyOwn {} {
global FocusEditorFlag FocusEditor myown myown_max T
if ![winfo exists .wmyown] then {
 toplevel .wmyown
 wm title .wmyown $T(wmyown-titel)
 for {set i 0} {$i < $myown_max} {incr i} {
  frame .wmyown.f$i
  entry .wmyown.f$i.text -width 20 -relief sunken -textvariable myown($i) -background White
  button .wmyown.f$i.but  -command "if \$FocusEditorFlag {focus \$FocusEditor.te.edit1\n set ksp \[\$FocusEditor.te.edit1 index \"insert linestart\"\]\n undo_switch \$FocusEditor.te.edit1 {Save UndoBegin}\n \$FocusEditor.te.edit1 insert insert \[.wmyown.f$i.text get\]\n undo_switch \$FocusEditor.te.edit1 {UndoEnd Save}\n Syntax \$FocusEditor.te.edit1 \$ksp \"insert lineend\"\n event generate \$FocusEditor.te.edit1 <<Position_tail>> -when tail}"
  menu .wmyown.f$i.pop_menu
.wmyown.f$i.pop_menu add command -label $T(pop_menu-Cut) -command "event generate .wmyown.f$i.text <<Cut>>"
.wmyown.f$i.pop_menu add command -label $T(pop_menu-Copy) -command "event generate .wmyown.f$i.text <<Copy>>"
.wmyown.f$i.pop_menu add command -label $T(pop_menu-Paste) -command "event generate .wmyown.f$i.text <<Paste>>"
.wmyown.f$i.pop_menu add command -label $T(pop_menu-Clear) -command "event generate .wmyown.f$i.text <<Clear>>"
bind .wmyown.f$i.text <Button-3> "tk_popup .wmyown.f$i.pop_menu \[winfo pointerx .wmyown.f$i\] \[winfo pointery .wmyown.f$i\]"


  pack  .wmyown.f$i.but .wmyown.f$i.text -side left
  pack .wmyown.f$i
 }
 button .wmyown.butQ -text $T(Quit) -command {
  destroy .wmyown
 }
 pack .wmyown.butQ
 wm minsize . 1 1
 bind .wmyown <<Help>> {Help $T(wmyown-Help)}
 bind .wmyown <Control-c> {
  destroy .wmyown
 }
 wm resizable .wmyown 0 0
 COLOR .wmyown
 for {set i 0} {$i < $myown_max} {incr i} {
  .wmyown.f$i.text configure -background White
 }
} else {focus .wmyown}
}
#######################################################################
# Yeah, cut everything into small pieces to disturb curius people !
#######################################################################
# help online in the latex-text
source $libpath/help.tcl
HLP_load

#######################################################################
# auto complition
source $libpath/complition.tcl

#######################################################################
# help-system of tcltexed
source $libpath/helpmanual.tcl

#######################################################################
# undo function
source $libpath/undo.tcl

#######################################################################
# Farbige Syntax
source $libpath/syntax.tcl

#######################################################################
# Bilderverwaltung
proc Bild {name} {
global gifpath I_txt
set ksp [lsearch [image names] "IMAGE$I_txt($name)"]
if {$ksp == -1} {
 image create photo "IMAGE$I_txt($name)" -file "$gifpath/$I_txt($name).gif"
}
return "IMAGE$I_txt($name)"
}
#######################################################################
# Goto Curser
proc Init_curser {E} {
 global T GotoArray

 if ![winfo exists $E.wcurser] then {
  toplevel $E.wcurser
  label $E.wcurser.l -text $T(wcurser-gotocurser)
  label $E.wcurser.pos -text "$T(EDITOR-ZS) [$E.te.edit1 index insert]" -width 12
  entry $E.wcurser.text -width 6 -relief sunken -textvariable GotoArray($E.te.edit1) -background White
  frame $E.wcurser.f
  button $E.wcurser.f.goto -text $T(wcurser-goto) -command "if \[catch {if {\[llength \[split \$GotoArray($E.te.edit1) .\]\] == 1} {append GotoArray($E.te.edit1) \".0\"}\n$E.te.edit1 mark set insert \$GotoArray($E.te.edit1)\n$E.te.edit1 see insert\nevent generate $E.te.edit1 <<Position_tail>> -when tail\n focus $E.te.edit1}\] {set GotoArray($E.te.edit1) \[$E.te.edit1 index insert\]}"


  button $E.wcurser.f.butQ -text $T(Quit) -command "destroy $E.wcurser"
  pack $E.wcurser.f.goto $E.wcurser.f.butQ -side left
  pack $E.wcurser.l $E.wcurser.pos $E.wcurser.text $E.wcurser.f
  wm title $E.wcurser $T(wcurser-titel)
  COLOR $E.wcurser
  $E.wcurser.text configure -background White
 }
 focus $E.wcurser
}
#######################################################################
# It's all folks !
#######################################################################
# Bei Programstart eine Message

if $readme_flag {
Help readme_hlp
}

if {[ string compare [ info procs tkTextInsert ] tkTextInsert]} {
 # contributed by Aaron Mueller
 proc tkTextInsert {w s} {
  if {$s == ""} {return}
  catch {
   if {[$w compare sel.first <= insert] && [$w compare sel.last >= insert]} {
    $w tag remove sel sel.first promptEnd
    $w delete sel.first sel.last
   }
  }
  $w insert insert $s
  $w see insert
 }
}