#!/usr/local/bin/wish8.5 -f
#  'CBB' -- Check Book Balancer
#
#  menu.tcl -- menu management routines.
#
#  Written by Curtis Olson.  Started August 25, 1994.
#
#  Copyright (C) 1994 - 1997  Curtis L. Olson  - curt@sledge.mn.org
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# $Id: menu.tcl,v 2.15 1997/06/12 21:53:15 curt Exp $
# (Log is kept at end of this file)


proc setup_menubar m {
    global cbb

    menubutton $m.file -text "File" -underline 0 -menu $m.file.menu \
	    -takefocus 0
    menubutton $m.edit -text "Edit" -underline 1 -menu $m.edit.menu \
	    -takefocus 0
    menubutton $m.functions -text "Functions" -menu $m.functions.menu \
	    -takefocus 0
    menubutton $m.extern -text "External" -underline 1 -menu $m.extern.menu \
	    -takefocus 0
    if { $cbb(devel) == 1 } {
	menubutton $m.devel -text "Devel" -menu $m.devel.menu \
		-takefocus 0
    }
    menubutton $m.help -text "Help" -underline 0 -menu $m.help.menu \
	    -takefocus 0
    
    if { $cbb(devel) == 0 } {
	pack $m.file $m.edit $m.functions $m.extern -side left -ipadx 2
    } else {
	pack $m.file $m.edit $m.functions $m.extern $m.devel -side left -ipadx 2
    }
    pack $m.help -side right -ipadx 1
}


proc setup_file_menu m {
    set mf $m.file.menu

    if { [winfo exists $mf] } {
	destroy $mf
    }

    menu $mf -tearoff 0

    $mf add command -label "Make New Account ..." -underline 0 \
	    -command { acctNew }
    $mf add command -label "Load Account ..." -underline 0 \
    	    -command { acctLoad }
    $mf add command -label "Save Account" -underline 0 \
            -command { 
		if { $cbb(cur_file) != "noname.cbb" } {
		    acctSave
		} else {
		    acctSaveAs
		}
	    }
    .menubar.file.menu add command -label "Save Account As ..." -underline 5 \
            -command { acctSaveAs }

    $mf add separator

    $mf add command -label "Import QIF File ..." -underline 0 \
	    -command {
		set import_type 1
		acctImport
	    }
    $mf add command -label "Export QIF File" -underline 0 \
	    -command { acctExportQIF }

    $mf add separator

    $mf add cascade -label "Preferences" -underline 0 -menu $mf.prefs

    $mf add separator

    $mf add command -label "Quit" -underline 0 -command { cbbQuit }
    $mf entryconfig 10 -accelerator <Meta-Q>
    bind all <Meta-q> { cbbQuit }
    bind all <Alt-q> { cbbQuit }
}


proc setup_edit_menu m {
    set me $m.edit.menu

    menu $me -tearoff 0

    $me add command -label "Undo" -underline 0 -command { undoAction }
    $me entryconfig 0 -accelerator <Meta-U>
    bind all <Meta-u> { undoAction }
    bind all <Alt-u> { undoAction }

    $me add separator

    $me add command -label "New Transaction" \
	    -underline 0 -command { clear_entry_area }
    $me entryconfig 2 -accelerator <Meta-N>
    bind all <Meta-n> { clear_entry_area }
    bind all <Alt-n> { clear_entry_area }

    $me add command -label "Edit Transaction" -underline 0 \
	    -command { 
	if { [listGetCurTrans] >= 1 } {
	    update_entry_area [listGetCurTrans].0
	}
    }
    $me entryconfig 3 -accelerator <Meta-E>
    bind all <Meta-e> { 
	if { [listGetCurTrans] >= 1 } {
	    update_entry_area [listGetCurTrans].0
	}
    }
    bind all <Alt-e> { 
	if { [listGetCurTrans] >= 1 } {
	    update_entry_area [listGetCurTrans].0
	}
    }

    $me add command -label "Delete Transaction" -underline 0 \
	    -command { 
	if { "[.trans.list tag nextrange sel 1.0 end ]" != "" } {
	    delete_trans [.trans.list tag nextrange sel 1.0 end ]
	}
    }

    $me add separator

    $me add command -label "Open Category Splits ... " -underline 0 \
	    -command { 
	cbbWindow.splits
	tkwait window .splits
    }
    $me entryconfig 6 -accelerator <Meta-S>
    bind all <Meta-s> { 
	cbbWindow.splits
	tkwait window .splits
    }
    bind all <Alt-s> { 
	cbbWindow.splits
	tkwait window .splits
    }
}


