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

############################################################################
# bwedit: Version 1.2 (Experimental)
# Author: Abhijit Das (Barda) [abhij@csa.iisc.ernet.in]
# Last updated: Thu Mar 12 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 fontlist [ exec xlsfonts | grep -v bengali]
set fontlist [ split $fontlist "\n" ]
set scriptlist [ list suptag supsuptag subsuptag subtag subsubtag supsubtag ]

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

set textbg2 "#000000"
set textfg2 "#ffffff"
set textsbg2 "#ffffff"
set textsfg2 "#000000"
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; set off1 5; set off2 8; set off3 3;}
   120 {set textsp3 5; set off1 6; set off2 9; set off3 3;}
   150 {set textsp3 6; set off1 7; set off2 12; set off3 4;}
   180 {set textsp3 7; set off1 9; set off2 14; set off3 5;}
   210 {set textsp3 8; set off1 10; set off2 16; set off3 6;}
   250 {set textsp3 10; set off1 12; set off2 20; set off3 7;}
   300 {set textsp3 12; set off1 15; set off2 24; set off3 9;}
   360 {set textsp3 15; set off1 18; set off2 28; set off3 10;}
   default {set textsp3 5; set off1 6; set off2 9; set off3 3;}
}

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.engfr1
frame .mainfr.cafr.engfr2
frame .mainfr.cafr.engfr3
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.tag -text "Tag" -height 1 -relief flat \
      -menu .cmdfr.tag.m -bg #d3d3d3 -fg #000000 -underline 2 \
      -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 config -tearoff false -bg #d3d3d3 -fg #000000
menu .cmdfr.tag.m
.cmdfr.tag.m add command -label "  Normal  " -command {normalSel} -underline 2
.cmdfr.tag.m add command -label "  Underline  " -command {ulSel} -underline 2
.cmdfr.tag.m add command -label "  Superscript  " -command {supSel} -underline 4
.cmdfr.tag.m add command -label "  Supersuperscript  " -command {supsupSel} -underline 5
.cmdfr.tag.m add command -label "  Subsuperscript  " -command {subsupSel} -underline 9
.cmdfr.tag.m add command -label "  Subscript  " -command {subSel} -underline 4
.cmdfr.tag.m add command -label "  Subsubscript  " -command {subsubSel} -underline 9
.cmdfr.tag.m add command -label "  Supersubscript  " -command {supsubSel} -underline 15
.cmdfr.tag.m add command -label "  Select font  " -command {fontSel} -underline 9
.cmdfr.tag.m config -tearoff false -bg #d3d3d3 -fg #000000
.cmdfr.tag.m add separator
.cmdfr.tag.m add command -label "  Load tags  " -command {loadTags} -underline 2
.cmdfr.tag.m add command -label "  Save tags  " -command {saveTags} -underline 4
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 "  Select document font (Alt+D) " -command {chooseBaseFont} -underline 9
.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 "  Load formatted roman text  " -command {importRoman 0} -underline 2
.cmdfr.import.m add command -label "  Insert formatted roman text  " -command {importRoman 1} -underline 2
.cmdfr.import.m add separator
.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.tag .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 addcbeng { fr name asc } {
   set char [list format "%c" $asc]
   button .mainfr.cafr.$fr.$name -text [eval $char] -relief flat -width 1 \
      -font fixed -bg #a9a9a9 -fg #000000 -borderwidth -3 \
      -activeforeground #ffffff -activebackground #888888 \
      -command "printCharEng $asc"
   pack .mainfr.cafr.$fr.$name -padx 0 -pady 0 -side left
}

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

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

#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

#upper case letters
for {set i 65} {$i <= 90} {incr i 1} {
   addcbeng engfr1 uc$i $i
}

#lower case letters
for {set i 97} {$i <= 122} {incr i 1} {
   addcbeng engfr2 lc$i $i
}

# Special symbols in the ASCII keyboard
addcbeng engfr3 dot 46
addcbeng engfr3 dollar 36
addcbeng engfr3 pound 163
addcbeng engfr3 lbrace 123
addcbeng engfr3 rbrace 125
addcbeng engfr3 lt 60
addcbeng engfr3 gt 62
addcbeng engfr3 bslash 92
addcbeng engfr3 at 64
addcbeng engfr3 amp 38
addcbeng engfr3 caret 94
addcbeng engfr3 underscore 95
addcbeng engfr3 multsign 215
addcbeng engfr3 divsign 247
addcbeng engfr3 copy 169
addcbeng engfr3 reg 174
addcbeng engfr3 zero 48
addcbeng engfr3 one 49
addcbeng engfr3 two 50
addcbeng engfr3 three 51
addcbeng engfr3 four 52
addcbeng engfr3 five 53
addcbeng engfr3 six 54
addcbeng engfr3 seven 55
addcbeng engfr3 eight 56
addcbeng engfr3 nine 57

#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
}
pack .mainfr.cafr.engfr1 -padx 0 -pady 0 -fill x
pack .mainfr.cafr.engfr2 -padx 0 -pady 0 -fill x
pack .mainfr.cafr.engfr3 -padx 0 -pady 0 -fill x
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
.mainfr.cafr.engfr1 config -bg #d3d3d3
.mainfr.cafr.engfr2 config -bg #d3d3d3
.mainfr.cafr.engfr3 config -bg #d3d3d3
. config -bg #d3d3d3

focus .mainfr.editfr.textarea

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

   message $ewin.msg -text $msg -relief flat -bg #006688 -fg #ffffff -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 #004466

   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
}

set dirtybit 0
proc saveConfirm { } {
   global scwin dirtybit

   while {$dirtybit} {
      set scwin [toplevel .sc]
      $scwin config -bg #004466
      label $scwin.l -text "Editor text has unsaved changes" -fg #ffffff -bg #006688
      frame $scwin.bfr -bg #004466
      button $scwin.bfr.b1 -text "Save" -command {saveThisFile} -underline 0 \
         -bg #a9a9a9 -fg #000000 -activebackground #a9a9a9 -activeforeground #000000 \
         -relief raised
      button $scwin.bfr.b2 -text "Save as" -command {saveFile} -underline 5 \
         -bg #a9a9a9 -fg #000000 -activebackground #a9a9a9 -activeforeground #000000 \
         -relief raised
      button $scwin.bfr.b3 -text "Do not save" -command {set dirtybit 0} -underline 3 \
         -bg #a9a9a9 -fg #000000 -activebackground #a9a9a9 -activeforeground #000000 \
         -relief raised
      pack $scwin.l -expand yes -fill both -padx 0 -pady 0
      pack $scwin.bfr.b1 $scwin.bfr.b2 $scwin.bfr.b3 -side left -padx 10 -pady 0
      pack $scwin.bfr -expand no -padx 0 -pady 10

      bind $scwin <Key-s> {saveThisFile}
      bind $scwin <Key-a> {saveFile}
      bind $scwin <Key-n> {set dirtybit 0}

      wm transient $scwin .
      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 350
      set eht 120
      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 $scwin "${ewd}x${eht}+$posx+$posy"

      tkwait variable dirtybit
      destroy $scwin
   }
}

proc loadThisFile {} {
   global fname

   saveConfirm
   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

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

proc loadFile {} {
   global fname

   saveConfirm
   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 dirtybit

   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]
   set dirtybit 0
}

proc saveFile {} {
   global fname dirtybit

   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"
      }
      set dirtybit 0
   }
}

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

proc quitEditor {} {
   saveConfirm
   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 <ButtonRelease-1> {
      foreach si [$dbox.brfr.lbx curselection] {
         set f [$dbox.brfr.lbx get $si]
         if {![file isdirectory $f]} { set newfname $f }
      }
   }
   bind $dbox.brfr.lbx <Double-Button-1> {
      foreach si [$dbox.brfr.lbx curselection] {
         set newfname [$dbox.brfr.lbx get $si]
         if [file isdirectory $newfname] {
            set browsedir [string range $f 0 [expr [string length $f] - 2]]
            browse $dbox.brfr.lbx
         } else {
            set ok 1
         }
      }
   }

   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
   if {![file readable $browsedir]} { set browsedir [exec pwd] }
   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 "      Tag menu  " -command "adddoc $hwin.dpyfr.textarea tag 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 and mouse 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.2, March 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 off1 off2 off3
   
   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; set off1 5; set off2 8; set off3 3;}
         120 {.mainfr.editfr.textarea config -spacing3 5; set off1 6; set off2 9; set off3 3;}
         150 {.mainfr.editfr.textarea config -spacing3 6; set off1 7; set off2 12; set off3 4;}
         180 {.mainfr.editfr.textarea config -spacing3 7; set off1 9; set off2 14; set off3 5;}
         210 {.mainfr.editfr.textarea config -spacing3 8; set off1 10; set off2 16; set off3 6;}
         250 {.mainfr.editfr.textarea config -spacing3 10; set off1 12; set off2 20; set off3 7;}
         300 {.mainfr.editfr.textarea config -spacing3 12; set off1 15; set off2 24; set off3 9;}
         360 {.mainfr.editfr.textarea config -spacing3 15; set off1 18; set off2 28; set off3 10;}
         default {.mainfr.editfr.textarea config -spacing3 5; set off1 6; set off2 9; set off3 3;}
      }
      .mainfr.editfr.textarea config -font "-*-bengali-medium-$slant-*-*-*-$ptsize-*-*-*-*-*-fontspecific"
      configTags
   }
}

