#!/bin/sh
# Call wish and restart \
exec wish "$0" "$@"

############################################################################
# bwedit: Version 1.1 (Experimental)
# Author: Abhijit Das (Barda) [abhij@csa.iisc.ernet.in]
# Last updated: Wed Feb 11 1998
############################################################################

# Edit the following two lines if you have bwedit and bnr.gsf
# installed elsewhere

set installdir "/usr/local/bwedit"
set psfontfile "/usr/lib/ghostscript/fonts/bnr.gsf"

# Do not edit after this line

set fntprobe [ exec xlsfonts ]
if {[regexp "bengali" $fntprobe] == 0} {
   puts "\nERROR: Font not found ...."
   puts "I cannot detect Bengali fonts in your system."
   puts "First load the fonts and then run bwedit.\n"
   exit -1;
}
unset fntprobe

set textbg "#003355"
set textfg "#f0d0f0"
set textsbg "#f0d0f0"
set textsfg "#003355"
set textibg "#d0f080"
set textht 15
set textwd 70
set ptsize 120
set slant "r"
set charmap 1
set editrmn 0

set textbg2 "#003355"
set textfg2 "#f0d0f0"
set textsbg2 "#f0d0f0"
set textsfg2 "#003355"
set textibg2 "#d0f080"
set textht2 24
set textwd2 80

proc readOptions {} {
   global textbg textfg textsbg textsfg textibg textht textwd ptsize slant charmap
   global textbg2 textfg2 textsbg2 textsfg2 textibg2 textht2 textwd2 editrmn

   set rcfile "~/.bweditrc"
   if [file exists $rcfile] {
      set rcf [open $rcfile r]
      while { [gets $rcf rcline] >= 0 } {
         set rcline [string trim $rcline]
         set cidx [string first ":" $rcline]
         if {($cidx >= 0) && [string compare "#" [string index $rcline 0]]} {
            set rcName [ string range $rcline 0 [expr $cidx - 1] ]
            set rcVal [ string range $rcline [expr $cidx + 1] [expr [string length $rcline] - 1] ]
            set rcName [string tolower [string trim $rcName]]
            set rcVal [string tolower [string trim $rcVal]]
            switch -exact $rcName {
               "textbackground" { set textbg $rcVal }
               "textforeground" { set textfg $rcVal }
               "selectionbackground" { set textsbg $rcVal }
               "selectionforeground" { set textsfg $rcVal }
               "cursorcolor" { set textibg $rcVal }
               "textheight" { set textht $rcVal }
               "textwidth" { set textwd $rcVal }
               "defaultpointsize" { set ptsize $rcVal }
               "slant" { set slant $rcVal }
               "charmap" { set charmap $rcVal }
               "editroman" { set editrmn $rcVal }
               "textbackground2" { set textbg2 $rcVal }
               "textforeground2" { set textfg2 $rcVal }
               "selectionbackground2" { set textsbg2 $rcVal }
               "selectionforeground2" { set textsfg2 $rcVal }
               "cursorcolor2" { set textibg2 $rcVal }
               "textheight2" { set textht2 $rcVal }
               "textwidth2" { set textwd2 $rcVal }
            }
         }
      }
      close $rcf
   }
}

readOptions

switch -exact $ptsize {
   100 {set textsp3 4}
   120 {set textsp3 5}
   150 {set textsp3 6}
   180 {set textsp3 7}
   210 {set textsp3 8}
   250 {set textsp3 10}
   300 {set textsp3 12}
   360 {set textsp3 15}
   default {set textsp3 5}
}

frame .cmdfr -relief raised -borderwidth 2
frame .namefr
frame .mainfr
frame .mainfr.editfr
frame .mainfr.cafr -relief raised -borderwidth 2
frame .mainfr.cafr.swarfr
frame .mainfr.cafr.banfr1
frame .mainfr.cafr.banfr2
frame .mainfr.cafr.splfr
frame .mainfr.cafr.jukfr1
frame .mainfr.cafr.jukfr2
frame .mainfr.cafr.jukfr3
frame .mainfr.cafr.jukfr4
frame .mainfr.cafr.jukfr5
frame .mainfr.cafr.jukfr6

#Command bar
menubutton .cmdfr.file -text "File" -height 1 -relief flat \
      -menu .cmdfr.file.m -bg #d3d3d3 -fg #000000 -underline 0 \
      -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0
menubutton .cmdfr.edit -text "Edit" -height 1 -relief flat \
      -menu .cmdfr.edit.m -bg #d3d3d3 -fg #000000 -underline 0 \
      -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0
menubutton .cmdfr.option -text "Option" -height 1 -relief flat \
      -menu .cmdfr.option.m -bg #d3d3d3 -fg #000000 -underline 1 \
      -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0
menubutton .cmdfr.import -text "Import" -height 1 -relief flat \
      -menu .cmdfr.import.m -bg #d3d3d3 -fg #000000 -underline 1 \
      -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0
menubutton .cmdfr.export -text "Export" -height 1 -relief flat \
      -menu .cmdfr.export.m -bg #d3d3d3 -fg #000000 -underline 1 \
      -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0
menubutton .cmdfr.help -text "Help" -height 1 -relief flat \
      -menu .cmdfr.help.m -bg #d3d3d3 -fg #000000 -underline 0 \
      -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0
menu .cmdfr.file.m
.cmdfr.file.m add command -label "  New (Alt+N)  " -command {newFile} -underline 2
.cmdfr.file.m add command -label "  Load (Alt+L)  " -command {loadFile} -underline 2
.cmdfr.file.m add command -label "  Insert (Alt+I)  " -command {insertFile} -underline 2
.cmdfr.file.m add command -label "  Append (Alt+A)  " -command {appendFile} -underline 2
.cmdfr.file.m add command -label "  Save (Alt+V)  " -command {saveThisFile} -underline 4
.cmdfr.file.m add command -label "  Save as (Alt+S)  " -command {saveFile} -underline 2
.cmdfr.file.m add separator
.cmdfr.file.m add command -label "  Quit (Alt+Q)  " -command {quitEditor} -underline 2
.cmdfr.file.m config -tearoff false -bg #d3d3d3 -fg #000000
menu .cmdfr.edit.m
.cmdfr.edit.m add command -label "  Clear  " -command {clearTextArea} -underline 2
.cmdfr.edit.m add command -label "  Select all  " -command {selectAll} -underline 9
.cmdfr.edit.m add separator
.cmdfr.edit.m add command -label "  Cut  " -command {cutBuffer} -underline 4
.cmdfr.edit.m add command -label "  Copy  " -command {copyBuffer} -underline 5
.cmdfr.edit.m add command -label "  Paste  " -command {pasteBuffer} -underline 2
.cmdfr.edit.m add separator
.cmdfr.edit.m add command -label "  Normal  " -command {normalBuffer} -underline 2
.cmdfr.edit.m add command -label "  Underline  " -command {ulBuffer} -underline 2
.cmdfr.edit.m add command -label "  Superscript  " -command {supBuffer} -underline 2
.cmdfr.edit.m add command -label "  Subscript  " -command {subBuffer} -underline 4
.cmdfr.edit.m add separator
.cmdfr.edit.m add command -label "  Document font (Alt+D)  " -command {chooseBaseFont} -underline 2
.cmdfr.edit.m config -tearoff false -bg #d3d3d3 -fg #000000
menu .cmdfr.option.m
.cmdfr.option.m add command -label "  Show Keyboard map (Alt+K)  " -command {viewKbdMap} -underline 7
if ($charmap) {
   .cmdfr.option.m add command -label "  Hide character array (Alt+C) " -command {manageCharMap} -underline 7
} else {
   .cmdfr.option.m add command -label "  Show character array (Alt+C) " -command {manageCharMap} -underline 7
}
.cmdfr.option.m add separator
.cmdfr.option.m add command -label "  Edit options (Alt+O)  " -command {editOptions} -underline 7
.cmdfr.option.m add command -label "  Save options  " -command {saveOptions} -underline 2
.cmdfr.option.m config -tearoff false -bg #d3d3d3 -fg #000000
menu .cmdfr.import.m
.cmdfr.import.m add command -label "  Read encoding  " -command {readEnc} -underline 2
.cmdfr.import.m add separator
.cmdfr.import.m add command -label "  Import formatted roman text  " -command {importRoman} -underline 2
.cmdfr.import.m add command -label "  Edit formatted roman text  " -command {editRoman} -underline 2
.cmdfr.import.m add separator
.cmdfr.import.m add command -label "  Roman-to-Bengali conversion rules  " -command {helpwinRoman} -underline 19
.cmdfr.import.m config -tearoff false -bg #d3d3d3 -fg #000000
menu .cmdfr.export.m
.cmdfr.export.m add command -label "  To HTML  " -command {exportHTML} -underline 5
.cmdfr.export.m add command -label "  To LaTeX  " -command {exportLaTeX} -underline 5
.cmdfr.export.m add command -label "  To PostScript  " -command {exportPS} -underline 5
.cmdfr.export.m config -tearoff false -bg #d3d3d3 -fg #000000
menu .cmdfr.help.m
.cmdfr.help.m add command -label "  About bwedit  " -command {helpwin} -underline 2
.cmdfr.help.m add command -label "  Copyright notice  " -command {copyInfo} -underline 2
.cmdfr.help.m config -tearoff false -bg #d3d3d3 -fg #000000
label .cmdfr.blank -text "" -relief flat -bg #d3d3d3 -fg #000000
image create photo bweditlogo -file "$installdir/images/bwedit-logo.gif"
label .cmdfr.logo -image "bweditlogo" -relief flat -bg #d3d3d3 -fg #000000
pack .cmdfr.file .cmdfr.edit .cmdfr.option .cmdfr.import .cmdfr.export \
      .cmdfr.help -side left -padx 5 -pady 0 -side left
pack .cmdfr.blank -side left -expand yes -fill both
pack .cmdfr.logo -side left -padx 5 -pady 0 -side left

#File name
label .namefr.lbl -text " File name: " -relief flat -foreground #000000 -background #d3d3d3
entry .namefr.ent -textvariable fname -relief sunken \
      -background #ffb6c1 -foreground #000000
# Previous background: #ddaaaa
bind .namefr.ent <Return> {focus .mainfr.editfr.textarea; loadThisFile}
pack .namefr.lbl -side left -padx 0 -pady 0
pack .namefr.ent -side left -padx 0 -pady 0 -expand yes -fill x
.namefr.ent config -selectbackground #ffffcc -selectforeground #000000 -selectborderwidth 0

#Edit area
text .mainfr.editfr.textarea -relief sunken -height $textht -width $textwd \
            -font "-*-bengali-medium-$slant-*-*-*-$ptsize-*-*-*-*-*-fontspecific" \
            -xscroll ".mainfr.hscroll set" -yscroll ".mainfr.editfr.scrbar set" \
            -wrap none -spacing3 $textsp3 -relief flat \
            -insertbackground $textibg -insertwidth 3 \
            -background $textbg -foreground $textfg -borderwidth 2 \
            -selectbackground $textsbg -selectforeground $textsfg -selectborderwidth 0
# Previous background: #44bbee  Previous foreground: #000000
scrollbar .mainfr.editfr.scrbar -relief sunken -orient vertical \
           -command ".mainfr.editfr.textarea yview" -bg #d3d3d3 -width 12 \
           -activebackground #d3d3d3
pack .mainfr.editfr.scrbar -fill y -side right -padx 0 -pady 0
pack .mainfr.editfr.textarea -expand yes -fill both -side right -padx 0 -pady 0

#Horizontal scrollbar
scrollbar .mainfr.hscroll -relief sunken -orient horizontal \
           -command ".mainfr.editfr.textarea xview" -bg #d3d3d3 -width 12 \
           -activebackground #d3d3d3

proc addcb { fr asc } {
   set char [list format "%c" $asc]
   button .mainfr.cafr.$fr.char$asc -text [eval $char] -relief flat -width 1 \
          -font "-*-bengali-medium-r-*-*-*-100-*-*-*-*-*-fontspecific" \
          -bg #a9a9a9 -fg #000000 -borderwidth -3 \
          -activeforeground #ffffff -activebackground #888888 \
          -command "printChar $asc"
   pack .mainfr.cafr.$fr.char$asc -padx 0 -pady 0 -side left
}

proc printChar { i } {
   set char [format "%c" $i]
   .mainfr.editfr.textarea insert insert $char
}

#Swar frame
addcb swarfr 97
button .mainfr.cafr.swarfr.charA -text "aA" -relief flat -width 1 \
       -font "-*-bengali-medium-r-*-*-*-100-*-*-*-*-*-fontspecific" \
       -bg #a9a9a9 -fg #000000 -borderwidth -3 \
       -activeforeground #ffffff -activebackground #888888 \
       -command {.mainfr.editfr.textarea insert insert "aA"}
pack .mainfr.cafr.swarfr.charA -padx 0 -pady 0 -side left
for {set i 1} {$i <= 8} {incr i 1} {
   addcb swarfr $i
}
addcb swarfr 111
addcb swarfr 65
addcb swarfr 105
addcb swarfr 73
addcb swarfr 117
addcb swarfr 85
addcb swarfr 87
addcb swarfr 101
addcb swarfr 69
addcb swarfr 79

