home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / X11R6 / lib / X11 / cbb / main.tcl < prev    next >
Text File  |  1998-10-07  |  41KB  |  1,386 lines

  1. #!/usr/bin/wish -f
  2. #  'CBB' -- Check Book Balancer
  3. #
  4. #   main.tcl -- main window routines.
  5. #
  6. #  Written by Curtis Olson.  Started August 25, 1994.
  7. #
  8. #  Copyright (C) 1994 - 1997  Curtis L. Olson  - curt@sledge.mn.org
  9. #
  10. #  This program is free software; you can redistribute it and/or modify
  11. #  it under the terms of the GNU General Public License as published by
  12. #  the Free Software Foundation; either version 2 of the License, or
  13. #  (at your option) any later version.
  14. #
  15. #  This program is distributed in the hope that it will be useful,
  16. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. #  GNU General Public License for more details.
  19. #
  20. #  You should have received a copy of the GNU General Public License
  21. #  along with this program; if not, write to the Free Software
  22. #  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23. #
  24. # $Id: main.tcl,v 2.28 1998/08/14 14:28:40 curt Exp $
  25. # (Log is kept at end of this file)
  26.  
  27.  
  28. #------------------------------------------------------------------------------
  29. # Setup main window
  30. #------------------------------------------------------------------------------
  31.  
  32. proc setup_main {} {
  33.     global cbb lib_path argv0
  34.  
  35.     # Setup main window parameters
  36.  
  37.     wm title . "[file tail $argv0] - $cbb(cur_file)"
  38.     wm command . "[file tail $argv0]"
  39.     wm group . .
  40.     wm iconname . "[file tail $argv0] - $cbb(cur_file)"
  41.     wm iconbitmap . @$lib_path/images/$cbb(icon_xbm)
  42.     # specify absolute placement
  43.     #wm geometry . +0+0
  44.     # The following options will enable window resizing
  45.     #wm minsize . 100 50
  46.     #wm maxsize . 1000 700
  47.     option add *font $cbb(default_font)
  48.  
  49.     # Setup container frames
  50.     setup_containers
  51.  
  52.     # Setup menu bar
  53.     option add *font $cbb(menu_font)
  54.     setup_menubar .menubar
  55.     setup_file_menu .menubar
  56.     setup_edit_menu .menubar
  57.     setup_functions_menu .menubar
  58.     setup_extern_menu .menubar
  59.  
  60.     if { $cbb(devel) == 1 } { 
  61.     setup_devel_menu .menubar
  62.     }
  63.  
  64.     setup_help_menu .menubar
  65.     setup_file_prefs_menu .menubar
  66.     setup_prefs_crypt_menu .menubar
  67.     setup_prefs_appear_menu .menubar
  68.     setup_functions_goto_menu .menubar
  69.  
  70. #   if { $cbb(devel) == 0 } {
  71. #       tk_menuBar .menubar .menubar.file .menubar.edit .menubar.functions \
  72. #        .menubar.extern .menubar.help
  73. #   } else {
  74. #    tk_menuBar .menubar .menubar.file .menubar.edit .menubar.functions \
  75. #        .menubar.extern .menubar.devel .menubar.help
  76. #   }
  77. #
  78. #    tk_bindForTraversal .
  79.  
  80.     # Setup headers
  81.     setup_headers
  82.  
  83.     # Setup the transaction listbox and scrollbar
  84.     setup_listbox 
  85.  
  86.     # Setup the entry area
  87.     setup_entry_area
  88.  
  89.     # setup auto hiliting of entry fields if desired
  90.     if { $cbb(auto_hilite) } {
  91.     setup_auto_hilite
  92.     }
  93.  
  94.     # Setup the command bar
  95.     setup_command_bar
  96.  
  97.     # Setup the account list
  98.     setup_acct_listbox
  99.  
  100.     # Setup the status line
  101.     setup_status_line
  102.  
  103.     update
  104.     wm deiconify .
  105. }
  106.  
  107.  
  108. #------------------------------------------------------------------------------
  109. # Setup container frames
  110. #------------------------------------------------------------------------------
  111.  
  112. proc setup_containers {} {
  113.     frame .menubar -relief raised -borderwidth 2
  114.  
  115.     frame .head -relief raised -borderwidth 2
  116.     frame .trans -relief raised -borderwidth 2
  117.     frame .entry -relief raised -borderwidth 2
  118.     frame .bar -borderwidth 2
  119.     frame .acct -relief raised -borderwidth 2
  120.     frame .status -relief raised -borderwidth 2
  121.     pack .menubar -fill x 
  122.     pack .head -fill x 
  123.     pack .trans -fill both -expand 1
  124.     pack .entry -fill both 
  125.     pack .bar -fill x 
  126.     pack .acct -fill x
  127.     pack .status -fill x 
  128. }
  129.  
  130.  
  131. #------------------------------------------------------------------------------
  132. # Setup headers
  133. #------------------------------------------------------------------------------
  134.  
  135. proc setup_headers {} {
  136.     global cbb
  137.  
  138.     label .head.line1 -font $cbb(fixed_header_font) \
  139.             -text [format "%5s  %-8s  %-15s  %9s  %9s  %1s  %9s" \
  140.             "Chk #" "Date" "Description" "Debit" "Credit" "" "Total"] \
  141.             -padx 5 -pady -1 -foreground $cbb(head_color)
  142.     label .head.line2 -font $cbb(fixed_header_font) \
  143.             -text [format "%5s  %-8s  %-15s  %-9s" \
  144.             "" "" "Comment" "Category"] -padx 4 -pady -1 \
  145.         -foreground $cbb(head_color)
  146.     pack .head.line1 -side top -anchor w
  147.     pack .head.line2 -side top -anchor w
  148. }
  149.  
  150.  
  151. #------------------------------------------------------------------------------
  152. # Setup the transaction listbox and scrollbar
  153. #------------------------------------------------------------------------------
  154.  
  155. proc setup_listbox {} {
  156.     global cbb
  157.  
  158. ### listbox .trans.list -width $cbb(list_width) -height $cbb(list_height) \
  159. ###        -takefocus 0 -exportselection false \
  160. ###        -yscrollcommand ".trans.scroll set" -font $cbb(fixed_font)
  161.     text .trans.list -width $cbb(list_width) -height $cbb(list_height) \
  162.         -spacing1 1 -takefocus 0 -exportselection false \
  163.         -font $cbb(fixed_font) -wrap none \
  164.         -state disabled \
  165.         -yscrollcommand ".trans.scroll set"
  166.  
  167.     if {[winfo depth .] > 1} {
  168. #    .trans.list tag configure color1 -background grey94 \
  169. #        -foreground black
  170. #    .trans.list tag configure color2 -background grey78 \
  171. #        -foreground black
  172. #    .trans.list tag configure color2 -underline 1
  173.     .trans.list tag configure color1 -background $cbb(list_line1_color) \
  174.         -foreground black
  175.     .trans.list tag configure color2 -background $cbb(list_line2_color) \
  176.         -foreground black
  177.     .trans.list tag configure negcolor1 -background $cbb(list_line1_color) \
  178.         -foreground red
  179.     .trans.list tag configure negcolor2 -background $cbb(list_line2_color) \
  180.         -foreground red
  181.  
  182.     .trans.list tag configure cbbSel -background $cbb(hilite_color) \
  183.         -foreground black
  184.     } else {
  185.     .trans.list tag configure color1
  186.     .trans.list tag configure color2
  187.     }
  188.  
  189.     bind .trans.list <ButtonRelease-1> {
  190.     listHiliteTrans [.trans.list index @%x,%y]
  191.     }
  192.  
  193.     bind .trans.list <Double-Button> {
  194.     listHiliteTrans [.trans.list index @%x,%y]
  195.     update_entry_area [.trans.list index @%x,%y]
  196.     }
  197.  
  198.     scrollbar .trans.scroll -takefocus 0 -command ".trans.list yview" \
  199.         -relief flat
  200.     pack .trans.scroll -side right -fill y 
  201.     pack .trans.list -side left -fill both -expand 1
  202. }
  203.  
  204.  
  205. #------------------------------------------------------------------------------
  206. # Setup the entry area
  207. #------------------------------------------------------------------------------
  208.  
  209. proc setup_entry_area {} {
  210.     global cbb lib_path
  211.  
  212.     option add *font $cbb(fixed_font)
  213.  
  214.     image create photo "done" -file "$lib_path/images/mini-exclam.gif"
  215.     image create photo "cancel" -file "$lib_path/images/mini-cross.gif"
  216.  
  217.     frame .entry.line1 
  218.     frame .entry.line2
  219.     pack .entry.line1 -side top -fill x -expand 1
  220.     pack .entry.line2 -side top -fill x -expand 1
  221.  
  222.     entry .entry.line1.check -relief sunken -width 5 -textvariable check
  223.     entry .entry.line1.date -width 8 -relief sunken -textvariable nicedate
  224.     entry .entry.line1.desc -width 15 -relief sunken -textvariable desc
  225.     entry .entry.line1.debit -width 9 -relief sunken -textvariable debit
  226.     entry .entry.line1.credit -width 9 -relief sunken -textvariable credit
  227.     entry .entry.line1.clear -width 1 -relief sunken -textvariable cleared
  228.     button .entry.line1.done -image done -command done_entering -takefocus 0
  229.     cbb_set_balloon .entry.line1.done "Done entering <Enter>"
  230.  
  231.     pack .entry.line1.check -side left
  232.     pack .entry.line1.date -padx 7 -side left
  233.     pack .entry.line1.desc -side left
  234.     pack .entry.line1.debit -padx 7 -side left
  235.     pack .entry.line1.credit -side left
  236.     pack .entry.line1.clear -padx 6 -side left
  237.     pack .entry.line1.done -side right
  238.  
  239.     label .entry.line2.space -width 15
  240.     entry .entry.line2.com -width 15 -relief sunken -textvariable com
  241.     entry .entry.line2.cat -width 9 -relief sunken -textvariable cat
  242.     button .entry.line2.cancel -image cancel -command clear_entry_area \
  243.         -takefocus 0
  244.     cbb_set_balloon .entry.line2.cancel "Cancel changes and start over <Meta-N>"
  245.  
  246.     pack .entry.line2.space -padx 6 -side left
  247.     pack .entry.line2.com -side left
  248.     pack .entry.line2.cat -padx 7 -side left
  249.     pack .entry.line2.cancel -side right
  250.  
  251.     # setup some bindings
  252.  
  253.     # Change the bindtags so the following bindings execute first
  254.     # the break makes sure any other default bindings are skipped.
  255.     bindtags .entry.line1.check {.entry.line1.check Entry . all}
  256.     bindtags .entry.line1.date {.entry.line1.date Entry . all}
  257.  
  258.     # Don't use "all" bindings on this field so we can control what happens
  259.     # with a <Tab> or <Shift-Tab>
  260.     bindtags .entry.line1.desc {.entry.line1.desc Entry .}
  261.     bindtags .entry.line2.cat  {.entry.line2.cat Entry .}
  262.  
  263.     bind .entry.line1.check + {
  264.     set check [inc_check $check]
  265.     %W icursor end
  266.     break
  267.     }
  268.     bind .entry.line1.check = {
  269.     set check [inc_check $check]
  270.     %W icursor end
  271.     break
  272.     }
  273.  
  274.     bind .entry.line1.check - {
  275.     set check [dec_check $check]
  276.     %W icursor end
  277.     break
  278.     }
  279.     bind .entry.line1.check _ {
  280.     set check [dec_check $check]
  281.     %W icursor end
  282.     break
  283.     }
  284.  
  285.     bind .entry.line1.date + {
  286.     set nicedate [inc_date $nicedate]
  287.     %W icursor end
  288.     break
  289.     }
  290.     bind .entry.line1.date = {
  291.     set nicedate [inc_date $nicedate]
  292.     %W icursor end
  293.     break
  294.     }
  295.  
  296.     bind .entry.line1.date - {
  297.     set nicedate [dec_date $nicedate]
  298.     %W icursor end
  299.     break
  300.     }
  301.     bind .entry.line1.date _ {
  302.     set nicedate [dec_date $nicedate]
  303.     %W icursor end
  304.     break
  305.     }
  306. }
  307.  
  308.  
  309. #------------------------------------------------------------------------------
  310. # Setup the command bar
  311. #------------------------------------------------------------------------------
  312.  
  313. proc setup_command_bar { } {
  314.     global cbb
  315.  
  316.     option add *font $cbb(button_font)
  317.  
  318.     button .bar.new -text "New" -takefocus 0 -command { clear_entry_area }
  319.     cbb_set_balloon .bar.new "Cancel changes and start a new transaction \
  320.         <Meta-N>"
  321.  
  322.     button .bar.edit -text "Edit" -takefocus 0 -command {
  323.     if { [listGetCurTrans] >= 1 } {
  324.         update_entry_area [listGetCurTrans].0
  325.     }
  326.     }
  327.     cbb_set_balloon .bar.edit "Edit the selected transaction <Meta-E>"
  328.  
  329.     button .bar.delete -text "Delete" -takefocus 0 \
  330.             -command {
  331.     if { [listGetCurTrans] >= 1 } {
  332.         if { $cbb(debug) } { puts "Delete [listGetCurTrans].0" }
  333.         delete_trans [listGetCurTrans].0
  334.     }
  335.     } 
  336.     cbb_set_balloon .bar.delete "Delete the selected transaction"
  337.  
  338.     button .bar.splits -text "Splits" -takefocus 0 -command { 
  339.     cbbWindow.splits
  340.     tkwait window .splits
  341.     }
  342.     cbb_set_balloon .bar.splits "Open the splits window <Meta-S>"
  343.  
  344.     button .bar.balance -text "Balance" -takefocus 0 -command { balance }
  345.     cbb_set_balloon .bar.balance "Open the balance window"
  346.  
  347.     button .bar.save -text "Save" -takefocus 0 -command {
  348.     if { $cbb(cur_file) != "noname.cbb" } {
  349.         acctSave
  350.     } else {
  351.         acctSaveAs
  352.     }
  353.     }
  354.     cbb_set_balloon .bar.save "Save the current file"
  355.  
  356.     button .bar.quit -text "Quit" -takefocus 0 -command { cbbQuit }
  357.     cbb_set_balloon .bar.quit "Quit <Meta-Q>"
  358.  
  359.     pack .bar.new .bar.edit .bar.delete .bar.splits .bar.balance .bar.save \
  360.     .bar.quit -side left -fill x -expand 1 -padx 2 -pady 1
  361. }
  362.  
  363.  
  364. #------------------------------------------------------------------------------
  365. # Setup the acct listbox and scrollbar
  366. #------------------------------------------------------------------------------
  367.  
  368. proc setup_acct_listbox {} {
  369.     global cbb yesno
  370.  
  371.     listbox .acct.list -width $cbb(list_width) -height $cbb(acctlist_height) \
  372.         -takefocus 0 -exportselection false \
  373.         -yscrollcommand ".acct.scroll set" -font $cbb(fixed_font)
  374.  
  375.     bind .acct.list <Double-Button> {
  376.     if { "[.acct.list curselection]" != "" } {
  377.         set file [.acct.list get [.acct.list curselection]].cbb
  378.         if { [acctIsDirty] } {
  379.         if { $cbb(auto_save) } {
  380.             acctSave
  381.         } else {
  382.             cbbWindow.yesno "You have not saved your current changes.  \
  383.                 Would you like to save before loading a new \
  384.                 account?"
  385.             tkwait window .yesno
  386.             
  387.             if { "$yesno(result)" == "yes" } {
  388.             acctSave
  389.             } elseif { "$yesno(result)" == "no" } {
  390.             } elseif { "$yesno(result)" == "cancel" } {
  391.             return
  392.             }
  393.         }
  394.         }
  395.         set dname  [file dirname $cbb(cur_file)]
  396.         regsub " .*$" $file "" file
  397.         acctLoadFile $dname/$file.cbb
  398.     }
  399.     }
  400.  
  401.     pack .acct.list -side left -fill both -expand 1
  402.  
  403.     scrollbar .acct.scroll -takefocus 0 -command ".acct.list yview" \
  404.         -relief flat
  405.     pack .acct.scroll -side right -fill y -expand 1
  406. }
  407.  
  408. proc load_acct_listbox {} {
  409.     global cbb eng
  410.  
  411.     set a "no files found"
  412.     set dname [file dirname $cbb(cur_file)]
  413.     catch {set a [split [exec sh -c "cd $dname; echo *.cbb"] \ ]}
  414.     .acct.list delete 0 [.acct.list size]
  415.     foreach i $a {
  416.     set b "no files found"
  417.     set c "no files found"
  418.     if { $cbb(use_crypt) } {
  419.         catch { set b [exec sh -c "$cbb(decrypt) $cbb(crypt_code) < \
  420.             $dname/$i 2>/dev/null | grep '# Current Balance = '"]}
  421.         catch { set c [exec sh -c "$cbb(decrypt) $cbb(crypt_code) < \
  422.             $dname/$i 2>/dev/null | grep '# Ending Balance = '"]}
  423.     } else {
  424.         catch {set b [exec grep "# Current Balance = " $dname/$i]}
  425.         catch {set c [exec grep "# Ending Balance = " $dname/$i]}
  426.     }
  427.     regsub ".* " $b "" b
  428.     regsub ".* " $c "" c
  429.     regsub "\.cbb" $i "" i
  430.  
  431.     # get the account description
  432.     puts $eng "get_cat_info \[$i\]"; flush $eng
  433.     gets $eng desc
  434.     
  435.     if { "$desc" != "none" } {
  436.         set pieces [split $desc "\t"]
  437.         set desc [lindex $pieces 0]
  438.     }
  439.  
  440.     # .acct.list insert end [format "%-16s  %-37s  %11s" $i $desc $b]
  441.     .acct.list insert end \
  442.         [format "%-16s  %-24.24s  %11s  %11s" $i $desc $b $c]
  443.     }
  444.  
  445.     update
  446. }
  447.  
  448.  
  449. #------------------------------------------------------------------------------
  450. # Setup the status line
  451. #------------------------------------------------------------------------------
  452.  
  453. proc setup_status_line { } {
  454.     global cbb argv0
  455.  
  456.     label .status.line -text "Welcome to [file tail $argv0]" \
  457.         -font $cbb(status_line_font)
  458.     pack .status.line -fill both -expand 1
  459. }
  460.  
  461.  
  462. #------------------------------------------------------------------------------
  463. # Functions for the text box
  464. #------------------------------------------------------------------------------
  465.  
  466. proc listAddTrans {line1 line2} {
  467.     global cbb date start_pos
  468.  
  469.     set total [string range $line1 58 67]
  470.     if { $cbb(debug) } { puts " --> $total" }
  471.     set total [expr $total + 0]
  472.     if { $cbb(debug) } { puts " --> $total" }
  473.     if { $total < 0 } {
  474.     set negative 1
  475.     } else {
  476.     set negative 0
  477.     }
  478.  
  479.     set tmp_date [string range $line1 72 79]
  480.     if { $cbb(debug) } { puts "$date - $tmp_date" }
  481.  
  482.     if { $negative } {
  483.     .trans.list insert end "$line1\n" negcolor1
  484.     .trans.list insert end "$line2\n" negcolor2
  485.     } else {
  486.     .trans.list insert end "$line1\n" color1
  487.     .trans.list insert end "$line2\n" color2
  488.     }
  489.  
  490.     if { $tmp_date <= $date } {
  491.     set start_pos [listGetSize]
  492.     }
  493. }
  494.  
  495.  
  496. proc listGetSize {} {
  497.     scan [.trans.list index end] "%d.%d" line col
  498.     return [expr $line - 2]
  499. }
  500.  
  501.  
  502. proc listGetCurTrans {} {
  503.     global cbb
  504.  
  505.     if { "[.trans.list tag nextrange cbbSel 1.0 end ]" != "" } {
  506.     scan [.trans.list tag nextrange cbbSel 1.0 end ] "%d.%d" line col
  507.     # set line [expr $line + 1]
  508.     } else {
  509.     set line -1
  510.     }
  511.  
  512.     if { $cbb(debug) } { puts $line }
  513.  
  514.     return $line
  515. }
  516.  
  517.  
  518. proc listHiliteTrans index {
  519.     global cbb
  520.  
  521.     scan $index "%d.%d" line col
  522.  
  523.  
  524.     .trans.list tag remove sel 1.0 end
  525.     .trans.list tag remove cbbSel 1.0 end
  526.  
  527.     if { $line < 1 } {
  528.     set line 1
  529.     }
  530.  
  531.     if { [ expr $line / 2.0 ] != [ expr $line / 2] } {
  532.     set index1 $line
  533.     set index2 [ expr $line + 1 ]
  534.     } else {
  535.     set index1 [ expr $line - 1 ]
  536.     set index2 $line 
  537.     }
  538.     
  539.     .trans.list tag add cbbSel ${index1}.0 ${index2}.0lineend
  540.     .trans.list see ${index1}.0
  541.     .trans.list see ${index2}.0
  542. }    
  543.  
  544.  
  545. #------------------------------------------------------------------------------
  546. # Functions for entry area
  547. #------------------------------------------------------------------------------
  548.  
  549. proc update_globals result {
  550.     global cbb eng key date nicedate year month day check desc debit credit cat
  551.     global nicecat com cleared total 
  552.  
  553.     set date ""; set year ""; set month ""; set day ""; set check ""
  554.     set desc ""; set debit 0.00; set credit 0.00; set cat ""; set nicecat ""
  555.     set com ""; set cleared ""; set total 0.00
  556.  
  557.     set pieces [split $result "\t"]
  558.     set key [lindex $pieces 0]
  559.     set date [lindex $pieces 1]
  560.     if { [string length $date] == 6 } {
  561.     set year "$cbb(century)[string range $date 0 1]"
  562.     set month [string range $date 2 3]
  563.     set day [string range $date 4 5]
  564.     } else {
  565.     set year [string range $date 0 3]
  566.     set month [string range $date 4 5]
  567.     set day [string range $date 6 7]
  568.     }
  569.     if { $cbb(date_fmt) == 1 } {
  570.         set nicedate "$month/$day/[string range $year 2 3]"
  571.     } else {
  572.         set nicedate "$day.$month.[string range $year 2 3]"
  573.     }
  574.     set check [lindex $pieces 2]
  575.     set desc [lindex $pieces 3]
  576.     scan [lindex $pieces 4] "%f" debit
  577.     scan [lindex $pieces 5] "%f" credit
  578.     set debit [format "%.2f" $debit]; 
  579.     set credit [format "%.2f" $credit]; 
  580.     set cat [lindex $pieces 6]
  581.     if { [string range $cat 0 0] == "|" } {
  582.         set nicecat "-Splits-"
  583.     } else {
  584.         set nicecat $cat
  585.     }
  586.     set nicecat [string range $nicecat 0 8]
  587.     set com [lindex $pieces 7]
  588.     set cleared [lindex $pieces 8]
  589.     scan [lindex $pieces 9] "%f" total
  590. }
  591.  
  592.  
  593. # given a memorized transaction, update the relevant fields
  594. proc update_from_mem result {
  595.     global eng desc debit credit cat nicecat com 
  596.  
  597.     set desc ""; set debit 0.00; set credit 0.00; set cat ""; set nicecat ""
  598.     set com ""; 
  599.  
  600.     set pieces [split $result "\t"]
  601.     set desc [lindex $pieces 3]
  602.     scan [lindex $pieces 4] "%f" debit
  603.     scan [lindex $pieces 5] "%f" credit
  604.     set cat [lindex $pieces 6]
  605.     if { [string range $cat 0 0] == "|" } {
  606.         set nicecat "-Splits-"
  607.     } else {
  608.         set nicecat $cat
  609.     }
  610.     set nicecat [string range $nicecat 0 8]
  611.     set com [lindex $pieces 7]
  612.  
  613.     set debit [format "%.2f" $debit]; 
  614.     set credit [format "%.2f" $credit]; 
  615. }
  616.  
  617. proc find_index_from_key args {
  618.     global cbb
  619.     # given a newkey, return the index of the first affected transaction
  620.  
  621.     set arglist [split $args]
  622.     set cbb(index1) [lindex $arglist 0]
  623.     set newkey [lindex $arglist 1]
  624.  
  625.     if { $cbb(debug) } { puts "find: cbb(index1) = $cbb(index1)  newkey = $newkey" }
  626.  
  627.     if { [expr $cbb(index1) / 2.0] == [expr $cbb(index1) / 2] } {
  628.     set cbb(index1) [expr $cbb(index1) - 1]
  629.     }
  630.  
  631.     if { $cbb(index1) < 1 } {
  632.     set cbb(index1) 1
  633.     }
  634.  
  635.     set line [.trans.list get $cbb(index1).0 $cbb(index1).0lineend ]
  636.     set key [string range $line 72 end]
  637.  
  638.     if { $cbb(debug) } { puts "target = $newkey  current = $key" }
  639.  
  640.     if { [string compare "$newkey" "$key"] == -1 } {
  641.     # we changed the date to something previous
  642.     while { [expr [string compare "$newkey" "$key"] == -1 && $cbb(index1) > 0]} {
  643.         set cbb(index1) [expr $cbb(index1) - 2]
  644.         set line [.trans.list get $cbb(index1).0 $cbb(index1).0lineend ]
  645.             set key [string range $line 72 end]
  646.         if { $cbb(debug) } { puts "target = $newkey  current = $key" }
  647.     }
  648.     return [expr $cbb(index1)]
  649.     } else {
  650.     # we changed the date to something forward or this is the trivial case
  651.     return [expr $cbb(index1) - 2]
  652.     }
  653. }
  654.  
  655.  
  656. proc find_index_from_date date {
  657.     global cbb
  658.     # given a date in the form yyyymmdd, return the index of the transaction
  659.     # which is previous to the next higher date
  660.  
  661.     if { $cbb(debug) } { puts "find: date = $date" }
  662.  
  663.     set index [listGetSize]
  664.  
  665.     set line [.trans.list get ${index}.0 ${index}.0lineend ]
  666.     set linedate [string range $line 72 79]
  667.  
  668.     if { $cbb(debug) } { puts "target = $date  current = $linedate" }
  669.  
  670.     while { [expr [string compare "$date" "$linedate"] == -1 && $index > 0]} {
  671.     set index [expr $index - 2]
  672.     set line [.trans.list get ${index}.0 ${index}.0lineend ]
  673.     set linedate [string range $line 72 79]
  674.     if { $cbb(debug) } { puts "target = $date  current = $linedate" }
  675.     }
  676.  
  677.     return [expr $index]
  678. }
  679.  
  680.  
  681. proc update_rest args {
  682.     global cbb key eng date nicedate year month day check desc debit credit cat
  683.     global nicecat com cleared total
  684.  
  685.     set arglist [split $args]
  686.     set cbb(index1) [lindex $arglist 0]
  687.     set newkey [lindex $arglist 1]
  688.  
  689.     if { $cbb(debug) } { puts "update_rest: $cbb(index1) $newkey" }
  690.  
  691.     # save the current listbox view ...
  692.  
  693.     set yview_list [.trans.list yview]
  694.     if { $cbb(debug) } { puts "Saving current view: $yview_list" }
  695.     set yview_saved [lindex $yview_list 0]
  696.     if { $cbb(debug) } { puts $yview_saved }
  697.  
  698.     # delete everything from the change forward, then rebuild our list from 
  699.     # there
  700.  
  701.     set cbb(index1) [find_index_from_key $cbb(index1) $newkey]
  702.     if { [expr $cbb(index1) < 0] } {
  703.         set cbb(index1) 1
  704.     }
  705.     set cbb(index2) [expr $cbb(index1) + 1]
  706.  
  707.     if { $cbb(debug) } { puts "deleting from:  $cbb(index1).0 to end" }
  708.  
  709.     set line [.trans.list get $cbb(index1).0 $cbb(index1).0lineend ]
  710.     set key [string range $line 72 end]
  711.     .trans.list configure -state normal
  712.     .trans.list delete $cbb(index1).0 end
  713.     .trans.list configure -state disabled
  714.  
  715.     if { $cbb(debug) } { puts [string range $line 70 end] }
  716.     if { $cbb(debug) } { puts "adding entries from $key to end" }
  717.  
  718.     if { $cbb(index1) == 1 } {
  719.         puts $eng "first_trans"; flush $eng
  720.     } else {
  721.         puts $eng "find_trans $key"; flush $eng
  722.     .trans.list configure -state normal
  723.     .trans.list insert end "\n"
  724.     .trans.list configure -state disabled
  725.     }
  726.     .trans.list configure -state normal
  727.     gets $eng result
  728.     while { $result != "none" } {
  729.         update_globals $result
  730.  
  731.         set checklen [string length $check]
  732.         if { $checklen > 5 } {
  733.         set cutcheck [string range $check [expr $checklen - 5] end]
  734.         } else {
  735.         set cutcheck $check
  736.         }
  737.         set cutdesc [string range $desc 0 14]
  738.         set cutcom [string range $com 0 14]
  739.  
  740.     listAddTrans \
  741.         [format "%5s  %-8s  %-15s  %9.2f  %9.2f  %-1s  %9.2f %14s" \
  742.         $cutcheck $nicedate $cutdesc $debit $credit $cleared $total \
  743.         $key] \
  744.         [format "%5s  %-8s  %-15s  %-9s %39s" "" "" $cutcom $nicecat \
  745.         $key] 
  746.  
  747.         # try keep the selection with the original transaction
  748.         if { $key == $newkey } {
  749.             set cbb(selected) [expr [listGetSize] - 1]
  750.         listHiliteTrans $cbb(selected).0
  751.             set cbb(cur_date) $nicedate
  752.  
  753.         if { "$check" != "" } {                                        
  754.                 set cbb(next_chk) $check                                  
  755.             }
  756.          }
  757.  
  758.         puts $eng "next_trans"; flush $eng
  759.         gets $eng result
  760.     }
  761.     .trans.list configure -state disabled
  762.  
  763.     # now try to restore the current view ...
  764.  
  765.     .trans.list yview moveto $yview_saved
  766.     set temp [listGetCurTrans]
  767.     if { $temp >= 1 } {
  768.     .trans.list see ${temp}.0
  769.     } else {
  770.     .trans.list see 1.0
  771.     }
  772. }
  773.  
  774.  
  775. proc update_line args {
  776.     global cbb key eng date nicedate year month day check desc debit credit cat
  777.     global nicecat com cleared total
  778.  
  779.     set arglist [split $args]
  780.     set cbb(index1) [lindex $arglist 0]
  781.     set key [lindex $arglist 1]
  782.     set temp [listGetCurTrans]
  783.     if { $temp >= 1 } {
  784.     set cbb(selected) $temp
  785.     } else {
  786.     set cbb(selected) 1
  787.     }
  788.  
  789.     if { $cbb(debug) } { puts "update_line: $cbb(index1) $key" }
  790.  
  791.     # delete trans and re-insert
  792.  
  793.     set cbb(index2) [expr $cbb(index1) + 1]
  794.  
  795.     if { $cbb(debug) } { puts "deleting from:  $cbb(index1) to $cbb(index2)" }
  796.  
  797.     set line [.trans.list get $cbb(index1).0 $cbb(index1).0lineend ]
  798.     set key [string range $line 72 end]
  799.     .trans.list configure -state normal
  800.     .trans.list delete $cbb(index1).0 [expr $cbb(index2) + 1].0
  801.     .trans.list configure -state disabled
  802.  
  803.     if { $cbb(debug) } { puts "re-inserting entry" }
  804.  
  805.     puts $eng "find_trans $key"; flush $eng
  806.     gets $eng result
  807.  
  808.     update_globals $result
  809.  
  810.     set checklen [string length $check]
  811.     if { $checklen > 5 } {
  812.     set cutcheck [string range $check [expr $checklen - 5] end]
  813.     } else {
  814.     set cutcheck $check
  815.     }
  816.     set cutdesc [string range $desc 0 14]
  817.     set cutcom [string range $com 0 14]
  818.  
  819.     .trans.list configure -state normal
  820.     .trans.list insert $cbb(index1).0 \
  821.            [format "%5s  %-8s  %-15s  %9.2f  %9.2f  %-1s  %9.2f %14s\n" \
  822.            $cutcheck $nicedate $cutdesc $debit $credit $cleared $total \
  823.        $key] color1
  824.     .trans.list insert $cbb(index2).0 \
  825.            [format "%5s  %-8s  %-15s  %-9s %39s\n" "" "" $cutcom $nicecat \
  826.        $key] color2
  827.     .trans.list configure -state disabled
  828.  
  829.     listHiliteTrans $cbb(selected)
  830. }
  831.  
  832.  
  833. proc clear_entry_area {} {
  834.     global cbb key eng date nicedate year month day check desc debit credit cat
  835.     global nicecat com cleared total
  836.  
  837.     set key ""; set date ""; set year ""; set month ""; set day ""
  838.     set check ""; set desc ""; set debit 0.00; set credit 0.00; set cat ""
  839.     set nicecat ""; set com ""; set cleared ""; set total 0.00
  840.  
  841.     if { "$cbb(cur_date)" != "" } {
  842.         set nicedate $cbb(cur_date)
  843.     } else {
  844.         # set nicedate [fmtclock [getclock] "%m/%d/%y"]
  845.         puts $eng "nice_date $cbb(date_fmt)"; flush $eng
  846.         gets $eng nicedate
  847.     set cbb(cur_date) $nicedate
  848.     }
  849.     # set date [fmtclock [getclock] "%Y%m%d"]
  850.     puts $eng "raw_date"; flush $eng
  851.     gets $eng date
  852.  
  853.     # get internal sdate, if sdate is defined
  854.     if { $cbb(sdate) != "" } {
  855.     puts $eng "start_date $cbb(sdate)"; flush $eng
  856.     gets $eng cbb(int_sdate)
  857.     }
  858.  
  859.     if { $cbb(debug) } { puts $nicedate; puts $date }
  860.  
  861.     set cbb(no_more_mem) 0
  862.  
  863.     focus .entry.line1.check
  864. }
  865.  
  866.  
  867. proc update_entry_area lineindex {
  868.     global cbb key eng date nicedate year month day check desc debit credit cat
  869.     global nicecat com cleared total
  870.  
  871.     scan $lineindex "%d.%d" item col
  872.     set item [expr $item + 1]
  873.  
  874.     set cbb(no_more_mem) 1
  875.  
  876.     set cbb(selected) $item
  877.  
  878.     if { [expr $item / 2.0] == [expr $item / 2] } {
  879.     set cbb(index1) $item
  880.     set cbb(index2) [expr $item + 1]
  881.     } else {
  882.     set cbb(index1) [expr $item - 1]
  883.     set cbb(index2) $item
  884.     }
  885.  
  886.     set line [.trans.list get $cbb(index1).0 $cbb(index1).0lineend ] 
  887.     set key [string range $line 72 end]
  888.  
  889.     puts $eng "find_trans $key"; flush $eng
  890.     gets $eng result
  891.     if { $cbb(debug) } { puts $result }
  892.  
  893.     if { $result != "none" } {
  894.         update_globals $result
  895.     }
  896.  
  897.     # warn if about to edit a closed transaction
  898.     if { "$cleared" == "x" } {
  899.     cbbWindow.ok "You are about to edit a ``Closed'' transaction.  \
  900.         Hopefully you know what you are doing."
  901.     tkwait window .ok
  902.     }
  903.  
  904.     # warn if about to edit a transfer transaction
  905.     if { "[string range $cat 0 0]" == "\[" } {
  906.     cbbWindow.ok "Notice:  You are about to edit a ``Transfer'' transaction.  \
  907.         The corresponding transaction in the file ``$cat''  \
  908.         will also be updated."
  909.     tkwait window .ok
  910.     }
  911.  
  912.  
  913.     focus .entry.line1.check
  914. }
  915.  
  916.  
  917. proc done_entering {} {
  918.     global cbb yesno key eng date nicedate year month day check desc debit 
  919.     global credit cat nicecat com cleared total addcat
  920.  
  921.     if { $cbb(debug) } { puts "Done entering ..." }
  922.  
  923.     # check for a valid file
  924.     if { "$cbb(cur_file)" == "noname.cbb" } {
  925.     cbbWindow.ok "You must Make or Load an Account First."
  926.     tkwait window .ok
  927.     return
  928.     } elseif { "$cbb(cur_file)" == ""} {
  929.     cbbWindow.ok "You must Make or Load an Account First."
  930.     tkwait window .ok
  931.     return
  932.     }
  933.  
  934.     # we now have something to save
  935.     acctSetDirty
  936.  
  937.     # do some consistency checking here
  938.     if { "$desc" == "" } {
  939.     cbbWindow.yesno "You have not entered anything in the description \
  940.         field.  Would you like to continue?"
  941.     tkwait window .yesno
  942.     if { "$yesno(result)" != "yes" } {
  943.         return
  944.     }
  945.     }
  946.  
  947.     # pad date if needed
  948.     if { $cbb(date_fmt) == 1 } {
  949.     set pieces [split $nicedate /]
  950.         set month [lindex $pieces 0]
  951.         set day [lindex $pieces 1]
  952.     } else {
  953.      set pieces [split $nicedate .]
  954.     set day [lindex $pieces 0]
  955.         set month [lindex $pieces 1]
  956.     }
  957.  
  958.     if { [lindex $pieces 2] != "" } {
  959.     set year [lindex $pieces 2]
  960.     } else {
  961.     # get last entered year
  962.     set pieces [split $cbb(cur_date) /]
  963.     set year [lindex $pieces 2]
  964.     }
  965.     set month [pad $month]
  966.     set day [pad $day]
  967.     set year [pad $year]
  968.     if { [string length $year] == 2 } {
  969.     set year $cbb(century)$year
  970.     }
  971.     if { $cbb(date_fmt) == 1 } {
  972.         if { $cbb(debug) } { puts "$month/$day/$year" }
  973.         set nicedate "$month/$day/$year"
  974.     } else {
  975.         if { $cbb(debug) } { puts "$day.$month.$year" }
  976.         set nicedate "$day.$month.$year"
  977.     }
  978.  
  979.     if { "[string range $cat 0 0]" != "|" } {
  980.         # if not a split, try to match category
  981.         puts $eng "find_cat $cat"; flush $eng
  982.         gets $eng result
  983.         if { "$result" != "none" } {
  984.             set cat $result
  985.         } elseif { "$cat" == "" } {
  986.         cbbWindow.yesno "You have not entered anything in the category \
  987.             field.  Would you like to continue?"
  988.         tkwait window .yesno
  989.         if { "$yesno(result)" != "yes" } {
  990.             return
  991.         }
  992.     } else {
  993.         set addcat(cat) $cat
  994.         set addcat(mode) "missing"
  995.             cbbWindow.newcat
  996.             tkwait window .newcat
  997.         if { $cbb(debug) } { puts $addcat(result) }
  998.         if { "$addcat(result)" != "yes" } {
  999.         return
  1000.         }
  1001.         }
  1002.     }
  1003.  
  1004.     # verify cleared field
  1005.     set cleared [string range $cleared 0 0]
  1006.     if { "$cleared" == "x" } {
  1007.         # ok
  1008.     } elseif { "$cleared" == "*" } {
  1009.         # ok
  1010.     } elseif { "$cleared" == "?" } {
  1011.         # ok 
  1012.     } elseif { "$cleared" == "" } {
  1013.         # ok 
  1014.     } else {
  1015.         set cleared ""
  1016.     }
  1017.  
  1018.     if { "$key" == "" } {
  1019.         # new entry ... insert
  1020.     if { "[string range $cat 0 0]" == "\[" } {
  1021.         # transfer transaction
  1022.         puts $eng "create_xfer $year$month$day\t$check\t$desc\t$debit\t$credit\t$cat\t$com\t$cleared\t0.00"
  1023.     } else {
  1024.         # normal transaction
  1025.         puts $eng "create_trans $year$month$day\t$check\t$desc\t$debit\t$credit\t$cat\t$com\t$cleared\t0.00"
  1026.     }
  1027.         flush $eng
  1028.         gets $eng result
  1029.         if { $cbb(debug) } { puts "result:  create_trans $result" }
  1030.  
  1031.         if { "$result" == "error" } {
  1032.         cbbWindow.ok "Your transaction entry returned an error:  \
  1033.             '$result'.  If it was a transfer transaction, it probably \
  1034.             couldn't find the ``to'' account.  Things could \
  1035.             potentially be in an unsettled state.  You should \
  1036.             probably save everything and manually make sure things \
  1037.             are ok." 
  1038.         } else {
  1039.             undoRegister "insert $result"
  1040.         }
  1041.     update_rest [listGetSize] [string range $result 0 10]
  1042.     } else {
  1043.     if { [string length "$key"] != 11 } {
  1044.         # try to make sure we have a valid key
  1045.         cbbWindow.ok "Bad key value '$key'.  This transaction is aborted."
  1046.         tkwait window .ok
  1047.         set key ""
  1048.         return
  1049.     }
  1050.     if { [string first "-" "$key"] != 8 } {
  1051.         # try to make sure we have a valid key
  1052.         cbbWindow.ok "Bad key value '$key'.  This transaction is aborted."
  1053.         tkwait window .ok
  1054.         set key ""
  1055.         return
  1056.     }
  1057.  
  1058.     # if { "[string range $cat 0 0]" == "\[" } {
  1059.     #     cbbWindow.ok "You have edited a ``Transfer'' transaction.  The \
  1060.     #        corresponding transaction in the file ``$cat'' cannot \
  1061.     #        currently be changed.  You must do this manually."
  1062.     #     tkwait window .ok
  1063.     # }
  1064.  
  1065.         # first record the official version of this transaction so we can be
  1066.         # able to undelete it later
  1067.         puts $eng "find_trans $key"; flush $eng
  1068.         gets $eng origresult
  1069.  
  1070.         # updating an existing entry
  1071.     if { "[string range $cat 0 0]" == "\[" } {
  1072.         # transfer transaction
  1073.         puts $eng "update_xfer $key\t$year$month$day\t$check\t$desc\t$debit\t$credit\t$cat\t$com\t$cleared\t0.00"
  1074.     } else {
  1075.         puts $eng "update_trans $key\t$year$month$day\t$check\t$desc\t$debit\t$credit\t$cat\t$com\t$cleared\t0.00"
  1076.     }
  1077.         flush $eng
  1078.         gets $eng result
  1079.  
  1080.     if { "$cbb(index1)" == "" } {
  1081.         set cbb(index1) [listGetSize]
  1082.     }
  1083.     update_rest $cbb(index1) [string range $result 0 10]
  1084.         undoRegister "edit [string range $result 0 10]\t$origresult"
  1085.     }
  1086.  
  1087.     # try keep the entry area in sync with the selection
  1088.     goto $cbb(selected)
  1089.  
  1090.     clear_entry_area
  1091. }
  1092.  
  1093.  
  1094. proc delete_trans lineindex {
  1095.     global cbb yesno eng cat cleared
  1096.  
  1097.     scan $lineindex "%d.%d" item col
  1098.     # set item [expr $item - 1]
  1099.  
  1100.     acctSetDirty
  1101.  
  1102.     if { [expr $item / 2.0] != [expr $item / 2] } {
  1103.     set cbb(index1) $item
  1104.     set cbb(index2) [expr $item + 1]
  1105.     } else {
  1106.     set cbb(index1) [expr $item - 1]
  1107.     set cbb(index2) $item
  1108.     }
  1109.  
  1110.     set line [.trans.list get $cbb(index1).0 $cbb(index1).0lineend ]
  1111.     set key [string range $line 72 end]
  1112.  
  1113.     # first record the official version of this transaction so we can be
  1114.     # able to undelete it later
  1115.     puts $eng "find_trans $key"; flush $eng
  1116.     gets $eng result
  1117.     update_globals $result
  1118.     undoRegister "delete $result"
  1119.  
  1120.     if { "[string range $cat 0 0]" == "\[" } {
  1121.     cbbWindow.ok "Notice:  You are deleting a ``Transfer'' transaction.  \
  1122.         The corresponding transaction in the file ``$cat'' will \
  1123.         also be deleted."
  1124.     tkwait window .ok
  1125.     }
  1126.  
  1127.     if { "$cleared" == "x" } {
  1128.     cbbWindow.yesno "You are deleting a ``Closed'' transaction.  Continue \
  1129.         with delete?"
  1130.     tkwait window .yesno
  1131.     
  1132.     if { "$yesno(result)" == "yes" } {
  1133.     } elseif { "$yesno(result)" == "no" } {
  1134.         return
  1135.     } elseif { "$yesno(result)" == "cancel" } {
  1136.         return
  1137.     }
  1138.     }
  1139.  
  1140.     if { "[string range $cat 0 0]" == "\[" } {
  1141.     puts $eng "delete_xfer $key"; flush $eng
  1142.     } else {
  1143.     puts $eng "delete_trans $key"; flush $eng
  1144.     }
  1145.     gets $eng result
  1146.     if { $cbb(debug) } { puts "deleting:  $result" }
  1147.  
  1148.     update_rest $cbb(index1) $key
  1149.  
  1150.     goto $cbb(index1)
  1151.  
  1152.     clear_entry_area
  1153. }
  1154.  
  1155.  
  1156. #------------------------------------------------------------------------------
  1157. # Miscellaneous functions
  1158. #------------------------------------------------------------------------------
  1159.  
  1160. proc goto line {
  1161.     global cbb
  1162.  
  1163.     if { $cbb(debug) } { puts "Size = [listGetSize]  Goto = $line" }
  1164.  
  1165.     set max [expr [listGetSize] - 1]
  1166.     if { $line > $max } {
  1167.     set line $max
  1168.     }
  1169.  
  1170.     if { [expr $line / 2.0] == [expr $line / 2] } {
  1171.         set line [expr $line - 1]
  1172.     }
  1173.  
  1174. ### .trans.list see $line
  1175. ### .trans.list see [expr $line + 1]
  1176. ### .trans.list selection clear 0 end
  1177. ### .trans.list selection set $line $line
  1178.     listHiliteTrans $line
  1179. }
  1180.  
  1181.  
  1182. proc acctSetClean { } {
  1183.     global cbb
  1184.  
  1185.     set cbb(clean) 1
  1186.     if { [winfo exists .bar.save] } {
  1187.     .bar.save configure -text "Save"
  1188.     cbb_set_balloon .bar.save "Save the current file (file is clean)"
  1189.     }
  1190.  
  1191.     # update account listbox (if it exists)
  1192.     if { [winfo exists .acct.list] } {
  1193.         load_acct_listbox
  1194.     }
  1195. }
  1196.  
  1197.  
  1198. proc acctSetDirty { } {
  1199.     global cbb
  1200.     
  1201.     set cbb(clean) 0
  1202.     if { [winfo exists .bar.save] } {
  1203.     .bar.save configure -text "Save!"
  1204.     cbb_set_balloon .bar.save \
  1205.         "Save the current file (file has been changed)"
  1206.     }
  1207. }
  1208.  
  1209.  
  1210. proc acctIsDirty { } {
  1211.     global cbb
  1212.  
  1213.     return [expr 1 - $cbb(clean)]
  1214. }
  1215.  
  1216.  
  1217. # ----------------------------------------------------------------------------
  1218. # $Log: main.tcl,v $
  1219. # Revision 2.28  1998/08/14 14:28:40  curt
  1220. # Added desc-pie graph.
  1221. # Added option to eliminate splash screen.
  1222. # Other misc. tweaks and bug fixes.
  1223. #
  1224. # Revision 2.27  1997/06/12 21:53:14  curt
  1225. # Applied more patches from Martin Schenk <schenkm@ping.at>.  His changes
  1226. # greatly improved and developed the preferences menu so it is now actually
  1227. # usable to set preferences.
  1228. # Current data file is now saved in ~/.cbbcur.tcl
  1229. #
  1230. # Revision 2.26  1997/05/06 01:00:25  curt
  1231. # Added patches contributed by Martin Schenk <schenkm@ping.at>
  1232. # - Default to umask of 066 so .CBB files get created rw by owner only
  1233. # - Added support for pgp encrypting data files
  1234. # - Added support for displaying only recent parts of files (avoids
  1235. #   waiting to load in lots of old txns you don't currently need.)
  1236. # - Added a feature to "cache" whole accounts in the perl engine so
  1237. #   that switching between accounts can be faster.
  1238. # - The above options can be turned on/off via the preferrences menu.
  1239. #
  1240. # Revision 2.25  1997/04/12 01:15:26  curt
  1241. # Display current balance rather than ending balance in the account list
  1242. # box.  This makes a difference if you like to insert future transactions.
  1243. #
  1244. # Revision 2.24  1997/04/11 20:26:53  curt
  1245. # $index1, $index2 wrapped up so they are now $cbb(index1), and $cbb(index2)
  1246. #
  1247. # Revision 2.23  1997/04/04 22:50:20  curt
  1248. # Tweaked the previous fix.
  1249. #
  1250. # Revision 2.22  1997/04/04 18:44:48  curt
  1251. # Commented out some old menubar baggage.
  1252. # Fixed a harmless, but annoying bug that caused a pop up tk error message
  1253. # on occasion when manipulating the account list box.
  1254. #
  1255. # Revision 2.21  1997/04/03 03:54:49  curt
  1256. # Enable auto save without prompting when switching to a new account.
  1257. # Contributed by Jonathan I. Kamens <jik@kamens.brookline.ma.us>
  1258. #
  1259. # Revision 2.20  1997/04/03 03:42:20  curt
  1260. # Heading, line 2 color was hardcoded rather than honoring the header color
  1261. # variable.
  1262. #
  1263. # Revision 2.19  1997/03/04 03:22:39  curt
  1264. # Fixed bug which showed up when hitting '+' in a blank check # field after
  1265. # an account had been loaded, but before any transactions with a check number
  1266. # had been added.
  1267. #
  1268. # Revision 2.18  1997/02/19 18:08:06  curt
  1269. # Fixed a bug with long check numbers (> 5 char) in the balance window.
  1270. # Nailed a bug which caused cbb to forget the last check # entered when
  1271. # using +/- in the check number field.
  1272. #
  1273. # Revision 2.17  1997/01/28 03:25:24  curt
  1274. # Force strict scoping in all perl scripts.
  1275. #
  1276. # Revision 2.16  1997/01/16 19:15:42  curt
  1277. # Miscellaneous interface tweaks.
  1278. #
  1279. # Revision 2.15  1997/01/10 22:03:32  curt
  1280. # Transfer fixups and a few other misc. fixes contributed by
  1281. #   Lionel Mallet <Lionel.Mallet@sophia.inria.fr>
  1282. #
  1283. # Revision 2.14  1997/01/09 04:03:06  curt
  1284. # Allow user to specify colors of alternating transaction lines.
  1285. #
  1286. # Revision 2.13  1997/01/09 03:56:59  curt
  1287. # Added contrib script loan.pl.
  1288. # User sizable account list.
  1289. # Removed some old gnuplot baggage from install.pl.
  1290. #
  1291. # Revision 2.12  1997/01/02 04:38:36  curt
  1292. # Changes over the 1996 holidays:
  1293. #   - Converted listbox to text widget.  This allows us to do nice
  1294. #     things with alternating background colors, highliting, red
  1295. #     negative numbers, etc.
  1296. #   - Negative transactions are now drawn in red.
  1297. #   - Added a Goto <Today> option.
  1298. #   - <Home> & <End> were double bound.  Now, listbox can be traversed with
  1299. #     <Meta-Home> and <Meta-End>
  1300. #
  1301. # Revision 2.11  1996/12/17 20:15:44  curt
  1302. # Version incremented to 0.70.
  1303. # No longer save running total in .cbb files.
  1304. # Miscellaneous tweaks.
  1305. #
  1306. # Revision 2.10  1996/12/17 14:54:00  curt
  1307. # Updated copyright date.
  1308. #
  1309. # Revision 2.9  1996/12/16 04:18:21  curt
  1310. # Continuing the great overhaul of December 1996.
  1311. #
  1312. # Revision 2.8  1996/12/14 17:15:23  curt
  1313. # The great overhaul of December '96.
  1314. #
  1315. # Revision 2.7  1996/12/13 01:26:59  curt
  1316. # Worked on getting reports.tcl to work smoothly.
  1317. #
  1318. # Revision 2.6  1996/12/11 18:33:38  curt
  1319. # Ran a spell checker.
  1320. #
  1321. # Revision 2.5  1996/12/11 04:32:31  curt
  1322. # Several minor tweaks.
  1323. #
  1324. # Revision 2.4  1996/12/11 01:03:44  curt
  1325. # Added balloon help support.
  1326. #
  1327. # Revision 2.3  1996/12/09 14:38:23  curt
  1328. # Added "ok" and "cancel" buttons to entry area.  Tweaked check# and data +/-
  1329. # bindings.
  1330. #
  1331. # Revision 2.2  1996/12/08 07:40:01  curt
  1332. # Rearranged quite a bit of code.
  1333. # Put most global variables in cbb() structure.
  1334. #
  1335. # Revision 2.1  1996/12/07 20:38:16  curt
  1336. # Renamed *.tk -> *.tcl
  1337. #
  1338. # Revision 2.10  1996/10/03 04:49:00  curt
  1339. # Fixed an inconsistency in &raw_date() in common.pl (with how it was
  1340. # called.)
  1341. #
  1342. # Version now is 0.67-beta-x
  1343. #
  1344. # Revision 2.9  1996/10/03 03:57:37  curt
  1345. # Adjusted spacing of 2nd entry line so fields better align with the first.
  1346. #
  1347. # Revision 2.8  1996/10/02 19:37:20  curt
  1348. # Replaced instances of hardcoded century (19) with a variable.  We need to
  1349. # know the current century in cases where it is not provided and it is
  1350. # assumed to be the current century.  Someday I need to figure out how
  1351. # to determine the current century, but I have a couple of years to do it. :-)
  1352. #
  1353. # I still need to fix conf-reports and reports.pl
  1354. #
  1355. # Revision 2.7  1996/10/01 20:25:38  curt
  1356. # Added better handling of unknown category when trying to "commit" a
  1357. # transaction.
  1358. #
  1359. # Revision 2.6  1996/09/30 15:14:38  curt
  1360. # Updated CBB URL, and hardwired wish path.
  1361. #
  1362. # Revision 2.5  1996/09/25 17:45:42  curt
  1363. # Revamped tab completions in description and category fields.
  1364. # Fixed a problem with autohiliting.  When tabbing to a blank field, we used
  1365. # to leave the previous hilited field hilited.
  1366. #
  1367. # Revision 2.4  1996/08/29 14:22:33  curt
  1368. # <Meta-Tab> changed to <Control-Tab> in desc field.
  1369. #
  1370. # Revision 2.3  1996/07/13 02:57:49  curt
  1371. # Version 0.65
  1372. # Packing Changes
  1373. # Documenation changes
  1374. # Changes to handle a value in both debit and credit fields.
  1375. #
  1376. # Revision 2.2  1996/03/03  00:16:13  curt
  1377. # Modified Files:  cbb categories.pl wrapper.pl file.tk main.tk menu.tk
  1378. #   Added an account list at the bottom of the screen.  Thanks to:
  1379. #   Cengiz Alaettinoglu <cengiz@ISI.EDU> for this great addition.
  1380. #
  1381. # Revision 2.1  1996/02/27  05:35:48  curt
  1382. # Just stumbling around a bit with cvs ... :-(
  1383. #
  1384. # Revision 2.0  1996/02/27  04:43:01  curt
  1385. # Initial 2.0 revision.  (See "Log" files for old history.)
  1386.