set buffer ""

proc cutBuffer {} {
   global buffer dirtybit

   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

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

proc copyBuffer {} {
   global buffer

   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

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

proc pasteBuffer {} {
   global buffer dirtybit

   .mainfr.editfr.textarea insert insert $buffer
   incr dirtybit 1
}

proc configTags {} {
   global off1 off2 off3 ptsize slant

   switch -exact $ptsize {
      100 { set scriptsize 100; set scriptscriptsize 100 }
      120 { set scriptsize 100; set scriptscriptsize 100 }
      150 { set scriptsize 120; set scriptscriptsize 100 }
      180 { set scriptsize 150; set scriptscriptsize 120 }
      210 { set scriptsize 180; set scriptscriptsize 150 }
      250 { set scriptsize 210; set scriptscriptsize 180 }
      300 { set scriptsize 250; set scriptscriptsize 210 }
      360 { set scriptsize 300; set scriptscriptsize 250 }
      default { set scriptsize 120; set scriptscriptsize 120 }
   }

   .mainfr.editfr.textarea tag config suptag -offset $off1 -font "-*-bengali-medium-$slant-*-*-*-$scriptsize-*-*-*-*-*-fontspecific"
   .mainfr.editfr.textarea tag config supsuptag -offset $off2 -font "-*-bengali-medium-$slant-*-*-*-$scriptscriptsize-*-*-*-*-*-fontspecific"
   .mainfr.editfr.textarea tag config subsuptag -offset $off3 -font "-*-bengali-medium-$slant-*-*-*-$scriptscriptsize-*-*-*-*-*-fontspecific"
   .mainfr.editfr.textarea tag config subtag -offset -$off1 -font "-*-bengali-medium-$slant-*-*-*-$scriptsize-*-*-*-*-*-fontspecific"
   .mainfr.editfr.textarea tag config subsubtag -offset -$off2 -font "-*-bengali-medium-$slant-*-*-*-$scriptscriptsize-*-*-*-*-*-fontspecific"
   .mainfr.editfr.textarea tag config supsubtag -offset -$off3 -font "-*-bengali-medium-$slant-*-*-*-$scriptscriptsize-*-*-*-*-*-fontspecific"
   .mainfr.editfr.textarea tag config ultag -underline true
}

configTags
foreach point {100 120 150 180 210 250 300 360} {
   .mainfr.editfr.textarea tag config bengali${point}o -font "-*-bengali-medium-o-*-*-*-$point-*-*-*-*-*-fontspecific"
   .mainfr.editfr.textarea tag config bengali${point}r -font "-*-bengali-medium-r-*-*-*-$point-*-*-*-*-*-fontspecific"
}
.mainfr.editfr.textarea tag config english -font fixed
set customfontno 0

proc supSel {} {
   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

   .mainfr.editfr.textarea tag add suptag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subtag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsubtag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsubtag sel.first sel.last
}

proc supsupSel {} {
   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

   .mainfr.editfr.textarea tag remove suptag sel.first sel.last
   .mainfr.editfr.textarea tag add supsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subtag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsubtag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsubtag sel.first sel.last
}

proc subsupSel {} {
   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

   .mainfr.editfr.textarea tag remove suptag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsuptag sel.first sel.last
   .mainfr.editfr.textarea tag add subsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subtag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsubtag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsubtag sel.first sel.last
}

proc subSel {} {
   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

   .mainfr.editfr.textarea tag remove suptag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsuptag sel.first sel.last
   .mainfr.editfr.textarea tag add subtag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsubtag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsubtag sel.first sel.last
}

proc subsubSel {} {
   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

   .mainfr.editfr.textarea tag remove suptag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subtag sel.first sel.last
   .mainfr.editfr.textarea tag add subsubtag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsubtag sel.first sel.last
}

proc supsubSel {} {
   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

   .mainfr.editfr.textarea tag remove suptag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subtag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsubtag sel.first sel.last
   .mainfr.editfr.textarea tag add supsubtag sel.first sel.last
}

proc ulSel {} {
   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

   .mainfr.editfr.textarea tag add ultag sel.first sel.last
}

proc normalSel {} {
   global customfontno

   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

   .mainfr.editfr.textarea tag remove suptag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsuptag sel.first sel.last
   .mainfr.editfr.textarea tag remove subtag sel.first sel.last
   .mainfr.editfr.textarea tag remove subsubtag sel.first sel.last
   .mainfr.editfr.textarea tag remove supsubtag sel.first sel.last
   .mainfr.editfr.textarea tag remove ultag sel.first sel.last
   foreach point {100 120 150 180 210 250 300 360} {
      .mainfr.editfr.textarea tag remove bengali${point}o sel.first sel.last
      .mainfr.editfr.textarea tag remove bengali${point}r sel.first sel.last
   }
   .mainfr.editfr.textarea tag remove english sel.first sel.last
   for {set i 0} {$i < $customfontno} {incr i 1} {
      .mainfr.editfr.textarea tag remove customftag$i sel.first sel.last
   }
}

proc fontSel { } {
   global ptsize slant fseltype fselpt fselsl fswin fsgfname
   global fsok customfid customfontno lsel fontlist

   set lsel [.mainfr.editfr.textarea tag ranges sel]
   if {[llength $lsel] != 2} {
      errmsg "Text does not contain a selected region. Select text by left mouse button and retry."
      return
   }

   set fswin [toplevel .fsel]
   set fseltype 0
   set fselpt $ptsize
   set fselsl $slant
   set fsgfname ""

   frame $fswin.bfr -bg #d9d9d9 -relief flat
   frame $fswin.efr -bg #d9d9d9 -relief flat
   frame $fswin.gfr -bg #d9d9d9 -relief flat
   frame $fswin.gfr.fr1 -bg #d9d9d9 -relief flat
   frame $fswin.gfr.fr2 -bg #d9d9d9 -relief flat
   frame $fswin.ofr -bg #d9d9d9 -relief flat
   radiobutton $fswin.bfr.rb  -text "Bengali: " -variable fseltype -value 0 \
      -relief ridge -selectcolor #bbff00 -fg #000000 -bg #88ccdd \
      -activebackground #88ccdd -activeforeground #000000
   menubutton $fswin.bfr.mb -text "Point size" -height 1 -width 10 \
      -relief raised -menu $fswin.bfr.mb.m -bg #d9d9d9 -fg #000000 \
      -activebackground #d9d9d9 -activeforeground #000000 -disabledforeground #A2A2A2
   menu $fswin.bfr.mb.m -tearoff false -bg #d9d9d9 -fg #000000
   $fswin.bfr.mb.m add command -label " 100 " -command {$fswin.bfr.mb config -text 100; set fselpt 100}
   $fswin.bfr.mb.m add command -label " 120 " -command {$fswin.bfr.mb config -text 120; set fselpt 120}
   $fswin.bfr.mb.m add command -label " 150 " -command {$fswin.bfr.mb config -text 150; set fselpt 150}
   $fswin.bfr.mb.m add command -label " 180 " -command {$fswin.bfr.mb config -text 180; set fselpt 180}
   $fswin.bfr.mb.m add command -label " 210 " -command {$fswin.bfr.mb config -text 210; set fselpt 210}
   $fswin.bfr.mb.m add command -label " 250 " -command {$fswin.bfr.mb config -text 250; set fselpt 250}
   $fswin.bfr.mb.m add command -label " 300 " -command {$fswin.bfr.mb config -text 300; set fselpt 300}
   $fswin.bfr.mb.m add command -label " 360 " -command {$fswin.bfr.mb config -text 360; set fselpt 360}
   checkbutton $fswin.bfr.cb -text "Slanted" \
      -variable fselsl -onvalue "o" -offvalue "r" -relief flat \
      -selectcolor #bbff00 -fg #000000 -bg #d9d9d9 \
      -activeforeground #000000 -activebackground #d9d9d9 -disabledforeground #A2A2A2
   label $fswin.bfr.space -text "" -relief flat -fg #000000 -bg #d9d9d9
   radiobutton $fswin.efr.rb  -text "English: " -variable fseltype -value 1 \
      -relief ridge -selectcolor #bbff00 -fg #000000 -bg #88ccdd \
      -activebackground #88ccdd -activeforeground #000000
   label $fswin.efr.space -text "" -relief flat -fg #000000 -bg #d9d9d9
   radiobutton $fswin.gfr.fr1.rb  -text "General: " -variable fseltype -value 2 \
      -relief ridge -selectcolor #bbff00 -fg #000000 -bg #88ccdd \
      -activebackground #88ccdd -activeforeground #000000
   entry $fswin.gfr.fr1.e -textvariable fsgfname -width 40 -bg #ddddaa -fg #000000 \
      -state disabled -selectbackground #000000 -selectforeground #ddddaa
   listbox $fswin.gfr.fr2.lbx -bg #ddddaa -fg #A2A2A2 -height 10 \
      -yscroll "$fswin.gfr.fr2.scr set" -relief sunken \
      -selectmode single -selectforeground #ddddaa -selectbackground #A2A2A2 \
      -selectborderwidth 0
   scrollbar $fswin.gfr.fr2.scr -command "$fswin.gfr.fr2.lbx yview" \
      -orient vertical -bg #d9d9d9 -width 12 -activebackground #d9d9d9
   set fllen [llength $fontlist]
   for {set idx 0} {$idx < $fllen} {incr idx 1} {
      $fswin.gfr.fr2.lbx insert end [lindex $fontlist $idx]
   }
   bind $fswin.gfr.fr2.lbx <ButtonPress-1> {
      if {$fseltype == 2} {
         set fsgfname [$fswin.gfr.fr2.lbx get [$fswin.gfr.fr2.lbx nearest %y]]
      }
   }
   bind $fswin.gfr.fr2.lbx <ButtonRelease-1> {
      .mainfr.editfr.textarea tag add sel [lindex $lsel 0] [lindex $lsel 1]
   }
   bind $fswin.bfr.rb <ButtonPress-1> {
      $fswin.gfr.fr2.lbx config -fg #A2A2A2 -selectbackground #A2A2A2
      $fswin.bfr.mb config -state active
      $fswin.bfr.cb config -state active
   }
   bind $fswin.efr.rb <ButtonPress-1> {
      $fswin.gfr.fr2.lbx config -fg #A2A2A2 -selectbackground #A2A2A2
      $fswin.bfr.mb config -state disabled
      $fswin.bfr.cb config -state disabled
   }
   bind $fswin.gfr.fr1.rb <ButtonPress-1> {
      $fswin.gfr.fr2.lbx config -fg #000000 -selectbackground #000000
      $fswin.bfr.mb config -state disabled
      $fswin.bfr.cb config -state disabled
   }

   button $fswin.ofr.ok -text " Ok " -relief raised -fg #000000 -bg #a9a9a9 \
      -activebackground #a9a9a9 -activeforeground #000000 -command "set fsok 1"
   label $fswin.ofr.space -text "" -relief flat -fg #000000 -bg #d9d9d9
   button $fswin.ofr.cancel -text " Cancel " -relief raised -fg #000000 -bg #a9a9a9 \
      -activebackground #a9a9a9 -activeforeground #000000 -command "set fsok 0"

   pack $fswin.bfr.rb $fswin.bfr.mb $fswin.bfr.cb -expand no -side left -padx 5 -pady 0
   pack $fswin.bfr.space -expand yes -fill x -padx 5 -pady 0 -side left
   pack $fswin.efr.rb -expand no -side left -padx 5 -pady 0
   pack $fswin.efr.space -expand yes -fill x -padx 5 -pady 0 -side left
   pack $fswin.gfr.fr1.rb -expand no -side left -padx 5 -pady 0
   pack $fswin.gfr.fr1.e -expand yes -fill x -padx 5 -pady 0 -side left
   pack $fswin.gfr.fr2.scr -side right -expand no -fill y -padx 0 -pady 0
   pack $fswin.gfr.fr2.lbx -side right -expand yes -fill x -padx 0 -pady 0
   pack $fswin.gfr.fr1 -expand yes -fill x -padx 0 -pady 0
   pack $fswin.gfr.fr2 -expand yes -fill x -padx 5 -pady 0
   pack $fswin.ofr.ok -expand no -side left -padx 5 -pady 0
   pack $fswin.ofr.space -expand yes -fill x -padx 5 -pady 0 -side left
   pack $fswin.ofr.cancel -expand no -side left -padx 5 -pady 0
   pack $fswin.bfr $fswin.efr $fswin.gfr $fswin.ofr -padx 5 -pady 10 -expand yes -fill x
   $fswin config -bg #d9d9d9

   wm title $fswin "Selection font"
   wm resizable $fswin false false

   bind $fswin <Escape> "set fsok 0"

   grab $fswin
   tkwait variable fsok
   destroy $fswin

   .mainfr.editfr.textarea tag add sel [lindex $lsel 0] [lindex $lsel 1]
   if {($fsok)} {
      foreach point {100 120 150 180 210 250 300 360} {
         .mainfr.editfr.textarea tag remove bengali${point}o sel.first sel.last
         .mainfr.editfr.textarea tag remove bengali${point}r sel.first sel.last
      }
      .mainfr.editfr.textarea tag remove english sel.first sel.last
      for {set i 0} {$i < $customfontno} {incr i 1} {
         .mainfr.editfr.textarea tag remove customftag$i sel.first sel.last
      }
      switch -exact $fseltype {
         0 { .mainfr.editfr.textarea tag add bengali$fselpt$fselsl sel.first sel.last }
         1 { .mainfr.editfr.textarea tag add english sel.first sel.last }
         2 {
            set inserted 0
            for {set i 0} {($i < $customfontno) && (!$inserted)} {incr i 1} {
               if {![string comp $customfid($i) $fsgfname]} {
                  .mainfr.editfr.textarea tag add customftag$i sel.first sel.last
                  set inserted 1
               }
            }
            if {!($inserted)} {
               .mainfr.editfr.textarea tag config customftag$customfontno -font $fsgfname
               .mainfr.editfr.textarea tag add customftag$customfontno sel.first sel.last
               set customfid($customfontno) $fsgfname
               incr customfontno 1
            }
         }
      }
   }
}

proc saveTags {} {
   global customfontno customfid

   set fn [getFileName "bwedit: Save tags"]
   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]
      foreach tagname { ultag suptag supsuptag subsuptag subtag subsubtag supsubtag english } {
         set tagranges [.mainfr.editfr.textarea tag ranges $tagname]
         if {[llength $tagranges] > 0} { puts $f "$tagname\t: $tagranges" }
      }
      foreach point {100 120 150 180 210 250 300 360} {
         set tagranges [.mainfr.editfr.textarea tag ranges bengali${point}o ]
         if {[llength $tagranges] > 0} { puts $f "bengali${point}o\t: $tagranges" }
         set tagranges [.mainfr.editfr.textarea tag ranges bengali${point}r ]
         if {[llength $tagranges] > 0} { puts $f "bengali${point}r\t: $tagranges" }
      }
      for {set i 0} {$i < $customfontno} {incr i 1} {
         set tagname customftag$i
         set tagranges [.mainfr.editfr.textarea tag ranges $tagname]
         if {[llength $tagranges] > 0} {
            set fid $customfid($i)
            puts $f "customfont\t: $fid\t$tagranges"
         }
      }
      close $f
   }
}