#Banjon frames
addcb banfr1 107
addcb banfr1 75
addcb banfr1 103
addcb banfr1 71
addcb banfr1 113
addcb banfr1 99
addcb banfr1 67
addcb banfr1 106
addcb banfr1 74
addcb banfr1 81
addcb banfr1 84
addcb banfr1 90
addcb banfr1 68
addcb banfr1 88
addcb banfr1 78
addcb banfr1 116
addcb banfr1 122
addcb banfr1 100
addcb banfr1 120
addcb banfr1 110

addcb banfr2 112
addcb banfr2 102
addcb banfr2 98
addcb banfr2 118
addcb banfr2 109
addcb banfr2 89
addcb banfr2 114
addcb banfr2 108
button .mainfr.cafr.banfr2.charw -text "b" -relief flat -width 1 \
       -font "-*-bengali-medium-r-*-*-*-100-*-*-*-*-*-fontspecific" \
       -bg #a9a9a9 -fg #000000 -borderwidth -3 \
       -activeforeground #ffffff -activebackground #888888 \
       -command {.mainfr.editfr.textarea insert insert "b"}
pack .mainfr.cafr.banfr2.charw -padx 0 -pady 0 -side left
addcb banfr2 83
addcb banfr2 70
addcb banfr2 115
addcb banfr2 104
addcb banfr2 82
addcb banfr2 86
addcb banfr2 121
addcb banfr2 66
addcb banfr2 77
addcb banfr2 72
addcb banfr2 119

#Special frame
addcb splfr 14
addcb splfr 15
addcb splfr 94
addcb splfr 95
addcb splfr 25
addcb splfr 26
addcb splfr 27
addcb splfr 28
addcb splfr 29
addcb splfr 30
addcb splfr 46
addcb splfr 60
addcb splfr 126
addcb splfr 123
addcb splfr 124
addcb splfr 36
addcb splfr 92
addcb splfr 96
addcb splfr 39
addcb splfr 34

#Juktakkhar frames
for {set i 128} {$i <= 151} {incr i 1} {
   addcb jukfr1 $i
}
for {set i 152} {$i <= 159} {incr i 1} {
   addcb jukfr2 $i
}
addcb jukfr2 80
for {set i 161} {$i <= 175} {incr i 1} {
   addcb jukfr2 $i
}
for {set i 176} {$i <= 199} {incr i 1} {
   addcb jukfr3 $i
}
for {set i 200} {$i <= 223} {incr i 1} {
   addcb jukfr4 $i
}
for {set i 224} {$i <= 247} {incr i 1} {
   addcb jukfr5 $i
}
for {set i 248} {$i <= 255} {incr i 1} {
   addcb jukfr6 $i
}
for {set i 16} {$i <= 24} {incr i 1} {
   addcb jukfr6 $i
}
addcb jukfr6 31
addcb jukfr6 62
addcb jukfr6 76
addcb jukfr6 125
#addcb jukfr6 127

#pack top level components
pack .mainfr.cafr.swarfr -padx 0 -pady 0 -fill x
pack .mainfr.cafr.banfr1 -padx 0 -pady 0 -fill x
pack .mainfr.cafr.banfr2 -padx 0 -pady 0 -fill x
pack .mainfr.cafr.splfr -padx 0 -pady 0 -fill x
for {set i 1} {$i <= 6} {incr i 1} {
   pack .mainfr.cafr.jukfr$i -padx 0 -pady 0 -fill x
   .mainfr.cafr.jukfr$i config -bg #d3d3d3
}
if ($charmap) { pack .mainfr.cafr -padx 0 -pady 0 -fill x -side bottom }
pack .mainfr.hscroll -padx 0 -pady 0 -fill x -side bottom
pack .mainfr.editfr -padx 0 -pady 0 -expand yes -fill both -side bottom
pack .cmdfr -padx 0 -pady 0 -fill x
pack .namefr -padx 5 -pady 5 -fill x
pack .mainfr -padx 0 -pady 0 -expand yes -fill both

.cmdfr config -bg #d3d3d3
.namefr config -bg #d3d3d3
.mainfr config -bg #d3d3d3
.mainfr.editfr config -bg #d3d3d3
.mainfr.cafr config -bg #d3d3d3
.mainfr.cafr.swarfr config -bg #d3d3d3
.mainfr.cafr.banfr1 config -bg #d3d3d3
.mainfr.cafr.banfr2 config -bg #d3d3d3
.mainfr.cafr.splfr config -bg #d3d3d3
. config -bg #d3d3d3

focus .mainfr.editfr.textarea

proc errmsg { msg } {
   set ewin [toplevel .error]

   message $ewin.msg -text $msg -relief flat -fg #000000 -bg #d3d3d3 -width 250 -justify center
   button $ewin.btn -text "Ok" -relief raised -fg #000000 -bg #a9a9a9 \
          -activeforeground #000000 -activebackground #a9a9a9 \
          -command {set edone 1} -height 0

   pack $ewin.msg -padx 0 -pady 0 -expand yes -fill both
   pack $ewin.btn -pady 10

   bind $ewin <Escape> {set edone 1}
   bind $ewin <Return> {set edone 1}

   $ewin config -bg #d3d3d3

   wm transient $ewin .
   set posx [winfo x .]
   set posy [winfo y .]
   incr posx [winfo x .mainfr]
   incr posy [winfo y .mainfr]
   set twd [winfo width .mainfr.editfr.textarea]
   set tht [winfo height .mainfr.editfr.textarea]
   set ewd 300
   set eht 150
   set posx [expr $posx + ($twd - $ewd) / 2]
   set posy [expr $posy + ($tht - $eht) / 2]
   if {$posx <= 0} { set posx 0 }
   if {$posy <= 0} { set posy 0 }
   wm geometry $ewin "${ewd}x${eht}+$posx+$posy"

   grab $ewin
   tkwait variable edone
   grab release $ewin
   destroy $ewin
}

proc loadThisFile {} {
   global fname

   if {![file readable $fname]} {
      errmsg "ERROR:\nI cannot load the file \"$fname\". The file does not exist or does not have read permission."
      return
   }
   if {![file isfile $fname]} {
      errmsg "ERROR:\nI cannot load the file. \"$fname\" is not a regular file."
      return
   }
   set f [open $fname r]
   set x [read $f]
   clearTextArea
   .mainfr.editfr.textarea insert 1.0 $x
   set t [close $f]
   wm title . "bwedit: $fname"
   focus .mainfr.editfr.textarea
   .mainfr.editfr.textarea see insert
}

proc newFile {} {
   global fname

   clearTextArea
   set fname ""
   wm title . "bwedit: (New file)"
}

proc loadFile {} {
   global fname

   set fn [getFileName "bwedit: Load"]
   if { [string compare $fn ""] != 0 } {
      if {![file readable $fn]} {
         errmsg "ERROR:\nI cannot load the file \"$fn\". The file does not exist or does not have read permission."
         return
      }
      if {![file isfile $fn]} {
         errmsg "ERROR:\nI cannot load the file. \"$fn\" is not a regular file."
         return
      }
      set f [open $fn r]
      set x [read $f]
      clearTextArea
      .mainfr.editfr.textarea insert 1.0 $x
      set t [close $f]
      set fname $fn
      wm title . "bwedit: $fname"
      .mainfr.editfr.textarea see insert
   }
}

proc insertFile {} {
   set fn [getFileName "bwedit: Insert"]
   if { [string compare $fn ""] != 0 } {
      if {![file readable $fn]} {
         errmsg "ERROR:\nI cannot insert the file \"$fn\". The file does not exist or does not have read permission."
         return
      }
      if {![file isfile $fn]} {
         errmsg "ERROR:\nI cannot insert the file. \"$fn\" is not a regular file."
         return
      }
      set f [open $fn r]
      set x [read $f]
      .mainfr.editfr.textarea insert insert $x
      set t [close $f]
      .mainfr.editfr.textarea see insert
   }
}

proc appendFile {} {
   set fn [getFileName "bwedit: Append"]
   if { [string compare $fn ""] != 0 } {
      if {![file readable $fn]} {
         errmsg "ERROR:\nI cannot append the file \"$fn\". The file does not exist or does not have read permission."
         return
      }
      if {![file isfile $fn]} {
         errmsg "ERROR:\nI cannot append the file. \"$fn\" is not a regular file."
         return
      }
      set f [open $fn r]
      set x [read $f]
      .mainfr.editfr.textarea insert end $x
      set t [close $f]
      .mainfr.editfr.textarea see insert
   }
}

proc saveThisFile {} {
   global fname

   if {![string compare "" $fname]} {
      errmsg "ERROR:\nI cannot save file. No file name is given."
      return
   }
   set dnm [file dirname $fname]
   if {![file isdirectory $dnm]} {
      errmsg "ERROR:\nI cannot save the file. \"$dnm\" is not a directory."
      return
   }
   if {![file writable $dnm]} {
      errmsg "ERROR:\nI cannot save the file. You do not have permission to write in the directory \"$dnm\"."
      return
   }
   if {[file exists $fname] && ![file isfile $fname]} {
      errmsg "ERROR:\nI cannot save the file. \"$fname\" is not a regular file."
      return
   }
   if {[file exists $fname] && ![file writable $fname]} {
      errmsg "ERROR:\nI cannot save the file. You do not have permission to overwrite \"$fname\""
      return
   }
   set f [open $fname w]
   set x [.mainfr.editfr.textarea get 1.0 end]
   puts -nonewline $f $x
   set t [close $f]
}

proc saveFile {} {
   global fname

   set fn [getFileName "bwedit: Save"]
   if { [string compare $fn ""] != 0 } {
      set dnm [file dirname $fn]
      if {![file isdirectory $dnm]} {
         errmsg "ERROR:\nI cannot save the file. \"$dnm\" is not a directory."
         return
      }
      if {![file writable $dnm]} {
         errmsg "ERROR:\nI cannot save the file. You do not have permission to write in the directory \"$dnm\"."
         return
      }
      if {[file exists $fn] && ![file isfile $fn]} {
         errmsg "ERROR:\nI cannot save the file. \"$fn\" is not a regular file."
         return
      }
      if {[file exists $fn] && ![file writable $fn]} {
         errmsg "ERROR:\nI cannot save the file. You do not have permission to overwrite \"$fn\""
         return
      }
      set f [open $fn w]
      set x [.mainfr.editfr.textarea get 1.0 end]
      puts -nonewline $f $x
      set t [close $f]
      if { [string compare $fname ""] == 0 } {
         set fname $fn
         wm title . "bwedit: $fname"
      }
   }
}

proc clearTextArea {} {
   .mainfr.editfr.textarea delete 1.0 end
}

proc quitEditor {} {
   destroy .
   exit 0
}

proc browse { win } {
   global browsedir

   $win delete 0 end
   if [regexp {/\.\.$} $browsedir] {
      set browsedir [string range $browsedir 0 [expr [string length $browsedir] - 4]]
      set browsedir [string range $browsedir 0 [expr [string last "/" $browsedir] - 1]]
   }
   if {[string compare $browsedir ""] == 0} {
      foreach f [exec ls -a "/"] {
         if {[regexp {^\.$} $f] == 0} {
            if [file isdirectory /$f] {
               $win insert end /$f/
            } else {
               $win insert end /$f
            }
         }
      }
   } else {
      foreach f [exec ls -a $browsedir] {
         if {[regexp {^\.$} $f] == 0} {
            if [file isdirectory $browsedir/$f] {
               $win insert end $browsedir/$f/
            } else {
               $win insert end $browsedir/$f
            }
         }
      }
   }
}

proc getFileName { wtitle } {
   global newfname browsedir dbox ok

   set dbox [toplevel .prompt]
   label $dbox.lbl -text "Enter filename: " -relief flat -fg #000000 -bg #d3d3d3
   entry $dbox.ent -textvariable newfname -bg #88ddff -fg #000000
   button $dbox.obtn -text "OK" -command {set ok 1} -fg #000000 -bg #a9a9a9 \
      -activeforeground #000000 -activebackground #a9a9a9
   label $dbox.space -text "" -fg #d3d3d3 -bg #d3d3d3
   button $dbox.cbtn -text "Cancel" -command {set ok 0} -fg #000000 -bg #a9a9a9 \
      -activeforeground #000000 -activebackground #a9a9a9
   frame $dbox.brfr -bg #d3d3d3
   listbox $dbox.brfr.lbx -width 50 -height 12 -bg #88ddff -fg #000000 \
      -xscroll "$dbox.xscr set" -yscr "$dbox.brfr.yscr set" -relief sunken \
      -selectmode single -selectforeground #88ddff -selectbackground #000000 \
      -selectborderwidth 0
   scrollbar $dbox.brfr.yscr -command "$dbox.brfr.lbx yview" \
      -troughcolor #88ddff -orient vertical -bg #d3d3d3 -width 12 \
      -activebackground #d3d3d3
   scrollbar $dbox.xscr -command "$dbox.brfr.lbx xview" \
      -troughcolor #88ddff -orient horizontal -bg #d3d3d3 -width 12 \
      -activebackground #d3d3d3
   bind $dbox.ent <Return> {set ok 1}
   bind $dbox <Escape> {set ok 0}
   bind $dbox.brfr.lbx <Double-Button-1> {
      foreach f [selection get] {
         if [file isdirectory $f] {
            set browsedir [string range $f 0 [expr [string length $f] - 2]]
            browse $dbox.brfr.lbx
         } else {
            set newfname $f
         }
      }
   }

   pack $dbox.lbl -padx 10 -pady 5
   pack $dbox.ent -padx 10 -pady 5 -fill x
   pack $dbox.brfr.yscr $dbox.brfr.lbx -side right -padx 0 -pady 0 -fill y
   pack $dbox.brfr -padx 10 -pady 0
   pack $dbox.xscr -padx 10 -pady 0 -fill x
   pack $dbox.obtn -padx 10 -pady 5 -side left
   pack $dbox.space -padx 10 -pady 5 -expand yes -fill x -side left
   pack $dbox.cbtn -padx 10 -pady 5
   $dbox config -bg #d3d3d3

   wm title $dbox "$wtitle"
   wm resizable $dbox false false
   browse $dbox.brfr.lbx

   focus $dbox.ent
   grab $dbox
   tkwait variable ok
   grab release $dbox
   destroy $dbox

   if ($ok) {
      return "$newfname"
   } else {
      return ""
   }
}

