home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-16 | 19.8 KB | 767 lines | [TEXT/ALFA] |
- # New modes can be specified by appending to the following vars.
- # are no longer any procs such as 'setTextMode' etc.
-
- # 'mode' is nothing when we start up.
- set mode ""
-
- set whichInfo mode
-
- #================================================================================
- # The next two procs are called by Alpha to handle the mode flags popup menu.
- #================================================================================
-
- proc getModeValuesAlpha {} {
- global mode
- global ${mode}modeVars
- global allFlags
- global whichInfo
- set fvals {}
- set vvals {}
-
- if {$whichInfo == "mode"} {
- if {[info exists ${mode}modeVars]} {
- set vars [lsort [array names ${mode}modeVars]]
- foreach v $vars {
- if {[lsearch $allFlags $v] >= 0} {
- lappend fvals $v [set ${mode}modeVars($v)]
- } else {
- lappend vvals $v 0
- }
- }
- }
- return [concat $fvals {-} 0 $vvals {{(-} 0 "Set Mode Menus╔" 0 "Change Mode Vars╔" 0 "Describe Mode" 0 {(-} 0 "(Mode Info" 0 "File Info" 0}]
- } else {
- getWinInfo blah
- lappend m "Mac" [expr {$blah(platform) == "mac"}]
- lappend m "UNIX" [expr {$blah(platform) == "unix"}]
- lappend m "IBM" [expr {$blah(platform) == "ibm"}] {(-} 0
- lappend m "MPW" [expr {$blah(state) == "mpw"}]
- lappend m "Think" [expr {$blah(state) == "think"}]
- lappend m "None" [expr {$blah(state) == "none"}] {(-} 0
- lappend m "Read Only" $blah(read-only) {(-} 0
- lappend m "Tab Size" 0 {(-} 0
- lappend m "Mode Info" 0 "(File Info" 0
- return $m
- }
- }
-
-
- proc setModeVarAlpha {var} {
- global mode allFlags modeVars modifiedModeVars
- global whichInfo
- global ${mode}modeVars
-
- if {$whichInfo == "file"} {
- set var [string tolower $var]
- switch $var {
- "unix" -
- "mac" -
- "ibm" { setWinInfo platform $var }
- "mpw" -
- "think" -
- "none" { setWinInfo state $var }
- "mode info" { set whichInfo mode }
- "tab size" {
- getWinInfo arr
- if {![catch {prompt "New tab size?" $arr(tabsize)} res]} {
- setWinInfo tabsize $res
- }
- }
- "read only" {
- getWinInfo b
- setWinInfo read-only [expr -1 * ($b(read-only) - 1)]}
- }
- return
- }
-
- if {$var == "Set Mode Menus╔"} {
- setModeMenus
- } elseif {$var == "File Info"} {
- set whichInfo file
- } elseif {$var == "Mode Info"} {
- set whichInfo mode
- } elseif {$var == "Change Mode Vars╔"} {
- set mvars {}
- catch {set mvars [array names ${mode}modeVars]}
- set vars [listpick -l -L $mvars -p "Set mode vars for '$mode':" [lsort $modeVars]]
- if {![string length $vars]} return
-
- catch {unset ${mode}modeVars}
- foreach v $vars {
- global $v
- set ${mode}modeVars($v) [set $v]
- }
- } elseif {$var == "Describe Mode"} {
- describeMode
- } elseif {[lsearch $allFlags $var] >= 0} {
- global $var
- set ${mode}modeVars($var) [set $var [expr -1 * ([set ${mode}modeVars($var)] - 1)]]
- lappend modifiedModeVars [list $var ${mode}modeVars]
- } else {
- global $var
- set res [prompt "New value of '$var':" [set ${mode}modeVars($var)]]
- set ${mode}modeVars($var) $res
- set $var $res
- lappend modifiedModeVars [list $var ${mode}modeVars]
- }
- }
-
- #================================================================================
-
-
- # Suffixes used to initially determine mode for new window.
- set modeSuffixes { default { set winMode Text } }
-
-
- # The set of menus that the modes may choose to use.
- set allModeMenus { thinkMenu cwarriorMenu toolserverMenu
- latexMenu thinkRefMenu toolboxRefMenu tclMenu perlMenu }
-
- set modeVars { }
-
-
- # The dummy proc for a mode is called whenever we change to that mode,
- # so that the autoloading facility will load the correct file, if
- # necessary.
-
- # The list of modes.
- set modes {}
- set lastMode 0
-
- # Can be used to add new mode-specific flags and variables (see think.tcl for example).
- proc newModeVar {mode var val isFlag} {
- global ${mode}modeVars modeVars allFlags $var
-
- if {![info exists modeVars] || [lsearch $modeVars $var] < 0} {
- lappend modeVars $var
- }
- if {![info exists ${mode}modeVars($var)]} {
- set ${mode}modeVars($var) $val
- if {![info exists $var]} {
- set $var $val
- }
- }
- if {$isFlag && (![info exists allFlags] || ([lsearch $allFlags $var] < 0))} {
- lappend allFlags $var
- }
- }
-
- #================================================================================
- lappend modes C
- set dummyProc(C) dummyC
- lappend modeSuffixes {*.h} { set winMode C }
- lappend modeSuffixes {*.c} { set winMode C }
- lappend modeSuffixes {*.r} { set winMode C }
- set modeMenus(C) { thinkMenu cwarriorMenu thinkRefMenu toolboxRefMenu}
-
- #================================================================================
- lappend modes C++
- set dummyProc(C++) dummyC++
- lappend modeSuffixes {*.H} { set winMode C++ }
- lappend modeSuffixes {*.cc} { set winMode C++ }
- lappend modeSuffixes {*.cp} { set winMode C++ }
- lappend modeSuffixes {*.cpp} { set winMode C++ }
- lappend modeSuffixes {*.CPP} { set winMode C++ }
- lappend modeSuffixes {*.C} { set winMode C++ }
- set modeMenus(C++) { thinkMenu cwarriorMenu thinkRefMenu toolboxRefMenu}
-
- #===============================================================================
-
- #############################################################################
- # PL/SQL mode by Joel D. Elkins
- #############################################################################
- lappend modes SQL
- set modeMenus(SQL) { }
- set dummyProc(SQL) dummySQL
- lappend modeSuffixes {*.sql} { set winMode SQL }
- lappend modeSuffixes {*.SQL} { set winMode SQL }
- lappend modeSuffixes {*.pkg} { set winMode SQL }
-
- #================================================================================
- lappend modes Shel
- set dummyProc(Shel) dummyShel
- set modeMenus(Shel) { tclMenu }
- lappend modeSuffixes {*tcl\ sh*} {set winMode Shel}
- newModeVar Shel wordBreak {(\$)?[a-zA-Z0-9_.]+} 0
- newModeVar Shel wordWrap {0} 1
- newModeVar Shel wordBreakPreface {[^a-zA-Z0-9_\$]} 0
- newModeVar Shel autoMark 0 1
- regModeKeywords -m {╟} Shel {}
-
- #===============================================================================
- # AppleScript mode
- lappend modes Scrp
- set dummyProc(Scrp) dummyScrp
- lappend modeSuffixes {*.script} { set winMode Scrp }
- set modeMenus(Scrp) { }
-
- #================================================================================
- lappend modes Text
- set modeMenus(Text) { }
- newModeVar Text leftFillColumn {0} 0
- newModeVar Text suffixString { <--} 0
- newModeVar Text prefixString {> } 0
- newModeVar Text fillColumn {75} 0
- newModeVar Text wordWrap {1} 1
- newModeVar Text wordBreak {[a-zA-Z0-9_]+} 0
- newModeVar Text wordBreakPreface {([^a-zA-Z0-9_])} 0
- newModeVar Text wrapBreak {[a-zA-Z0-9_]+} 0
- newModeVar Text wrapBreakPreface {([^a-zA-Z0-9_])} 0
- newModeVar Text autoMark 0 1
-
- #================================================================================
- lappend modes PS
- lappend modeSuffixes {*.ps} { set winMode PS }
- newModeVar PS prefixString {% } 0
- set PSKeyWords {
- def begin end dict load
- exec if ifelse for repeat loop exit stop stopped countexecstack execstack quit start
- gsave grestore grestoreall initgraphics
- newpath erasepage fill eofill stroke image imagemask showpage copypage
- }
- if {[info exists PSwords]} {set PSKeyWords [concat $PSKeyWords $PSwords]}
- regModeKeywords -e {%} -m {/} -c red -k blue PS $PSKeyWords -i "\}" -i "\{" -i {[} -i {]} -I green
- unset PSKeyWords
-
- #================================================================================
- lappend modes Fort
- lappend modeSuffixes {*.f} { set winMode Fort }
- lappend modeSuffixes {*.inc} { set winMode Fort }
- lappend modeSuffixes {*.INC} { set winMode Fort }
- lappend modeSuffixes {*.fcm} { set winMode Fort }
- lappend modeSuffixes {*.for} { set winMode Fort }
- lappend modeSuffixes {*.FOR} { set winMode Fort }
- set dummyProc(Fort) dummyFort
- set modeMenus(Fort) { }
-
- #================================================================================
- lappend modes Pasc
- lappend modeSuffixes {*.p} { set winMode Pasc }
- set dummyProc(Pasc) dummyPascal
- set modeMenus(Pasc) { thinkRefMenu toolboxRefMenu}
-
- #=============================================================================
- lappend modes Tcl
- set dummyProc(Tcl) dummyTcl
- lappend modeSuffixes {*.tcl} { set winMode Tcl }
- set modeMenus(Tcl) { tclMenu }
-
- #================================================================================
- lappend modes MPW
- set modeMenus(MPW) { }
- lappend modeSuffixes {*Toolserver\ *} { set winMode MPW }
-
- #================================================================================
- lappend modes Brws
- set modeMenus(Brws) { }
- set dummyProc(Brws) dummyBrws
- #================================================================================
- lappend modes Diff
- set modeMenus(Diff) { }
- #================================================================================
- # Ada mode definition !
- #================================================================================
- lappend modes Ada
- set dummyProc(Ada) DUMMY_ADA
- set modeMenus(Ada) { }
- lappend modeSuffixes {*.ada} { set winMode Ada }
- lappend modeSuffixes {*.ads} { set winMode Ada }
- lappend modeSuffixes {*.adb} { set winMode Ada }
- # only for my GNAT specific files
- lappend modeSuffixes {*.gnat} { set winMode Ada }
- newModeVar Ada elecRBrace {1} 1
- newModeVar Ada leftFillColumn {3} 0
- newModeVar Ada prefixString {-- } 0
- newModeVar Ada electricSemi {1} 1
- newModeVar Ada wordBreak {[a-zA-Z0-9_]+} 0
- newModeVar Ada elecLBrace {1} 1
- newModeVar Ada wordWrap {0} 1
- newModeVar Ada funcExpr {^[^ \t\(#\r/@].*\(.*\)$} 0
- newModeVar Ada wordBreakPreface {} 0
- newModeVar Ada optionIsMeta {1} 1
- newModeVar Ada electricTab {0} 1
-
- set adaCommentRegexp {/\*(([^*]/)|[^*]|\r)*\*/}
- set adaPreRegexp {^\#[\t ]*[a-z]*}
- set adaKeyWords {
- abort abs accept access all and array at begin body case constant
- declare delay delta digits do else elsif end entry exception exit
- for function generic goto others if in is limited loop mod new not
- null of or subtype out package pragma private procedure raise range
- record rem renames return reverse select separate task terminate
- then type use when while with xor = /= := > <
- }
- regModeKeywords -e {--} -c cyan -k blue Ada $adaKeyWords -i ")" -i "(" -i ":" -i ";" -i "," -i "." -I red
- #================================================================================
-
- proc buildFlagsVars {} {
- global allFlags allVars modeVars
-
- set fs {}
- foreach f [lsort $allFlags] {
- if {[lsearch $modeVars $f] < 0} {
- # lappend fs "<E<S? $f"
- # lappend fs "<S$f"
- lappend flags $f
- }
- }
- menu -m -n flags -p editFlag $flags
- eval global $flags
- foreach f $flags {
- markMenuItem flags $f [set $f]
- }
-
- set fs {}
- set flags {}
- foreach f [lsort $allVars] {
- if {[lsearch $modeVars $f] < 0} {
- # lappend fs "<E<S? $f"
- # lappend fs "<S$f"
- lappend fs "$f"
- }
- }
- menu -m -n vars -p editVar $fs
- }
-
-
- proc saveVarValues {} {
- global modes HOME
- if {[askyesno "Save variables and values to \"$HOME:alphaFlags.tcl\"?"] == "yes"} {
- set lines {}
- foreach m $modes {
- global ${m}modeVars
-
- if {[info exists ${m}modeVars]} {
- foreach v [array names ${m}modeVars] {
- append lines "set ${m}modeVars($v)\t\t\{[set ${m}modeVars($v)]\}\r"
- }
- append lines "\r"
- }
- }
-
- append lines "\r\r"
- global allFlags allVars
- set vars [lsort [concat $allFlags $allVars]]
- eval global $vars
- foreach f $vars {
- append lines "set $f\t\t\{[set $f]\}\r"
- }
-
- set fd [open "$HOME:alphaFlags.tcl" "w"]
- puts $fd $lines
- close $fd
- message "New '$HOME:alphaFlags.tcl' written."
- }
- }
-
-
- #================================================================================
-
- proc setWinMode name {
- global winModes modeSuffixes
- set nm [file tail $name]
- if {[set first [string last " <" $nm]] >= 0} {
- set rname [string range $nm 0 [expr $first - 1]]
- } else {
- set rname $nm
- }
- case $rname in $modeSuffixes
- set winModes($name) $winMode
- }
-
-
-
- proc newMode mode {
- global winModes modeProcs
-
- set name [lindex [winNames -f] 0]
- changeMode $mode
- set winModes($name) $mode
- }
-
-
- proc deactivateHook name {
- }
-
- proc suspendHook name {
- global iconifyOnSwitch
- global suspIconed
- if {$iconifyOnSwitch} {
- set wins [winNames -f]
- set suspIconed ""
- foreach win $wins {
- if {![icon -f "$win" -q]} {
- lappend suspIconed $win
- icon -f "$win" -t
- }
- }
- set suspIconed [lreverse $suspIconed]
- }
- }
-
-
- set killCompilerErrors 0
-
- proc resumeHook name {
- global iconifyOnSwitch resumeRevert suspIconed killCompilerErrors
-
- if {$killCompilerErrors} {
- set wins [winNames -f]
- if {[set res [lsearch $wins "*Compiler Errors*"]] >= 0} {
- bringToFront [lindex $wins $res]
- killWindow
- }
- }
-
- if {$iconifyOnSwitch && [info exists suspIconed]} {
- set wins [winNames -f]
- foreach win $suspIconed {
- icon -f "$win" -o
- }
- unset suspIconed
- }
- if {$resumeRevert} {
- set resumeRevert 0
- revert
- }
- }
-
-
-
- # Handles dynamically adding and deleting window names from menu.
- proc addWinName name {
- global winNameToNum winMenu winNumToName
-
- for {set i 0} {$i<100} {incr i} {
- if {[catch {set nm $winNumToName($i)} res] == "1"} {
- regexp {[^:]*$} $name nm
- if {$i < 10} {
- addMenuItem -m -l "/$i" $winMenu $nm
- } else {
- addMenuItem -m -l "" $winMenu $nm
- }
- set winNumToName($i) $name
- set winNameToNum($name) $i
- return
- }
- }
- }
-
- proc removeWinName name {
- global winNameToNum winNumToName winMenu
-
- set num $winNameToNum($name)
- unset winNumToName($num)
- unset winNameToNum($name)
- regexp {[^:]*$} $name nm
- deleteMenuItem -m $winMenu $nm
- }
-
-
- proc menuWin {menu name} {
- global winNameToNum
-
- set nms [array names winNameToNum]
-
- if {[lsearch $nms "*$name"] < 0} {
- $name
- return
- }
-
- foreach nm $nms {
- if {[string match *$name $nm] == "1"} {
- bringToFront $name
- if [icon -q] { icon -f $name -o }
- return
- }
- }
- return "normal"
- }
-
-
- # Do not move 'displayMode' calls!
- proc changeMode {newMode} {
- global lastMode modeMenus dummyProc mode
-
- set lastMode $mode
- set mode $newMode
- if {$lastMode == $mode} {
- catch {displayMode $newMode}
- return
- }
-
- # Used to be after the modeVar stuff. Why?
- if {[info exists dummyProc($mode)]} { $dummyProc($mode) }
-
- global ${mode}modeVars
- if {[info exists ${mode}modeVars]} {
- foreach v [array names ${mode}modeVars] {
- global $v
- set $v [set ${mode}modeVars($v)]
- }
- }
-
- if {[info exists modeMenus($lastMode)]} {
- foreach m $modeMenus($lastMode) {
- global $m
- catch {removeMenu [set $m]}
- }
- }
- if {[info exists modeMenus($mode)]} {
- foreach m $modeMenus($mode) {
- catch {$m}
- global $m
- catch {insertMenu [set $m]}
- }
- }
- catch {displayMode $newMode}
- }
-
-
- proc setModeMenus {} {
- global mode modeMenus allModeMenus modifiedModeMenus
-
- set menus [listpick -p "Pick menus for mode '$mode':" -l -L $modeMenus($mode) [lsort $allModeMenus]]
- set modeMenus($mode) $menus
-
- lappend modifiedModeMenus $mode
-
- foreach m $allModeMenus {
- global $m
- catch {removeMenu [set $m]}
- }
- foreach m $menus {
- global $m
- catch {$m}
- catch {insertMenu [set $m]}
- }
- }
-
-
- #=============================================================================
- # Hook procs recognized: "openHook", "closeHook", "activateHook", "deactivateHook",
- # "suspendHook", "saveasHook", "saveHook", and "resumeHook".
- #=============================================================================
-
- if {![info exists winActive]} {set winActive ""}
-
- # Event hooks - set specific modes when files opened.
-
-
- proc openHook name {
- global winModes winActive autoMark mode screenHeight screenWidth forceMainScreen recentFiles recentFilesCount
- changeMode $winModes($name)
- if {$name == {*Toolserver shell*}} startMPW
- addWinName $name
- message ""
-
- if {![catch {getFileInfo $name info}]} {
- if {$info(creator) == {ttxt}} {
- setWinInfo dirty 0
- }
- if {$info(type) == {ttro}} {
- catch {setWinInfo read-only 1}
- message "Read-only!"
- }
- }
-
- global ${mode}modeVars
-
- if {$forceMainScreen} {
- set geo [getGeometry]
- set l [lindex $geo 0]; set t [lindex $geo 1]; set w [lindex $geo 2]; set h [lindex $geo 3];
- if {($l < 0) || ($t < 35) || ([expr $l + $w] > $screenWidth) || ([expr $t + $h + 18] > $screenHeight)} {
- singlePage
- }
- }
- getWinInfo arr
- if {[info exists ${mode}modeVars(autoMark)] && [set ${mode}modeVars(autoMark)] && !$arr(read-only) && ![llength [getNamedMarks -n]]} {
- markFile
- }
-
- if {[string match "*Preferences*defs.tcl" $name]} {setWinInfo read-only 1}
-
- pushRecent $name
- }
-
-
- # full pathname
- proc saveHook name {
- global backup backExtension backDir mode
-
- if {($mode == "C") || ($mode == "C++")} {catch {modified}}
-
- if ($backup) {
- if {![string length [set dir $backDir]]} {
- set dir [file dirname $name]
- }
- if {![file exists $dir]} {
- if {[askyesno "Create backup dir '$dir'?"] == "yes"} {
- mkdir $dir
- }
- }
- catch {rm $dir:[file tail $name]$backExtension}
- catch {cp $name $dir:[file tail $name]$backExtension}
- }
- }
-
- # Clean up the mark stack.
- proc closeHook name {
- global markStack winModes winActive
-
- unset winModes($name)
- if [llength $markStack] {
- set markStack [removePat $markStack $name*]
- }
- removeWinName $name
-
- if {[set ind [lsearch $winActive $name]] >= 0} {
- set winActive [lreplace $winActive $ind $ind]
- }
-
- catch {unset winModes($name)}
- }
-
-
- proc saveasHook {oldName newName} {
- global winModes winActive
- removeWinName $oldName
- addWinName $newName
- setWinMode $newName
- changeMode $winModes($newName)
-
- pushRecent $newName
-
- if {[set ind [lsearch $winActive $oldName]] >= 0} {
- set winActive [lreplace $winActive $ind $ind]
- }
- set winActive [linsert $winActive 0 $newName]
- catch {unset winModes($oldName)}
- }
-
- if {![info exists actives]} {set actives 0}
-
- # and, install a new 'winActive' patch , to 'activateHook':
-
- proc activateHook name {
- global winModes winActive
- if {![info exists winModes($name)]} {
- setWinMode $name
- }
- changeMode $winModes($name)
-
- if {[set ind [lsearch $winActive $name]] == -1} {
- set winActive [linsert $winActive 0 $name]
- return
- }
- if {$ind >= 1} {
- set winActive [lreplace $winActive $ind $ind]
- set winActive [linsert $winActive 0 $name]
- }
-
- }
-
-
- proc dirtyHook {name dirty} {
- global winMenu
- markMenuItem $winMenu [file tail $name] $dirty "╫"
- }
-
-
- set modifiedVars {}
- set modifiedModeVars {}
- set modifiedModeMenus {}
-
-
- proc quitHook {} {
- saveModifiedVars
- }
-
-
- proc saveModifiedVars {} {
- global modifiedVars modifiedModeVars modifiedModeMenus modeMenus prefDefs recentFilesSave recentFiles
-
- if {[llength $modifiedVars] || [llength $modifiedModeVars] || [llength $modifiedModeMenus]} {
- foreach f [removeDups $modifiedModeMenus] {
- addArrDef modeMenus $f $modeMenus($f)
- }
- foreach f [removeDups $modifiedVars] {
- global $f
- addDef $f [set $f]
- }
- foreach f [removeDups $modifiedModeVars] {
- set nm [lindex $f 0]
- set mode [lindex $f 1]
- global $mode
- addArrDef [set mode] $nm [set [set mode]($nm)]
- }
- }
-
- if {[info exists recentFiles]} {
- addDef recentFilesSave $recentFiles
- }
- }
-
- #================================================================================
-
- proc describeMode {} {
- global mode modeSuffixes modeMenus modes
- global ${mode}modeVars
-
- set text "\r\tMODE $mode\r\r"
- set suffs ""
- set first 1
- foreach suf $modeSuffixes {
- if {([llength $suf] == 3) && ([lindex $suf 1] == "winMode") && ([lindex $suf 2] == $mode)} {
- if {$first} {
- lappend suffs $last
- set first 0
- } else {
- append suffs ", $last"
- }
- }
- set last $suf
- }
- append text "Mode suffixes: $suffs\r\r"
-
- set first 1
- append text "Mode menus: "
- if {[info exists modeMenus($mode)]} {
- foreach m $modeMenus($mode) {
- if $first {
- set first 0
- lappend text $m
- } else {
- append text ", $m"
- }
- }
- }
- append text "\r\r"
-
- append text "Mode-specific variables:\r"
- if {[info exists ${mode}modeVars]} {
- foreach v [lsort [array names ${mode}modeVars]] {
- append text [format "\t%-20s: \"%s\"\r" $v [set ${mode}modeVars($v)]]
- }
- }
-
-
- set etext "\rMode-independent bindings:\r"
- append text "\rMode-specific bindings:\r"
- foreach b [split [bindingList] "\r"] {
- set lst [lindex $b end]
- if {$lst == $mode} {
- append text "\t$b\r"
- } elseif {[lsearch $modes $lst] < 0} {
- append etext "\t$b\r"
- }
- }
- new -n "* <$mode> MODE *"
- insertText $text$etext
- goto 0
-
- setWinInfo dirty 0
- }
-
-
-