proc loadTags { {flag 0} {tfname "" } } {
   global customfontno customfid fontlist scriptlist

   set endidx [.mainfr.editfr.textarea index end]
   if {$flag} { set fn $tfname } else { set fn [getFileName "bwedit: Load tags"] }
   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]
      foreach line [split [read $f] "\n"] {
         set colonidx [ string first ":" $line ]
         if {$colonidx > 0} {
            set tagname [ string range $line 0 [expr $colonidx - 1] ]
            set tagranges [ string range $line [expr $colonidx + 1] [ expr [string length $line] - 1] ]
            set tagname [ string trim $tagname ]
            set tagranges [ string trim $tagranges ]
            set cfidx -1
            if {![string compare $tagname "customfont"]} {
               set tabidx [string first "\t" $tagranges]
               if {$tabidx > 0} {
                  set tagname [string trim [string range $tagranges 0 [expr $tabidx - 1]]]
                  set tagranges [string trim [string range $tagranges [expr $tabidx + 1] [expr [string length $tagranges] - 1]]]
                  for {set i 0} {$i < $customfontno} {incr i 1} {
                     if {![string compare $tagname $customfid($i)]} { set cfidx $i }
                  }
                  if {$cfidx == -1} {
                     set cfidx $customfontno
                     incr customfontno 1
                     set customfid($cfidx) $tagname
                     if {[lsearch -exact $fontlist $tagname] < 0} {
                        puts "Unable to find font $tagname.. using fixed instead"
                        .mainfr.editfr.textarea tag config customftag$cfidx -font fixed
                     } else {
                        .mainfr.editfr.textarea tag config customftag$cfidx -font $tagname
                     }
                  }
               } else { set cfidx -2 }
            }
            set tagranges [split $tagranges " "]
            if {$cfidx != 2} {
               while {[llength $tagranges] > 1} {
                  set tagfirst [lindex $tagranges 0]
                  set taglast [lindex $tagranges 1]
                  set tagranges [lreplace $tagranges 0 1]
                  if { [regexp {[0-9]+\.[0-9]+} $tagfirst] && [regexp {[0-9]+\.[0-9]+} $taglast] && ($tagfirst <= $taglast) && ($tagfirst >= 1.0) && ($taglast <= $endidx)} {
                     if {[lsearch -exact $scriptlist $tagname] >= 0} {
                        .mainfr.editfr.textarea tag remove suptag $tagfirst $taglast
                        .mainfr.editfr.textarea tag remove supsuptag $tagfirst $taglast
                        .mainfr.editfr.textarea tag remove subsuptag $tagfirst $taglast
                        .mainfr.editfr.textarea tag remove subtag $tagfirst $taglast
                        .mainfr.editfr.textarea tag remove subsubtag $tagfirst $taglast
                        .mainfr.editfr.textarea tag remove supsubtag $tagfirst $taglast
                     }
                     foreach point {100 120 150 180 210 250 300 360} {
                        .mainfr.editfr.textarea tag remove bengali${point}o $tagfirst $taglast
                        .mainfr.editfr.textarea tag remove bengali${point}r $tagfirst $taglast
                     }
                     .mainfr.editfr.textarea tag remove english $tagfirst $taglast
                     for {set i 0} {$i < $customfontno} {incr i 1} {
                        .mainfr.editfr.textarea tag remove customftag$i $tagfirst $taglast
                     }
                     if {$cfidx == -1} {
                        .mainfr.editfr.textarea tag add $tagname $tagfirst $taglast
                     } else {
                        .mainfr.editfr.textarea tag add customftag$cfidx $tagfirst $taglast
                     }
                  }
               }
            }
         }
      }
      close $f
   }
}

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