proc helpwin { } {
   global installdir bweditlogo

   set hwin [toplevel .help]
   $hwin config -bg #d3d3d3
   frame $hwin.cmdfr -bg #d3d3d3
   frame $hwin.dpyfr -bg #d3d3d3
   menubutton $hwin.cmdfr.file -relief flat -fg #000000 -bg #d3d3d3 \
      -activebackground #d3d3d3 -activeforeground #000000 \
      -menu $hwin.cmdfr.file.m -text "File"
   menubutton $hwin.cmdfr.content -relief flat -fg #000000 -bg #d3d3d3 \
      -activebackground #d3d3d3 -activeforeground #000000 \
      -menu $hwin.cmdfr.content.m -text "Contents"
   menu $hwin.cmdfr.file.m -tearoff false -bg #d3d3d3 -fg #000000
   $hwin.cmdfr.file.m add command -label "  Close  " -command "destroy $hwin" -underline 2
   menu $hwin.cmdfr.content.m -tearoff false -bg #d3d3d3 -fg #000000
   $hwin.cmdfr.content.m add command -label "  Introduction  " -command "adddoc $hwin.dpyfr.textarea intro 0"
   $hwin.cmdfr.content.m add separator
   $hwin.cmdfr.content.m add command -label "  Toolbar  " -command "adddoc $hwin.dpyfr.textarea toolbar 0"
   $hwin.cmdfr.content.m add command -label "      File menu  " -command "adddoc $hwin.dpyfr.textarea file 0"
   $hwin.cmdfr.content.m add command -label "      Edit menu  " -command "adddoc $hwin.dpyfr.textarea edit 0"
   $hwin.cmdfr.content.m add command -label "      Option menu  " -command "adddoc $hwin.dpyfr.textarea option 0"
   $hwin.cmdfr.content.m add command -label "      Import menu  " -command "adddoc $hwin.dpyfr.textarea import 0"
   $hwin.cmdfr.content.m add command -label "      Export menu  " -command "adddoc $hwin.dpyfr.textarea export 0"
   $hwin.cmdfr.content.m add command -label "      Help menu  " -command "adddoc $hwin.dpyfr.textarea help 0"
   $hwin.cmdfr.content.m add command -label "  Text area  " -command "adddoc $hwin.dpyfr.textarea textarea 0"
   $hwin.cmdfr.content.m add command -label "  Character array  " -command "adddoc $hwin.dpyfr.textarea chararray 0"
   $hwin.cmdfr.content.m add separator
   $hwin.cmdfr.content.m add command -label "  Edit Roman text  " -command "adddoc $hwin.dpyfr.textarea editrmn 0"
   $hwin.cmdfr.content.m add separator
   $hwin.cmdfr.content.m add command -label "  Keyboard bindings  " -command "adddoc $hwin.dpyfr.textarea binding 0"
   $hwin.cmdfr.content.m add separator
   $hwin.cmdfr.content.m add command -label "  Copyright info  " -command "adddoc $hwin.dpyfr.textarea copyright 0"
   label $hwin.cmdfr.space -fg #000000 -bg #d3d3d3 -text ""
   label $hwin.cmdfr.logo -relief flat -fg #000000 -bg #d3d3d3 -image "bweditlogo"

   text $hwin.dpyfr.textarea -relief sunken -height 20 -width 60 \
      -yscroll "$hwin.dpyfr.vscroll set" \
      -wrap none -relief flat \
      -background #ddddaa -foreground #000000 -borderwidth 2 \
      -selectbackground #000000 -selectforeground #ddddaa -selectborderwidth 0
   scrollbar $hwin.dpyfr.vscroll -relief sunken -orient vertical \
      -command "$hwin.dpyfr.textarea yview" -bg #d3d3d3 -width 12 \
      -activebackground #d3d3d3

   pack $hwin.cmdfr.file $hwin.cmdfr.content -padx 0 -pady 0 -side left
   pack $hwin.cmdfr.space -padx 0 -pady 0 -side left -expand yes -fill x
   pack $hwin.cmdfr.logo -padx 5 -pady 0 -side left
   pack $hwin.dpyfr.vscroll $hwin.dpyfr.textarea -padx 0 -pady 0 -side right \
      -expand yes -fill y
   pack $hwin.cmdfr $hwin.dpyfr -padx 0 -pady 3 -side top -fill x

   bind $hwin <Escape> "destroy $hwin"

   wm resizable $hwin false false
   wm title $hwin "bwedit: Help"
   wm iconname $hwin "bwedit: Help"
   wm iconbitmap $hwin @$installdir/images/bwedit-logo.xbm

   adddoc $hwin.dpyfr.textarea intro 0
}

proc copyInfo {} {
   global bweditlogo installdir

   set cwin [toplevel .copyright]
   label $cwin.hdr -relief flat -fg #000000 -bg #d3d3d3 -image "bweditlogo"
   label $cwin.ver -relief ridge -fg #000000 -bg #ddddaa \
      -text " Version 1.1, February 1998 "
   message $cwin.cpy -relief ridge -fg #000000 -bg #ddddaa -width 800 -text \
"bwedit -- An X11 application for editing and processing Bengali text files.
   This is based on the Tcl/Tk shell wish. This requires a fixed X11 bitmap
   font for Bengali also designed by the author.

bwedit is a freeware. You can use and distribute it free of charge as long as
   the original author gets credit and this copyright notice remains intact."

   label $cwin.aut -relief ridge -fg #000000 -bg #ddddaa -text " Author: "
   message $cwin.add -relief ridge -fg #000000 -bg #ddddaa -width 500 -text \
"Abhijit Das (Barda)
Department of Computer Science and Automation
Indian Institute of Science
Bangalore 560 012
INDIA

E-mail: abhij@csa.iisc.ernet.in"

   button $cwin.btn -fg #000000 -bg "#a9a9a9" -text " Dismiss " \
      -command "destroy $cwin" -activeforeground #000000 -activebackground #a9a9a9

   pack $cwin.hdr -padx 0 -pady 5
   pack $cwin.ver -padx 0 -pady 5
   pack $cwin.cpy -padx 5 -pady 5
   pack $cwin.aut -padx 0 -pady 5
   pack $cwin.add -padx 0 -pady 5
   pack $cwin.btn -padx 0 -pady 5
   $cwin config -bg #d3d3d3
   bind $cwin <Escape> "destroy $cwin"

   wm title $cwin "bwedit: copyright notice"
   wm resizable $cwin false false
   wm iconname $cwin "bwedit: copyright notice"
   wm iconbitmap $cwin @$installdir/images/bwedit-logo.xbm
}

proc viewKbdMap {} {
   set mapwin [toplevel .map]

   frame $mapwin.banfr
   frame $mapwin.karfr
   frame $mapwin.swarfr

   message $mapwin.banfr.ban -text \
"k K g G q
c C j J Q
T Z D X N
t z d x n
p f b v m
Y r l b S
F s h R V
y B H  M  w" -relief ridge -bg #99aabb -fg #000000 \
      -font "-*-bengali-medium-r-*-*-*-120-*-*-*-*-*-fontspecific"

   message $mapwin.banfr.banmap -text \
"k K g G q
c C j J Q
T Z D X N
t z d x n
p f b v m
Y r l b S
F s h R V
y B H M w" -relief ridge -bg #99aabb -fg #000000
      # -font "-misc-fixed-bold-r-normal--13-120-75-75-c-70-iso8859-1"

   message $mapwin.karfr.kar -text \
" A   i   I
 u   U   W

 e   E   O" -relief ridge -bg #99aabb -fg #000000 \
      -font "-*-bengali-medium-r-*-*-*-120-*-*-*-*-*-fontspecific"

   message $mapwin.karfr.karmap -text \
"A  i  I
u  U  W
e  E  O" -relief ridge -bg #99aabb -fg #000000
      # -font "-misc-fixed-bold-r-normal--13-120-75-75-c-70-iso8859-1"

   message $mapwin.swarfr.swar -text "a o" -relief ridge -bg #99aabb -fg #000000 \
      -font "-*-bengali-medium-r-*-*-*-120-*-*-*-*-*-fontspecific"

   message $mapwin.swarfr.swarmap -text "a o" -relief ridge -bg #99aabb -fg #000000

   button $mapwin.done -text "Done" -command "destroy $mapwin" -bg #a9a9a9 -fg #000000 -activebackground #a9a9a9 -activeforeground #000000

   pack $mapwin.banfr.ban $mapwin.banfr.banmap -padx 5 -pady 5 -fill x -side left
   pack $mapwin.karfr.kar $mapwin.karfr.karmap -padx 5 -pady 5 -fill x -side left
   pack $mapwin.swarfr.swar $mapwin.swarfr.swarmap -padx 5 -pady 5 -fill x -side left
   pack $mapwin.banfr $mapwin.karfr $mapwin.swarfr -padx 5 -pady 5
   pack $mapwin.done
   $mapwin config -bg #d3d3d3
   $mapwin.banfr config -bg #d3d3d3
   $mapwin.karfr config -bg #d3d3d3
   $mapwin.swarfr config -bg #d3d3d3
   bind $mapwin <Escape> "destroy $mapwin"

   wm title $mapwin "bwedit: character map"
   wm resizable $mapwin false false
}

proc manageCharMap {} {
   global charmap

   if ($charmap) {
      pack forget .mainfr.cafr
      set charmap 0
      .cmdfr.option.m entryconfigure 1 -label "  Show character array (Alt+C)  " -underline 7
   } else {
      pack forget .mainfr.editfr
      pack forget .mainfr.hscroll
      pack .mainfr.cafr -padx 0 -pady 0 -fill x -side bottom
      pack .mainfr.hscroll -padx 0 -pady 0 -fill x -side bottom
      pack .mainfr.editfr -padx 0 -pady 0 -expand yes -fill both -side bottom
      set charmap 1
      .cmdfr.option.m entryconfigure 1 -label "  Hide character array (Alt+C)  " -underline 7
   }
}

proc chooseBaseFont {} {
   global ptsize slant donef
   
   set fwin [toplevel .font]

   label $fwin.lbl -text "Choose font size" -relief flat -fg #000000 -bg #d3d3d3

   radiobutton $fwin.rb1 -width 6 -text "10" -variable ptsize -value "100" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 -activebackground #d3d3d3 -activeforeground #000000
   radiobutton $fwin.rb2 -width 6 -text "12" -variable ptsize -value "120" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 -activebackground #d3d3d3 -activeforeground #000000
   radiobutton $fwin.rb3 -width 6 -text "15" -variable ptsize -value "150" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 -activebackground #d3d3d3 -activeforeground #000000
   radiobutton $fwin.rb4 -width 6 -text "18" -variable ptsize -value "180" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 -activebackground #d3d3d3 -activeforeground #000000
   radiobutton $fwin.rb5 -width 6 -text "21" -variable ptsize -value "210" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 -activebackground #d3d3d3 -activeforeground #000000
   radiobutton $fwin.rb6 -width 6 -text "25" -variable ptsize -value "250" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 -activebackground #d3d3d3 -activeforeground #000000
   radiobutton $fwin.rb7 -width 6 -text "30" -variable ptsize -value "300" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 -activebackground #d3d3d3 -activeforeground #000000
   radiobutton $fwin.rb8 -width 6 -text "36" -variable ptsize -value "360" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 -activebackground #d3d3d3 -activeforeground #000000

   checkbutton $fwin.cb -width 9 -text " slanted" -variable slant \
      -onvalue "o" -offvalue "r" -relief raised \
      -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 \
      -activeforeground #000000 -activebackground #d3d3d3

   button $fwin.done -text "Done" -command {set donef 1} -fg #000000 -bg #a9a9a9 \
      -activeforeground #000000 -activebackground #a9a9a9
   button $fwin.cancel -text "Cancel" -command {set donef 0} -fg #000000 -bg #a9a9a9 \
      -activeforeground #000000 -activebackground #a9a9a9

   pack $fwin.lbl -pady 5 -padx 5
   for {set i 1} {$i <= 8} {incr i 1} {
      pack $fwin.rb$i
   }
   pack $fwin.cb -padx 5 -pady 5
   pack $fwin.done $fwin.cancel -pady 5 -padx 5
   $fwin config -bg #d3d3d3
   bind $fwin <Escape> {set donef 0}

   wm title $fwin "bwedit: select font"
   wm resizable $fwin false false

   grab $fwin
   tkwait variable donef
   grab release $fwin
   destroy $fwin

   if ($donef) {
      switch -exact $ptsize {
         100 {.mainfr.editfr.textarea config -spacing3 4}
         120 {.mainfr.editfr.textarea config -spacing3 5}
         150 {.mainfr.editfr.textarea config -spacing3 6}
         180 {.mainfr.editfr.textarea config -spacing3 7}
         210 {.mainfr.editfr.textarea config -spacing3 8}
         250 {.mainfr.editfr.textarea config -spacing3 10}
         300 {.mainfr.editfr.textarea config -spacing3 12}
         360 {.mainfr.editfr.textarea config -spacing3 15}
         default {.mainfr.editfr.textarea config -spacing3 6}
      }
      .mainfr.editfr.textarea config -font "-*-bengali-medium-$slant-*-*-*-$ptsize-*-*-*-*-*-fontspecific"
   }
}

