1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
### history.tcl
### Text entry history functions for Scid.
### Copyright (C) 2004 Shane Hudson.
namespace eval ::utils::history {}
set ::utils::history::defaultListLength 10
array set ::utils::history::listLength {}
array set ::utils::history::comboboxWidget {}
if {! [info exists ::utils::history::listData]} {
array set ::utils::history::listData {}
}
# Load any history lists that were saved in the last session:
catch {source [scidConfigFile history]}
proc ::utils::history::SetList {key list} {
set ::utils::history::listData($key) $list
}
proc ::utils::history::GetList {key} {
variable listData
if {[info exists listData($key)]} {
return $listData($key)
}
return {}
}
# ::utils::history::AddEntry
#
# Inserts an entry at the top of the list of the specified key and
# ensures that only one copy of the entry exists in the list.
# The list is then pruned to the limit size is necessary.
#
proc ::utils::history::AddEntry {key entry} {
variable listData
# We do not add the empty string to a history list:
if {$entry == "" } {
return
}
if {[info exists listData($key)]} {
# Take out this entry if it exists, so it will not appear twice:
set index [lsearch -exact $listData($key) $entry]
if {$index == 0} {
# The entry is already at the start of the list; nothing to do
return
} elseif {$index > 0} {
set listData($key) [lreplace $listData($key) $index $index]
}
set listData($key) [linsert $listData($key) 0 $entry]
::utils::history::PruneList $key
} else {
set listData($key) [list $entry]
}
RefillCombobox $key
if { [llength [GetList $key]] > 0 } {
set cb [ GetCombobox $key ]
if { $cb != "" && [winfo exists $cb]} {
$cb current 0
}
}
}
proc ::utils::history::SetLimit {key length} {
set ::utils::history::listLength($key) $length
::utils::history::PruneList $key
}
proc ::utils::history::GetLimit {key} {
variable listLength
variable defaultListLength
if {[info exists ::utils::history::listLength($key)]} {
return $::utils::history::listLength($key)
}
return $defaultListLength
}
proc ::utils::history::PruneList {key {length -1}} {
variable listData
if {! [info exists listData($key)]} { return }
if {$length < 0} {
set length [::utils::history::GetLimit $key]
}
set listData($key) [lrange $listData($key) 0 [expr {$length - 1}]]
}
# ::utils::history::SetCombobox
#
# Returns the combobox widget associated with this history key.
#
proc ::utils::history::GetCombobox {key} {
variable comboboxWidget
if {[info exists comboboxWidget($key)]} {
return $comboboxWidget($key)
}
return ""
}
# ::utils::history::SetCombobox
#
# Associates the specified widget (which must be a megawidget created
# with ::combobox::combobox, see contrib/combobox.tcl) with the specifiec
# history key. Whenever the list for this history key is modified, the
# combobox widget will be updated.
#
proc ::utils::history::SetCombobox {key cbWidget} {
set ::utils::history::comboboxWidget($key) $cbWidget
RefillCombobox $key
}
# ::utils::history::SetCombobox
#
# Refills the history list of the combobox associated with the specified
# history key, if there is one.
#
proc ::utils::history::RefillCombobox {key} {
variable comboboxWidget
set cbWidget [GetCombobox $key]
if {$cbWidget == ""} { return }
# If the combobox widget is part of a dialog which is generated as needed,
# it may not exist right now:
if {! [winfo exists $cbWidget]} { return }
$cbWidget delete 0 end
set entries [GetList $key]
$cbWidget configure -values $entries
}
# ::utils::history::Save
# Saves the combobox history file, reporting any error in a message box
# if reportError is true.
#
proc ::utils::history::Save {{reportError 0}} {
variable listData
set f {}
set filename [scidConfigFile history]
if {[catch {open $filename w} f]} {
if {$reportError} {
tk_messageBox -title "Scid" -type ok -icon warning \
-message "Unable to write file: $filename\n$f"
}
return
}
puts $f "# Scid [sc_info version] combobox history lists"
puts $f ""
foreach i [lsort [array names listData]] {
puts $f "set ::utils::history::listData($i) [list $listData($i)]"
}
close $f
}
|