#!/usr/bin/wish -f
set psfontfile "/usr/lib/ghostscript/fonts/bnr.gsf"
frame .cmdfr
frame .namefr
frame .editfr
frame .swarfr
frame .banfr1
frame .banfr2
frame .splfr
frame .jukfr1
frame .jukfr2
frame .jukfr3
frame .jukfr4
frame .jukfr5
frame .jukfr6

#Command bar
menubutton .cmdfr.file -text "File" -height 1 -width 8 -relief raised -menu .cmdfr.file.m -bg #a9a9a9 -fg #000000 -underline 0
menubutton .cmdfr.edit -text "Edit" -height 1 -width 8 -relief raised -menu .cmdfr.edit.m -bg #a9a9a9 -fg #000000 -underline 0
menubutton .cmdfr.view -text "View" -height 1 -width 8 -relief raised -menu .cmdfr.view.m -bg #a9a9a9 -fg #000000 -underline 3
menubutton .cmdfr.export -text "Export" -height 1 -width 8 -relief raised -menu .cmdfr.export.m -bg #a9a9a9 -fg #000000 -underline 1
menu .cmdfr.file.m
.cmdfr.file.m add command -label "  New (Alt+N)  " -command {newFile} -underline 2
.cmdfr.file.m add command -label "  Load (Alt+L)  " -command {loadFile} -underline 2
.cmdfr.file.m add command -label "  Insert (Alt+I)  " -command {insertFile} -underline 2
.cmdfr.file.m add command -label "  Append (Alt+A)  " -command {appendFile} -underline 2
.cmdfr.file.m add command -label "  Save (Alt+V)  " -command {saveThisFile} -underline 4
.cmdfr.file.m add command -label "  Save as (Alt+S)  " -command {saveFile} -underline 2
.cmdfr.file.m add separator
.cmdfr.file.m add command -label "  Quit (Alt+Q)  " -command {quitEditor} -underline 2
.cmdfr.file.m config -tearoff false -bg #d3d3d3 -fg #000000
menu .cmdfr.edit.m
.cmdfr.edit.m add command -label "  Clear  " -command {clearTextArea} -underline 2
.cmdfr.edit.m add command -label "  Select all  " -command {selectAll} -underline 9
.cmdfr.edit.m add separator
.cmdfr.edit.m add command -label "  Cut  " -command {cutBuffer} -underline 4
.cmdfr.edit.m add command -label "  Copy  " -command {copyBuffer} -underline 5
.cmdfr.edit.m add command -label "  Paste  " -command {pasteBuffer} -underline 2
.cmdfr.edit.m add separator
.cmdfr.edit.m add command -label "  Normal  " -command {normalBuffer} -underline 2
.cmdfr.edit.m add command -label "  Underline  " -command {ulBuffer} -underline 2
.cmdfr.edit.m add command -label "  Superscript  " -command {supBuffer} -underline 2
.cmdfr.edit.m add command -label "  Subscript  " -command {subBuffer} -underline 4
.cmdfr.edit.m add separator
.cmdfr.edit.m add command -label "  Document font (Alt+D)  " -command {chooseBaseFont} -underline 2
.cmdfr.edit.m config -tearoff false -bg #d3d3d3 -fg #000000
menu .cmdfr.view.m
.cmdfr.view.m add command -label "  Keyboard map (Alt+K)  " -command {viewKbdMap} -underline 2
.cmdfr.view.m add command -label "  Hide character array (Alt+C) " -command {manageCharMap} -underline 7
.cmdfr.view.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
label .cmdfr.blank -width 25 -text "" -relief flat -bg #d3d3d3 -fg #000000
button .cmdfr.help -text "Help" -height 1 -width 7 -relief raised -command {helpwin} -bg #d3d3d3 -fg #000000 -underline 0
pack .cmdfr.file .cmdfr.edit .cmdfr.view .cmdfr.export -side left -padx 10 -pady 5 -side left
pack .cmdfr.blank -side left -expand yes -fill both
pack .cmdfr.help -padx 10 -pady 5 -side left

#File name
label .namefr.lbl -text " File name: " -relief flat -foreground #000000 -background #d3d3d3 -underline 8
entry .namefr.ent -textvariable fname -relief sunken \
      -background #ddaaaa -foreground #000000