set buffer ""

proc cutBuffer {} {
   global buffer

   set buffer [.mainfr.editfr.textarea get sel.first sel.last]
   .mainfr.editfr.textarea delete sel.first sel.last
}

proc copyBuffer {} {
   global buffer

   set buffer [.mainfr.editfr.textarea get sel.first sel.last]
}

proc pasteBuffer {} {
   global buffer

   .mainfr.editfr.textarea insert insert $buffer
}

.mainfr.editfr.textarea tag config suptag -offset 5
.mainfr.editfr.textarea tag config subtag -offset -5
.mainfr.editfr.textarea tag config ultag -underline true
.mainfr.editfr.textarea tag config normaltag -offset 0 -underline false

proc supBuffer {} {
   .mainfr.editfr.textarea tag add suptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subtag sel.first sel.last
   .mainfr.editfr.textarea tag remove normaltag sel.first sel.last
}

proc subBuffer {} {
   .mainfr.editfr.textarea tag add subtag sel.first sel.last
   .mainfr.editfr.textarea tag remove suptag sel.first sel.last
   .mainfr.editfr.textarea tag remove normaltag sel.first sel.last
}

proc ulBuffer {} {
   .mainfr.editfr.textarea tag add ultag sel.first sel.last
   .mainfr.editfr.textarea tag remove normaltag sel.first sel.last
}

proc normalBuffer {} {
   .mainfr.editfr.textarea tag add normaltag sel.first sel.last
   .mainfr.editfr.textarea tag remove subtag sel.first sel.last
   .mainfr.editfr.textarea tag remove suptag sel.first sel.last
   .mainfr.editfr.textarea tag remove ultag sel.first sel.last
}

proc selectAll {} {
   .mainfr.editfr.textarea tag add sel 1.0 end
}

set firstarg [lindex $argv 0]
if { [string compare $firstarg ""] != 0 } {
   set fname $firstarg
   if { [file exists $firstarg] } {
      loadThisFile
   } else {
      wm title . "bwedit: $firstarg (New)"
   }
} else {
   set fname ""
   wm title . "bwedit: (No file)"
}
set browsedir [exec pwd]

proc getExportFileName {} {
   global efname verbatim ok

   set dbox [toplevel .export]
   frame $dbox.fr1
   frame $dbox.fr2
   frame $dbox.fr3
   frame $dbox.fr4
   label $dbox.fr1.lbl -text "Export to file:" -relief flat -anchor e -bg #d3d3d3 -fg #000000
   entry $dbox.fr1.ent -textvariable efname -bg #ddaaaa -fg #000000
   label $dbox.fr2.lbl -text "Document title:" -relief flat -anchor e -bg #d3d3d3 -fg #000000
   entry $dbox.fr2.ent -textvariable doctitle -bg #ddaaaa -fg #000000
   checkbutton $dbox.fr3.cb -text "  Verbatim copy " -variable verbatim -onvalue 1 -offvalue 0 -relief raised -selectcolor #bbff00 -bg #a9a9a9 -fg #000000 -activebackground #a9a9a9 -activeforeground #000000
   button $dbox.fr4.obtn -text "OK" -command {set ok 1} -width 6 -fg #000000 -bg #a9a9a9 -activebackground #a9a9a9 -activeforeground #000000
   button $dbox.fr4.cbtn -text "Cancel" -command {set ok 0} -width 6 -fg #000000 -bg #a9a9a9 -activebackground #a9a9a9 -activeforeground #000000
   label $dbox.fr4.space -text "" -relief flat -bg #d3d3d3 -fg #000000
   bind $dbox.fr1.ent <Return> "focus $dbox.fr2.ent"
   bind $dbox.fr2.ent <Return> {set ok 1}
   bind $dbox <Escape> {set ok 0}

   pack $dbox.fr1 $dbox.fr2 $dbox.fr3 -expand yes -fill x
   pack $dbox.fr4 -expand yes -fill both
   pack $dbox.fr1.lbl -padx 5 -pady 5 -expand yes -fill x -side left
   pack $dbox.fr1.ent -padx 5 -pady 5
   pack $dbox.fr2.lbl -padx 5 -pady 5 -expand yes -fill x -side left
   pack $dbox.fr2.ent -padx 5 -pady 5
   pack $dbox.fr3.cb  -padx 5 -pady 5
   pack $dbox.fr4.obtn -padx 5 -pady 5 -fill y -side left
   pack $dbox.fr4.space -padx 5 -pady 5 -expand yes -fill x -side left
   pack $dbox.fr4.cbtn -padx 5 -pady 5 -fill y
   $dbox config -bg #d3d3d3
   $dbox.fr1 config -bg #d3d3d3
   $dbox.fr2 config -bg #d3d3d3
   $dbox.fr3 config -bg #d3d3d3
   $dbox.fr4 config -bg #d3d3d3

   wm title $dbox "bwedit: export"
   wm resizable $dbox false false

   focus $dbox.fr1.ent
   grab $dbox
   tkwait variable ok
   grab release $dbox
   destroy $dbox

   if ($ok) {
      return "$efname"
   } else {
      return ""
   }
}

proc exportLaTeX {} {
   global fname efname verbatim doctitle

   if { [string compare $fname ""] != 0 } {
      set dotindex [string last "." $fname]
      incr dotindex -1
   } else {
      set dotindex -1
   }
   if {$dotindex >= 0} {
      set efname [string range $fname 0 $dotindex]
      set efname "$efname.tex"
   } else {
      set efname "$fname.tex"
   }
   set verbatim 0
   set doctitle ""
   set efn [getExportFileName]
   if { [string compare $efn ""] != 0 } {
      set f [open $efn w]
      puts $f "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
      puts $f "%% Filename: $efname"
      puts $f "%% Original file: $fname"
      puts $f "%% Exported by: bwedit version 1.1"
      puts $f "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
      puts $f "\\documentstyle\[10pt,bengali\]\{article\}"
      puts $f "\\parindent 0pt"
      puts $f "\\parskip 10pt"
      puts $f "\\hbadness 10000"
      if { [string compare $doctitle ""] != 0 } {
         puts $f "\\pagestyle\{myheadings\}"
         puts $f "\\markboth\{$doctitle\}\{$doctitle\}"
      }
      puts $f "\\begin\{document\}"
      puts $f "\\begingroup\\bn\\leavevmode"
      set ins [.mainfr.editfr.textarea get 1.0 end]
      set inl [string length $ins]
      for {set i 0} {$i < $inl} {incr i 1} {
         set nextchar [string range $ins $i $i]
         scan $nextchar "%c" asciival
         switch -exact $asciival {
             1 { puts -nonewline $f "\{\\char2\}" }
             2 { puts -nonewline $f "\{\\char3\}" }
             3 { puts -nonewline $f "\{\\char4\}" }
             4 { puts -nonewline $f "\{\\char5\}" }
             5 { puts -nonewline $f "\{\\char6\}" }
             6 { puts -nonewline $f "\{\\char8\}" }
             7 { puts -nonewline $f "\{\\char9\}" }
             8 { puts -nonewline $f "\{\\char10\}" }
             9 { puts -nonewline $f "\t" }
            10 { if ($verbatim) {
                    puts $f "\\null\\\\"
                 } else {
                    puts $f ""
                 }
               }
            14 { puts -nonewline $f "\{\\char13\}" }
            32 { if ($verbatim) {
                    puts -nonewline $f "\\ "
                 } else {
                    puts -nonewline $f " "
                 }
               }
            35 { puts -nonewline $f "\\#" }
            36 { puts -nonewline $f "\{\\bucks\}" }
            37 { puts -nonewline $f "\\%" }
            38 { }
            60 { puts -nonewline $f ".." }
            62 { puts -nonewline $f "\{\\char62\}" }
            64 { }
            80 { puts -nonewline $f "\{\\char160\}" }
            91 { puts -nonewline $f "\{\\char91\}" }
            92 { puts -nonewline $f "\{\\char92\}" }
            93 { puts -nonewline $f "\{\\char93\}" }
            94 { puts -nonewline $f "\{\\char14\}" }
            95 { puts -nonewline $f "\{\\char12\}" }
            97 { puts -nonewline $f "\{\\char0\}" }
           111 { puts -nonewline $f "\{\\char11\}" }
            default {
               if { $asciival < 32 } {
                  puts -nonewline $f "\{\\char$asciival\}"
               } elseif { $asciival >= 123 } {
                  puts -nonewline $f "\{\\char$asciival\}"
               } else {
                  puts -nonewline $f $nextchar
               }
            }
         }
      }
      puts $f "\\endgroup"
      puts $f "\\end\{document\}"
      puts $f "%% End of file"
      close $f
   }
}

proc exportHTML {} {
   global fname efname verbatim doctitle

   if { [string compare $fname ""] != 0 } {
      set dotindex [string last "." $fname]
      incr dotindex -1
   } else {
      set dotindex -1
   }
   if {$dotindex >= 0} {
      set efname [string range $fname 0 $dotindex]
      set efname "$efname.html"
   } else {
      set efname "$fname.html"
   }
   set verbatim 0
   set doctitle "untitled"
   set efn [getExportFileName]
   if { [string compare $efn ""] != 0 } {
      set f [open $efn w]
      puts $f "<!--------------------------------------------------------->"
      puts $f "<!-- Filename: $efname -->"
      puts $f "<!-- Original file: $fname -->"
      puts $f "<!-- Exported by: bwedit version 1.1 -->"
      puts $f "<!--------------------------------------------------------->"
      puts $f "<HTML>"
      puts $f "<HEAD><TITLE>$doctitle</TITLE></HEAD>"
      puts $f "<BODY>"
      set ins [.mainfr.editfr.textarea get 1.0 end]
      set inl [string length $ins]
      for {set i 0} {$i < $inl} {incr i 1} {
         set nextchar [string range $ins $i $i]
         scan $nextchar "%c" asciival
         switch -exact $asciival {
            34 { puts -nonewline $f "&quot;" }
            38 { puts -nonewline $f "&amp;" }
            60 { puts -nonewline $f "&lt;" }
            62 { puts -nonewline $f "&gt;" }
             9 { if ($verbatim) {
                    puts -nonewline $f "&nbsp;"
                 } else {
                    puts  -nonewline $f "\t"
                 }
               }
            10 { if ($verbatim) {
                    puts $f "<BR>"
                 } else {
                    incr i 1
                    set nextnextchar [string range $ins $i $i]
                    if { [string compare $nextnextchar "\n"] == 0 } {
                       puts $f "\n<P>"
                    } else {
                       incr i -1
                       puts $f ""
                    }
                 }
               }
            32 { if ($verbatim) {
                    puts -nonewline $f "&nbsp;"
                 } else {
                    puts -nonewline $f " "
                 }
               }
            default {
               if { $asciival < 32 } {
                  puts -nonewline $f "&#$asciival;"
               } elseif { $asciival >= 128 } {
                  puts -nonewline $f "&#$asciival;"
               } else {
                  puts -nonewline $f $nextchar
               }
            }
         }
      }
      puts $f "</BODY>"
      puts $f "</HTML>"
      puts $f "<!-- End of file -->"
      close $f
   }
}