set firstarg [lindex $argv 0]
if { [string compare $firstarg ""] } {
   set fname $firstarg
   if { [file exists $firstarg] } {
      loadThisFile
      set secondarg [lindex $argv 1]
      if { [string compare $secondarg ""] && [file exists $secondarg] } {
         loadTags 1 $secondarg
      }
   } 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 customfontno ptsize slant

   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 } {
      switch -exact $ptsize {
         100 { set bndft "\\bn\\small" ; set ss "\\bn\\tiny" ; set sss "\\bn\\tiny" }
         150 { set bndft "\\bn\\large" ; set ss "\\bn" ; set sss "\\bn\\small" }
         180 { set bndft "\\bn\\Large" ; set ss "\\bn\\large" ; set sss "\\bn" }
         210 { set bndft "\\bn\\LARGE" ; set ss "\\bn\\Large" ; set sss "\\bn\\large" }
         250 { set bndft "\\bn\\huge" ; set ss "\\bn\\LARGE" ; set sss "\\bn\\Large" }
         300 { set bndft "\\bn\\Huge" ; set ss "\\bn\\huge" ; set sss "\\bn\\LARGE" }
         360 { set bndft "\\bn\\Huge" ; set ss "\\bn\\huge" ; set sss "\\bn\\LARGE" }
         default {set bndft "\\bn" ; set ss "\\bn\\small" ; set sss "\\bn\\tiny" }
      }
      if {![string compare "o" $slant]} { set bndft "$bndft\\sl" }
      foreach tagname {suptag supsuptag subsuptag subtag subsubtag supsubtag english} {
         set ${tagname}rng [.mainfr.editfr.textarea tag ranges $tagname]
      }
      for {set i 0} {$i < $customfontno} {incr i 1} {
         set englishrng [concat $englishrng [.mainfr.editfr.textarea tag ranges customftag$i]]
      }
      set smallrng [.mainfr.editfr.textarea tag ranges bengali100r]
      set normalsizerng [.mainfr.editfr.textarea tag ranges bengali120r]
      set largerng [.mainfr.editfr.textarea tag ranges bengali150r]
      set Largerng [.mainfr.editfr.textarea tag ranges bengali180r]
      set LARGErng [.mainfr.editfr.textarea tag ranges bengali210r]
      set hugerng [.mainfr.editfr.textarea tag ranges bengali250r]
      set Hugerng [lsort -real -increasing [concat \
         [.mainfr.editfr.textarea tag ranges bengali300r] \
         [.mainfr.editfr.textarea tag ranges bengali360r]]]
      set smallslrng [.mainfr.editfr.textarea tag ranges bengali100o]
      set normalsizeslrng [.mainfr.editfr.textarea tag ranges bengali120o]
      set largeslrng [.mainfr.editfr.textarea tag ranges bengali150o]
      set Largeslrng [.mainfr.editfr.textarea tag ranges bengali180o]
      set LARGEslrng [.mainfr.editfr.textarea tag ranges bengali210o]
      set hugeslrng [.mainfr.editfr.textarea tag ranges bengali250o]
      set Hugeslrng [lsort -real -increasing [concat \
         [.mainfr.editfr.textarea tag ranges bengali300o] \
         [.mainfr.editfr.textarea tag ranges bengali360o]]]

      foreach scriptrng { \$suptagrng \$subtagrng \$supsuptagrng \$subsuptagrng \$subsubtagrng \$supsubtagrng } {
         set srlen [ eval llength $scriptrng ]
         if {$srlen > 0} {
            foreach tagrng { \$normalsizerng \$smallrng \$largerng \$Largerng \$LARGErng \$hugerng \$Hugerng \$englishrng \$normalsizeslrng \$smallslrng \$largeslrng \$Largeslrng \$LARGEslrng \$hugeslrng \$Hugeslrng } {
               set trlen [ eval llength $tagrng ]
               if {$trlen > 0} {
                  for {set i 0} {$i < $srlen} {incr i 2} {
                     for {set j 0} {$j < $trlen} {incr j 1} {
                        set si [eval lindex $scriptrng $i]
                        set ti1 [eval lindex $tagrng $j]
                        incr j 1
                        set ti2 [eval lindex $tagrng $j]
                        if { ($ti1 < $si) && ($ti2 > $si) } {
                           set [string range $tagrng 1 [expr [string length $tagrng] - 1]] [eval linsert $tagrng $j $si $si]
                           incr trlen 2
                        }
                     }
                  }
                  for {set i 1} {$i < $srlen} {incr i 2} {
                     for {set j 0} {$j < $trlen} {incr j 1} {
                        set si [eval lindex $scriptrng $i]
                        set ti1 [eval lindex $tagrng $j]
                        incr j 1
                        set ti2 [eval lindex $tagrng $j]
                        if { ($ti1 < $si) && ($ti2 > $si) } {
                           set [string range $tagrng 1 [expr [string length $tagrng] - 1]] [eval linsert $tagrng $j $si $si]
                           incr trlen 2
                        }
                     }
                  }
               }
            }
         }
      }

      set f [open $efn w]
      puts $f "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
      puts $f "%% Filename: $efname"
      puts $f "%% Original file: $fname"
      puts $f "%% Exported by: bwedit version 1.2"
      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$bndft\\leavevmode"
      set ins [.mainfr.editfr.textarea get 1.0 end]
      set inl [string length $ins]
      set lineno 1
      set charno 0
      set englishmode 0
      set tagshere {}
      for {set i 0} {$i < $inl} {incr i 1} {
         if {[lsearch -regexp $tagshere "bengali"] >= 0} {
            foreach tagname { \$normalsizerng \$smallrng \$largerng \$Largerng \$LARGErng \$hugerng \$Hugerng \$normalsizeslrng \$smallslrng \$largeslrng \$Largeslrng \$LARGEslrng \$hugeslrng \$Hugeslrng } {
               set ridx [eval lsearch -exact $tagname $lineno.$charno]
               if { ($ridx >= 0) && ($ridx & 1) } { puts -nonewline $f "\}" }
            }
         }
         set ridx [lsearch -exact $englishrng $lineno.$charno]
         if { ($ridx >= 0) && ($ridx & 1) } {
            puts -nonewline $f "\}"
            incr englishmode -1
         }
         set suidx [lsearch -regexp $tagshere "su"]
         if {$suidx >= 0} {
            set tagname [lindex $tagshere $suidx]
            set ridx [eval lsearch -exact \$${tagname}rng $lineno.$charno]
            if { ($ridx >= 0) && ($ridx & 1) } {
               if {[string length $tagname] == 6} {
                  puts -nonewline $f "\}\}\$"
               } else {
                  puts -nonewline $f "\}\}\}\$"
               }
            }
         }
         set tagshere [.mainfr.editfr.textarea tag names "$lineno.$charno"]
         set suidx [lsearch -regexp $tagshere "su"]
         if {$suidx >= 0} {
            set tagname [lindex $tagshere $suidx]
            switch -exact $tagname {
               suptag {
                  set ridx [lsearch -exact $suptagrng $lineno.$charno]
                  if { ($ridx >= 0) && !($ridx & 1) } { puts -nonewline $f "\$^\{\\hbox\{$ss " }
               }
               subtag {
                  set ridx [lsearch -exact $subtagrng $lineno.$charno]
                  if { ($ridx >= 0) && !($ridx & 1) } { puts -nonewline $f "\$_\{\\hbox\{$ss " }
               }
               supsuptag {
                  set ridx [lsearch -exact $supsuptagrng $lineno.$charno]
                  if { ($ridx >= 0) && !($ridx & 1) } { puts -nonewline $f "\$^\{^\{\\hbox\{$sss " }
               }
               subsuptag {
                  set ridx [lsearch -exact $subsuptagrng $lineno.$charno]
                  if { ($ridx >= 0) && !($ridx & 1) } { puts -nonewline $f "\$^\{_\{\\hbox\{$sss " }
               }
               subsubtag {
                  set ridx [lsearch -exact $subsubtagrng $lineno.$charno]
                  if { ($ridx >= 0) && !($ridx & 1) } { puts -nonewline $f "\$_\{_\{\\hbox\{$sss " }
               }
               subsubtag {
                  set ridx [lsearch -exact $supsubtagrng $lineno.$charno]
                  if { ($ridx >= 0) && !($ridx & 1) } { puts -nonewline $f "\$_\{^\{\\hbox\{$sss " }
               }
            }
         }
         set ridx [lsearch -exact $englishrng $lineno.$charno]
         if { ($ridx >= 0) } {
            if { !($ridx & 1) } {
               incr englishmode 1 ; puts -nonewline $f "\{\\rm "
            } else {
               incr ridx 1
               if { ($ridx < [llength $englishrng]) && ("$lineno.$charno" == [lindex $englishrng $ridx]) } {
                  incr englishmode 1 ; puts -nonewline $f "\{\\rm "
               }
            }
         }
         if {[lsearch -regexp $tagshere "bengali"] >= 0} {
            foreach tagname { normalsize small large Large LARGE huge Huge } {
               set ridx [eval lsearch -exact \$${tagname}rng $lineno.$charno]
               if { ($ridx >= 0) } {
                  if { !($ridx & 1) } {
                     puts -nonewline $f "\{\\$tagname\\nsl "
                  } else {
                     incr ridx 1
                     if { ($ridx < [eval llength  \$${tagname}rng]) && ("$lineno.$charno" == [eval lindex \$${tagname}rng $ridx]) } {
                        puts -nonewline $f "\{\\$tagname\\nsl "
                     }
                  }
               }
               set ridx [eval lsearch -exact \$${tagname}slrng $lineno.$charno]
               if { ($ridx >= 0) } {
                  if { !($ridx & 1) } {
                     puts -nonewline $f "\{\\$tagname\\sl "
                  } else {
                     incr ridx 1
                     if { ($ridx < [eval llength  \$${tagname}rng]) && ("$lineno.$charno" == [eval lindex \$${tagname}slrng $ridx]) } {
                        puts -nonewline $f "\{\\$tagname\\sl "
                     }
                  }
               }
            }
         }
         set nextchar [string range $ins $i $i]
         scan $nextchar "%c" asciival
         if {$asciival == 10} { set charno 0 ; incr lineno 1 } else { incr charno 1 }
         if {($englishmode & 1)} {
            switch -exact $asciival {
               10 { if {$verbatim} {
                       puts $f "\\null\\\\\\null"
                    } else {
                       puts $f ""
                    }
               }
               32 { if {$verbatim} {
                       puts -nonewline $f "\\ "
                    } else {
                       puts -nonewline $f " "
                    }
               }
               35 { puts -nonewline $f "\\#" }
               36 { puts -nonewline $f "\\\$" }
               37 { puts -nonewline $f "\\%" }
               38 { puts -nonewline $f "\\&" }
               60 { puts -nonewline $f "\$<\$" }
               62 { puts -nonewline $f "\$>\$" }
               91 { puts -nonewline $f "\$\[\$" }
               92 { puts -nonewline $f "\$\\backslash\$" }
               93 { puts -nonewline $f "\$\]\$" }
               94 { puts -nonewline $f "\{\\char94\}" }
               95 { puts -nonewline $f "\\_" }
               123 { puts -nonewline $f "\\\{" }
               124 { puts -nonewline $f "\$|\$" }
               125 { puts -nonewline $f "\\\}" }
               126 { puts -nonewline $f "\$\\tilde\{\\phantom\{1\}\}\$" }
               169 { puts -nonewline $f "\\copyright\{\}" }
               215 { puts -nonewline $f "\$\\times\$" }
               247 { puts -nonewline $f "\$\\div\$" }
               default { puts -nonewline $f $nextchar }
            }
         } else {
            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\\\\\\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 ptsize slant customfontno

   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 } {
      foreach tagname {suptag supsuptag subsuptag subtag subsubtag supsubtag english} {
         set ${tagname}rng [.mainfr.editfr.textarea tag ranges $tagname]
      }
      for {set i 0} {$i < $customfontno} {incr i 1} {
         set englishrng [concat $englishrng [.mainfr.editfr.textarea tag ranges customftag$i]]
      }
      set englishrng [lsort -real -increasing $englishrng]
      set size1rng [.mainfr.editfr.textarea tag ranges bengali100r]
      set size2rng [.mainfr.editfr.textarea tag ranges bengali120r]
      set size3rng [.mainfr.editfr.textarea tag ranges bengali150r]
      set size4rng [.mainfr.editfr.textarea tag ranges bengali180r]
      set size5rng [.mainfr.editfr.textarea tag ranges bengali210r]
      set size6rng [.mainfr.editfr.textarea tag ranges bengali250r]
      set size7rng [lsort -real -increasing [concat \
         [.mainfr.editfr.textarea tag ranges bengali300r] \
         [.mainfr.editfr.textarea tag ranges bengali360r]]]
      set size1slrng [.mainfr.editfr.textarea tag ranges bengali100o]
      set size2slrng [.mainfr.editfr.textarea tag ranges bengali120o]
      set size3slrng [.mainfr.editfr.textarea tag ranges bengali150o]
      set size4slrng [.mainfr.editfr.textarea tag ranges bengali180o]
      set size5slrng [.mainfr.editfr.textarea tag ranges bengali210o]
      set size6slrng [.mainfr.editfr.textarea tag ranges bengali250o]
      set size7slrng [lsort -real -increasing [concat \
         [.mainfr.editfr.textarea tag ranges bengali300o] \
         [.mainfr.editfr.textarea tag ranges bengali360o]]]
      foreach scriptrng { \$suptagrng \$subtagrng \$supsuptagrng \$subsuptagrng \$subsubtagrng \$supsubtagrng } {
         set srlen [ eval llength $scriptrng ]
         if {$srlen > 0} {
            foreach tagrng { \$englishrng \$size1rng \$size2rng \$size3rng \$size4rng \$size5rng \$size6rng \$size7rng \$size1slrng \$size2slrng \$size3slrng \$size4slrng \$size5slrng \$size6slrng \$size7slrng } {
               set trlen [ eval llength $tagrng ]
               if {$trlen > 0} {
                  for {set i 0} {$i < $srlen} {incr i 2} {
                     for {set j 0} {$j < $trlen} {incr j 1} {
                        set si [eval lindex $scriptrng $i]
                        set ti1 [eval lindex $tagrng $j]
                        incr j 1
                        set ti2 [eval lindex $tagrng $j]
                        if { ($ti1 < $si) && ($ti2 > $si) } {
                           set [string range $tagrng 1 [expr [string length $tagrng] - 1]] [eval linsert $tagrng $j $si $si]
                           incr trlen 2
                        }
                     }
                  }
                  for {set i 1} {$i < $srlen} {incr i 2} {
                     for {set j 0} {$j < $trlen} {incr j 1} {
                        set si [eval lindex $scriptrng $i]
                        set ti1 [eval lindex $tagrng $j]
                        incr j 1
                        set ti2 [eval lindex $tagrng $j]
                        if { ($ti1 < $si) && ($ti2 > $si) } {
                           set [string range $tagrng 1 [expr [string length $tagrng] - 1]] [eval linsert $tagrng $j $si $si]
                           incr trlen 2
                        }
                     }
                  }
               }
            }
         }
      }
      
      set f [open $efn w]
      puts $f "<!--------------------------------------------------------->"
      puts $f "<!-- Filename: $efname -->"
      puts $f "<!-- Original file: $fname -->"
      puts $f "<!-- Exported by: bwedit version 1.2 -->"
      puts $f "<!--------------------------------------------------------->"
      puts $f "<HTML>"
      puts $f "<HEAD><TITLE>$doctitle</TITLE></HEAD>"
      switch -exact $ptsize {
         100 { puts $f "<BASEFONT SIZE=2>" }
         150 { puts $f "<BASEFONT SIZE=4>" }
         180 { puts $f "<BASEFONT SIZE=5>" }
         210 { puts $f "<BASEFONT SIZE=6>" }
         250 { puts $f "<BASEFONT SIZE=7>" }
         300 { puts $f "<BASEFONT SIZE=7>" }
         360 { puts $f "<BASEFONT SIZE=7>" }
      }
      puts $f "<BODY>"
      set ins [.mainfr.editfr.textarea get 1.0 end]
      set inl [string length $ins]
      set lineno 1
      set charno 0
      set tagshere {}
      set opsctg(sup) "<SUP>"
      set opsctg(sub) "<SUB>"
      set opsctg(supsup) "<SUP><SUP>"
      set opsctg(subsup) "<SUP><SUB>"
      set opsctg(subsub) "<SUB><SUB>"
      set opsctg(supsub) "<SUB><SUP>"
      set clsctg(sup) "</SUP>"
      set clsctg(sub) "</SUB>"
      set clsctg(supsup) "</SUP></SUP>"
      set clsctg(subsup) "</SUB></SUP>"
      set clsctg(subsub) "</SUB></SUB>"
      set clsctg(supsub) "</SUP></SUB>"
      for {set i 0} {$i < $inl} {incr i 1} {
         if {[lsearch -regexp $tagshere "bengali"] >= 0} {
            foreach tagname { \$size1rng \$size2rng \$size3rng \$size4rng \$size5rng \$size6rng \$size7rng } {
               set ridx [eval lsearch -exact $tagname $lineno.$charno]
               if { ($ridx >= 0) && ($ridx & 1) } {
                  puts -nonewline $f "</FONT>"
               }
            }
            foreach tagname { \$size1slrng \$size2slrng \$size3slrng \$size4slrng \$size5slrng \$size6slrng \$size7slrng } {
               set ridx [eval lsearch -exact $tagname $lineno.$charno]
               if { ($ridx >= 0) && ($ridx & 1) } {
                  puts -nonewline $f "</I></FONT>"
               }
            }
         }
         set ridx [lsearch -exact $englishrng $lineno.$charno]
         if { ($ridx >= 0) && ($ridx & 1) } { puts -nonewline $f "</TT>" }
         set suidx [lsearch -regexp $tagshere "su"]
         if {$suidx >= 0} {
            set tagname [lindex $tagshere $suidx]
            set tagname [string range $tagname 0 [expr [string length $tagname] - 4]]
            set ridx [eval lsearch -exact \$${tagname}tagrng $lineno.$charno]
            if { ($ridx >= 0) && ($ridx & 1) } { puts -nonewline $f $clsctg($tagname) }
         }
         set tagshere [.mainfr.editfr.textarea tag names "$lineno.$charno"]
         set suidx [lsearch -regexp $tagshere "su"]
         if {$suidx >= 0} {
            set tagname [lindex $tagshere $suidx]
            set tagname [string range $tagname 0 [expr [string length $tagname] - 4]]
            set ridx [eval lsearch -exact \$${tagname}tagrng $lineno.$charno]
            if { ($ridx >= 0) && !($ridx & 1) } { puts -nonewline $f $opsctg($tagname) }
         }
         set ridx [lsearch -exact $englishrng $lineno.$charno]
         if {($ridx >= 0)} {
            if { !($ridx & 1) } { puts -nonewline $f "<TT>" } else {
               incr ridx 1
               if { ($ridx < [llength $englishrng]) && ("$lineno.$charno" == [lindex $englishrng $ridx]) } {
                   puts -nonewline $f "<TT>"
               }
            }
         }
         if {[lsearch -regexp $tagshere "bengali"] >= 0} {
            for {set ftsz 1} {$ftsz <= 7} {incr ftsz 1} {
               set ridx [eval lsearch -exact \$size${ftsz}rng $lineno.$charno]
               if {($ridx >= 0)} {
                  if { !($ridx & 1) } {
                     puts -nonewline $f "<FONT SIZE=$ftsz>"
                  } else {
                     incr ridx 1
                     if { ($ridx < [eval llength \$size${ftsz}rng]) && ("$lineno.$charno" == [eval lindex \$size${ftsz}rng $ridx]) } {
                        puts -nonewline $f "<FONT SIZE=$ftsz>"
                     }
                  }
               }
               set ridx [eval lsearch -exact \$size${ftsz}slrng $lineno.$charno]
               if {($ridx >= 0)} {
                  if { !($ridx & 1) } {
                     puts -nonewline $f "<FONT SIZE=$ftsz><I>"
                  } else {
                     incr ridx 1
                     if { ($ridx < [eval llength \$size${ftsz}slrng]) && ("$lineno.$charno" == [eval lindex \$size${ftsz}slrng $ridx]) } {
                        puts -nonewline $f "<FONT SIZE=$ftsz><I>"
                     }
                  }
               }
            }
         }
         set nextchar [string range $ins $i $i]
         scan $nextchar "%c" asciival
         if {$asciival == 10} { set charno 0 ; incr lineno 1 } else { incr charno 1 }
         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 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
   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 $dbox.fr2 $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 -padx 5 -pady 5
   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 pageheight textheight xoffset yoffset psfontfile
   global customfontno ptsize slant

   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 } {
      if {[string compare "o" $slant]} { set slflag 0 } else { set slflag 1 }
      foreach tagname {suptag supsuptag subsuptag subtag subsubtag supsubtag english} {
         set ${tagname}rng [.mainfr.editfr.textarea tag ranges $tagname]
      }
      for {set i 0} {$i < $customfontno} {incr i 1} {
         set englishrng [concat $englishrng [.mainfr.editfr.textarea tag ranges customftag$i]]
      }
      set englishrng [lsort -real -increasing $englishrng]
      set smallrng [.mainfr.editfr.textarea tag ranges bengali100r]
      set normalrng [.mainfr.editfr.textarea tag ranges bengali120r]
      set largerng [.mainfr.editfr.textarea tag ranges bengali150r]
      set Largerng [.mainfr.editfr.textarea tag ranges bengali180r]
      set LARGErng [.mainfr.editfr.textarea tag ranges bengali210r]
      set hugerng [.mainfr.editfr.textarea tag ranges bengali250r]
      set Hugerng [.mainfr.editfr.textarea tag ranges bengali300r]
      set HUGErng [.mainfr.editfr.textarea tag ranges bengali360r]
      set smallslrng [.mainfr.editfr.textarea tag ranges bengali100o]
      set normalslrng [.mainfr.editfr.textarea tag ranges bengali120o]
      set largeslrng [.mainfr.editfr.textarea tag ranges bengali150o]
      set Largeslrng [.mainfr.editfr.textarea tag ranges bengali180o]
      set LARGEslrng [.mainfr.editfr.textarea tag ranges bengali210o]
      set hugeslrng [.mainfr.editfr.textarea tag ranges bengali250o]
      set Hugeslrng [.mainfr.editfr.textarea tag ranges bengali300o]
      set HUGEslrng [.mainfr.editfr.textarea tag ranges bengali360o]
      foreach scriptrng { \$suptagrng \$subtagrng \$supsuptagrng \$subsuptagrng \$subsubtagrng \$supsubtagrng } {
         set srlen [ eval llength $scriptrng ]
         if {$srlen > 0} {
            foreach tagrng { \$normalrng \$smallrng \$largerng \$Largerng \$LARGErng \$hugerng \$Hugerng \$HUGErng \$englishrng \$normalslrng \$smallslrng \$largeslrng \$Largeslrng \$LARGEslrng \$hugeslrng \$Hugeslrng \$HUGEslrng } {
               set trlen [ eval llength $tagrng ]
               if {$trlen > 0} {
                  for {set i 0} {$i < $srlen} {incr i 2} {
                     for {set j 0} {$j < $trlen} {incr j 1} {
                        set si [eval lindex $scriptrng $i]
                        set ti1 [eval lindex $tagrng $j]
                        incr j 1
                        set ti2 [eval lindex $tagrng $j]
                        if { ($ti1 < $si) && ($ti2 > $si) } {
                           set [string range $tagrng 1 [expr [string length $tagrng] - 1]] [eval linsert $tagrng $j $si $si]
                           incr trlen 2
                        }
                     }
                  }
                  for {set i 1} {$i < $srlen} {incr i 2} {
                     for {set j 0} {$j < $trlen} {incr j 1} {
                        set si [eval lindex $scriptrng $i]
                        set ti1 [eval lindex $tagrng $j]
                        incr j 1
                        set ti2 [eval lindex $tagrng $j]
                        if { ($ti1 < $si) && ($ti2 > $si) } {
                           set [string range $tagrng 1 [expr [string length $tagrng] - 1]] [eval linsert $tagrng $j $si $si]
                           incr trlen 2
                        }
                     }
                  }
               }
            }
         }
      }
      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.2"
      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
      set off1 [expr 0.5 * $pt]
      set off2 [expr 0.8 * $pt]
      set off3 [expr 0.3 * $pt]
      puts $f "/bnnormal \{ /Bengali findfont $pt scalefont setfont \} def"
      set bnsize [expr 0.7 * $pt]
      puts $f "/bnsmall \{ /Bengali findfont $bnsize scalefont setfont \} def"
      set bnsize [expr 0.5 * $pt]
      puts $f "/bntiny \{ /Bengali findfont $bnsize scalefont setfont \} def"
      set bnsize [expr 1.2 * $pt]
      puts $f "/bnlarge \{ /Bengali findfont $bnsize scalefont setfont \} def"
      set bnsize [expr 1.44 * $pt]
      puts $f "/bnLarge \{ /Bengali findfont $bnsize scalefont setfont \} def"
      set bnsize [expr 1.728 * $pt]
      puts $f "/bnLARGE \{ /Bengali findfont $bnsize scalefont setfont \} def"
      set bnsize [expr 2.074 * $pt]
      puts $f "/bnhuge \{ /Bengali findfont $bnsize scalefont setfont \} def"
      set bnsize [expr 2.488 * $pt]
      puts $f "/bnHuge \{ /Bengali findfont $bnsize scalefont setfont \} def"
      set bnsize [expr 2.986 * $pt]
      puts $f "/bnHUGE \{ /Bengali findfont $bnsize scalefont setfont \} def"
      puts $f "/english \{ /Times-Roman findfont $pt scalefont setfont \} def"

      puts $f "/bsup \{ 0 $off1 rmoveto \} def"
      puts $f "/bsub \{ 0 -$off1 rmoveto \} def"
      puts $f "/bsupsup \{ 0 $off2 rmoveto \} def"
      puts $f "/bsubsub \{ 0 -$off2 rmoveto \} def"
      puts $f "/bsubsup \{ 0 $off3 rmoveto \} def"
      puts $f "/bsupsub \{ 0 -$off3 rmoveto \} def"
      puts $f "/esup \{ 0 -$off1 rmoveto \} def"
      puts $f "/esub \{ 0 $off1 rmoveto \} def"
      puts $f "/esupsup \{ 0 -$off2 rmoveto \} def"
      puts $f "/esubsub \{ 0 $off2 rmoveto \} def"
      puts $f "/esubsup \{ 0 -$off3 rmoveto \} def"
      puts $f "/esupsub \{ 0 $off3 rmoveto \} def"

      puts $f "/M \{ dup 4 div neg /y0 exch def moveto \} def"
      puts $f "/S \{ show \} def"
      puts $f "/SS \{ 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"
      puts $f "/P \{ CH 0 3 -1 roll put CH S \} def"
      puts $f "/PP \{ CH 0 3 -1 roll put CH SS \} def"
      puts $f "bnnormal"
      set tos 0
      set fontstack(0) "bnnormal"

      puts $f "\n%%Page: $pageno $pageno\nN"
      set ins [.mainfr.editfr.textarea get 1.0 end]
      set inl [string length $ins]
      set lineno 1
      set charno 0
      set englishmode 0
      foreach tagname { sub sup subsup supsub supsup subsub large Large LARGE huge Huge HUGE } {
         set ${tagname}found 0
         set prevcorr 0
      }
      set acc ""
      set tagshere {}
      for {set i 0} {$i < $inl} {incr i 1} {
         if {[lsearch -regexp $tagshere "bengali"] >= 0} {
            foreach tagname { \$normalrng \$smallrng \$largerng \$Largerng \$LARGErng \$hugerng \$Hugerng \$HUGErng \$normalslrng \$smallslrng \$largeslrng \$Largeslrng \$LARGEslrng \$hugeslrng \$Hugeslrng \$HUGEslrng } {
               set ridx [eval lsearch -exact $tagname $lineno.$charno]
               if { ($ridx >= 0) && ($ridx & 1) } {
                  incr tos -1 ; set prevfont $fontstack($tos) ; set acc "$acc $prevfont"
                  if {[string compare $slant "o"]} {set slflag 0} else {set slflag 1}
               }
            }
         }
         set ridx [lsearch -exact $englishrng $lineno.$charno]
         if { ($ridx >= 0) && ($ridx & 1) } {
            incr englishmode -1
            incr tos -1 ; set prevfont $fontstack($tos) ; set acc "$acc $prevfont"
         }
         set suidx [lsearch -regexp $tagshere "su"]
         if {$suidx >= 0} {
            set tagname [lindex $tagshere $suidx]
            set tagname [string range $tagname 0 [expr [string length $tagname] - 4]]
            set ridx [eval lsearch -exact \$${tagname}tagrng $lineno.$charno]
            if { ($ridx >= 0) && ($ridx & 1) } {
               set acc "$acc e$tagname"
               incr tos -1 ; set prevfont $fontstack($tos) ; set acc "$acc $prevfont"
            }
         }
         set tagshere [.mainfr.editfr.textarea tag names "$lineno.$charno"]
         set suidx [lsearch -regexp $tagshere "su.tag"]
         if {$suidx >= 0} {
            set tagname [lindex $tagshere $suidx]
            set tagname [string range $tagname 0 [expr [string length $tagname] - 4]]
            set ridx [eval lsearch -exact \$${tagname}tagrng $lineno.$charno]
            if { ($ridx >= 0) && !($ridx & 1) && ([string length $tagname] == 3) } {
               set acc "$acc b$tagname"
               incr tos 1 ; set fontstack($tos) bnsmall ; set acc "$acc bnsmall"
               set ${tagname}found 1
            }
         }
         set suidx [lsearch -regexp $tagshere "su.su.tag"]
         if {$suidx >= 0} {
            set tagname [lindex $tagshere $suidx]
            set tagname [string range $tagname 0 [expr [string length $tagname] - 4]]
            set ridx [eval lsearch -exact \$${tagname}tagrng $lineno.$charno]
            if { ($ridx >= 0) && !($ridx & 1) } {
               set acc "$acc b$tagname"
               incr tos 1 ; set fontstack($tos) bntiny ; set acc "$acc bntiny"
               set ${tagname}found 1
            }
         }
         set ridx [lsearch -exact $englishrng $lineno.$charno]
         if {($ridx >= 0)} {
            if { !($ridx & 1) } {
               incr englishmode 1
               incr tos 1 ; set fontstack($tos) english ; set acc "$acc english"
            } else {
               incr ridx 1
               if { ($ridx < [llength $englishrng]) && ("$lineno.$charno" == [lindex $englishrng $ridx]) } {
                  incr englishmode 1
                  incr tos 1 ; set fontstack($tos) english ; set acc "$acc english"
               }
            }
         }
         if {[lsearch -regexp $tagshere "bengali"] >= 0} {
            foreach tagname { normal small large Large LARGE huge Huge HUGE } {
               set ridx [eval lsearch -exact \$${tagname}rng $lineno.$charno]
               if {($ridx >= 0)} {
                  if { !($ridx & 1) } {
                     set acc "$acc bn$tagname" ; set slflag 0
                     incr tos 1 ; set fontstack($tos) bn$tagname
                     set ${tagname}found 1
                  } else {
                     incr ridx 1
                     if { ($ridx < [eval llength \$${tagname}rng]) && ("$lineno.$charno" == [eval lindex \$${tagname}rng $ridx]) } {
                        set acc "$acc bn$tagname" ; set slflag 0
                        incr tos 1 ; set fontstack($tos) bn$tagname
                        set ${tagname}found 1
                     }
                  }
               }
               set ridx [eval lsearch -exact \$${tagname}slrng $lineno.$charno]
               if {($ridx >= 0)} {
                  if { !($ridx & 1) } {
                     set acc "$acc bn$tagname" ; set slflag 1
                     incr tos 1 ; set fontstack($tos) bn$tagname
                     set ${tagname}found 1
                  } else {
                     incr ridx 1
                     if { ($ridx < [eval llength \$${tagname}slrng]) && ("$lineno.$charno" == [eval lindex \$${tagname}slrng $ridx]) } {
                        set acc "$acc bn$tagname" ; set slflag 1
                        incr tos 1 ; set fontstack($tos) bn$tagname
                        set ${tagname}found 1
                     }
                  }
               }
            }
         }
         set nextchar [string range $ins $i $i]
         scan $nextchar "%c" asciival
         if {$asciival == 10} { set charno 0 ; incr lineno 1 } else { incr charno 1 }
         if {($slflag) && !($englishmode)} {set P PP ; set S SS} else {set P P ; set S S}
         if {$asciival == 10} {
            set currenty [expr $currenty - $lineskip]
            if {$prevcorr != 0} { set currenty [expr $currenty - ( $prevcorr * $pt )] }
            set sosc 0
            if {$subsupfound} { set sosc 0.3 }
            if {$supfound} { set sosc 0.5 }
            if {$supsupfound} { set sosc 0.8 }
            set fosc 0
            if {$largefound} { set fosc 0.25 }
            if {$Largefound} { set fosc 0.5 }
            if {$LARGEfound} { set fosc 0.75 }
            if {$hugefound} { set fosc 1.08 }
            if {$Hugefound} { set fosc 1.5 }
            if {$HUGEfound} { set fosc 2 }
            set tosc [expr ( $sosc + $fosc ) * $pt]
            set currenty [expr $currenty - $tosc]
            set prevcorr 0
            if { $currenty <= $lly } {
               incr pageno 1
               puts $f "showpage\n\n%%Page: $pageno $pageno\nN"
               set currenty $uly
            } else {
               if {$supsubfound} {set prevcorr 0.3}
               if {$subfound} {set prevcorr 0.5}
               if {$subsubfound} {set prevcorr 0.8}
            }
            puts $f "$xoffset $currenty M"
            puts $f $acc
            set acc ""
            set taglist [.mainfr.editfr.textarea tag names "$lineno.0"]
            if {[lsearch -regexp $taglist "bengali150"] >= 0} { set largefound 1 } else { set largefound 0 }
            if {[lsearch -regexp $taglist "bengali180"] >= 0} { set Largefound 1 } else { set Largefound 0 }
            if {[lsearch -regexp $taglist "bengali210"] >= 0} { set LARGEfound 1 } else { set LARGEfound 0 }
            if {[lsearch -regexp $taglist "bengali250"] >= 0} { set hugefound 1 } else { set hugefound 0 }
            if {[lsearch -regexp $taglist "bengali300"] >= 0} { set Hugefound 1 } else { set Hugefound 0 }
            if {[lsearch -regexp $taglist "bengali360"] >= 0} { set HUGEfound 1 } else { set HUGEfound 0 }
            foreach tagname { sub sup subsup supsub supsup subsub } {
               if {[lsearch -exact $taglist "${tagname}tag"] >= 0} {
                  set ${tagname}found 1
               } else { set ${tagname}found 0 }
            }
         } elseif {$englishmode} {
            switch -exact $asciival {
               37 { set acc "$acc (\\$nextchar) S" }
               40 { set acc "$acc (\\$nextchar) S" }
               41 { set acc "$acc (\\$nextchar) S" }
               92 { set acc "$acc (\\$nextchar) S" }
               default {
                  if { ($asciival < 32) || ($asciival > 127) } {
                     set acc "$acc $asciival P"
                  } else {
                     set acc "$acc ($nextchar) S"
                  }
               }
            }
         } else {
            switch -exact $asciival {
                1 { set acc "$acc $corr5 B 1 $P $corr5 F" }
                3 { set acc "$acc $corr5 B 3 $P $corr5 F" }
                4 { set acc "$acc $corr5 B 4 $P $corr5 F" }
               15 { set acc "$acc $corr4 B 15 $P $corr4 F" }
               37 { set acc "$acc (\\$nextchar) $S" }
               40 { set acc "$acc (\\$nextchar) $S" }
               41 { set acc "$acc (\\$nextchar) $S" }
               46 { set acc "$acc ( $nextchar) $S" }
               60 { set acc "$acc ( $nextchar) $S" }
               73 { set acc "$acc $corr1 B (I) $S $corr1 F" }
               79 { set acc "$acc $corr1 B (O) $S $corr1 F" }
               84 { set acc "$acc $corr5 B (T) $S $corr5 F" }
               85 { set acc "$acc $corr2 B (U) $S $corr2 F" }
               87 { set acc "$acc $corr2 B (W) $S $corr2 F" }
               92 { set acc "$acc (\\$nextchar) $S" }
              117 { set acc "$acc $corr2 B (u) $S $corr2 F" }
              119 { set acc "$acc $corr3 B (w) $S $corr3 F" }
               default {
                  if { ($asciival < 32) || ($asciival > 127) } {
                     set acc "$acc $asciival $P"
                  } else {
                     set acc "$acc ($nextchar) $S"
                  }
               }
            }
         }
      }
      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.pt.m -bg #a9a9a9 -fg #000000 \
         -activebackground #a9a9a9 -activeforeground #000000
   menu $dbox.fr8.pt.m -tearoff false -bg #d3d3d3 -fg #000000
   $dbox.fr8.pt.m add command -label " 100 " -command {set ptsize 100}
   $dbox.fr8.pt.m add command -label " 120 " -command {set ptsize 120}
   $dbox.fr8.pt.m add command -label " 150 " -command {set ptsize 150}
   $dbox.fr8.pt.m add command -label " 180 " -command {set ptsize 180}
   $dbox.fr8.pt.m add command -label " 210 " -command {set ptsize 210}
   $dbox.fr8.pt.m add command -label " 250 " -command {set ptsize 250}
   $dbox.fr8.pt.m add command -label " 300 " -command {set ptsize 300}
   $dbox.fr8.pt.m 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.2"
   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 activateTagMenu {} {
   set posx [winfo x .]
   incr posx [winfo x .cmdfr.tag]
   set posy [winfo y .]
   incr posy [winfo y .cmdfr.tag]
   incr posy [winfo height .cmdfr.tag]
   .cmdfr.tag.m post $posx $posy
   .cmdfr.tag.m activate 0
   grab set -global .cmdfr.tag.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; activateTagMenu }
bind .cmdfr.tag.m <Right> { grab release .cmdfr.tag.m; .cmdfr.tag.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.tag.m <Left> { grab release .cmdfr.tag.m; .cmdfr.tag.m unpost; activateEditMenu }
bind .cmdfr.option.m <Left> { grab release .cmdfr.option.m; .cmdfr.option.m unpost; activateTagMenu }
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-g> { activateTagMenu }
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-G> { activateTagMenu }
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 { flag } {
   global encmap encread dirtybit

   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
      }
      if {!($flag)} { .mainfr.editfr.textarea delete 1.0 end }
      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]] "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 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 notdone 1
                  while {$notdone} {
                     set notdone 0
                     if {![string compare $ref ""] && ![string compare [string index $banjon 0] "r"] } {
                        set ref "^"
                        set banjon [string range $banjon 1 [expr $len - 1]]
                        incr len -1
                        set notdone 1
                     }
                     if {($len > 1) && ![string compare $rafala ""]} {
                        set lastchar [string index $banjon [expr $len - 1]]
                        if {![string compare $lastchar "r"]} {
                           set rafala [format "%c" 15]
                           set banjon [string range $banjon 0 [expr $len - 2]]
                           incr len -1
                           set notdone 1
                        }
                     }
                     if {($len > 1) && ![string compare $jafala ""]} {
                        set lastchar [string index $banjon [expr $len - 1]]
                        if {![string compare $lastchar "y"] || ![string compare $lastchar "Y"]} {
                           set jafala [format "%c" 14]
                           set banjon [string range $banjon 0 [expr $len - 2]]
                           incr len -1
                           set notdone 1
                        }
                     }
                     if {($len > 1) && ![string compare $chandra ""]} {
                        set lastchar [string index $banjon [expr $len - 1]]
                        if {![string compare $lastchar "^"]} {
                           set chandra "w"
                           set banjon [string range $banjon 0 [expr $len - 2]]
                           incr len -1
                           set notdone 1
                        }
                     }
                  }
                  if {[info exists encmap($banjon)]} {
                     set ban [format "%c" $encmap($banjon)]
                  } else {
                     set ban " "
                  }
               }
               set ban "$ban$ref$chandra$rafala$jafala"
            } else {
               set ban "w"
               set swar 97
            }
            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
      incr dirtybit 1
   }
}

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

   message $ewin.msg -text $msg -relief flat -bg #006688 -fg #ffffff -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 #004466

   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

   menu $rwin.b3m  -tearoff false -bg #d3d3d3 -fg #000000
   $rwin.b3m add command -label " Load file " -command "loadRomanFile $rwin"
   $rwin.b3m add command -label " Save file " -command "saveRomanFile $rwin"
   $rwin.b3m add command -label " Save as file " -command "saveasRomanFile $rwin"
   $rwin.b3m add separator
   $rwin.b3m add command -label " Conversion rules " -command {helpwinRoman}
   $rwin.b3m add separator
   $rwin.b3m add command -label " Close " -command "set rok 1"
   $rwin.b3m add command -label " Quit " -command "quitEditor"

   bind $rwin.editfr.textarea <ButtonPress-3> "$rwin.b3m post %X %Y; $rwin.b3m activate 0; grab set -global $rwin.b3m"

   tkwait variable rok
   destroy $rwin
}