bind .namefr.ent <Return> {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 .editfr.textarea -relief sunken -height 15 -width 0 \
            -font "-*-bengali-medium-r-*-*-*-150-*-*-*-*-*-fontspecific" \
            -xscroll ".hscroll set" -yscroll ".editfr.scrbar set" \
            -wrap none -spacing3 6 \
            -background #99aabb -foreground #000000 -borderwidth 2
scrollbar .editfr.scrbar -relief sunken -orient vertical -command ".editfr.textarea yview" -bg #d3d3d3
pack .editfr.scrbar -fill y -side right -padx 0 -pady 0
pack .editfr.textarea -expand yes -fill both -side right -padx 0 -pady 0
.editfr.textarea config -selectbackground #ccffff -selectforeground #000000 -selectborderwidth 0

#Horizontal scrollbar
scrollbar .hscroll -relief sunken -orient horizontal -command ".editfr.textarea xview" -bg #d3d3d3

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

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

#Swar frame
addcb .swarfr 97
button .swarfr.charA -text "aA" -relief flat -width 1 \
       -font "-*-bengali-medium-r-*-*-*-120-*-*-*-*-*-fontspecific" \
       -bg #a9a9a9 -fg #000000 -borderwidth -3 \
       -command {.editfr.textarea insert insert "aA"}
pack .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 .banfr2.charw -text "b" -relief flat -width 1 \
       -font "-*-bengali-medium-r-*-*-*-120-*-*-*-*-*-fontspecific" \
       -bg #a9a9a9 -fg #000000 -borderwidth -3 \
       -command {.editfr.textarea insert insert "b"}
pack .banfr2.charw -padx 0 -pady 0 -side left
addcb .banfr2 83
addcb .banfr2 70
addcb .banfr2 115
addcb .banfr2 104
addcb .banfr2 82
addcb .banfr2 86
addcb .banfr2 121
addcb .banfr2 66
addcb .banfr2 77
addcb .banfr2 72
addcb .banfr2 119

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

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

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

set charmap 1
focus .editfr.textarea

proc loadThisFile {} {
   global fname

   set f [open $fname r]
   set x [read $f]
   clearTextArea
   .editfr.textarea insert 1.0 $x
   set t [close $f]
   wm title . "bwedit: $fname"
   focus .editfr.textarea
}

proc newFile {} {
   global fname

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

proc loadFile {} {
   global fname

   set fn [getFileName "bwedit: Load"]
   if { [string compare $fn ""] != 0 } {
      set f [open $fn r]
      set x [read $f]
      clearTextArea
      .editfr.textarea insert 1.0 $x
      set t [close $f]
      set fname $fn
      wm title . "bwedit: $fname"
   }
}

proc insertFile {} {
   set fn [getFileName "bwedit: Insert"]
   if { [string compare $fn ""] != 0 } {
      set f [open $fn r]
      set x [read $f]
      .editfr.textarea insert insert $x
      set t [close $f]
   }
}

proc appendFile {} {
   set fn [getFileName "bwedit: Append"]
   if { [string compare $fn ""] != 0 } {
      set f [open $fn r]
      set x [read $f]
      .editfr.textarea insert end $x
      set t [close $f]
   }
}

proc saveThisFile {} {
   global fname

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

proc saveFile {} {
   global fname

   set fn [getFileName "bwedit: Save"]
   if { [string compare $fn ""] != 0 } {
      set f [open $fn w]
      set x [.editfr.textarea get 1.0 end]
      puts -nonewline $f $x
      set t [close $f]
      if { [string compare $fname ""] == 0 } {
         set fname $fn
         wm title . "bwedit: $fname"
      }
   }
}

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

proc quitEditor {} {
   destroy .
}

proc getFileName { wtitle } {
   global ok
   global newfname

   set dbox [toplevel .prompt]
   label $dbox.lbl -text "Enter filename: " -relief flat -fg #000000 -bg #d3d3d3
   entry $dbox.ent -textvariable newfname -bg #ddaaaa -fg #000000
   button $dbox.obtn -text "OK" -command {set ok 1} -fg #000000 -bg #a9a9a9
   button $dbox.cbtn -text "Cancel" -command {set ok 0} -fg #000000 -bg #a9a9a9
   bind $dbox.ent <Return> {set ok 1}
   bind $dbox <Escape> {set ok 0}

   pack $dbox.lbl -padx 10 -pady 5
   pack $dbox.ent -padx 10 -pady 5 -fill x
   pack $dbox.obtn -padx 10 -pady 5 -expand yes -fill y -side left
   pack $dbox.cbtn -padx 10 -pady 5 -expand yes -fill y
   $dbox config -bg #d3d3d3

   wm title $dbox "$wtitle"
   wm resizable $dbox false false

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

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

proc helpwin { } {
   global done

   set hwin [toplevel .help]
   label $hwin.hdr -text "HELP" -relief flat -fg #00ff00 -bg #000080
   message $hwin.msg -text \
"bwedit is a  Tcl/Tk-based application for editing Bengali files using a fixed
X11 font.  This is an experimental version of bwedit.  Here is listed a brief
description of its functionalities.

File operations: (Alt+F)
   New      edit a new file (Alt+N)
   Load     load a file to the editor (Alt+L)
   Insert   insert a file at the cursor position (Alt+I)
   Append   append a file at the end of the edited text (Alt+A)
   Save     save content of the editor to the file currently edited (Alt+V)
   Save As  save content of the editor to a named file (Alt+S)
   Quit     quit editor (Alt+Q)

Edit operations: (Alt+E)
   Clear         clear editor text
   Select all    select the entire editor text
   Cut           remove selected region and remember it in the cut buffer
   Copy          remember selected region in the cut buffer
   Paste         insert cut buffer at current cursor position
   Normal        set display style of selected region to normal
   Underline     underline selected region
   Superscript   raise text in selected region
   Subscript     lower text in selected region
   Document font    choose font size and slant for the entire document (Alt+D)

View: (Alt+W)
Keyboard Map:   character mapping of the keyboard (Alt+D)
Character array:  show/hide the character array below the text area (Alt+C)

Export text in the editor to the formats (Alt+X)
   LaTeX         for use with \"Bengali Writer TeX Interface\"
   HTML          for viewing in web browsers
   PostScript    for printing

Help        launch this help window (Alt+H)

FILE NAME:  The name of the file currently edited. (Alt+m)

CHARACTER ARRAY:
            click on the characters of the character array below the text
            area to print the characters at the current cursor position
            in the text window

AUTHOR: Abhijit Das \[abhij@csa.iisc.ernet.in\]
DATE: Sun Jan 11 1998" \
      -relief ridge -bg #99aabb -fg #000000 -width 700 
      # -font "-misc-fixed-bold-r-normal--13-120-75-75-c-70-iso8859-1"

   button $hwin.done -text "Done" -command {set done 1} -bg #a9a9a9 -fg #000000
   label $hwin.space -text "" -relief flat -bg #d3d3d3 -fg #000000
   button $hwin.map -text "Keyboard map" -command {viewKbdMap} -bg #a9a9a9 -fg #000000

   pack $hwin.hdr -padx 5 -pady 10
   pack $hwin.msg -padx 5 -pady 0 -fill x
   pack $hwin.map -padx 5 -pady 10 -fill y -side left
   pack $hwin.space -padx 5 -pady 10 -expand yes -fill x -side left
   pack $hwin.done -padx 5 -pady 10 -fill y -side left
   $hwin config -bg #d3d3d3
   bind $hwin <Escape> {set done 1}

   wm title $hwin "bwedit help"
   wm resizable $hwin false false

   tkwait variable done
   destroy $hwin
}

proc viewKbdMap {} {
   global donem

   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 {set donem 1} -bg #a9a9a9 -fg #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> {set donem 1}

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

   tkwait variable donem
   destroy $mapwin
}

proc manageCharMap {} {
   global charmap

   if ($charmap) {
      pack forget .swarfr .banfr1 .banfr2 .splfr .jukfr1 .jukfr2 .jukfr3 .jukfr4 .jukfr5 .jukfr6
      set charmap 0
      .cmdfr.view.m entryconfigure 1 -label "  Show character array (Alt+C)  " -underline 7
   } else {
      pack .swarfr .banfr1 .banfr2 .splfr .jukfr1 .jukfr2 .jukfr3 .jukfr4 .jukfr5 .jukfr6 -padx 5 -pady 0 -fill x
      set charmap 1
      .cmdfr.view.m entryconfigure 1 -label "  Hide character array (Alt+C)  " -underline 7
   }
}

set ptsize 150
set slant "r"

proc chooseBaseFont {} {
   global donef
   global ptsize
   global slant
   
   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
   radiobutton $fwin.rb2 -width 6 -text "12" -variable ptsize -value "120" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3
   radiobutton $fwin.rb3 -width 6 -text "15" -variable ptsize -value "150" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3
   radiobutton $fwin.rb4 -width 6 -text "18" -variable ptsize -value "180" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3
   radiobutton $fwin.rb5 -width 6 -text "21" -variable ptsize -value "210" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3
   radiobutton $fwin.rb6 -width 6 -text "25" -variable ptsize -value "250" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3
   radiobutton $fwin.rb7 -width 6 -text "30" -variable ptsize -value "300" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3
   radiobutton $fwin.rb8 -width 6 -text "36" -variable ptsize -value "360" -relief ridge -selectcolor #bbff00 -fg #000000 -bg #d3d3d3

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

   button $fwin.done -text "Done" -command {set donef 1} -fg #000000 -bg #a9a9a9
   button $fwin.cancel -text "Cancel" -command {set donef 0} -fg #000000 -bg #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 1}

   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 {.editfr.textarea config -spacing3 4}
         120 {.editfr.textarea config -spacing3 5}
         150 {.editfr.textarea config -spacing3 6}
         180 {.editfr.textarea config -spacing3 7}
         210 {.editfr.textarea config -spacing3 8}
         250 {.editfr.textarea config -spacing3 10}
         300 {.editfr.textarea config -spacing3 12}
         360 {.editfr.textarea config -spacing3 15}
         default {.editfr.textarea config -spacing3 6}
      }
      .editfr.textarea config -font "-*-bengali-medium-$slant-*-*-*-$ptsize-*-*-*-*-*-fontspecific"
   }
}

set buffer ""
set newfont "-*-bengali-medium-r-*-*-*-150-*-*-*-*-*-fontspecific"

proc cutBuffer {} {
   global buffer

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

proc copyBuffer {} {
   global buffer

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

proc pasteBuffer {} {
   global buffer

   .editfr.textarea insert insert $buffer
}

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

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

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

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

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

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

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

proc getExportFileName {} {
   global ok
   global efname
   global verbatim

   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
   button $dbox.fr4.obtn -text "OK" -command {set ok 1} -width 6 -fg #000000 -bg #a9a9a9
   button $dbox.fr4.cbtn -text "Cancel" -command {set ok 0} -width 6 -fg #000000 -bg #a9a9a9
   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
   global efname
   global verbatim
   global doctitle

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

proc exportHTML {} {
   global fname
   global efname
   global verbatim
   global doctitle

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

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

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

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

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

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

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

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

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

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

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

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

.cmdfr.file configure -highlightcolor #000000 -highlightthickness 2
.cmdfr.edit configure -highlightcolor #000000 -highlightthickness 2
.cmdfr.view configure -highlightcolor #000000 -highlightthickness 2
.cmdfr.export configure -highlightcolor #000000 -highlightthickness 2
bind .cmdfr.file <Right> { focus .cmdfr.edit }
bind .cmdfr.edit <Right> { focus .cmdfr.view }
bind .cmdfr.view <Right> { focus .cmdfr.export }
bind .cmdfr.export <Right> { focus .cmdfr.file }
bind .cmdfr.file <Left> { focus .cmdfr.export }
bind .cmdfr.edit <Left> { focus .cmdfr.file }
bind .cmdfr.view <Left> { focus .cmdfr.edit }
bind .cmdfr.export <Left> { focus .cmdfr.view }

bind all <Alt-a> { appendFile }
bind all <Alt-c> { manageCharMap }
bind all <Alt-d> { chooseBaseFont }
bind all <Alt-e> { focus .cmdfr.edit }
bind all <Alt-f> { focus .cmdfr.file }
bind all <Alt-h> { .cmdfr.help invoke }
bind all <Alt-i> { insertFile }
bind all <Alt-k> { viewKbdMap }
bind all <Alt-l> { loadFile }
bind all <Alt-m> { focus .namefr.ent }
bind all <Alt-n> { newFile }
bind all <Alt-q> { quitEditor }
bind all <Alt-s> { saveFile }
bind all <Alt-t> { focus .editfr.textarea }
bind all <Alt-v> { saveThisFile }
bind all <Alt-w> { focus .cmdfr.view }
bind all <Alt-x> { focus .cmdfr.export }
bind all <Alt-A> { appendFile }
bind all <Alt-C> { manageCharMap }
bind all <Alt-D> { chooseBaseFont }
bind all <Alt-E> { focus .cmdfr.edit }
bind all <Alt-F> { focus .cmdfr.file }
bind all <Alt-H> { .cmdfr.help invoke }
bind all <Alt-I> { insertFile }
bind all <Alt-K> { viewKbdMap }
bind all <Alt-L> { loadFile }
bind all <Alt-N> { newFile }
bind all <Alt-Q> { quitEditor }
bind all <Alt-S> { saveFile }
bind all <Alt-T> { focus .editfr.textarea }
bind all <Alt-V> { saveThisFile }
bind all <Alt-W> { focus .cmdfr.view }
bind all <Alt-X> { focus .cmdfr.export }

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