proc getPSFileName {} {
   global efname pt sl pageheight textheight xoffset yoffset ok

   set dbox [toplevel .export]
   frame $dbox.fr1
   frame $dbox.fr2
   frame $dbox.fr3
   frame $dbox.fr4
   frame $dbox.fr5
   frame $dbox.fr6
   frame $dbox.fr7
   label $dbox.fr1.lbl -text "Export to file:" -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr1.ent -textvariable efname -bg #ddaaaa -fg #000000
   label $dbox.fr2.lbl -text "Point size:" -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr2.ent -textvariable pt -bg #ddaaaa -fg #000000 -width 4
   checkbutton $dbox.fr2.cb -text " Slanted " -variable sl -offvalue "normal" -onvalue "slanted" -relief raised -selectcolor #bbff00 -fg #000000 -bg #a9a9a9 -activebackground #a9a9a9 -activeforeground #000000
   label $dbox.fr3.lbl -text "Text height (cm)" -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr3.ent -textvariable textheight -bg #ddaaaa -fg #000000
   label $dbox.fr4.lbl -text "X offset (cm)" -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr4.ent -textvariable xoffset -bg #ddaaaa -fg #000000
   label $dbox.fr5.lbl -text "Y offset (cm)" -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr5.ent -textvariable yoffset -bg #ddaaaa -fg #000000
   label $dbox.fr6.lbl -text "Page height (cm)" -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr6.ent -textvariable pageheight -bg #ddaaaa -fg #000000
   button $dbox.fr7.obtn -text "OK" -command {set ok 1} -width 6 -fg #000000 -bg #a9a9a9 -activebackground #a9a9a9 -activeforeground #000000
   button $dbox.fr7.cbtn -text "Cancel" -command {set ok 0} -width 6 -fg #000000 -bg #a9a9a9 -activebackground #a9a9a9 -activeforeground #000000
   label $dbox.fr7.space -text "" -relief flat -fg #000000 -bg #d3d3d3
   pack $dbox.fr1 -expand yes -fill x
   pack $dbox.fr2
   pack $dbox.fr3 $dbox.fr4 $dbox.fr5 $dbox.fr6 $dbox.fr7 -expand yes -fill x
   pack $dbox.fr1.lbl -padx 5 -pady 5 -side left -expand yes -fill x
   pack $dbox.fr1.ent -padx 5 -pady 5
   pack $dbox.fr2.lbl -padx 5 -pady 5 -side left -expand yes -fill x
   pack $dbox.fr2.ent $dbox.fr2.cb -padx 5 -pady 5 -side left
   pack $dbox.fr3.lbl -padx 5 -pady 5 -side left -expand yes -fill x
   pack $dbox.fr3.ent -padx 5 -pady 5
   pack $dbox.fr4.lbl -padx 5 -pady 5 -side left -expand yes -fill x
   pack $dbox.fr4.ent -padx 5 -pady 5
   pack $dbox.fr5.lbl -padx 5 -pady 5 -side left -expand yes -fill x
   pack $dbox.fr5.ent -padx 5 -pady 5
   pack $dbox.fr6.lbl -padx 5 -pady 5 -side left -expand yes -fill x
   pack $dbox.fr6.ent -padx 5 -pady 5
   pack $dbox.fr7.obtn -padx 5 -pady 5 -side left
   pack $dbox.fr7.space -padx 5 -pady 5  -side left -expand yes -fill x
   pack $dbox.fr7.cbtn -padx 5 -pady 5 -fill y
   $dbox config -bg #d3d3d3
   $dbox.fr1 config -bg #d3d3d3
   $dbox.fr2 config -bg #d3d3d3
   $dbox.fr3 config -bg #d3d3d3
   $dbox.fr4 config -bg #d3d3d3
   $dbox.fr5 config -bg #d3d3d3
   $dbox.fr6 config -bg #d3d3d3
   $dbox.fr7 config -bg #d3d3d3
   bind $dbox <Escape> {set ok 0}
   bind $dbox.fr1.ent <Return>  "focus $dbox.fr2.ent"
   bind $dbox.fr2.ent <Return>  "focus $dbox.fr3.ent"
   bind $dbox.fr3.ent <Return>  "focus $dbox.fr4.ent"
   bind $dbox.fr4.ent <Return>  "focus $dbox.fr5.ent"
   bind $dbox.fr5.ent <Return>  "focus $dbox.fr6.ent"
   bind $dbox.fr6.ent <Return>  {set ok 1}

   wm title $dbox "bwedit: export"
   wm resizable $dbox false false

   focus $dbox.fr1.ent
   grab $dbox
   tkwait variable ok
   grab release $dbox
   destroy $dbox

   if ($ok) {
      return "$efname"
   } else {
      return ""
   }
}

proc exportPS {} {
   global fname efname pt sl pageheight textheight xoffset yoffset psfontfile

   if { [string compare $fname ""] != 0 } {
      set dotindex [string last "." $fname]
      incr dotindex -1
   } else {
      set dotindex -1
   }
   if {$dotindex >= 0} {
      set efname [string range $fname 0 $dotindex]
      set efname "$efname.ps"
   } else {
      set efname "$fname.ps"
   }
   set pt 15
   set sl "normal"
   set pageheight 29.7
   set textheight 24.7
   set xoffset 2.5
   set yoffset 2.5

   set efn [getPSFileName]
   if { [string compare $efn ""] != 0 } {
      set pageno 1
      set f [open $efn w]
      puts $f "%!PS-Adobe-2.0"
      puts $f "%%Title: Exported from $fname"
      puts $f "%%Creator: bwedit version 1.1"
      puts $f "%%CreationDate: [exec date]"
      puts $f "%%Pages: (atend)"
      puts $f "%%PageOrder: Ascend"
      puts $f "%%BoundingBox: 0 0 596 842"
      puts $f "%%DocumentFonts: "
      puts $f "%%DocumentPaperSizes: a4"
      puts $f "%%EndComments"

      set ff [open $psfontfile r]
      set x [read $ff]
      puts $f $x
      close $ff

      set corr1 [expr 0.43 * $pt]
      set corr2 [expr 0.23 * $pt]
      set corr3 [expr 0.20 * $pt]
      set corr4 [expr 0.56 * $pt]
      set corr5 [expr 0.06 * $pt]
      set lineskip [expr 1.4 * $pt]
      set uly [expr ($pageheight - $yoffset) * 28.35 - (0.8 * $pt)]
      set lly [expr $uly - ($textheight * 28.35)]
      set xoffset [expr $xoffset * 28.35]
      set currenty $uly
      if { [string compare $sl "normal"] == 0 } {
         puts $f "/M \{ moveto \} def"
         puts $f "/S \{ show \} def"
      } else {
         puts $f "/M \{ dup 4 div neg /y0 exch def moveto \} def"
         puts $f "/S \{ dup stringwidth pop /xx exch def gsave \[1 0 0.25 1 y0 0\] concat show grestore xx 0 rmoveto \} def"
      }
      puts $f "/N \{ $xoffset $uly M \} def"
      puts $f "/B \{ neg /corr exch def corr 0 rmoveto \} def /F \{ /corr exch def corr 0 rmoveto \} def"
      puts $f "/CH 1 string def /P \{ CH 0 3 -1 roll put CH S \} def"
      puts $f "/Bengali findfont $pt scalefont setfont"

      puts $f "\n%%Page: $pageno $pageno\nN"
      set ins [.mainfr.editfr.textarea get 1.0 end]
      set inl [string length $ins]
      set acc ""
      for {set i 0} {$i < $inl} {incr i 1} {
         set nextchar [string range $ins $i $i]
         scan $nextchar "%c" asciival
         switch -exact $asciival {
             1 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr5 B 1 P $corr5 F"
               }
             3 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr5 B 3 P $corr5 F"
               }
             4 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr5 B 4 P $corr5 F"
               }
            10 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 set currenty [expr $currenty - $lineskip]
                 if { $currenty <= $lly } {
                    incr pageno 1
                    puts $f "showpage\n\n%%Page: $pageno $pageno\nN"
                    set currenty $uly
                 }
                 puts $f "$xoffset $currenty M"
               }
            15 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr4 B 15 P $corr4 F"
               }
            37 { set acc "$acc\\$nextchar" }
            40 { set acc "$acc\\$nextchar" }
            41 { set acc "$acc\\$nextchar" }
            46 { set acc "$acc $nextchar" }
            60 { set acc "$acc $nextchar" }
            73 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr1 B (I) S $corr1 F"
               }
            79 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr1 B (O) S $corr1 F"
               }
            84 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr5 B (T) S $corr5 F"
               }
            85 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr2 B (U) S $corr2 F"
               }
            87 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr2 B (W) S $corr2 F"
               }
            92 { set acc "$acc\\$nextchar" }
           117 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr2 B (u) S $corr2 F"
               }
           119 { if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                 puts $f "$corr3 B (w) S $corr3 F"
               }
            default {
               if { $asciival < 32 } {
                  if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                  puts $f "$asciival P"
               } elseif { $asciival > 127} {
                  if { [string compare $acc ""] != 0 } { puts $f "($acc) S" ; set acc "" }
                  puts $f "$asciival P"
               } else {
                  set acc "$acc$nextchar"
               }
            }
         }
      }
      puts $f "showpage\n"
      puts $f "%%Trailer"
      puts $f "%%Pages: $pageno"
      puts $f "%%EOF"
      close $f
   }
}

proc editOptions {} {
   global textbg textfg textsbg textsfg textibg textht textwd ptsize slant charmap charmap2 textsp3
   global oldtextbg oldtextfg oldtextsbg oldtextsfg oldtextibg oldtextht oldtextwd oldptsize oldslant oldcharmap
   global ok

   set oldtextbg $textbg
   set oldtextfg $textfg
   set oldtextsbg $textsbg
   set oldtextsfg $textsfg
   set oldtextibg $textibg
   set oldtextht $textht
   set oldtextwd $textwd
   set oldptsize $ptsize
   set oldslant $slant
   set oldcharmap $charmap
   set dbox [toplevel .option]
   frame $dbox.fr1
   frame $dbox.fr2
   frame $dbox.fr3
   frame $dbox.fr4
   frame $dbox.fr5
   frame $dbox.fr6
   frame $dbox.fr7
   frame $dbox.fr8
   frame $dbox.fr9
   frame $dbox.frA
   label $dbox.fr1.lbl -text "Text background color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr1.ent -textvariable textbg -bg #ddaaaa -fg #000000
   label $dbox.fr2.lbl -text "Text foreground color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr2.ent -textvariable textfg -bg #ddaaaa -fg #000000
   label $dbox.fr3.lbl -text "Selection background color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr3.ent -textvariable textsbg -bg #ddaaaa -fg #000000
   label $dbox.fr4.lbl -text "Selection foreground color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr4.ent -textvariable textsfg -bg #ddaaaa -fg #000000
   label $dbox.fr5.lbl -text "Cursor color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr5.ent -textvariable textibg -bg #ddaaaa -fg #000000
   label $dbox.fr6.lbl -text "Text height (number of lines): " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr6.ent -textvariable textht -bg #ddaaaa -fg #000000
   label $dbox.fr7.lbl -text "Text width (in avg char width): " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr7.ent -textvariable textwd -bg #ddaaaa -fg #000000
   label $dbox.fr8.lbl -text "Default point size: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   menubutton $dbox.fr8.pt -textvariable ptsize -height 1 -width 8 \
         -relief ridge -menu $dbox.fr8.ptm -bg #a9a9a9 -fg #000000 \
         -activebackground #a9a9a9 -activeforeground #000000
   menu $dbox.fr8.ptm -tearoff false -bg #d3d3d3 -fg #000000
   $dbox.fr8.ptm add command -label " 100 " -command {set ptsize 100}
   $dbox.fr8.ptm add command -label " 120 " -command {set ptsize 120}
   $dbox.fr8.ptm add command -label " 150 " -command {set ptsize 150}
   $dbox.fr8.ptm add command -label " 180 " -command {set ptsize 180}
   $dbox.fr8.ptm add command -label " 210 " -command {set ptsize 210}
   $dbox.fr8.ptm add command -label " 250 " -command {set ptsize 250}
   $dbox.fr8.ptm add command -label " 300 " -command {set ptsize 300}
   $dbox.fr8.ptm add command -label " 360 " -command {set ptsize 360}
   checkbutton $dbox.fr9.cb1 -text " Slanted " \
          -variable slant -onvalue "o" -offvalue "r" -relief ridge \
          -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 \
          -activeforeground #000000 -activebackground #d3d3d3
   set charmap2 $charmap
   checkbutton $dbox.fr9.cb2 -text " Show character array " \
          -variable charmap2 -onvalue 1 -offvalue 0 -relief ridge \
          -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 \
          -activeforeground #000000 -activebackground #d3d3d3
   button $dbox.frA.apply -text "Apply" -command {
      applyOptions
      set oldtextbg $textbg
      set oldtextfg $textfg
      set oldtextsbg $textsbg
      set oldtextsfg $textsfg
      set oldtextibg $textibg
      set oldtextht $textht
      set oldtextwd $textwd
      set oldptsize $ptsize
      set oldslant $slant
      set oldcharmap $charmap
   } -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   button $dbox.frA.default -text "Default" -command {
      set oldcharmap $charmap
      readOptions
      set charmap2 $charmap
      set charmap $oldcharmap
   } -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   button $dbox.frA.save -text "Save" -command {
     set tempcharmap $charmap
     set charmap $charmap2
     saveOptions
     set charmap $tempcharmap
   } -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   button $dbox.frA.cancel -text "Cancel" -command {
      set textbg $oldtextbg
      set textfg $oldtextfg
      set textsbg $oldtextsbg
      set textsfg $oldtextsfg
      set textibg $oldtextibg
      set textht $oldtextht
      set textwd $oldtextwd
      set ptsize $oldptsize
      set slant $oldslant
      set charmap $oldcharmap
      set ok 1
   } -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   button $dbox.frA.done -text "Done" -command {applyOptions; set ok 1} \
     -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   for {set i 1} {$i <= 7} {incr i 1} {
      pack $dbox.fr$i.lbl -padx 5 -pady 5 -side left -expand yes -fill x
      pack $dbox.fr$i.ent -padx 5 -pady 5
      pack $dbox.fr$i -padx 5 -pady 2 -expand yes -fill x
      $dbox.fr$i config -bg #d3d3d3
   }
   pack $dbox.fr8.lbl $dbox.fr8.pt -padx 5 -pady 5 -side left
   pack $dbox.fr8 -padx 5 -pady 2
   $dbox.fr8 config -bg #d3d3d3
   pack $dbox.fr9.cb1 $dbox.fr9.cb2 -padx 5 -pady 5 -side left
   pack $dbox.fr9 -padx 5 -pady 2
   $dbox.fr9 config -bg #d3d3d3
   pack $dbox.frA.apply $dbox.frA.default $dbox.frA.save $dbox.frA.cancel $dbox.frA.done -padx 5 -pady 5 -side left
   pack $dbox.frA -padx 5 -pady 2
   $dbox.frA config -bg #d3d3d3

   $dbox config -bg #d3d3d3
   bind $dbox <Escape> {set ok 0}
   bind $dbox.fr1.ent <Return>  "focus $dbox.fr2.ent"
   bind $dbox.fr2.ent <Return>  "focus $dbox.fr3.ent"
   bind $dbox.fr3.ent <Return>  "focus $dbox.fr4.ent"
   bind $dbox.fr4.ent <Return>  "focus $dbox.fr5.ent"
   bind $dbox.fr5.ent <Return>  "focus $dbox.fr6.ent"
   bind $dbox.fr6.ent <Return>  "focus $dbox.fr7.ent"
   bind $dbox.fr7.ent <Return>  {set ok 1}
   wm title $dbox "bwedit: edit options"
   wm resizable $dbox false false
   grab $dbox
   tkwait variable ok
   grab release $dbox
   destroy $dbox
}

