# Sebastian Hammer, Adam Dickmeiss
#
# $Log: client.tcl,v $
-# Revision 1.40 1995-06-14 13:37:17 adam
+# Revision 1.45 1995-06-19 08:08:44 adam
+# client.tcl: hotTargets now contain both database and target name.
+# ir-tcl.c: setting protocol edited. Errors in callbacks are logged
+# by logf(LOG_WARN, ...) calls.
+#
+# Revision 1.44 1995/06/16 14:55:18 adam
+# Book logo mirrored.
+#
+# Revision 1.43 1995/06/16 14:41:05 adam
+# Scan line entries can be copied to a search entry.
+#
+# Revision 1.42 1995/06/16 12:28:13 adam
+# Implemented preferredRecordSyntax.
+# Minor changes in diagnostic handling.
+# Record list deleted when connection closes.
+#
+# Revision 1.41 1995/06/14 15:07:59 adam
+# Bug fix in cascade-target-list. Uses yaz-version.h.
+#
+# Revision 1.40 1995/06/14 13:37:17 adam
# Setting recordType implemented.
# Setting implementationVersion implemented.
# Settings implementationId / implementationName edited.
set libDir ""
-set profile(Default) {{} {} {210} {} 16384 8192 tcpip {} 1 {} {} z39v2}
+set profile(Default) {{} {} {210} {} 16384 8192 tcpip {} 1 {} {} Z39}
set hostid Default
set settingsChanged 0
set setNo 0
set lastSetNo 0
set cancelFlag 0
set searchEnable 0
+set scanEnable 0
set fullMarcSeq 0
set displayFormat 1
+set popupMarcdf 0
set textWrap word
set queryTypes {Simple}
{Subject {1=21}} {Any {1=1016}} } }
wm minsize . 0 0
+set setOffset 0
+set setMax 0
+
proc read-formats {} {
global displayFormats
set formats [glob -nocomplain formats/*.tcl]
proc set-display-format {f} {
global displayFormat
global setNo
+ global busy
set displayFormat $f
if {$setNo == 0} {
return
}
- .bot.a.status configure -text "Reformatting"
+ if {!$busy} {
+ .bot.a.status configure -text "Reformatting"
+ }
update idletasks
add-title-lines 0 10000 1
- .bot.a.status configure -text "Done"
+ if {!$busy} {
+ .bot.a.status configure -text "Ready"
+ }
}
proc initBindings {} {
set w Listbox
bind $w <B1-Motion> {}
bind $w <Shift-B1-Motion> {}
+
+ set w Entry
+}
+
+proc post-menu {wbutton wmenu} {
+ $wmenu activate none
+ focus $wmenu
+ $wmenu post [winfo rootx $wbutton] \
+ [expr [winfo rooty $wbutton]+[winfo height $wbutton]]
+
}
proc destroyGW {w} {
set cancelFlag 1
if {$busy} {
- show-status Cancelled 0 {}
+ show-status Canceling 0 {}
}
}
-proc show-target {target} {
- .bot.a.target configure -text "$target"
+proc show-target {target base} {
+ global profile
+
+ if {$target == ""} {
+ .bot.a.target configure -text ""
+ return
+ }
+ if {$base == ""} {
+ .bot.a.target configure -text "$target"
+ } else {
+ .bot.a.target configure -text "$target - $base"
+ }
}
proc show-logo {v1} {
global busy
if {$busy != 0} {
- incr v1 -1
- if {$v1==0} {
- set v1 9
+ incr v1
+ if {$v1==10} {
+ set v1 1
}
.bot.logo configure -bitmap @book${v1}
- after 140 [list show-logo $v1]
+ after 120 [list show-logo $v1]
return
}
while {1} {
proc show-status {status b sb} {
global busy
global searchEnable
+ global scanEnable
+ global setOffset
+ global setMax
.bot.a.status configure -text "$status"
if {$b == 1} {
if {$sb} {
.top.service configure -state normal
.mid.search configure -state normal
- .mid.scan configure -state normal
- .mid.present configure -state normal
+ if {$scanEnable} {
+ .mid.scan configure -state normal
+ }
+ if {$setOffset > 0 && $setOffset <= $setMax} {
+ .top.service.m enable 1
+ .mid.present configure -state normal
+ } else {
+ .top.service.m disable 1
+ }
if {[winfo exists .scan-window]} {
.scan-window.bot.2 configure -state normal
.scan-window.bot.4 configure -state normal
if {![winfo exists $w]} {
return
}
- incr n -1
- if {$n==0} {
- set n 9
+ incr n
+ if {$n==10} {
+ set n 1
}
$w.top.a.logo configure -bitmap @book$n
- after 140 [list about-origin-logo $n]
+ after 120 [list about-origin-logo $n]
}
proc about-origin {} {
set df $popupMarcdf
} else {
set w .full-marc
- if {[info exists popupMarcdf]} {
- set df $popupMarcdf
- } else {
- set popupMarcdf $df
- }
+ set df $popupMarcdf
}
if {[winfo exists $w]} {
set new 0
}
}
-proc update-target-hotlist {target} {
+proc update-target-hotlist {target base} {
global hotTargets
set len [llength $hotTargets]
if {$len > 0} {
.top.target.m delete 6 [expr 6+[llength $hotTargets]]
}
- set indx [lsearch $hotTargets $target]
- if {$indx >= 0} {
- set hotTargets [lreplace $hotTargets $indx $indx]
+ set i 0
+ foreach e $hotTargets {
+ if {$target == [lindex $e 0] && $base == [lindex $e 1]} {
+ set hotTargets [lreplace $hotTargets $i $i]
+ break
+ }
+ incr i
}
- set hotTargets [linsert $hotTargets 0 $target]
+ set hotTargets [linsert $hotTargets 0 [list $target $base]]
set-target-hotlist
}
global hotTargets
set i 1
- foreach target $hotTargets {
- .top.target.m add command -label "$i $target" -command \
+ foreach e $hotTargets {
+ set target [lindex $e 0]
+ set base [lindex $e 1]
+ if {$base == ""} {
+ .top.target.m add command -label "$i $target" -command \
[list reopen-target $target {}]
+ } else {
+ .top.target.m add command -label "$i $target - $base" -command \
+ [list reopen-target $target $base]
+ }
incr i
if {$i > 8} {
break
proc reopen-target {target base} {
close-target
open-target $target $base
- update-target-hotlist $target
+ update-target-hotlist $target $base
}
proc define-target-action {} {
if {$target == ""} {
return
}
- update-target-hotlist $target
foreach n [array names profile] {
if {$n == $target} {
protocol-setup $n
tkerror "Target connection closed or protocol error"
}
-proc connect-response {target} {
+proc connect-response {target base} {
puts "connect-response"
- show-target $target
+ show-target $target $base
init-request
}
z39 disconnect
z39 comstack [lindex $profile($target) 6]
+ z39 protocol [lindex $profile($target) 11]
z39 idAuthentication [lindex $profile($target) 3]
z39 maximumRecordSize [lindex $profile($target) 4]
z39 preferredMessageSize [lindex $profile($target) 5]
puts [z39 maximumRecordSize]
puts -nonewline "preferredMessageSize="
puts [z39 preferredMessageSize]
- show-status {Connecting} 0 0
+ show-status {Connecting} 1 0
if {$base == ""} {
z39 databaseNames [lindex [lindex $profile($target) 7] 0]
} else {
z39 databaseNames $base
}
z39 failback [list fail-response $target]
- z39 callback [list connect-response $target]
- z39 connect [lindex $profile($target) 1]:[lindex $profile($target) 2]
+ z39 callback [list connect-response $target $base]
+ set err [catch {
+ z39 connect [lindex $profile($target) 1]:[lindex $profile($target) 2]
+ } errorMessage]
+ if {$err} {
+ tkerror $errorMessage
+ show-status Ready 0 {}
+ return
+ }
# z39 options search present scan namedResultSets triggerResourceCtrl
- show-status {Connecting} 1 {}
set hostid $target
.top.target.m disable 0
.top.target.m enable 1
proc close-target {} {
global hostid
global cancelFlag
+ global setNo
set cancelFlag 0
+ set setNo 0
+ .bot.a.set configure -text ""
set hostid Default
z39 disconnect
- show-target {}
+ show-target {} {}
show-status {Not connected} 0 0
+ init-title-lines
show-message {}
.top.target.m disable 1
.top.target.m disable 2
proc init-response {} {
global cancelFlag
+ global scanEnable
if {$cancelFlag} {
close-target
return
}
- show-status {Ready} 0 1
if {![z39 initResult]} {
+ show-status {Ready} 0 1
set u [z39 userInformationField]
close-target
tkerror "Connection rejected by target: $u"
+ } else {
+ if {[lsearch [z39 options] scan] >= 0} {
+ set scanEnable 1
+ } else {
+ set scanEnable 0
+ }
+ show-status {Ready} 0 1
}
}
}
incr setNo
ir-set z39.$setNo z39
+ z39.$setNo preferredRecordSyntax SUTRS
if {[lindex $profile($target) 10] == 1} {
z39.$setNo setName $setNo
}
z39 callback {search-response}
z39.$setNo search $query
- show-status {Search} 1 0
+ show-status {Searching} 1 0
}
-proc scan-focus {w} {
- set oldFocus [focus]
- bind $w <Leave> [list focus $oldFocus]
- focus $w.top.entry
+proc scan-copy {y entry} {
+ set w .scan-window
+ set no [$w.top.list nearest $y]
+ puts "no=$no"
+ .lines.$entry.e delete 0 end
+ .lines.$entry.e insert 0 [string range [$w.top.list get $no] 8 end]
}
proc scan-request {} {
bind $w.top.list <Up> [list scan-up $attr]
bind $w.top.list <Down> [list scan-down $attr]
}
+ bind $w.top.list <Double-Button-1> [list scan-copy %y $curIndexEntry]
wm title $w "Scan $title"
-# bind $w.top <Any-Enter> [list scan-focus $w]
z39 callback [list scan-response $attr 0 35]
z39.scan numberOfTermsRequested 5
z39.scan preferredPositionInResponse 1
z39.scan scan "${attr} 0"
- show-status {Scan} 1 0
+ show-status {Scanning} 1 0
}
proc scan-term-h {attr} {
} else {
z39.scan scan "${attr} \{${scanTerm}\}"
}
- show-status {Scan} 1 0
+ show-status {Scanning} 1 0
}
proc scan-response {attr start toget} {
} else {
z39.scan scan "${attr} \{${scanTerm}\}"
}
- show-status {Scan} 1 0
+ show-status {Scanning} 1 0
return
}
set status [z39.scan scanStatus]
puts "down: $q"
z39.scan numberOfTermsRequested 10
z39.scan preferredPositionInResponse 1
- show-status {Scan} 1 0
+ show-status {Scanning} 1 0
puts "${attr} \{$q\}"
z39.scan scan "${attr} \{$q\}"
return
puts "up: $q"
z39.scan numberOfTermsRequested 10
z39.scan preferredPositionInResponse 11
- show-status {Scan} 1 0
+ show-status {Scanning} 1 0
z39.scan scan "${attr} \{$q\}"
return
}
puts "In search-response"
init-title-lines
- show-status {Ready} 0 1
set setMax [z39.$setNo resultCount]
show-message "${setMax} hits"
set l [format "%-4d %7d" $setNo $setMax]
.top.rset.m add command -label $l \
-command [list add-title-lines $setNo 10000 1]
if {$setMax <= 0} {
+ show-status {Ready} 0 1
set status [z39.$setNo responseStatus]
if {[lindex $status 0] == "NSD"} {
set code [lindex $status 1]
set setMax 20
}
set setOffset 1
+ show-status {Ready} 0 1
if {$cancelFlag} {
set cancelFlag 0
return
}
z39 callback {present-response}
z39.$setNo present $setOffset 1
- show-status {Retrieve} 1 0
+ show-status {Retrieving} 1 0
}
proc present-more {number} {
set toGet 3
}
z39.$setNo present $setOffset $toGet
- show-status {Retrieve} 1 0
+ show-status {Retrieving} 1 0
}
proc init-title-lines {} {
}
z39.$setNo present $setOffset $toGet
} else {
- show-status {Finished} 0 1
+ show-status {Ready} 0 1
}
}
proc protocol-setup-delete {target} {
global profile
+ global settingsChanged
- set a [alert "Are you you want to delete the target definition $target ?"]
+ set a [alert "Are you sure you want to delete the target \
+definition $target ?"]
if {$a} {
set wno [lindex $profile($target) 12]
set w .setup-${wno}
destroy $w
unset profile($target)
+ set settingsChanged 1
cascade-target-list
}
}
set wno [lindex $profile($target) 12]
set w .setup-${wno}
-
- foreach i [lsort -decreasing \
- [$w.top.databases.list curselection]] {
- $w.top.databases.list delete $i
+ set l {}
+ foreach i [$w.top.databases.list curselection] {
+ set b [$w.top.databases.list get $i]
+ set l "$l $b"
+ }
+ set a [alert "Are you sure you want to remove the database(s)${l}?"]
+ if {$a} {
+ foreach i [lsort -decreasing \
+ [$w.top.databases.list curselection]] {
+ $w.top.databases.list delete $i
+ }
}
}
set ResultSetCheck [lindex $profile($target) 10]
set protocolRadioType [lindex $profile($target) 11]
if {$protocolRadioType == ""} {
- set protocolRadioType z39v2
+ set protocolRadioType Z39
}
# Databases ....
label $w.top.protocol.label -text "Protocol"
radiobutton $w.top.protocol.z39v2 -text "Z39.50" -anchor w \
- -command {puts z39v2} -variable protocolRadioType -value z39v2
+ -command {puts Z39} -variable protocolRadioType -value Z39
radiobutton $w.top.protocol.sr -text "SR" -anchor w \
- -command {puts sr} -variable protocolRadioType -value sr
+ -command {puts sr} -variable protocolRadioType -value SR
pack $w.top.protocol.label $w.top.protocol.z39v2 $w.top.protocol.sr \
-padx 4 -side top -fill x
.top.target.m.clist delete 0 last
foreach n [array names profile] {
if {$n != "Default"} {
- set nl [string tolower $n]
+ set nl [lindex $profile($n) 12]
if {[llength [lindex $profile($n) 7]] > 1} {
.top.target.m.clist add cascade -label $n \
-menu .top.target.m.clist.$nl
global hotTargets
global textWrap
global displayFormat
+ global popupMarcdf
set windowGeometry(.) [wm geometry .]
puts $f "set hotTargets \{ $hotTargets \}"
puts $f "set textWrap $textWrap"
puts $f "set displayFormat $displayFormat"
+ puts $f "set popupMarcdf $popupMarcdf"
foreach n [array names windowGeometry] {
puts -nonewline $f "set \{windowGeometry($n)\} \{"
puts -nonewline $f $windowGeometry($n)
global settingsChanged
if {$settingsChanged} {
- set a [alert "you havent saved your settings. Do you wish to save?"]
+ set a [alert "you haven't saved your settings. Do you wish to save?"]
if {$a} {
save-settings
}
set newI [.query-add-index.top.index.entry get]
lappend queryInfoTmp [list $newI {}]
- $w.top.index insert end $newI
+ $w.top.index.list insert end $newI
destroy .query-add-index
#destroy $w.top.lines
#frame $w.top.lines -relief ridge -border 2
global queryInfo
global queryButtonsTmp
global queryInfoTmp
+ global queryButtonsFind
+ global queryInfoFind
+
global settingsChanged
set settingsChanged 1
$queryInfoTmp]
set queryButtons [lreplace $queryButtons $queryNo $queryNo \
$queryButtonsTmp]
+ set queryInfoFind $queryInfoTmp
+ set queryButtonsFind $queryButtonsTmp
+
destroy .query-setup
+ index-lines .lines 1 $queryButtonsFind $queryInfoFind activate-index
}
proc activate-e-index {value no i} {
foreach x $queryInfoTmp {
$w.top.index.list insert end [lindex $x 0]
}
- # Ok-cancel
+ # Bottom
bottom-buttons $w [list \
{Ok} [list query-setup-action $queryNo] \
{Add index} [list query-add-index $queryNo] \
if {$term != ""} {
set attr [lrange [lindex $queryInfoFind [lindex $b 1]] 1 end]
+ set len [string length $term]
+ incr len -1
+ set left 0
+ set right 0
+ if {[string index $term $len] == "?"} {
+ set right 1
+ set term [string range $term 0 [expr $len - 1]]
+ }
+ if {[string index $term 0] == "?"} {
+ set left 1
+ set term [string range $term 1 end]
+ }
set term "\{${term}\}"
+ if {$right && $left} {
+ set term "@attr 5=3 ${term}"
+ } elseif {$right} {
+ set term "@attr 5=1 ${term}"
+ } elseif {$left} {
+ set term "@attr 5=2 ${term}"
+ }
foreach a $attr {
set term "@attr $a ${term}"
}
pack .data -side top -fill both -expand yes
pack .bot -fill x
-menubutton .top.file -text "File" -underline 0 -menu .top.file.m
+menubutton .top.file -text "File" -menu .top.file.m
menu .top.file.m
.top.file.m add command -label "Save settings" -command {save-settings}
.top.file.m add separator
.top.file.m add command -label "Exit" -command {exit-action}
-menubutton .top.target -text "Target" -underline 0 -menu .top.target.m
+menubutton .top.target -text "Target" -menu .top.target.m
menu .top.target.m
.top.target.m add cascade -label "Connect" -menu .top.target.m.clist
.top.target.m add command -label "Disconnect" -command {close-target}
menu .top.target.m.slist
cascade-target-list
-menubutton .top.service -text "Service" -underline 0 -menu .top.service.m
+menubutton .top.service -text "Service" -menu .top.service.m
menu .top.service.m
.top.service.m add command -label "Database" -command {database-select}
.top.service.m add cascade -label "Present" -menu .top.service.m.present
.top.rset.m add command -label "Load" -command {load-set}
.top.rset.m add separator
-menubutton .top.options -text "Options" -underline 0 -menu .top.options.m
+menubutton .top.options -text "Options" -menu .top.options.m
menu .top.options.m
.top.options.m add cascade -label "Query" -menu .top.options.m.query
.top.options.m add cascade -label "Format" -menu .top.options.m.formats
pack .bot.a.status .bot.a.set .bot.a.message \
-side left -padx 2 -pady 2
-#bind . <Any-Enter> {focus .lines.0.e}
-
ir z39
-#.top.options.m.formats invoke $displayFormat
-
show-logo 1