if {$editrmn} { editRoman }

menu .b2m -tearoff false -bg #d3d3d3 -fg #000000
.b2m add command -label " Cut " -command {cutBuffer}
.b2m add command -label " Copy " -command {copyBuffer}
.b2m add command -label " Paste " -command {pasteBuffer}
.b2m add separator
.b2m add command -label " Normal " -command {normalSel}
.b2m add command -label " Underline " -command {ulSel}
.b2m add command -label " Superscript " -command {supSel}
.b2m add command -label " Supersuperscript " -command {supsupSel}
.b2m add command -label " Subsuperscript " -command {subsupSel}
.b2m add command -label " Subscript " -command {subSel}
.b2m add command -label " Subsubscript " -command {subsubSel}
.b2m add command -label " Supersubscript " -command {supsubSel}
.b2m add separator
.b2m add command -label " Selection Font " -command {fontSel}
.b2m add command -label " Document Font " -command {chooseBaseFont}

menu .b3m -tearoff false -bg #d3d3d3 -fg #000000
.b3m add command -label " Load file " -command {loadFile}
.b3m add command -label " Save file " -command {saveThisFile}
.b3m add command -label " Save as file " -command {saveFile}
.b3m add separator
.b3m add command -label " Load Roman file " -command {importRoman 0}
.b3m add command -label " Insert Roman file " -command {importRoman 1}
.b3m add command -label " Edit Roman file " -command {editRoman}
.b3m add separator
.b3m add command -label " Export to HTML " -command {exportHTML}
.b3m add command -label " Export to LaTeX " -command {exportLaTeX}
.b3m add command -label " Export to PostScript " -command {exportPS}
.b3m add separator
.b3m add command -label " Load Tags " -command {loadTags}
.b3m add command -label " Save Tags " -command {saveTags}
.b3m add separator
.b3m add command -label " Quit " -command {quitEditor}