proc applyOptions {} {
   global textbg textfg textsbg textsfg textibg textht textwd ptsize slant charmap charmap2 textsp3

   switch -exact $ptsize {
      100 {set textsp3 4}
      120 {set textsp3 5}
      150 {set textsp3 6}
      180 {set textsp3 7}
      210 {set textsp3 8}
      250 {set textsp3 10}
      300 {set textsp3 12}
      360 {set textsp3 15}
      default {set textsp3 5}
   }

   .mainfr.editfr.textarea config -height $textht -width $textwd \
          -font "-*-bengali-medium-$slant-*-*-*-$ptsize-*-*-*-*-*-fontspecific" \
          -spacing3 $textsp3 -insertbackground $textibg \
          -background $textbg -foreground $textfg \
          -selectbackground $textsbg -selectforeground $textsfg

   if {$charmap != $charmap2} { manageCharMap }
}

proc saveOptions {} {
   global textbg textfg textsbg textsfg textibg textht textwd ptsize slant charmap
   global textbg2 textfg2 textsbg2 textsfg2 textibg2 textht2 textwd2 editrmn

   set rcfile "~/.bweditrc"
   set rcf [open $rcfile w]
   puts $rcf "# Resource file for bwedit version 1.1"
   puts $rcf "# Do not edit. Use the \"Edit options\" menu of bwedit\n"
   puts $rcf "# Main window"
   puts $rcf "TextBackGround\t\t: $textbg"
   puts $rcf "TextForeGround\t\t: $textfg"
   puts $rcf "SelectionBackGround\t: $textsbg"
   puts $rcf "SelectionForeGround\t: $textsfg"
   puts $rcf "CursorColor\t\t: $textibg"
   puts $rcf "TextHeight\t\t: $textht"
   puts $rcf "TextWidth\t\t: $textwd"
   puts $rcf "DefaultPointSize\t: $ptsize"
   puts $rcf "Slant\t\t\t: $slant"
   puts $rcf "CharMap\t\t\t: $charmap"
   puts $rcf "\n# Roman window"
   puts $rcf "TextBackGround2\t\t: $textbg2"
   puts $rcf "TextForeGround2\t\t: $textfg2"
   puts $rcf "SelectionBackGround2\t: $textsbg2"
   puts $rcf "SelectionForeGround2\t: $textsfg2"
   puts $rcf "CursorColor2\t\t: $textibg2"
   puts $rcf "TextHeight2\t\t: $textht2"
   puts $rcf "TextWidth2\t\t: $textwd2"
   puts $rcf "EditRoman\t\t: $editrmn"
   puts $rcf "\n# End of .bweditrc"
   close $rcf
}

proc activateFileMenu {} {
   set posx [winfo x .]
   incr posx [winfo x .cmdfr.file]
   set posy [winfo y .]
   incr posy [winfo y .cmdfr.file]
   incr posy [winfo height .cmdfr.file]
   .cmdfr.file.m post $posx $posy
   .cmdfr.file.m activate 0
   grab set -global .cmdfr.file.m
}

proc activateEditMenu {} {
   set posx [winfo x .]
   incr posx [winfo x .cmdfr.edit]
   set posy [winfo y .]
   incr posy [winfo y .cmdfr.edit]
   incr posy [winfo height .cmdfr.edit]
   .cmdfr.edit.m post $posx $posy
   .cmdfr.edit.m activate 0
   grab set -global .cmdfr.edit.m
}

proc activateOptionMenu {} {
   set posx [winfo x .]
   incr posx [winfo x .cmdfr.option]
   set posy [winfo y .]
   incr posy [winfo y .cmdfr.option]
   incr posy [winfo height .cmdfr.option]
   .cmdfr.option.m post $posx $posy
   .cmdfr.option.m activate 0
   grab set -global .cmdfr.option.m
}

proc activateImportMenu {} {
   set posx [winfo x .]
   incr posx [winfo x .cmdfr.import]
   set posy [winfo y .]
   incr posy [winfo y .cmdfr.import]
   incr posy [winfo height .cmdfr.import]
   .cmdfr.import.m post $posx $posy
   .cmdfr.import.m activate 0
   grab set -global .cmdfr.import.m
}

proc activateExportMenu {} {
   set posx [winfo x .]
   incr posx [winfo x .cmdfr.export]
   set posy [winfo y .]
   incr posy [winfo y .cmdfr.export]
   incr posy [winfo height .cmdfr.export]
   .cmdfr.export.m post $posx $posy
   .cmdfr.export.m activate 0
   grab set -global .cmdfr.export.m
}

proc activateHelpMenu {} {
   set posx [winfo x .]
   incr posx [winfo x .cmdfr.help]
   set posy [winfo y .]
   incr posy [winfo y .cmdfr.help]
   incr posy [winfo height .cmdfr.help]
   .cmdfr.help.m post $posx $posy
   .cmdfr.help.m activate 0
   grab set -global .cmdfr.help.m
}

bind .cmdfr.file.m <Right> { grab release .cmdfr.file.m; .cmdfr.file.m unpost; activateEditMenu }
bind .cmdfr.edit.m <Right> { grab release .cmdfr.edit.m; .cmdfr.edit.m unpost; activateOptionMenu }
bind .cmdfr.option.m <Right> { grab release .cmdfr.option.m; .cmdfr.option.m unpost; activateImportMenu }
bind .cmdfr.import.m <Right> { grab release .cmdfr.import.m; .cmdfr.import.m unpost; activateExportMenu }
bind .cmdfr.export.m <Right> { grab release .cmdfr.export.m; .cmdfr.export.m unpost; activateHelpMenu }
bind .cmdfr.help.m <Right> { grab release .cmdfr.help.m; .cmdfr.help.m unpost; activateFileMenu }
bind .cmdfr.file.m <Left> { grab release .cmdfr.file.m; .cmdfr.file.m unpost; activateHelpMenu }
bind .cmdfr.edit.m <Left> { grab release .cmdfr.edit.m; .cmdfr.edit.m unpost; activateFileMenu }
bind .cmdfr.option.m <Left> { grab release .cmdfr.option.m; .cmdfr.option.m unpost; activateEditMenu }
bind .cmdfr.import.m <Left> { grab release .cmdfr.import.m; .cmdfr.import.m unpost; activateOptionMenu }
bind .cmdfr.export.m <Left> { grab release .cmdfr.export.m; .cmdfr.export.m unpost; activateImportMenu }
bind .cmdfr.help.m <Left> { grab release .cmdfr.help.m; .cmdfr.help.m unpost; activateExportMenu }

bind . <Alt-a> { appendFile }
bind . <Alt-c> { manageCharMap }
bind . <Alt-d> { chooseBaseFont }
bind . <Alt-e> { activateEditMenu }
bind . <Alt-f> { activateFileMenu }
bind . <Alt-h> { activateHelpMenu }
bind . <Alt-i> { insertFile }
bind . <Alt-k> { viewKbdMap }
bind . <Alt-l> { loadFile }
bind . <Alt-m> { activateImportMenu }
bind . <Alt-n> { newFile }
bind . <Alt-o> { editOptions }
bind . <Alt-p> { activateOptionMenu }
bind . <Alt-q> { quitEditor }
bind . <Alt-s> { saveFile }
bind . <Alt-t> { focus .mainfr.editfr.textarea }
bind . <Alt-v> { saveThisFile }
bind . <Alt-x> { activateExportMenu }
bind . <Alt-A> { appendFile }
bind . <Alt-C> { manageCharMap }
bind . <Alt-D> { chooseBaseFont }
bind . <Alt-E> { activateEditMenu }
bind . <Alt-F> { activateFileMenu }
bind . <Alt-H> { activateHelpMenu }
bind . <Alt-I> { insertFile }
bind . <Alt-K> { viewKbdMap }
bind . <Alt-L> { loadFile }
bind . <Alt-N> { newFile }
bind . <Alt-O> { editOptions }
bind . <Alt-P> { activateOptionMenu }
bind . <Alt-Q> { quitEditor }
bind . <Alt-S> { saveFile }
bind . <Alt-T> { focus .mainfr.editfr.textarea }
bind . <Alt-V> { saveThisFile }
bind . <Alt-X> { activateExportMenu }
bind .cmdfr.logo <Button-1> { copyInfo }

wm iconname . "bwedit"
wm iconbitmap . @$installdir/images/bwedit-logo.xbm

proc vowel { c } {
   if {![string compare $c "-"]} { return 0 }
   switch -exact $c {
      a { return 1 }
      e { return 1 }
      i { return 1 }
      o { return 1 }
      u { return 1 }
      A { return 1 }
      E { return 1 }
      I { return 1 }
      O { return 1 }
      U { return 1 }
      R { return 1 }
      L { return 1 }
      default { return 0 }
   }
}

proc consonant { c } {
   if {[vowel $c]} { return 0 }
   scan $c "%c" asciival
   if {($asciival == 94)} { return 1 }
   if {($asciival > 65) && ($asciival <= 90)} { return 1 }
   if {($asciival > 97) && ($asciival <= 122)} { return 1 }
   return 0
}

set encread 0

proc readEnc { } {
   global encmap encread installdir

   if {!($encread)} {
      if {![file readable "$installdir/lib/bn.enc"]} {
         errmsg "ERROR:\nI cannot read the encoding file. The file $installdir/lib/BN.enc does not exist or does not have read permission."
         return
      }
      set encf [open "$installdir/lib/bn.enc" r]
      while {[gets $encf line] >= 0} {
         set idx [ string first "#" $line ]
         if {$idx >= 0} { set line [string range $line 0 [expr $idx - 1]] }
         set idx [ string first ":" $line ]
         if {$idx >= 0} {
            set code [string range $line 0 [expr $idx - 1]]
            set char [string range $line [expr $idx + 1] [expr [string length $line] - 1]]
            set code [string trim $code]
            set char [string trim $char]
            if {([string length $code] >= 0) && ([string length $char] >= 0)} {
               if {![string compare "\\" [string index $char 0]]} {
                  set ascval [string range $char 1 [expr [string length $char] - 1]]
               } else {
                  scan $char "%c" ascval
               }
               set encmap($code) $ascval
            }
         }
      }
      set encread 1
   }
}