proc setup_functions_menu m {
    global cbb

    set mf $m.functions.menu

    menu $mf -tearoff 0

    $mf add cascade -label "Goto" -underline 0 -menu $mf.goto

    $mf add separator

    $mf add command -label "Category List ..." \
	    -underline 0 -command { cbbWindow.catwin }
    $mf entryconfig 0 -accelerator <Meta-C>
    bind all <Meta-c> { cbbWindow.catwin }
    bind all <Alt-c> { cbbWindow.catwin }

    $mf add command -label "Add Default Categories" \
	    -underline 0 -command { catImportDefaults }

    $mf add separator

    $mf add command -label "Balance ..." -underline 0 -command { balance }

    $mf add separator

    $mf add command -label "Reports ..." -underline 0 -command { 
	set report(type) "report"
	set report(cur_file) $cbb(cur_file)
	set report(tmp_file) "/tmp/cbb-tmp-[pid].cbb"

	if { $cbb(debug) } { 
	    puts "Temp file is $report(tmp_file) -- saving ..."
	}
	# tell engine to save transactions
	puts $eng "auto_save_trans $report(tmp_file)"; flush $eng
	if { $cbb(debug) } { puts "No result should be returned." }

	cbbWindow.rep
    }

    $mf add command -label "Graphs ..." -underline 0 -command { 
	set report(type) "graph"
	set report(cur_file) $cbb(cur_file)
	set report(tmp_file) "/tmp/cbb-tmp-[pid].cbb"

	if { $cbb(debug) } { 
	    puts "Temp file is $report(tmp_file) -- saving ..."
	}
	# tell engine to save transactions
	puts $eng "auto_save_trans $report(tmp_file)"; flush $eng
	if { $cbb(debug) } { puts "No result should be returned." }

	cbbWindow.rep
    }
}


proc setup_extern_menu m {
    global lib_path

    set me $m.extern.menu

    menu $me -tearoff 0

    set filehandle [open "$lib_path/extern.conf" r]
    while { [gets $filehandle line] >= 0 } {
	if { "[string range $line 0 0]" == "-" } {
            $me add separator
	} elseif { "[string range $line 0 0]" == "#" } {
	    # ignore this line
	} elseif { [string length $line] < 3  } {
	    # ignore this line
        } else {
	    set pieces [split $line "\t"]
	    set name [lindex $pieces 0]
	    set prog [lindex $pieces 1]
            $me add command -label $name -command "launch_extern \"$prog\""
	}
    }
    close $filehandle
}


proc launch_extern { prog } {
    global report cbb eng

    if { $cbb(safe_mode) == 1 } {
        cbbWindow.ok "Cannot launch external scripts when running in 'safe' \
		mode." 
	tkwait window .ok
        return
    }

    set report(tmp_file) "/tmp/cbb-tmp-[pid].cbb"
    if { $cbb(debug) } { puts "Temp file is $report(tmp_file) -- saving ..." }
    # tell engine to save transactions
    puts $eng "auto_save_trans $report(tmp_file)"; flush $eng
    if { $cbb(debug) } { puts "No result should be returned." }

    regsub -all "%a" $prog $cbb(cur_file) prog
    regsub -all "%t" $prog $report(tmp_file) prog

    if { $cbb(debug) } { puts "exec $prog &" }
    eval exec $prog &
}


proc setup_devel_menu m {
    set mf $m.devel.menu

    if { [winfo exists $mf] } {
	destroy $mf
    }

    menu $mf -tearoff 0

    $mf add command -label "Re-source \"balance.tcl\""  \
	    -command {  source "$lib_path/balance.tcl" }
    $mf add command -label "Re-source \"bindings.tcl\""  \
	    -command {  source "$lib_path/bindings.tcl" }
    $mf add command -label "Re-source \"categories.tcl\""  \
	    -command {  source "$lib_path/categories.tcl" }
    $mf add command -label "Re-source \"common.tcl\""  \
	    -command {  source "$lib_path/common.tcl" }
    $mf add command -label "Re-source \"file.tcl\""  \
	    -command {  source "$lib_path/file.tcl" }
    $mf add command -label "Re-source \"filebox.tcl\""  \
	    -command {  source "$lib_path/filebox.tcl" }
    $mf add command -label "Re-source \"help.tcl\""  \
	    -command {  source "$lib_path/help.tcl" }
    $mf add command -label "Re-source \"init.tcl\""  \
	    -command {  source "$lib_path/init.tcl" }
    $mf add command -label "Re-source \"main.tcl\""  \
	    -command {  source "$lib_path/main.tcl" }
    $mf add command -label "Re-source \"menu.tcl\""  \
	    -command {  source "$lib_path/menu.tcl" }
    $mf add command -label "Re-source \"prefs.tcl\""  \
	    -command {  source "$lib_path/prefs.tcl" }
    $mf add command -label "Re-source \"reports.tcl\""  \
	    -command {  source "$lib_path/reports.tcl" }
    $mf add command -label "Re-source \"splits.tcl\""  \
	    -command {  source "$lib_path/splits.tcl" }
    $mf add command -label "Re-source \"undo.tcl\""  \
	    -command {  source "$lib_path/undo.tcl" }
}


