#   "glue.tcl" - part of "RAGMAAN, een anagrammengenerator" 
#
#            Copyright (C) 1999 Raymond Zandbergen
#
#
#    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.
#
#    The maintainer of this program is Raymond Zandbergen (ray@wirehub.nl)
#
#    ----------------------------------
#
#	all cmd_xxx procs are bound to buttons
#	all tr_xxx procs are variable traces
#				

proc	refresh_anagrams_view { } {

	global filter
	global use_filter
	global selection_idx
	global status_text
	global target
	global sort_results
	global reverse_results

	# perform the actual search!

	set nof_anagrams [rm_server_search $target]

	# filter and catch errors

	if {$use_filter} {
		if { [ catch {
		 set nof_filtered_anagrams [rm_server_filter $filter] 
		} regexp_error ] } {

			global status_text

			# strip leading message from server error

			set regexp_error [string range $regexp_error 16 1000]
			set status_text [concat ongeldige regexp: $regexp_error]
			tk_dialog .dlg "Oeps" $status_text error "" OK
			set use_filter 0
			return
		} else {
			set nof_anagrams $nof_filtered_anagrams
		}
	}

	rm_server_sort    $sort_results
	rm_server_reverse $reverse_results

	# fill listbox with placeholders

	rm_fill_listbox $nof_anagrams
	.f_searchlist.lb yview $selection_idx

	# update status bar message

	set status_text [ switch $nof_anagrams {

		0 {list geen woorden gevonden}
		1 {list 1 woord gevonden}
		default {list $nof_anagrams woorden gevonden}
	} ]

	# collect all user selections from history and build the result

	set acc_selections [rm_dump_stack selection]
	global root_target
	set rest [rm_subset_subtract $root_target $acc_selections]

	global acc_result
	if { $rest != "" } {
		if {$acc_selections != ""} {
			set acc_result [lappend acc_selections + \'${rest}\']
		}  else {
			set acc_result [list \' $rest \']
		}
	} else {
		set acc_result $acc_selections
	}
}

proc	cmd_select_anagram { idx } {

	global filter
	global target
	global use_filter
	global selection_idx
	global selection

	set selection_idx $idx
	set selection [lindex [.f_searchlist.lb get $idx] 1]

	# user selection in an empty listbox ?

	if { $selection == "" } return

	rm_push_state
	set selection_idx 0
	set use_filter 0
	set target [rm_subset_subtract $target $selection]
	refresh_anagrams_view
}

proc	cmd_up_tree { } {

	global filter
	global use_filter
	global selection_idx
	global selection
	global stack_depth

	if {$stack_depth == 0} return
	rm_pop_state
	refresh_anagrams_view
}

proc	cmd_search { new_target } {

	global root_target
	global last_root_target

	global filter
	global use_filter
	global selection_idx
	global selection
	global stack_depth
	global target

	set root_target $new_target
	set stack_depth 0
	set target [rm_trim $new_target]
	set use_filter 0
	set selection_idx 0
	set selection { }


	if { ![info exists last_root_target] } { set last_root_target "" }

	if {$root_target != "" } {

		if {$root_target != $last_root_target} {

			set last_root_target $root_target
			.f_kept.t insert end ${root_target}\:\n
		}
	}

	rm_server_cache_sync
	refresh_anagrams_view
}

proc	cmd_filter { } {

	global selection_idx

	set selection_idx 0
	refresh_anagrams_view
}

proc	get_database_file_name { } {

##############################################
#
# spawn a file selection dialog
#
##############################################

	global env
	global database

	if { $database != "" } {
		set default_location $database
	} else {
		set default_location $env(RM_DB_PATH)
	}

	if { [ file isdirectory $default_location ] == 0 } {
		set default_location [file dirname $default_location]
	}


	set open_file_types {

		{ {tekst}        {.txt } }
		{ {archief}      {.zip .gz} }
		{ {onbepaald}     *      }
	}

	set file_name [tk_getOpenFile \
		-filetypes $open_file_types \
		-initialdir $default_location \
		-title {woordenlijst-selectie} ]
	return $file_name
}

proc	cmd_query_and_load_database { } {

##############################################
#
# ask for a db_file & read it
#
# does not return until a valid file
# has been read
#
##############################################

        global database
        global status_text
	set may_exit 1

	while {1} {
		set temp [get_database_file_name]
		if { $temp == "" } {
			set status_text {geen bestand geselecteerd}
			if {$may_exit} {return}
			continue
		} elseif { 
			0 == [can_open $temp] } {
			set status_text [list kan $temp niet openen]
			tk_dialog .dlg "Oeps" $status_text error "" OK
			if {$may_exit} {return}
			continue
		}

		. configure -cursor watch
		set status_text [list bezig met laden '[file tail $temp]' ... ]
		update
		set db_load_error [catch {rm_server_load $temp}]
		. configure -cursor ""

		if { 1 == $db_load_error } {
			set status_text [list \
				$temp is geen geldige woordenlijst]
			tk_dialog .dlg "Oeps" $status_text error "" OK
			set may_exit 0
			continue
		} else {
			break
		}
	}
	set database $temp
	set status_text {klaar}
	write_db_file_name $database
	update
	.f_search.b invoke
}

proc can_open { file_name } {

##############################################
#
# returns 1 if $file_name can be opened
# for reading
#
##############################################

	if {0 == [catch { set id [ open $file_name ] } ] } {

		close $id
		return 1
	} else {
		return 0
	}
}

proc get_db_file_name { } {

##############################################
#
#  tries to obtain a db_file name
#
#  1) tries $HOME/.ragmaanrc
#  2) tries default location (defined in Makefile)
#  3) queries user
#
##############################################

	global env

	set rc_file [file join $env(HOME) .ragmaanrc ]
	
	if { [can_open $rc_file] } {

		set id [ open $rc_file ]
		set file_name [ gets $id ]
		close $id

		if { [can_open $file_name] } {

			return $file_name
		}
	}

	set last_resort $env(RM_DEFAULT_DATABASE)

	if { [can_open $last_resort] } {

		return $last_resort
	}

	while { 1 } {

		tk_dialog .dlg {Kies woordenlijst}  \
"Dit programma heeft een woordenlijst nodig.
Geef eerst een lijst op."  \
			 warning "" OK

		set file_name [get_database_file_name]

		if { $file_name != "" } {

			return $file_name
		}
	}
}

proc	write_db_file_name { file_name } {

##############################################
#
#  writes $file_name to $HOME/.ragmaanrc
#
##############################################

	global env

	set rc_file [file join $env(HOME) .ragmaanrc ]
	set id [ open $rc_file w ]
	puts $id $file_name
	close $id
}

proc	dump_text_widget {tw file_id} {

	set text_dump [$tw dump -text 1.0 end]
	foreach { dummy1 i dummy2 } $text_dump {

		puts -nonewline $file_id $i
	}
}

proc	cmd_save_results {} {

	global status_text
	global last_save_dir
	global unsaved_changes
	global save_file
	global env

	if { ![info exists last_save_dir] } { set last_save_dir $env(HOME) }

	set save_file_types {

		{ {tekst}        {.txt } }
		{ {onbepaald}    {*}     }
	}

	set file_name [tk_getSaveFile \
			-defaultextension .txt \
			-filetypes  $save_file_types \
			-initialfile $save_file \
			-initialdir $last_save_dir \
			-title {resultaten opslaan}]

	if {$file_name == ""} {
		set $status_text {geen bestand geselecteerd}
		return
	}

	if {0 == [catch { set id [ open $file_name w] } ] } {

		dump_text_widget .f_kept.t $id
		close $id
		set last_save_dir [file dirname $file_name]
		set save_file $file_name
		set unsaved_changes 0
		return
	}
	set status_text [list fout bij wegschrijven] 
	tk_dialog .dlg "Oeps" $status_text "" OK
}

proc	cmd_exit_ragmaan {} {

	global	unsaved_changes
	if { ![info exists unsaved_changes] } { set unsaved_changes 0}

	if {$unsaved_changes} {
		switch [ tk_dialog .dlg afsluiten  \
			{De resultaten zijn nog niet opgeslagen!} \
			warning \
			0 \
			opslaan terug afsluiten] {

			0	cmd_save_results;
			1	return
			2	{rm_server_destroy; exit}

		}
	} 
	switch [ tk_dialog .dlg afsluiten  \
		{Aflsuiten: zeker weten?} \
		warning \
		-1 \
		terug afsluiten] {

		0	return
		1	{rm_server_destroy; exit}
	}

}

proc	tr_unsaved_changes { d1 d2 d3 } {

	global	unsaved_changes
	global	save_file
	global	version

	set file_name [ file tail $save_file ]

	set title [list Ragmaan $version - $file_name]

	if {$unsaved_changes} {

		append title {  (niet opgeslagen)}
	}
	wm title . $title
}

proc	tr_stack_depth { d1 d2 d3 } {

	global stack_depth

	if { $stack_depth == 0 } {

		.f_buttons.up configure -state disabled
	} else {
		.f_buttons.up configure -state normal
	}
}

proc	do_popup { x y } {

	incr x 2
	incr y 2
	tk_popup .sort_popup $x $y 1
}

proc	cmd_keep { } {

	global unsaved_changes
	global acc_result

	.f_kept.t insert end ${acc_result}\n
	set unsaved_changes 1
}

proc	cmd_sort_length { } {

	global sort_results
	global selection_idx

	set sort_results 0
	set selection_idx 0
	refresh_anagrams_view
}

proc	cmd_sort_alpha { } {

	global sort_results
	global selection_idx

	set sort_results 1
	set selection_idx 0
	refresh_anagrams_view
}

proc	cmd_sort_reverse { } {

	global reverse_results
	global selection_idx

	if {$reverse_results} {
		set reverse_results 0
	} else {
		set reverse_results 1
	}
	set selection_idx 0
	refresh_anagrams_view
}