proc importRoman { } {
   global encmap encread

   set fn [getFileName "bwedit: Load"]
   if { [string compare $fn ""] != 0 } {
      if {!($encread)} { readEnc }
      if {![file readable $fn]} {
         errmsg "ERROR:\nI cannot load the file \"$fn\". The file does not exist or does not have read permission."
         return
      }
      if {![file isfile $fn]} {
         errmsg "ERROR:\nI cannot load the file. \"$fn\" is not a regular file."
         return
      }
      set f [open $fn r]
      set txt [read $f]
      close $f
      set idx 0
      set iplen [string length $txt]
      if {$iplen > 0} { set nextchar [string index $txt 0] }
      while {$idx < $iplen} {
         if {[vowel $nextchar]} {
            set swar ""
            while {[vowel $nextchar] && ($idx < $iplen)} {
               set swar $swar$nextchar
               incr idx 1
               if {$idx < $iplen} { set nextchar [string index $txt $idx] } else { set nextchar "" }
            }
            if [info exists encmap($swar)] {
               switch -exact $encmap($swar) {
                  97 { .mainfr.editfr.textarea insert insert "a" }
                  65 { .mainfr.editfr.textarea insert insert "aA" }
                   1 { .mainfr.editfr.textarea insert insert [format "%c" 1] }
                 105 { .mainfr.editfr.textarea insert insert [format "%c" 1] }
                   2 { .mainfr.editfr.textarea insert insert [format "%c" 2] }
                  73 { .mainfr.editfr.textarea insert insert [format "%c" 2] }
                   3 { .mainfr.editfr.textarea insert insert [format "%c" 3] }
                 117 { .mainfr.editfr.textarea insert insert [format "%c" 3] }
                   4 { .mainfr.editfr.textarea insert insert [format "%c" 4] }
                  85 { .mainfr.editfr.textarea insert insert [format "%c" 4] }
                   5 { .mainfr.editfr.textarea insert insert [format "%c" 5] }
                  87 { .mainfr.editfr.textarea insert insert [format "%c" 5] }
                   6 { .mainfr.editfr.textarea insert insert [format "%c" 6] }
                 101 { .mainfr.editfr.textarea insert insert [format "%c" 6] }
                   7 { .mainfr.editfr.textarea insert insert [format "%c" 7] }
                  69 { .mainfr.editfr.textarea insert insert [format "%c" 7] }
                   8 { .mainfr.editfr.textarea insert insert [format "%c" 8] }
                  79 { .mainfr.editfr.textarea insert insert "o" }
                 111 { .mainfr.editfr.textarea insert insert "o" }
                  14 { .mainfr.editfr.textarea insert insert a
                       .mainfr.editfr.textarea insert insert [format "%c" 14]
                       .mainfr.editfr.textarea insert insert "A"
                     }
               }
            }
         }
         if {[consonant $nextchar]} {
            set swar ""
            set banjon ""
            while {[consonant $nextchar] && ($idx < $iplen)} {
               set banjon $banjon$nextchar
               incr idx 1
               if {$idx < $iplen} { set nextchar [string index $txt $idx] } else { set nextchar "" }
            }
            while {[vowel $nextchar] && ($idx < $iplen)} {
               set swar $swar$nextchar
               incr idx 1
               if {$idx < $iplen} { set nextchar [string index $txt $idx] } else { set nextchar "" }
            }
            if {[string compare "^" $banjon]} {
               set notdone 1
               set chandra ""
               set ref ""
               set jafala ""
               set rafala ""
               while {$notdone} {
                  set notdone 0
                  set len [string length $banjon]
                  if {![string compare [string index $banjon [expr $len - 1]] "^"]} {
                     set chandra "w"
                     set banjon [string range $banjon 0 [expr $len - 2]]
                     incr len -1
                     set notdone 1
                  }
                  if {![string compare [string index $banjon [expr $len - 2]] "^"]} {
                     if {![string compare [string index $banjon [expr $len - 1]] "r"]} {
                        set rafala [format "%c" 15]
                        set banjon [string range $banjon 0 [expr $len - 3]]
                        incr len -2
                        set notdone 1
                     }
                     if {![string compare [string index $banjon [expr $len - 1]] "j"]} {
                        set jafala [format "%c" 14]
                        set banjon [string range $banjon 0 [expr $len - 3]]
                        incr len -2
                        set notdone 1
                     }
                     if {![string compare [string index $banjon [expr $len - 1]] "y"]} {
                        set jafala [format "%c" 14]
                        set banjon [string range $banjon 0 [expr $len - 3]]
                        incr len -2
                        set notdone 1
                     }
                  }
                  if {![string compare [string range $banjon 0 1] "^r"]} {
                     set ref "^"
                     set banjon [string range $banjon 2 [expr $len - 1]]
                     incr len -2
                     set notdone 1
                  }
               }
               if {[info exists encmap($banjon)]} {
                  set ban [format "%c" $encmap($banjon)]
               } else { set ban " " }
               set ban "$ban$ref$chandra$rafala$jafala"
            }
            if {[info exists encmap($swar)]} { set swar $encmap($swar) } else { set swar 97 }
            switch -exact $swar {
               97 { .mainfr.editfr.textarea insert insert "$ban" }
               65 { .mainfr.editfr.textarea insert insert "${ban}A" }
                1 { .mainfr.editfr.textarea insert insert "i$ban" }
              105 { .mainfr.editfr.textarea insert insert "i$ban" }
                2 { .mainfr.editfr.textarea insert insert "${ban}I" }
               73 { .mainfr.editfr.textarea insert insert "${ban}I" }
                3 { .mainfr.editfr.textarea insert insert "${ban}u" }
              117 { .mainfr.editfr.textarea insert insert "${ban}u" }
                4 { .mainfr.editfr.textarea insert insert "${ban}U" }
               85 { .mainfr.editfr.textarea insert insert "${ban}U" }
                5 { .mainfr.editfr.textarea insert insert "${ban}W" }
               87 { .mainfr.editfr.textarea insert insert "${ban}W" }
                6 { .mainfr.editfr.textarea insert insert "e$ban" }
              101 { .mainfr.editfr.textarea insert insert "e$ban" }
                7 { .mainfr.editfr.textarea insert insert "E$ban" }
               69 { .mainfr.editfr.textarea insert insert "E$ban" }
                8 { .mainfr.editfr.textarea insert insert "e${ban}A" }
               79 { .mainfr.editfr.textarea insert insert "e${ban}O" }
              111 { .mainfr.editfr.textarea insert insert "e${ban}O" }
               14 { .mainfr.editfr.textarea insert insert "$ban"
                    .mainfr.editfr.textarea insert insert [format "%c" 14]
                    .mainfr.editfr.textarea insert insert "A"
                  }
            }
         } else {
            if {![string compare $nextchar "_"]} {
               incr idx 1
               if {$idx < $iplen} { set nextnextchar [string index $txt $idx] } else { set nextchar "" }
               if {![string compare $nextnextchar "_"]} {
                  incr idx 1
                  .mainfr.editfr.textarea insert insert "_"
                  if {$idx < $iplen} { set nextchar [string index $txt $idx] } else { set nextchar "" }
               } else { set nextchar $nextnextchar }
            } else {
               if {![string compare $nextchar "."]} {
                  incr idx 1
                  if {$idx < $iplen} { set nextnextchar [string index $txt $idx] } else { set nextchar "" }
                  if {![string compare $nextnextchar "."]} {
                     incr idx 1
                     .mainfr.editfr.textarea insert insert "<"
                     if {$idx < $iplen} { set nextchar [string index $txt $idx] } else { set nextchar "" }
                  } else {
                     .mainfr.editfr.textarea insert insert "."
                     set nextchar $nextnextchar
                  }
               } else {
                  .mainfr.editfr.textarea insert insert $nextchar
                  incr idx 1
                  if {$idx < $iplen} { set nextchar [string index $txt $idx] } else { set nextchar "" }
               }
            }
         }
      }
      .mainfr.editfr.textarea see insert
   }
}

proc errmsg2 { msg win } {
   set ewin [toplevel .error]

   message $ewin.msg -text $msg -relief flat -fg #000000 -bg #d3d3d3 -width 250 -justify center
   button $ewin.btn -text "Ok" -relief raised -fg #000000 -bg #a9a9a9 \
          -activeforeground #000000 -activebackground #a9a9a9 \
          -command {set edone 1} -height 0

   pack $ewin.msg -padx 0 -pady 0 -expand yes -fill both
   pack $ewin.btn -pady 10

   bind $ewin <Escape> {set edone 1}
   bind $ewin <Return> {set edone 1}

   $ewin config -bg #d3d3d3

   wm transient $ewin $win
   set posx [winfo x $win]
   set posy [winfo y $win]
   incr posx [winfo x $win.editfr]
   incr posy [winfo y $win.editfr]
   set twd [winfo width $win.editfr.textarea]
   set tht [winfo height $win.editfr.textarea]
   set ewd 300
   set eht 150
   set posx [expr $posx + ($twd - $ewd) / 2]
   set posy [expr $posy + ($tht - $eht) / 2]
   wm geometry $ewin "${ewd}x${eht}+$posx+$posy"

   grab $ewin
   tkwait variable edone
   grab release $ewin
   destroy $ewin
}

proc loadRomanFile { rwin } {
   global rfname

   set fn [getFileName "bwedit: Load Roman"]
   if {[string compare $fn ""] != 0} {
      if {![file readable $fn]} {
         errmsg2 "ERROR:\nI cannot load the file \"$fn\". The file does not exist or does not have read permission." $rwin
         return
      }
      if {![file isfile $fn]} {
         errmsg2 "ERROR:\nI cannot load the file. \"$fn\" is not a regular file." $rwin
         return
      }
      set f [open $fn r]
      set x [read $f]
      $rwin.editfr.textarea delete 1.0 end
      $rwin.editfr.textarea insert 1.0 $x
      close $f
      set rfname $fn
      $rwin.editfr.textarea see insert
   }
}

proc saveRomanFile { rwin } {
   global rfname

   if {![string compare "" $rfname]} {
      errmsg2 "ERROR:\nI cannot save file. No file name is given." $rwin
      return
   }
   set dnm [file dirname $rfname]
   if {![file isdirectory $dnm]} {
      errmsg2 "ERROR:\nI cannot save the file. \"$dnm\" is not a directory." $rwin
      return
   }
   if {![file writable $dnm]} {
      errmsg2 "ERROR:\nI cannot save the file. You do not have permission to write in the directory." $rwin
      return
   }
   if {[file exists $rfname] && ![file isfile $rfname]} {
      errmsg2 "ERROR:\nI cannot save the file. \"$rfname\" is not a regular file." $rwin
      return
   }
   if {[file exists $rfname] && ![file writable $rfname]} {
      errmsg2 "ERROR:\nI cannot save the file. You do not have permission to overwrite \"$rfname\"" $rwin
      return
   }

   set f [open $rfname w]
   set x [$rwin.editfr.textarea get 1.0 end]
   puts -nonewline $f $x
   close $f
}

proc saveasRomanFile { rwin } {
   global rfname

   set fn [getFileName "bwedit: Save Roman"]
   if { [string compare $fn ""] != 0 } {
      set dnm [file dirname $fn]
      if {![file isdirectory $dnm]} {
         errmsg2 "ERROR:\nI cannot save the file. \"$dnm\" is not a directory." $rwin
         return
      }
      if {![file writable $dnm]} {
         errmsg2 "ERROR:\nI cannot save the file. You do not have permission to write in the directory \"$dnm\"." $rwin
         return
      }
      if {[file exists $fn] && ![file isfile $fn]} {
         errmsg2 "ERROR:\nI cannot save the file. \"$fn\" is not a regular file." $rwin
         return
      }
      if {[file exists $fn] && ![file writable $fn]} {
         errmsg2 "ERROR:\nI cannot save the file. You do not have permission to overwrite \"$fn\"" $rwin
         return
      }
      set f [open $fn w]
      set x [$rwin.editfr.textarea get 1.0 end]
      puts -nonewline $f $x
      close $f
      if {![string compare $rfname ""]} { set rfname $fn }
   }
}

proc applyRomanOptions { rwin } {
   global textbg2 textfg2 textsbg2 textsfg2 textibg2 textht2 textwd2 editrmn

   $rwin.editfr.textarea config -height $textht2 -width $textwd2 \
      -insertbackground $textibg2 \
      -background $textbg2 -foreground $textfg2 \
      -selectbackground $textsbg2 -selectforeground $textsfg2
}

proc editRomanOptions { rwin } {
   global textbg2 textfg2 textsbg2 textsfg2 textibg2 textht2 textwd2 editrmn
   global oldtextbg2 oldtextfg2 oldtextsbg2 oldtextsfg2 oldtextibg2 oldtextht2 oldtextwd2 oldeditrmn
   global ok

   set oldtextbg2 $textbg2
   set oldtextfg2 $textfg2
   set oldtextsbg2 $textsbg2
   set oldtextsfg2 $textsfg2
   set oldtextibg2 $textibg2
   set oldtextht2 $textht2
   set oldtextwd2 $textwd2
   set oldeditrmn $editrmn

   set dbox [toplevel .romanoption]
   frame $dbox.fr1
   frame $dbox.fr2
   frame $dbox.fr3
   frame $dbox.fr4
   frame $dbox.fr5
   frame $dbox.fr6
   frame $dbox.fr7
   frame $dbox.frA

   label $dbox.fr1.lbl -text "Text background color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr1.ent -textvariable textbg2 -bg #ddaaaa -fg #000000
   label $dbox.fr2.lbl -text "Text foreground color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr2.ent -textvariable textfg2 -bg #ddaaaa -fg #000000
   label $dbox.fr3.lbl -text "Selection background color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr3.ent -textvariable textsbg2 -bg #ddaaaa -fg #000000
   label $dbox.fr4.lbl -text "Selection foreground color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr4.ent -textvariable textsfg2 -bg #ddaaaa -fg #000000
   label $dbox.fr5.lbl -text "Cursor color: " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr5.ent -textvariable textibg2 -bg #ddaaaa -fg #000000
   label $dbox.fr6.lbl -text "Text height (number of lines): " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr6.ent -textvariable textht2 -bg #ddaaaa -fg #000000
   label $dbox.fr7.lbl -text "Text width (in avg char width): " -relief flat -anchor e -fg #000000 -bg #d3d3d3
   entry $dbox.fr7.ent -textvariable textwd2 -bg #ddaaaa -fg #000000
   checkbutton $dbox.cb -text " Show edit window for Roman text at start-up " \
         -variable editrmn -onvalue 1 -offvalue 0 -relief ridge \
         -selectcolor #bbff00 -fg #000000 -bg #d3d3d3 \
         -activeforeground #000000 -activebackground #d3d3d3
   button $dbox.frA.apply -text "Apply" -command "
      applyRomanOptions $rwin
      set oldtextbg2 $textbg2
      set oldtextfg2 $textfg2
      set oldtextsbg2 $textsbg2
      set oldtextsfg2 $textsfg2
      set oldtextibg2 $textibg2
      set oldtextht2 $textht2
      set oldtextwd2 $textwd2
      set oldeditrmn $editrmn
   " -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   button $dbox.frA.default -text "Default" -command { readOptions } \
     -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   button $dbox.frA.save -text "Save" -command { saveOptions } \
     -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   button $dbox.frA.cancel -text "Cancel" -command {
      set textbg2 $oldtextbg2
      set textfg2 $oldtextfg2
      set textsbg2 $oldtextsbg2
      set textsfg2 $oldtextsfg2
      set textibg2 $oldtextibg2
      set textht2 $oldtextht2
      set textwd2 $oldtextwd2
      set editrmn $oldeditrmn
      set ok 1
   } -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   button $dbox.frA.done -text "Done" -command "applyRomanOptions $rwin; set ok 1" \
     -fg #000000 -bg #a9a9a9 -activeforeground #000000 -activebackground #a9a9a9
   for {set i 1} {$i <= 7} {incr i 1} {
      pack $dbox.fr$i.lbl -padx 5 -pady 5 -side left -expand yes -fill x
      pack $dbox.fr$i.ent -padx 5 -pady 5
      pack $dbox.fr$i -padx 5 -pady 2 -expand yes -fill x
      $dbox.fr$i config -bg #d3d3d3
   }
   pack $dbox.cb -padx 5 -pady 5
   pack $dbox.frA.apply $dbox.frA.default $dbox.frA.save $dbox.frA.cancel $dbox.frA.done -padx 5 -pady 5 -side left
   pack $dbox.frA -padx 5 -pady 2
   $dbox.frA config -bg #d3d3d3
   $dbox config -bg #d3d3d3
   bind $dbox <Escape> {set ok 0}
   bind $dbox.fr1.ent <Return>  "focus $dbox.fr2.ent"
   bind $dbox.fr2.ent <Return>  "focus $dbox.fr3.ent"
   bind $dbox.fr3.ent <Return>  "focus $dbox.fr4.ent"
   bind $dbox.fr4.ent <Return>  "focus $dbox.fr5.ent"
   bind $dbox.fr5.ent <Return>  "focus $dbox.fr6.ent"
   bind $dbox.fr6.ent <Return>  "focus $dbox.fr7.ent"
   bind $dbox.fr7.ent <Return>  {set ok 1}
   wm title $dbox "bwedit: edit Roman options"
   wm resizable $dbox false false
   grab $dbox
   tkwait variable ok
   grab release $dbox
   destroy $dbox
}