proc setup_help_menu m {
    global cbb argv0 libpath

    set mh $m.help.menu
    menu $mh -tearoff 0

    $mh add command -label "About [file tail $argv0] ..." \
	    -underline 0 -command { cbbWindow.aboutwin [file tail $argv0] }

    $mh add separator

    $mh add command -label "Online HTML Manual ..." -underline 0 -command {
	if { $cbb(safe_mode) == 0 } {
	    if { $cbb(web_browser) == "netscape" } {
		# ... so they want to use nutscape ...
		if [catch {exec xwininfo -name "Netscape"} data] {
		    # no existing netscape running
		    exec $cbb(web_browser) $lib_path/docs/cbb-man/cbb-man.html &
		} else {
		    # A running copy of netscape exists
		    exec $cbb(web_browser) -remote \
			    openURL($lib_path/docs/cbb-man/cbb-man.html) &
		}
	    } elseif { $cbb(web_browser) == "lynx" } {
		exec xterm -sb -e $cbb(web_browser) \
			$lib_path/docs/cbb-man/cbb-man.html &
	    } else {
		exec $cbb(web_browser) $lib_path/docs/cbb-man/cbb-man.html &
	    }
	} else {
	    cbbWindow.ok "The online manual can be read from the CBB web page \
		    at: http://www.menet.umn.edu/~curt/cbb/"
	    tkwait window .ok
	}
    }

    $mh add command -label "Online Text Manual ..." -command { 
	cbbWindow.helpwin
    }
}


proc setup_file_prefs_menu m {
    set mfp $m.file.menu.prefs

    menu $mfp -tearoff 0

    $mfp add checkbutton -label "Use Memorized Transactions" \
	    -variable cbb(use_mems) -command {
	set cbb(pref_chg) 1
    }

    $mfp add checkbutton -label "Use Startdate" \
	    -variable cbb(use_sdate) -command {
	set cbb(pref_chg) 1
    }

    $mfp add checkbutton -label "Use Account Cache" \
	    -variable cbb(cache) -command {
	set cbb(pref_chg) 1

	puts $eng "cache $cbb(cache)"; flush $eng;
	gets $eng result;
    }

    $mfp add separator

    $mfp add command -label "Set Startdate ..." -command { 
	setStartDate
    }

    $mfp add separator

    $mfp add cascade -label "Appearence" -menu $mfp.appear

    $mfp add cascade -label "Cryptography" -menu $mfp.crypt

    $mfp add separator

    $mfp add command -label "Save Preferences" -command {
	cbbrcSave
    }

}

proc setup_prefs_appear_menu m {

    set mfpa $m.file.menu.prefs.appear

    menu $mfpa -tearoff 0

    $mfpa add checkbutton -label "Use Balloon Help" \
	    -variable cbb(balloon,on) -command {
	set cbb(pref_chg) 1
    }

    $mfpa add checkbutton -label "Use Auto Highlight" \
	    -variable cbb(auto_hilite) -command {
	set cbb(pref_chg) 1
	if { $cbb(auto_hilite) } {
		setup_auto_hilite
	} else {
		bind Entry <FocusIn> {}
		bind Entry <FocusOut> {}
	}
    }

    $mfpa add checkbutton -label "Use US Date Fmt" \
	-variable cbb(date_fmt) -onvalue 1 -offvalue 2 -command {
	set cbb(pref_chg) 1
    }

    $mfpa add separator

    $mfpa add command -label "Set Dimensions" -command {
	setDimensions
    }
}

proc setup_prefs_crypt_menu m {
    set mfpc $m.file.menu.prefs.crypt

    menu $mfpc -tearoff 0

    $mfpc add checkbutton -label "Use Cryptography" \
	    -variable cbb(use_crypt) -command {
	useCrypt
    }

    $mfpc add separator

    $mfpc add command -label "Set Cryptcode ..." -command {
	setCryptCode
    }

    $mfpc add command -label "Set Cryptprogram ..." -command {
	setCryptProgram
    }

}

