###################################################### # TkTeXeditor # Distributed under GNU Public License # Author: Sergey Kalinin (BanZaj) banzaj@lrn.ru # Copyright (c) "CONERO lrn", 2000, http//conero.lrn.ru ###################################################### ###################################################### # # # Programms main interface window # # # ###################################################### ## MAIN INTERFACE WINDOW ## wm geometry . $gui(geometry) set activeFile "" wm title . "TkLaTeXEditor $ver$release" wm iconname . "TkTeXEditor $ver$release" wm protocol . WM_DELETE_WINDOW Quit wm overrideredirect . 0 wm positionfrom . user #wm resizable . 0 0 ## main frames frame .frmMenu -border 1 -relief raised -background $color(bg) frame .frmTool -border 1 -relief raised -background $color(bg) frame .frmToolEdit -border 1 -relief raised -background $color(bg) frame .frmBody -border 1 -relief raised -background $color(bg) frame .frmStatus -border 1 -relief sunken -background $color(bg) pack .frmMenu -side top -padx 1 -fill x pack .frmTool -side top -padx 1 -fill x pack .frmToolEdit -side top -padx 1 -fill x pack .frmBody -side top -padx 1 -fill both -expand true pack .frmStatus -side top -padx 1 -fill x ## MENU ## menubutton .frmMenu.mnuFile -text [::msgcat::mc "File"] -menu .frmMenu.mnuFile.m -font $font(normal) -background $color(bg) set m [menu .frmMenu.mnuFile.m -background $color(bg)] $m add cascade -label [::msgcat::mc "New"] -menu $m.new -font $font(normal) set mn [menu $m.new -background $color(bg)] $mn add command -label [::msgcat::mc "New file"] -command {FileDialog new}\ -font $font(normal) -accelerator "Ctrl+N" $mn add command -label [::msgcat::mc "Create from template"] -command {FileDialog new_templ}\ -font $font(normal) $mn add command -label [::msgcat::mc "New project"] -command {NewProj add ""}\ -font $font(normal) -state disable $m add command -label [::msgcat::mc "Open"] -command {FileDialog open}\ -font $font(normal) -accelerator "Ctrl+O" $m add command -label [::msgcat::mc "Save"] -command {FileDialog save}\ -font $font(normal) -accelerator "Ctrl+S" $m add command -label [::msgcat::mc "Save as"] -command {FileDialog save_as}\ -font $font(normal) -accelerator "Ctrl+A" $m add command -label [::msgcat::mc "Save all"] -command {FileDialog save_all}\ -font $font(normal) $m add command -label [::msgcat::mc "Close"] -command {FileDialog close}\ -font $font(normal) -accelerator "Ctrl+W" $m add command -label [::msgcat::mc "Close all"] -command {FileDialog close_all}\ -font $font(normal) $m add command -label [::msgcat::mc "Delete"] -command {FileDialog delete}\ -font $font(normal) -accelerator "Ctrl+D" $m add separator $m add command -label [::msgcat::mc "Print"] -command {PrintDialog print}\ -font $font(normal) -accelerator "Ctrl+P" -state normal #$m add separator #$m add command -label [::msgcat::mc "Settings"] -command Settings -font $font(normal) $m add separator $m add command -label [::msgcat::mc "Exit"] -command Quit -font $font(normal) -accelerator "Ctrl+Q" ### DOCUMENT MENU #### menubutton .frmMenu.mnuDoc -text [::msgcat::mc "Document"] -menu .frmMenu.mnuDoc.m -font $font(normal) -background $color(bg) set m [menu .frmMenu.mnuDoc.m -background $color(bg)] #$m add command -label [::msgcat::mc "Included packages"] -command {PackageDialog}\ #-font $font(normal) -state disable # "convert to" submenu ## $m add cascade -label "[::msgcat::mc "Convert to"] ..." -menu $m.convert -font $font(normal) -state normal set mn [menu $m.convert -background $color(bg)] $mn add command -label [::msgcat::mc "DVI"] -font $font(normal) -accelerator "F5" -state normal\ -command {ConvertDialog dvi} $mn add command -label [::msgcat::mc "PS"] -font $font(normal) -accelerator "F6" -state normal\ -command {ConvertDialog ps} $mn add command -label [::msgcat::mc "PDF"] -font $font(normal) -accelerator "F7" -state normal\ -command {ConvertDialog pdf} $mn add command -label "HTML" -font $font(normal) -command {ConvertDialog html}\ $mn add separator ## "preview" submenu ## $m add cascade -label [::msgcat::mc "Preview"] -menu $m.preview -font $font(normal) -state normal set mn [menu $m.preview -background $color(bg)] $mn add command -label "DVI" -command {Preview dvi} -font $font(normal) $mn add command -label "PS" -command {Preview ps} -font $font(normal) $mn add command -label "PDF" -command {Preview pdf} -font $font(normal) $mn add command -label "HTML" -command {Preview html} -font $font(normal) $m add separator $m add command -label [::msgcat::mc "Spell check"] -font $font(normal) -state normal\ -command { SpellCheck $nb.f[$nb raise].f.text } $m add command -label [::msgcat::mc "Encoding"] -font $font(normal) -state normal\ -command {EncodeDialog file} $m add command -label [::msgcat::mc "Syntax check"] -command {DoModule syntax}\ -font $font(normal) -state disable ##.frmMenu 'EDIT' ## menubutton .frmMenu.mnuEdit -text [::msgcat::mc "Edit"] -menu .frmMenu.mnuEdit.m -font $font(normal) -background $color(bg) set m [menu .frmMenu.mnuEdit.m -background $color(bg)] $m add command -label [::msgcat::mc "Undo"] -font $font(normal) -accelerator "Ctrl+Z"\ -state normal -command "CutPast undo" $m add separator $m add command -label [::msgcat::mc "Copy"] -font $font(normal) -accelerator "Ctrl+C"\ -command "CutPast copy" $m add command -label [::msgcat::mc "Paste"] -font $font(normal) -accelerator "Ctrl+V"\ -command "CutPast paste" $m add command -label [::msgcat::mc "Cut"] -font $font(normal) -accelerator "Ctrl+X"\ -command "CutPast cut" $m add separator $m add command -label [::msgcat::mc "Select All"] -command {Select all} -font $font(normal) -accelerator "Ctrl+/" $m add command -label [::msgcat::mc "Remove selection"] -command {Select remove} -font $font(normal)\ -accelerator "Ctrl+\\" $m add separator $m add command -label [::msgcat::mc "Goto line"] -command GoToLine -font $font(normal)\ -accelerator "Ctrl+G" $m add command -label [::msgcat::mc "Find"] -command Find -font $font(normal) -accelerator "Ctrl+F" $m add command -label [::msgcat::mc "Replace"] -command ReplaceDialog -font $font(normal)\ -accelerator "Ctrl+R" $m add separator $m add cascade -label "[::msgcat::mc "Custom operations"] ..." -menu $m.hotkeys -font $font(normal) -state normal menu $m.hotkeys -background $color(bg) ## MENU for selected text ## set m [menu .frmMenu.mnuEdit.m.selection -background $color(bg)] $m add command -label [::msgcat::mc "Select All"] -command {Select all} -font $font(normal) -accelerator "Ctrl+/" $m add command -label [::msgcat::mc "Remove selection"] -command {Select remove} -font $font(normal)\ -accelerator "Ctrl+\\" $m add separator $m add command -label [::msgcat::mc "Copy"] -font $font(normal) -accelerator "Ctrl+C"\ -command "CutPast copy" $m add command -label [::msgcat::mc "Paste"] -font $font(normal) -accelerator "Ctrl+V"\ -command "CutPast paste" $m add command -label [::msgcat::mc "Cut"] -font $font(normal) -accelerator "Ctrl+X"\ -command "CutPast cut" $m add separator $m add command -label [::msgcat::mc "Preview formula"] -command {GenerateFormula math} -font $font(normal)\ -accelerator "Alt+F" $m add command -label [::msgcat::mc "Preview text"] -command {GenerateFormula text} -font $font(normal)\ -accelerator "Alt+T" $m add separator $m add command -label [::msgcat::mc "Remove to file"] -command {SaveToFile remove} -font $font(normal) $m add command -label [::msgcat::mc "Save as file"] -command {SaveToFile file} -font $font(normal) $m add command -label [::msgcat::mc "Save as image"] -command {SaveToFile image} -font $font(normal) ## VIEW MENU ## menubutton .frmMenu.mnuView -text [::msgcat::mc "View"] -menu .frmMenu.mnuView.m -font $font(normal) -state normal -background $color(bg) set m [menu .frmMenu.mnuView.m -background $color(bg)] $m add cascade -label [::msgcat::mc "Toolbar"] -menu $m.tool -font $font(normal) set mn [menu $m.tool] #$mn add command -label [::msgcat::mc "Create from template"] -command {FileDialog new_templ}\ #-font $font(normal) $m add separator $m add command -label [::msgcat::mc "Split window"] -font $font(normal) -accelerator "F2" -state disable\ -command {SplitWindow} $m add command -label [::msgcat::mc "Encoding"] -font $font(normal) -state normal\ -command {EncodeDialog view} ## MODULES MENU ## menubutton .frmMenu.mnuModule -text [::msgcat::mc "Modules"] -menu .frmMenu.mnuModule.m \ -underline 0 -font $font(normal) -background $color(bg) ## HELP MENU ## menubutton .frmMenu.mnuHelp -text [::msgcat::mc "Help"] -menu .frmMenu.mnuHelp.m \ -underline 0 -font $font(normal) -background $color(bg) set m [menu .frmMenu.mnuHelp.m -background $color(bg)] $m add command -label [::msgcat::mc "Help"] -command ShowHelp \ -accelerator F1 -font $font(normal) $m add command -label [::msgcat::mc "About ..."] -command AboutDialog \ -font $font(normal) pack .frmMenu.mnuFile .frmMenu.mnuEdit .frmMenu.mnuDoc .frmMenu.mnuView .frmMenu.mnuModule -side left pack .frmMenu.mnuHelp -side right ############################################### frame .frmBody.frmList -background $color(bg) frame .frmBody.frmEditor -background $color(bg) pack .frmBody.frmList .frmBody.frmEditor -side left -fill both ## SPLIT BAR ## pane::create .frmBody.frmList .frmBody.frmEditor ## TREE FRAME ## set nbTree [NoteBook .frmBody.frmList.nBook -font $font(normal) -side $gui(tabsLabel) -background $color(bg)] pack $nbTree -fill both -expand true -padx 2 -pady 2 set f [$nbTree insert end fileTree -text [::msgcat::mc "Files"] -background $color(bg)] set fTree [ScrolledWindow $f.f -background $color(bg)] pack $fTree -side top -fill both -expand yes -padx 0 -pady 0 set tree [Tree $fTree.tree \ -relief sunken -borderwidth 1 -width 1 -height 1 -highlightthickness 1\ -redraw 0 -dropenabled 1 -dragenabled 1 -dragevent 3 \ -background $color(editBg) -selectbackground $color(selectbg) \ -droptypes {TREE_NODE {copy {} move {} link {}} LISTBOX_ITEM {copy {} move {} link {}}} -opencmd {} -closecmd {}] $fTree setwidget $tree #pack $tree -side left -fill both -expand yes ############################################### set fStruct [$nbTree insert end fileStruct -text [::msgcat::mc "Document"] -background $color(bg)] set fTreeStruct [ScrolledWindow $fStruct.fs -background $color(bg)] pack $fTreeStruct -side top -fill both -expand yes set treeStruct [Tree $fTreeStruct.treeStruct \ -relief sunken -borderwidth 1 -width 1 -height 1 -highlightthickness 1\ -redraw 0 -dropenabled 0 -dragenabled 0 -dragevent 3 \ -background $color(editBg) -selectbackground $color(selectbg) \ -showlines 1 -droptypes { TREE_NODE {copy {} move {} link {}} LISTBOX_ITEM {copy {} move {} link {}} }] $fTreeStruct setwidget $treeStruct #pack $treeStruct -side left -fill both -expand yes ############################################### set f [$nbTree insert end lblList -text [::msgcat::mc "Labels"] -background $color(bg)] set fList [ScrolledWindow $f.f -background $color(bg)] set lblList [ListBox $fList.list -font $font(normal) -relief sunken -borderwidth 1 -width 1 -height 1 -highlightthickness 1 -background $color(editBg) -selectbackground $color(selectbg)] #pack $lblList -side left -fill both -expand yes $fList setwidget $lblList pack $fList -side top -fill both -expand yes ############################################### set nb [NoteBook .frmBody.frmEditor.noteBook -font $font(normal) -side $gui(tabsLabel) -background $color(bg)] pack $nb -fill both -expand true -padx 2 -pady 2 ############################################### set m .popupTabs menu $m -font $font(normal) $m add command -label [::msgcat::mc "Close"] -command {FileDialog close}\ -font $font(normal) -accelerator "Ctrl+W" $m add command -label [::msgcat::mc "Close all"] -command {FileDialog close_all}\ -font $font(normal) ## KEYS BINDINGS ## $tree bindText "TreeOneClick [$tree selection get]" $tree bindImage "TreeOneClick [$tree selection get]" $tree bindText {$tree selection add [$tree selection get]} $tree bindImage {$tree selection add [$tree selection get]} $treeStruct bindText "TreeStructOneClick [$treeStruct selection get]" $treeStruct bindImage "TreeStructOneClick [$treeStruct selection get]" $nb bindtabs "ClickTab" $nb bindtabs {catch [PopupMenuTab .popupTabs %X %Y]} ## MOUSE WHEEL BINDING ## bind $fTree.tree.c "$tree yview scroll -3 units" bind $fTree.tree.c "$tree yview scroll 3 units" bind $fTree.tree.c "$tree xview scroll -2 units" bind $fTree.tree.c "$tree xview scroll 2 units" bind $fTree.tree.c {catch [tk_popup .frmMenu.mnuFile.m %X %Y]} bind $fTreeStruct.treeStruct.c "$treeStruct yview scroll -3 units" bind $fTreeStruct.treeStruct.c "$treeStruct yview scroll 3 units" bind $fTreeStruct.treeStruct.c "$treeStruct xview scroll -2 units" bind $fTreeStruct.treeStruct.c "$treeStruct xview scroll 2 units" $lblList bindImage "FindLabel [$lblList selection get]" $lblList bindText "FindLabel [$lblList selection get]" bind $lblList.c "$lblList yview scroll -3 units" bind $lblList.c "$lblList yview scroll 3 units" bind $lblList.c "$lblList xview scroll -2 units" bind $lblList.c "$lblList xview scroll 2 units" bind . Quit bind . Quit bind . ShowHelp bind . {ConvertDialog dvi} bind . {ConvertDialog ps} bind . {ConvertDialog pdf} bind . {PageTab 1} bind . {PageTab -1} ############################################### ## CREATE TOOLBARs ## ############################################### set btnNum 0 proc CreateToolButton {frame command image hint keys} { global dir btnNum color relief if {$frame == "main"} { set frm frmTool } else { set frm frmToolEdit } set comm [string trim $command "\""] set btn [Button .$frm.$frame.btn_$btnNum -relief $relief(btn) -bd 1\ -command $comm -background $color(bg)] image create photo img_$btnNum -format gif -file [file join $dir(img) $image] $btn configure -image img_$btnNum if {$keys != ""} { set keys [string trim $keys "\""] #puts "$keys - $comm" bind . <$keys> "$comm" } pack $btn -side left balloon $btn set [::msgcat::mc [string trim $hint "\""]] incr btnNum } proc ReadToolBarFile {_dir} { global dir font color file frm frame tool foreach file [lsort [glob -nocomplain [file join $_dir toolbar *]]] { puts "Found toolbar file - \'$file\'" set frame [file tail $file] if {$frame == "main"} { set frm frmTool } else { set frm frmToolEdit } AddCheckBox .frmMenu.mnuView.m.tool $frame $file $frm if {$tool($frame) == 1} { ReadToolBar $file } } } proc AddCheckBox {m frame file frm} { global font color tool $m add checkbutton -label [::msgcat::mc "$frame"] -font $font(normal) -state normal\ -offvalue 0 -onvalue 1 -variable tool($frame) -selectcolor $color(selectbg)\ -command "ToolBar $frm $frame $file"\ -background $color(bg) } proc ReadToolBar {file} { global dir font color set frame [file tail $file] puts "Create toolbar \'$frame\' from file \'$file\'" if {$frame == "main"} { set frm frmTool } else { set frm frmToolEdit } pack [frame .$frm.$frame -background $color(bg)] -side left -fill x set fHandle [open $file] while {[gets $fHandle line]>=0} { set line [string trim $line] set kw [string range $line 0 [expr [string first " " $line]-1]] set l [string range $line [expr [string first " " $line] +1] end] if {$kw == "button"} { if [regexp -- {(\".*?\") (.*?) (\".*?\") (\".*?\")} $l m cmd img hint keys] { #puts "$frame $cmd $img $hint" CreateToolButton $frame $cmd $img $hint $keys } elseif [regexp -- {(\".*?\") (.*?) (\".*?\")} $l m cmd img hint] { CreateToolButton $frame $cmd $img $hint "" } } if {$l == "Separator"} { CreateSeparator $frame } if {$kw == "menu"} { if [regexp -- {(.*?) (\".*?\")} $l m img hint] { set menu [CreateToolMenu $frame $img $hint] } } if {$kw == "cmd"} { if [regexp -- {(\".*?\") (\".*?\") (\".*?\")} $l m cmd hint keys] { InsertCommand $menu $cmd $hint "" $keys } elseif [regexp -- {(\".*?\") (\".*?\")} $l m cmd hint] { InsertCommand $menu $cmd $hint "" "" } if [regexp -- {separator} $l m] { InsertSeparator $menu } } if {$kw == "imagecmd"} { if [regexp -- {(\".*?\") (\".*?\") (.*?)\.gif} $l m cmd hint im] { InsertCommand $menu $cmd $hint $im "" } if [regexp -- {(\".*?\") (\".*?\") (.*?)\.gif (\".*?\")} $l m cmd hint im keys] { InsertCommand $menu $cmd $hint $im $keys } } } close $fHandle } set mnuNum 0 proc CreateToolMenu {frame image hint} { global dir font mnuNum color relief if {$frame == "main"} { set frm frmTool } else { set frm frmToolEdit } image create photo img_mnu$mnuNum -format gif -file [file join $dir(img) $image] menubutton .$frm.$frame.m$mnuNum -image img_mnu$mnuNum -border 0\ -menu .$frm.$frame.m$mnuNum.m -background $color(bg) -relief $relief(menu) set menu [menu .$frm.$frame.m$mnuNum.m -background $color(bg)] pack .$frm.$frame.m$mnuNum -side left balloon .$frm.$frame.m$mnuNum set [::msgcat::mc [string trim $hint "\""]] incr mnuNum return $menu } set cmdNum 0 proc InsertCommand {m cmd hint image keys} { global font dir cmdNum color set comm [string trim $cmd "\""] set hint [string trim $hint "\""] #puts "Create cmd - $m - $cmd $hint $image" if {$keys != ""} { set keys [string trim $keys "\""] #puts "$keys - $comm" bind . <$keys> "$comm" if {$image != ""} { set image [string trim $image] image create photo img_$cmdNum -format gif -file [file join $dir(img) $image.gif] $m add command -label [::msgcat::mc $hint] -font $font(normal) -state normal\ -command $comm -image img_$cmdNum -background $color(bg) -accelerator "$keys" } else { $m add command -label [::msgcat::mc $hint] -font $font(normal) -state normal\ -command $comm -background $color(bg) -accelerator "$keys" } } else { if {$image != ""} { set image [string trim $image] image create photo img_$cmdNum -format gif -file [file join $dir(img) $image.gif] $m add command -label [::msgcat::mc $hint] -font $font(normal) -state normal\ -command $comm -image img_$cmdNum -background $color(bg) } else { $m add command -label [::msgcat::mc $hint] -font $font(normal) -state normal\ -command $comm -background $color(bg) } } incr cmdNum } proc InsertSeparator {m} { $m add separator } proc CreateSeparator {frame} { global dir btnNum color relief if {$frame == "main"} { set frm frmTool } else { set frm frmToolEdit } set btn [frame .$frm.$frame.btn_$btnNum -width 10 -background $color(bg) -borderwidth 0] #set btn [Button .$frm.$frame.btn_$btnNum -relief $relief(btn) -bd 2 -background $color(bg) -width 0 -state disable] pack $btn -side left -fill y -expand 1 incr btnNum } proc ToolBar {frm frame file} { global tool if {$tool($frame) == 0} { #set tool($frame) 0 if {$frame == "main"} { destroy .$frm.$frame .frmTool configure -height 1 } else { destroy .$frm.$frame .frmToolEdit configure -height 1 } return } elseif {$tool($frame) == 1} { #set tool($frame) 1 ReadToolBar $file return } } ############################################### proc CutPast {action} { global nb set node [$nb raise] if {$node == "newproj" || $node == "settings" || $node == "about" || $node == ""} { return } set text $nb.f$node.f.text switch -- $action { "copy" { tk_textCopy $text } "cut" { tk_textCut $text } "paste" { tk_textPaste $text } "undo" { $text undo } } } proc Select {type} { global nb activeFile set text $nb.f$activeFile.f.text if {$type == "all"} { $text tag remove sel 1.0 end $text tag add sel 1.0 end } elseif {$type == "remove"} { $text tag remove sel 1.0 end } } proc PopupMenu {text x y} { set selIndex [$text tag ranges sel] if {$selIndex != ""} { tk_popup .frmMenu.mnuEdit.m.selection $x $y } else { tk_popup .frmMenu.mnuEdit.m $x $y } } proc PopupMenuTab {menu x y} { tk_popup $menu $x $y } ########### ## STATUS BAR ## set frm1 [frame .frmStatus.frmFileAttr -background $color(bg)] set frm2 [frame .frmStatus.frmActive -background $color(bg)] set frm3 [frame .frmStatus.frmFileSize -relief sunken -background $color(bg)] set frm4 [frame .frmStatus.frmPos -background $color(bg)] set frm5 [frame .frmStatus.frmFile -background $color(bg)] set frm6 [frame .frmStatus.frmOvwrt -background $color(bg)] set frm7 [frame .frmStatus.frmOther -background $color(bg)] pack $frm1 $frm4 $frm6 $frm2 $frm5 $frm3 -side left -fill x pack $frm7 -side left -fill x -expand true set status(fileAttr) [label $frm1.lblFileAttr -width 30 -relief sunken -font $font(normal) -anchor w -background $color(bg)] pack $frm1.lblFileAttr -fill x set status(pos) [label $frm4.lblPos -width 10 -relief sunken -font $font(bold) -anchor w -background $color(bg)] pack $frm4.lblPos -fill x set status(ovwrt) [label $frm6.lblOvwrt -width 10 -relief sunken -font $font(normal) -anchor center -background $color(bg)] pack $frm6.lblOvwrt -fill x set status(active) [label $frm2.lblActive -width 25 -relief sunken -font $font(normal) -anchor center -background $color(bg) ] pack $frm2.lblActive -fill x set status(fileSize) [label $frm3.lblFileSize -width 10 -relief sunken -font $font(normal) -anchor w -background $color(bg)] pack $frm3.lblFileSize -fill x set status(encode) [label $frm5.lblFile -width 10 -relief sunken -font $font(normal) -anchor w -background $color(bg)] pack $frm5.lblFile -fill x set status(other) [label $frm7.lblOther -width 10 -relief sunken -font $font(normal) -anchor w -background $color(bg)] pack $frm7.lblOther -fill x ####### bind . {FileDialog new} bind . {FileDialog new} bind . {FileDialog open} bind . {FileDialog open} $nbTree raise fileTree ############ $status(ovwrt) configure -text [::msgcat::mc "Insert"] ReadToolBarFile $dir(gui) ;# system toolbars ReadToolBarFile $dir(work_gui) ;# user toolbars ReadHotKeysFile $dir(gui) ;# system hotkeys ReadHotKeysFile $dir(work_gui) ;# users hotkeys ## FINDE EXTERNAL MODULES ## FindModule