bind .mainfr.editfr.textarea <ButtonPress-2> {
   .b2m post %X %Y
   .b2m activate 0
   grab set -global .b2m
}

bind .mainfr.editfr.textarea <ButtonPress-3> {
   .b3m post %X %Y
   .b3m activate 0
   grab set -global .b3m
}

bind .mainfr.editfr.textarea <Any-Key> {
   if { ([string compare %A " "] >= 0) && ([string compare %A "~"] <= 0) } {
      incr dirtybit 1
   }
   if {![string compare %A "\t"]} { incr dirtybit 1 }
   if {![string compare %A "\n"]} { incr dirtybit 1 }
   if {![string compare %A "\r"]} { incr dirtybit 1 }
   if {![string compare %A "\f"]} { incr dirtybit 1 }
}
bind .mainfr.editfr.textarea <Alt-Key> { }
bind .mainfr.editfr.textarea <Control-Key> { }
bind .mainfr.editfr.textarea <BackSpace> { incr dirtybit 1 }
bind .mainfr.editfr.textarea <Control-h> { incr dirtybit 1 }
bind .mainfr.editfr.textarea <Delete> { incr dirtybit 1 }
bind .mainfr.editfr.textarea <Control-d> { incr dirtybit 1 }
bind .mainfr.editfr.textarea <Meta-d> { incr dirtybit 1 }
bind .mainfr.editfr.textarea <Control-k> { incr dirtybit 1 }
bind .mainfr.editfr.textarea <Control-o> { incr dirtybit 1 }
bind .mainfr.editfr.textarea <Control-w> { incr dirtybit 1 }
bind .mainfr.editfr.textarea <Control-x> { incr dirtybit 1 }
bind .mainfr.editfr.textarea <Control-t> { incr dirtybit 1 }

###########################################################################
# 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