proc setup_functions_goto_menu m {
    set mfg $m.functions.menu.goto

    menu $mfg -tearoff 0

    $mfg add command -label "Home" -underline 0 -command { goto 0 }
    $mfg entryconfig 0 -accelerator <Meta-Home>
    $mfg add command -label "Today" -underline 0 -command { 
	puts $eng "raw_date"; flush $eng
	gets $eng tmpdate
	goto [find_index_from_date $tmpdate] 
    }
    $mfg add command -label "End" -underline 0 -command { 
	goto [expr [listGetSize] - 1]
    }
    $mfg entryconfig 2 -accelerator <Meta-End>

    $mfg add separator

    $mfg add command -label "Page Up" -underline 5 \
     	    -command {
	goto [expr [.trans.list curselection] - ($cbb(list_height) - 4)]
    }
    $mfg entryconfig 4 -accelerator <Prior>
    $mfg add command -label "Page Down" -underline 5 \
     	    -command { 
	goto [expr [.trans.list curselection] + ($cbb(list_height) - 4)]
    }
    $mfg entryconfig 5 -accelerator <Next>

    $mfg add separator

    $mfg add command -label "Up" -underline 1 \
     	    -command {
	goto [expr [.trans.list curselection] - 2]
    }
    $mfg entryconfig 7 -accelerator <Up>
    $mfg add command -label "Down" -underline 1 \
     	    -command { 
	goto [expr [.trans.list curselection] + 2]
    }
    $mfg entryconfig 8 -accelerator <Down>
}


# ----------------------------------------------------------------------------
# $Log: menu.tcl,v $
# Revision 2.15  1997/06/12 21:53:15  curt
# Applied more patches from Martin Schenk <schenkm@ping.at>.  His changes
# greatly improved and developed the preferences menu so it is now actually
# usable to set preferences.
# Current data file is now saved in ~/.cbbcur.tcl
#
# Revision 2.14  1997/05/06 01:00:28  curt
# Added patches contributed by Martin Schenk <schenkm@ping.at>
# - Default to umask of 066 so .CBB files get created rw by owner only
# - Added support for pgp encrypting data files
# - Added support for displaying only recent parts of files (avoids
#   waiting to load in lots of old txns you don't currently need.)
# - Added a feature to "cache" whole accounts in the perl engine so
#   that switching between accounts can be faster.
# - The above options can be turned on/off via the preferrences menu.
#
# Revision 2.13  1997/04/23 18:10:02  curt
# Changed "clolson" -> "curt"
#
# Revision 2.12  1997/04/14 20:18:23  curt
# If browser is lynx, spawn in an xterm.
#
# Revision 2.11  1997/04/07 21:13:33  curt
# Add a $cbb(web_browser) variable which can be set from ~/.cbbrc.tcl
# If netscape is the browser, and there is a copy running, don't start
# a new copy.
#
# Revision 2.10  1997/01/02 04:38:38  curt
# Changes over the 1996 holidays:
#   - Converted listbox to text widget.  This allows us to do nice
#     things with alternating background colors, highliting, red
#     negative numbers, etc.
#   - Negative transactions are now drawn in red.
#   - Added a Goto <Today> option.
#   - <Home> & <End> were double bound.  Now, listbox can be traversed with
#     <Meta-Home> and <Meta-End>
#
# Revision 2.9  1996/12/17 14:54:01  curt
# Updated copyright date.
#
# Revision 2.8  1996/12/16 04:18:22  curt
# Continuing the great overhaul of December 1996.
#
# Revision 2.7  1996/12/14 17:15:25  curt
# The great overhaul of December '96.
#
# Revision 2.6  1996/12/13 01:27:00  curt
# Worked on getting reports.tcl to work smoothly.
#
# Revision 2.5  1996/12/13 00:12:45  curt
# Added reports.tcl
#
# Revision 2.4  1996/12/11 18:33:40  curt
# Ran a spell checker.
#
# Revision 2.3  1996/12/11 04:18:41  curt
# Removed the categories cascade menu and made the entries directly in the
# functions menu.
#
# Revision 2.2  1996/12/08 07:40:02  curt
# Rearranged quite a bit of code.
# Put most global variables in cbb() structure.
#
# Revision 2.1  1996/12/07 20:38:17  curt
# Renamed *.tk -> *.tcl
#
# Revision 2.6  1996/10/03 21:29:19  curt
# Added a devel menu to assist in development.  Many changes to the code
# can be re-sourced in without restarting the application.
#
# Revision 2.5  1996/09/30 15:14:39  curt
# Updated CBB URL, and hardwired wish path.
#
# Revision 2.4  1996/09/27 21:43:41  curt
# Added a text version of the manual to the Help menu.
#
# Revision 2.3  1996/07/13 02:57:51  curt
# Version 0.65
# Packing Changes
# Documenation changes
# Changes to handle a value in both debit and credit fields.
#
# Revision 2.2  1996/03/03  00:16:14  curt
# Modified Files:  cbb categories.pl wrapper.pl file.tk main.tk menu.tk
#   Added an account list at the bottom of the screen.  Thanks to:
#   Cengiz Alaettinoglu <cengiz@ISI.EDU> for this great addition.
#
# Revision 2.1  1996/02/27  05:35:49  curt
# Just stumbling around a bit with cvs ... :-(
#
# Revision 2.0  1996/02/27  04:43:04  curt
# Initial 2.0 revision.  (See "Log" files for old history.)