proc adddoc { twin fn appmode } {
   global installdir

   $twin tag configure bntag -font "-*-bengali-medium-r-*-*-*-120-*-*-*-*-*-fontspecific"
   set bngmode 0
   if {![file readable "$installdir/help/$fn.hlp"]} {
      $twin delete 1.0 end
      $twin insert end "ERROR:\nI am unable to read the help file\n$installdir/help/$fn.hlp\n"
   } else {
      if {!($appmode)} { $twin delete 1.0 end }
      set bngmode 0
      set f [open "$installdir/help/$fn.hlp" r]
      while {![eof $f]} {
         set nextchar [read $f 1]
         if {$bngmode == 0} {
            if {![string compare "#" $nextchar]} {
               set bngmode 1
               set bnstr ""
            } else { $twin insert end $nextchar }
         } else {
            if {![string compare "#" $nextchar]} {
               if {[string length $bnstr] > 0} {
                  if {![string compare [string index $bnstr 0] "\\"]} {
                     $twin insert end [format "%c" [string range $bnstr 1 [expr [string length $bnstr] - 1]]] bntag
                  } else {
                     $twin insert end $bnstr bntag
                  }
               }
               set bngmode 0
            } else { set bnstr "$bnstr$nextchar" }
         }
      }
   }
}

proc helpwinRoman { } {
   global installdir bweditlogo

   set hwin [toplevel .rhelp]
   $hwin config -bg #d3d3d3
   frame $hwin.cmdfr -bg #d3d3d3
   frame $hwin.dpyfr -bg #d3d3d3
   menubutton $hwin.cmdfr.file -relief flat -fg #000000 -bg #d3d3d3 \
      -activebackground #d3d3d3 -activeforeground #000000 \
      -menu $hwin.cmdfr.file.m -text "File"
   menubutton $hwin.cmdfr.content -relief flat -fg #000000 -bg #d3d3d3 \
      -activebackground #d3d3d3 -activeforeground #000000 \
      -menu $hwin.cmdfr.content.m -text "Contents"
   menu $hwin.cmdfr.file.m -tearoff false -bg #d3d3d3 -fg #000000
   $hwin.cmdfr.file.m add command -label "  Close  " -command "destroy $hwin" -underline 2
   menu $hwin.cmdfr.content.m -tearoff false -bg #d3d3d3 -fg #000000
   $hwin.cmdfr.content.m add command -label " 1. Introduction " -command "adddoc $hwin.dpyfr.textarea cr1 0"
   $hwin.cmdfr.content.m add command -label " 2. Conversion rules " -command "adddoc $hwin.dpyfr.textarea cr2 0"
   $hwin.cmdfr.content.m add command -label " 3. The default encoding " -command "adddoc $hwin.dpyfr.textarea cr3 0"
   $hwin.cmdfr.content.m add command -label "     3.1 Vowels and vowel forms " -command "adddoc $hwin.dpyfr.textarea cr3_1 0"
   $hwin.cmdfr.content.m add command -label "     3.2 Consonants " -command "adddoc $hwin.dpyfr.textarea cr3_2 0"
   $hwin.cmdfr.content.m add command -label "     3.3 Conjunct consonants " -command "adddoc $hwin.dpyfr.textarea cr3_3 0"
   $hwin.cmdfr.content.m add command -label "     3.4 Digits and punctuation symbols " -command "adddoc $hwin.dpyfr.textarea cr3_4 0"
   $hwin.cmdfr.content.m add command -label " 4. Customize encoding " -command "adddoc $hwin.dpyfr.textarea cr4 0"
   $hwin.cmdfr.content.m add command -label " 5. Conclusion " -command "adddoc $hwin.dpyfr.textarea cr5 0"
   label $hwin.cmdfr.space -fg #000000 -bg #d3d3d3 -text ""
   label $hwin.cmdfr.logo -relief flat -fg #000000 -bg #d3d3d3 -image "bweditlogo"
   
   text $hwin.dpyfr.textarea -relief sunken -height 20 -width 60 \
      -yscroll "$hwin.dpyfr.vscroll set" \
      -wrap none -relief flat \
      -background #ddddaa -foreground #000000 -borderwidth 2 \
      -selectbackground #000000 -selectforeground #ddddaa -selectborderwidth 0
   scrollbar $hwin.dpyfr.vscroll -relief sunken -orient vertical \
      -command "$hwin.dpyfr.textarea yview" -bg #d3d3d3 -width 12 \
      -activebackground #d3d3d3

   pack $hwin.cmdfr.file $hwin.cmdfr.content -padx 0 -pady 0 -side left
   pack $hwin.cmdfr.space -padx 0 -pady 0 -side left -expand yes -fill x
   pack $hwin.cmdfr.logo -padx 5 -pady 0 -side left
   pack $hwin.dpyfr.vscroll $hwin.dpyfr.textarea -padx 0 -pady 0 -side right \
      -expand yes -fill y
   pack $hwin.cmdfr $hwin.dpyfr -padx 0 -pady 3 -side top -fill x

   bind $hwin <Escape> "destroy $hwin"

   wm resizable $hwin false false
   wm title $hwin "bwedit: Roman-to-Bengali conversion rules"

   adddoc $hwin.dpyfr.textarea cr1 0
}

proc editRoman { } {
   global textbg2 textfg2 textsbg2 textsfg2 textibg2 textht2 textwd2
   global bweditlogo rfname installdir rok

   set rfname ""
   set rwin [toplevel .roman]
   $rwin config -bg #d3d3d3
   frame $rwin.cmdfr -bg #d3d3d3 -relief raised -borderwidth 2
   frame $rwin.namefr -bg #d3d3d3
   frame $rwin.editfr -bg #d3d3d3

   button $rwin.cmdfr.new -text "New" -height 1 -relief flat -bg #d3d3d3 \
      -fg #000000 -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0 -underline 0 \
      -command "$rwin.editfr.textarea delete 1.0 end; set rfname {}"
   button $rwin.cmdfr.load -text "Load" -height 1 -relief flat -bg #d3d3d3 \
      -fg #000000 -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0 -underline 0 -command "loadRomanFile $rwin"
   button $rwin.cmdfr.save -text "Save" -height 1 -relief flat -bg #d3d3d3 \
      -fg #000000 -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0 -underline 2 -command "saveRomanFile $rwin"
   button $rwin.cmdfr.saveas -text "Save as" -height 1 -relief flat -bg #d3d3d3 \
      -fg #000000 -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0 -underline 0 -command "saveasRomanFile $rwin"
   button $rwin.cmdfr.option -text "Option" -height 1 -relief flat -bg #d3d3d3 \
      -fg #000000 -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0 -underline 0 -command "editRomanOptions $rwin"
   button $rwin.cmdfr.help -text "Help" -height 1 -relief flat -bg #d3d3d3 \
      -fg #000000 -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0 -underline 0 -command "helpwinRoman"
   button $rwin.cmdfr.close -text "Close" -height 1 -relief flat -bg #d3d3d3 \
      -fg #000000 -activeforeground #000000 -activebackground #d3d3d3 \
      -highlightthickness 0 -underline 0 -command {set rok 1}
   label $rwin.cmdfr.space -text "" -text "" -fg #d3d3d3 -bg #d3d3d3
   label $rwin.cmdfr.logo -image "bweditlogo" -relief flat -bg #d3d3d3 -fg #000000
   bind $rwin.cmdfr.logo <Button-1> { copyInfo }
   label $rwin.namefr.lbl -text " File name: " -relief flat -fg #000000 -bg #d3d3d3
   entry $rwin.namefr.ent -textvariable rfname -relief sunken \
      -background #ffb6c1 -foreground #000000 \
      -selectbackground #ffffcc -selectforeground #000000 -selectborderwidth 0
   text $rwin.editfr.textarea -relief sunken -height $textht2 -width $textwd2 \
      -xscroll "$rwin.editfr.hscroll set" -yscroll "$rwin.editfr.scrbar set" \
      -wrap none -relief flat \
      -insertbackground $textibg2 -insertwidth 3 \
      -background $textbg2 -foreground $textfg2 -borderwidth 2 \
      -selectbackground $textsbg2 -selectforeground $textsfg2 -selectborderwidth 0
   scrollbar $rwin.editfr.scrbar -relief sunken -orient vertical \
      -command "$rwin.editfr.textarea yview" -bg #d3d3d3 -width 12 \
      -activebackground #d3d3d3
   scrollbar $rwin.editfr.hscroll -relief sunken -orient horizontal \
      -command "$rwin.editfr.textarea xview" -bg #d3d3d3 -width 12 \
      -activebackground #d3d3d3

   pack $rwin.cmdfr.new $rwin.cmdfr.load $rwin.cmdfr.save $rwin.cmdfr.saveas \
      $rwin.cmdfr.option $rwin.cmdfr.help $rwin.cmdfr.close \
      -side left -padx 0 -pady 0
   pack $rwin.cmdfr.space -side left -expand yes -fill both
   pack $rwin.cmdfr.logo -side left -padx 5 -pady 0 -side left
   pack $rwin.namefr.lbl -side left -padx 0 -pady 0
   pack $rwin.namefr.ent -side left -padx 0 -pady 0 -expand yes -fill x
   pack $rwin.editfr.hscroll -padx 0 -pady 0 -fill x -side bottom
   pack $rwin.editfr.scrbar -fill y -side right -padx 0 -pady 0
   pack $rwin.editfr.textarea -expand yes -fill both -side right -padx 0 -pady 0
   pack $rwin.cmdfr -padx 0 -pady 0 -fill x
   pack $rwin.namefr -padx 5 -pady 5 -fill x
   pack $rwin.editfr -padx 0 -pady 0 -expand yes -fill both

   wm title $rwin "bwedit: Edit roman text"
   wm iconname $rwin "bwedit: help"
   wm iconbitmap $rwin @$installdir/images/bwedit-logo.xbm

   bind $rwin <Alt-c> {set rok 1}
   bind $rwin <Alt-h> "$rwin.cmdfr.help invoke"
   bind $rwin <Alt-l> "$rwin.cmdfr.load invoke"
   bind $rwin <Alt-n> "$rwin.cmdfr.new invoke"
   bind $rwin <Alt-o> "$rwin.cmdfr.option invoke"
   bind $rwin <Alt-q> {set rok 1; quitEditor}
   bind $rwin <Alt-s> "$rwin.cmdfr.saveas invoke"
   bind $rwin <Alt-v> "$rwin.cmdfr.save invoke"
   bind $rwin <Alt-C> {set rok 1}
   bind $rwin <Alt-H> "$rwin.cmdfr.help invoke"
   bind $rwin <Alt-L> "$rwin.cmdfr.load invoke"
   bind $rwin <Alt-N> "$rwin.cmdfr.new invoke"
   bind $rwin <Alt-O> "$rwin.cmdfr.option invoke"
   bind $rwin <Alt-Q> {set rok 1; quitEditor}
   bind $rwin <Alt-S> "$rwin.cmdfr.saveas invoke"
   bind $rwin <Alt-V> "$rwin.cmdfr.save invoke"
   bind $rwin.namefr.ent <Return> "focus $rwin.editfr.textarea"

   focus $rwin.editfr.textarea

   tkwait variable rok
   destroy $rwin
}

if {$editrmn} { editRoman }

###########################################################################
# Copyright 1998 by Abhijit Das (abhij@csa.iisc.ernet.in).
# bwedit is a freeware. Permission is hereby granted to distribute and
# mirror it free of charge as long as the original author gets credit
# and this copyright notice remains intact.
###########################################################################
#
# End of bwedit
