+
+#---------- filtering ----------
+
+set filters {}
+
+#proc make-size-filter {minmax minmaxdesc} {
+# set n [llength $vc_codes]
+# $w configure
+
+# make-filter size${minmax} "$minmaxdesc size" scale \
+# [list \
+# -tickinterval 0 \
+# -variable filter_size{$minmax} \
+# -from 0 -to [expr {$n-1}] \
+# -resolution 1 \
+# -length [expr {$n*5}] \
+# ]
+
+
+proc filter-values/size {} { global vc_codes; return $vc_codes }
+proc filter-map/size {code} { upvar #0 vc_code2abbrev($code) abb; return $abb }
+proc filter-default/size {code} { return 1 }
+
+proc filter-values/lockown {} {
+ foreach lv {0 1 2} {
+ foreach ov {0 1 X} {
+ lappend vals "$lv$ov"
+ }
+ }
+ return $vals
+}
+proc filter-map/lockown {lockown} { return [code2abbrev-lock $lockown] }
+proc filter-default/lockown {lockown} {
+ return [regexp {^[01]|^2[^1]} $lockown]
+}
+
+proc filter-validate/xabbre {re} {
+ if {[catch {
+ regexp -- $re {}
+ } emsg]} {
+ regsub {^.*:\s*} $emsg {} emsg
+ regsub {^.*(.{30})$} $emsg {\1} emsg
+ return $emsg
+ }
+ return {}
+}
+
+proc filter-tickbox-flip {fil} {
+ upvar #0 filter_$fil vars
+ set values [filter-values/$fil]
+ foreach val $values {
+ set vars($val) [expr {!$vars($val)}]
+ }
+ refilter-needed
+}
+
+proc make-tickbox-filter {fil label rows inrow} {
+ upvar #0 filter_$fil vars
+ set fw [make-filter tickbox $fil $label frame]
+ set values [filter-values/$fil]
+ set nvalues [llength $values]
+ if {!$inrow} {
+ set inrow [expr {($nvalues + $rows) / $rows}]
+ }
+
+ for {set ix 0} {$ix < $nvalues} {incr ix} {
+ set val [lindex $values $ix]
+ set vars($val) [filter-default/$fil $val]
+ checkbutton $fw.$ix -variable filter_${fil}($val) \
+ -text [filter-map/$fil $val] -font fixed \
+ -command refilter-needed
+ grid configure $fw.$ix -sticky sw \
+ -row [expr {$ix / $inrow}] \
+ -column [expr {$ix % $inrow}]
+ }
+ button $fw.invert -text flip -command [list filter-tickbox-flip $fil] \
+ -padx 0 -pady 0
+ grid configure $fw.invert -sticky se \
+ -row [expr {$rows-1}] \
+ -column [expr {$inrow-1}]
+}
+
+proc entry-filter-changed {fw fil n1 n2 op} {
+ global errorInfo
+ upvar #0 filter_$fil realvar
+ upvar #0 filterentered_$fil entryvar
+ global def_background
+ debug "entry-filter-changed $fw $fil $entryvar"
+ if {[catch {
+ set error [filter-validate/$fil $entryvar]
+ if {[string length $error]} {
+ $fw.error configure -text $error -foreground white -background red
+ } else {
+ $fw.error configure -text { } -background $def_background
+ set realvar $entryvar
+ refilter-needed
+ }
+ } emsg]} {
+ puts stderr "FILTER CHECK ERROR $emsg $errorInfo"
+ }
+}
+
+proc make-entry-filter {fil label def} {
+ global filterentered_$fil
+ upvar #0 filter_$fil realvar
+ set realvar $def
+ set fw [make-filter entry $fil $label frame]
+ entry $fw.entry -textvariable filterentered_$fil
+ label $fw.error
+ glset def_background [$fw.error cget -background]
+ trace add variable filterentered_$fil write \
+ [list entry-filter-changed $fw $fil]
+ pack $fw.entry $fw.error -side top -anchor w
+}
+
+proc refilter-needed {} {
+ debug "REFILTER NEEDED"
+}
+
+proc make-filter {kind fil label ekind} {
+ global filters
+ label .filter.lab_$fil -text $label -justify left
+ $ekind .filter.$fil
+ lappend filters [list $kind $fil]
+ set nfilters [llength $filters]
+ grid configure .filter.lab_$fil -row $nfilters -column 0 -sticky nw -pady 4
+ grid configure .filter.$fil -row $nfilters -column 1 -sticky w -pady 3
+ return .filter.$fil
+}
+
+proc make-filters {} {
+ make-tickbox-filter size Size 2 0
+ make-tickbox-filter lockown "Lock/\nowner" 2 6
+ make-entry-filter xabbre "Flags\n regexp" {}
+}