Relational operators may be used in search entries - changes
[ir-tcl-moved-to-github.git] / client.tcl
index 21e1947..5059a97 100644 (file)
@@ -4,7 +4,34 @@
 # Sebastian Hammer, Adam Dickmeiss
 #
 # $Log: client.tcl,v $
-# Revision 1.63  1995-08-04 13:20:48  adam
+# Revision 1.71  1995-10-13 15:35:27  adam
+# Relational operators may be used in search entries - changes
+# in proc index-query.
+#
+# Revision 1.70  1995/10/12  14:46:52  adam
+# Better record popup windows. Next/prev buttons in popup record windows.
+# The record position in the raw format is much more visible.
+#
+# Revision 1.69  1995/09/21  13:42:54  adam
+# Bug fixes.
+#
+# Revision 1.68  1995/09/21  13:11:49  adam
+# Support of dynamic loading.
+# Test script uses load command if necessary.
+#
+# Revision 1.67  1995/09/20  14:35:19  adam
+# Minor changes.
+#
+# Revision 1.66  1995/08/29  15:30:13  adam
+# Work on GRS records.
+#
+# Revision 1.65  1995/08/24  15:39:09  adam
+# Minor changes.
+#
+# Revision 1.64  1995/08/24  15:33:02  adam
+# Minor changes.
+#
+# Revision 1.63  1995/08/04  13:20:48  adam
 # Buttons at the bottom are slightly smaller.
 #
 # Revision 1.62  1995/08/04  11:32:37  adam
 #
 
 if {$tk_version == "3.6"} {
-    set tk4 0
+    proc tk4 {} {
+        return 0
+    }
 } else {
-    set tk4 1
+    proc tk4 {} {
+        return 1
+    }
 }
 
-if {$tk4} {
+if {[tk4]} {
     proc configure-enable-e {w n} {
         incr n
         $w entryconfigure $n -state normal
@@ -250,7 +281,7 @@ if {$tk4} {
     set noFocus {}
 }
 
-if {! $tk4} {
+if {![tk4]} {
     if {[tk colormodel .] == "color"} {
         set monoFlag 0
     } else {
@@ -282,7 +313,6 @@ set setNo 0
 set setNoLast 0
 set cancelFlag 0
 set scanEnable 0
-set fullMarcSeq 0
 set displayFormat 1
 set popupMarcdf 0
 set textWrap word
@@ -321,7 +351,9 @@ proc tkerror err {
 proc read-formats {} {
     global displayFormats
     global libdir
-    set formats [glob -nocomplain ${libdir}/formats/*.tcl]
+    if {[catch {set formats [glob -nocomplain ${libdir}/formats/*.tcl]}]} {
+        set formats ./formats/raw.tcl
+    }
     foreach f $formats {
        if {[file readable $f]} {
             source $f
@@ -341,7 +373,6 @@ proc set-wrap {m} {
 }
 
 proc dputs {m} {
-   puts $m
 }
 
 proc set-display-format {f} {
@@ -435,11 +466,11 @@ proc top-down-window {w} {
 
 proc top-down-ok-cancel {w ok-action g} {
     frame $w.bot.left -relief sunken -border 1
-    pack $w.bot.left -side left -expand yes -ipadx 2 -ipady 2 -padx 4 -pady 4
-    button $w.bot.left.ok -width 5 -text {Ok} \
+    pack $w.bot.left -side left -expand yes -ipadx 2 -ipady 2 -padx 1 -pady 1
+    button $w.bot.left.ok -width 4 -text {Ok} \
             -command ${ok-action}
-    pack $w.bot.left.ok -expand yes -ipadx 2 -ipady 2 -padx 3 -pady 3
-    button $w.bot.cancel -width 6 -text {Cancel} \
+    pack $w.bot.left.ok -expand yes -ipadx 1 -ipady 1 -padx 2 -pady 2
+    button $w.bot.cancel -width 5 -text {Cancel} \
             -command [list destroy $w]
     pack $w.bot.cancel -side left -expand yes    
 
@@ -454,16 +485,16 @@ proc bottom-buttons {w buttonList g} {
     set l [llength $buttonList]
 
     frame $w.bot.$i -relief sunken -border 1
-    pack $w.bot.$i -side left -expand yes -padx 4 -pady 4
+    pack $w.bot.$i -side left -expand yes -padx 2 -pady 2
     button $w.bot.$i.ok -text [lindex $buttonList $i] \
             -command [lindex $buttonList [expr $i+1]]
-    pack $w.bot.$i.ok -expand yes -ipadx 2 -ipady 2 -padx 2 -pady 2 -side left
+    pack $w.bot.$i.ok -expand yes -padx 2 -pady 2 -side left
 
     incr i 2
     while {$i < $l} {
         button $w.bot.$i -text [lindex $buttonList $i] \
                 -command [lindex $buttonList [expr $i+1]]
-        pack $w.bot.$i -expand yes -ipadx 2 -ipady 2 -padx 2 -pady 2 -side left
+        pack $w.bot.$i -expand yes -padx 2 -pady 2 -side left
         incr i 2
     }
     if {$g} {
@@ -666,6 +697,7 @@ proc about-origin-logo {n} {
 proc about-origin {} {
     set w .about-origin-w
     global libdir
+    global tk_version
     
     if {[winfo exists $w]} {
         destroy $w
@@ -686,14 +718,17 @@ proc about-origin {} {
     label $w.top.a.logo -bitmap @${libdir}/bitmaps/book1 
     pack $w.top.a.irtcl $w.top.a.logo -side left -expand yes
 
-    set i [z39 implementationName]
+    set i unknown
+    catch {set i [z39 implementationName]}
     label $w.top.p.in -text "Implementation name: $i"
-    set i [z39 implementationId]
+    catch {set i [z39 implementationId]}
     label $w.top.p.ii -text "Implementation id: $i"
-    set i [z39 implementationVersion]
+    catch {set i [z39 implementationVersion]}
     label $w.top.p.iv -text "Implementation version: $i"
+    set i $tk_version
+    label $w.top.p.tk -text "Tk version: $i"
 
-    pack $w.top.p.in $w.top.p.ii $w.top.p.iv -side top -anchor nw
+    pack $w.top.p.in $w.top.p.ii $w.top.p.iv $w.top.p.tk -side top -anchor nw
 
     about-origin-logo 1
     bottom-buttons $w [list {Close} [list destroy $w] \
@@ -701,25 +736,21 @@ proc about-origin {} {
 }
 
 proc popup-marc {sno no b df} {
-    global fullMarcSeq
     global displayFormats
     global popupMarcdf
 
     if {[z39.$sno type $no] != "DB"} {
         return
     }
-    if {$b} {
-        set w .full-marc-$fullMarcSeq
-        incr fullMarcSeq
-        set df $popupMarcdf
-    } else {
-        set w .full-marc
-        set df $popupMarcdf
+    if {$b == -1} {
+        set b 0
+        while {[winfo exists .full-marc$b]} {
+            incr b
+        }
     }
-    if {[winfo exists $w]} {
-        set new 0
-    } else {
-
+    set df $popupMarcdf
+    set w .full-marc$b
+    if {![winfo exists $w]} {
         toplevelG $w
 
         wm minsize $w 0 0
@@ -743,47 +774,52 @@ proc popup-marc {sno no b df} {
             $w.top.record tag configure marc-id -foreground black
         }
         $w.top.record tag configure marc-data -foreground black
-        set new 1
-    }
-    $w.top.record delete 0.0 end
-    set recordType [z39.$sno recordType $no]
-    wm title $w "$recordType record #$no"
+        $w.top.record tag configure marc-head \
+                -font -Adobe-Times-Medium-R-Normal-*-180-* \
+                -background black -foreground white
 
-    if {$new} {
-        bind $w.top.record <Return> {destroy .full-marc}
-        
         pack $w.top.s -side right -fill y
         pack $w.top.record -expand yes -fill both
         
-        if {$b} {
-            bottom-buttons $w [list \
-                {Close} [list destroy $w]] 0
-        } else {
-            bottom-buttons $w [list \
-                    {Close} [list destroy $w] \
-                    {Duplicate} [list popup-marc $sno $no 1 0]] 0
-            menubutton $w.bot.formats -text "Format" -menu $w.bot.formats.m
-            menu $w.bot.formats.m
-            set i 0
-            foreach f $displayFormats {
-                $w.bot.formats.m add radiobutton -label $f \
-                        -variable popupMarcdf -value $i \
-                        -command [list display-$f $sno $no $w.top.record 0]
-                incr i
-            }
-            pack $w.bot.formats -expand yes -ipadx 2 -ipady 2 \
-                    -padx 3 -pady 3 -side left
-        }
+        bottom-buttons $w [list \
+                {Close} [list destroy $w] \
+                {Prev} {} \
+                {Next} {} \
+                {Duplicate} {}] 0
+        menubutton $w.bot.formats -text "Format" -menu $w.bot.formats.m \
+                -relief raised
+        menu $w.bot.formats.m
+        pack $w.bot.formats -expand yes -ipadx 2 -ipady 2 \
+                -padx 3 -pady 3 -side left
     } else {
-        set i 0
         $w.bot.formats.m delete 0 last
-        foreach f $displayFormats {
-            $w.bot.formats.m add radiobutton -label $f \
-                    -variable popupMarcdf -value $i \
-                    -command [list display-$f $sno $no $w.top.record 0]
-            incr i
-        }
     }
+    set i 0
+    foreach f $displayFormats {
+        $w.bot.formats.m add radiobutton -label $f \
+                -variable popupMarcdf -value $i \
+                -command [list popup-marc $sno $no $b 0]
+        incr i
+    }
+    $w.top.record delete 0.0 end
+    set recordType [z39.$sno recordType $no]
+    wm title $w "$recordType record #$no"
+
+    $w.bot.2 configure -command \
+            [list popup-marc $sno [expr $no-1] $b $df]
+    $w.bot.4 configure -command \
+            [list popup-marc $sno [expr $no+1] $b $df]
+    if {$no == 1} {
+        $w.bot.2 configure -state disabled
+    } else {
+        $w.bot.2 configure -state normal
+    }
+    if {[z39.$sno type [expr $no+1]] != "DB"} {
+        $w.bot.4 configure -state disabled
+    } else {
+        $w.bot.4 configure -state normal
+    }
+    $w.bot.6 configure -command [list popup-marc $sno $no -1 0]
     set ffunc [lindex $displayFormats $df]
     set ffunc "display-$ffunc"
 
@@ -822,10 +858,9 @@ proc delete-target-hotlist {target} {
 
 proc set-target-hotlist {olen} {
     global hotTargets
-    global tk4
    
     if {$olen > 0} {
-        if {$tk4} {
+        if {[tk4]} {
             .top.target.m delete 7 [expr 7+$olen]
         } else {
             .top.target.m delete 6 [expr 6+$olen]
@@ -932,7 +967,6 @@ proc close-target {} {
     global cancelFlag
     global setNo
     global setNoLast
-    global tk4
 
     set cancelFlag 0
     set setNo 0
@@ -946,7 +980,7 @@ proc close-target {} {
     show-message {}
     configure-disable-e .top.target.m 1
     configure-disable-e .top.target.m 2
-    if {$tk4} {
+    if {[tk4]} {
         .top.rset.m delete 2 last
     } else {
         .top.rset.m delete 1 last
@@ -1467,10 +1501,6 @@ proc init-title-lines {} {
     .data.record delete 0.0 end
 }
 
-proc title-press {y setno} {
-    show-full-marc $setno [expr 1 + [.data.list nearest $y]] 0
-}
-
 proc add-title-lines {setno no offset} {
     global displayFormats
     global displayFormat
@@ -1567,12 +1597,11 @@ proc right-cursor {w} {
 }
 
 proc bind-fields {list returnAction escapeAction} {
-    global tk4
     set max [expr [llength $list]-1]
     for {set i 0} {$i < $max} {incr i} {
         bind [lindex $list $i] <Return> $returnAction
         bind [lindex $list $i] <Escape> $escapeAction
-        if {!$tk4} {
+        if {![tk4]} {
             bind [lindex $list $i] <Tab> \
                     [list focus [lindex $list [expr $i+1]]]
             bind [lindex $list $i] <Left> \
@@ -1583,7 +1612,7 @@ proc bind-fields {list returnAction escapeAction} {
     }
     bind [lindex $list $i] <Return> $returnAction
     bind [lindex $list $i] <Escape> $escapeAction
-    if {!$tk4} {
+    if {![tk4]} {
         bind [lindex $list $i] <Tab>  [list focus [lindex $list 0]]
         bind [lindex $list $i] <Left> [list left-cursor [lindex $list $i]]
         bind [lindex $list $i] <Right> [list right-cursor [lindex $list $i]]
@@ -1809,19 +1838,18 @@ proc protocol-setup {target} {
     }
 
     # Databases ....
-    pack $w.top.databases -side left -pady 4 -padx 4 -expand yes -fill both
+    pack $w.top.databases -side left -pady 2 -padx 2 -expand yes -fill both
 
     label $w.top.databases.label -text "Databases"
     button $w.top.databases.add -text "Add" \
             -command [list add-database $target]
     button $w.top.databases.delete -text "Delete" \
             -command [list delete-database $target]
-    global tk4
-    if {! $tk4} {
-        listbox $w.top.databases.list -geometry 20x6 \
+    if {! [tk4]} {
+        listbox $w.top.databases.list -geometry 14x6 \
                 -yscrollcommand "$w.top.databases.scroll set"
     } else {
-        listbox $w.top.databases.list -width 20 \
+        listbox $w.top.databases.list -width 14 -height 5\
                 -yscrollcommand "$w.top.databases.scroll set"
     }
     scrollbar $w.top.databases.scroll -orient vertical -border 1
@@ -1840,7 +1868,7 @@ proc protocol-setup {target} {
     }
 
     # Transport ...
-    pack $w.top.cs-type -pady 4 -padx 4 -side top -fill x
+    pack $w.top.cs-type -pady 2 -padx 2 -side top -fill x
     
     label $w.top.cs-type.label -text "Transport" 
     radiobutton $w.top.cs-type.tcpip -text "TCP/IP" -anchor w \
@@ -1849,10 +1877,10 @@ proc protocol-setup {target} {
             -variable csRadioType -value mosi
     
     pack $w.top.cs-type.label $w.top.cs-type.tcpip $w.top.cs-type.mosi \
-            -padx 4 -side top -fill x
+            -padx 2 -side top -fill x
 
     # Protocol ...
-    pack $w.top.protocol -pady 4 -padx 4 -side top -fill x
+    pack $w.top.protocol -pady 2 -padx 2 -side top -fill x
     
     label $w.top.protocol.label -text "Protocol" 
     radiobutton $w.top.protocol.z39v2 -text "Z39.50" -anchor w \
@@ -1861,10 +1889,10 @@ proc protocol-setup {target} {
             -variable protocolRadioType -value SR
     
     pack $w.top.protocol.label $w.top.protocol.z39v2 $w.top.protocol.sr \
-            -padx 4 -side top -fill x
+            -padx 2 -side top -fill x
 
     # Query ...
-    pack $w.top.query -pady 4 -padx 4 -side top -fill x
+    pack $w.top.query -pady 2 -padx 2 -side top -fill x
 
     label $w.top.query.label -text "Query support"
     checkbutton $w.top.query.c1 -text "RPN query" -anchor w -variable RPNCheck
@@ -1873,7 +1901,7 @@ proc protocol-setup {target} {
 
     pack $w.top.query.label -side top 
     pack $w.top.query.c1 $w.top.query.c2 $w.top.query.c3 \
-            -padx 4 -side top -fill x
+            -padx 2 -side top -fill x
 
     # Ok-cancel
     bottom-buttons $w [list {Ok} [list protocol-setup-action $target] \
@@ -2072,8 +2100,9 @@ proc save-geometry {} {
     
     set windowGeometry(.) [wm geometry .]
 
-    set f [open "~/.clientrc.tcl" w]
-
+    if {[catch {set f [open ~/.clientrc.tcl w]}]} {
+        return
+    } 
     puts $f "set hotTargets \{ $hotTargets \}"
     puts $f "set textWrap $textWrap"
     puts $f "set displayFormat $displayFormat"
@@ -2458,7 +2487,6 @@ proc use-attr {init} {
         {Content type}                 1034 
         {Anywhere}                     1035 
     }
-    global tk4
     set w .index-setup
     global useTmpValue
     set l [llength $attr]
@@ -2474,7 +2502,7 @@ proc use-attr {init} {
             }
             incr lno
         }
-        if {$tk4} {
+        if {[tk4]} {
             $w.top.use.list selection clear 0 end
             $w.top.use.list selection set $s $s
         } else {
@@ -2542,7 +2570,6 @@ proc index-setup {attr queryNo indexNo} {
     global completenessTmpValue
     global positionTmpValue
     global useTmpValue
-    global tk4
     set relationTmpValue 0
     set truncationTmpValue 0
     set structureTmpValue 0
@@ -2597,7 +2624,7 @@ proc index-setup {attr queryNo indexNo} {
     pack $w.top.use -side left -pady 6 -padx 6 -fill y
 
     label $w.top.use.label -text "Use"
-    if {$tk4} {
+    if {[tk4]} {
         listbox $w.top.use.list -width 26 \
                 -yscrollcommand "$w.top.use.scroll set"
     } else {
@@ -2693,7 +2720,6 @@ proc query-setup {queryNo} {
     global queryButtonsTmp
     global queryInfoTmp
     global queryIndexTmp
-    global tk4
     
     set queryIndexTmp 0
     set queryName [lindex $queryTypes $queryNo]
@@ -2736,7 +2762,7 @@ proc query-setup {queryNo} {
     pack $w.top.index.list -side left -fill both -expand yes -padx 2 -pady 2
     pack $w.top.index.scroll -side right -fill y -padx 2 -pady 2
 
-    if {$tk4} {
+    if {[tk4]} {
         $w.top.index.list selection clear 0 end
         $w.top.index.list selection set 0 0
     } else {
@@ -2778,6 +2804,32 @@ proc index-query {} {
         if {$term != ""} {
             set attr [lrange [lindex $queryInfoFind [lindex $b 1]] 1 end]
 
+            set relation ""
+            set len [string length $term]
+            incr len -1
+
+            if {$len > 1} {
+                if {[string index $term 0] == ">"} {
+                    if {[string index $term 1] == "=" } {
+                        set term [string trim [string range $term 2 $len]]
+                        set relation 4
+                    } else {
+                        set term [string trim [string range $term 1 $len]]
+                        set relation 5
+                    }
+                } elseif {[string index $term 0] == "<"} {
+                    if {[string index $term 1] == "=" } {
+                        set term [string trim [string range $term 2 $len]]
+                        set relation 2
+                    } elseif {[string index $term 1] == ">"} {
+                        set term [string trim [string range $term 2 $len]]
+                        set relation 6
+                    } else {
+                        set term [string trim [string range $term 1 $len]]
+                        set relation 1
+                    }
+                }
+            } 
             set len [string length $term]
             incr len -1
             set left 0
@@ -2798,6 +2850,9 @@ proc index-query {} {
             } elseif {$left} {
                 set term "@attr 5=2 ${term}"
             }
+            if {$relation != ""} {
+                set term "@attr 2=${relation} ${term}"
+            }
             foreach a $attr {
                 set term "@attr $a ${term}"
             }
@@ -2815,20 +2870,18 @@ proc index-query {} {
 
 proc index-focus-in {w i} {
     global curIndexEntry
-    global tk4
 
-    if {! $tk4} {
+    if {! [tk4]} {
         $w.$i configure -background red
     }
     set curIndexEntry $i
 }
 
 proc index-lines {w realOp buttonInfo queryInfo handle} {
-    global tk4
     set i 0
     foreach b $buttonInfo {
         if {! [winfo exists $w.$i]} {
-            if {$tk4} {
+            if {[tk4]} {
                 frame $w.$i -border 0
             } else {
                 frame $w.$i -background white -border 1
@@ -2845,7 +2898,7 @@ proc index-lines {w realOp buttonInfo queryInfo handle} {
                 pack $w.$i.l -side left
                 pack $w.$i.e -side left -fill x -expand yes
                 pack $w.$i -side top -fill x -padx 2 -pady 2
-                if {!$tk4} {
+                if {![tk4]} {
                     bind $w.$i.e <Left> [list left-cursor $w.$i.e]
                     bind $w.$i.e <Right> [list right-cursor $w.$i.e]
                 }
@@ -2865,7 +2918,7 @@ proc index-lines {w realOp buttonInfo queryInfo handle} {
     if {! $realOp} {
         return
     }
-    if {! $tk4} {
+    if {! [tk4]} {
         set j 0
         incr i -1
         while {$j < $i} {
@@ -2875,7 +2928,7 @@ proc index-lines {w realOp buttonInfo queryInfo handle} {
         }
     }
     if {$i >= 0} {
-        if {! $tk4} {
+        if {! [tk4]} {
             bind $w.$i.e <Tab> "focus $w.0.e"
         }
         focus $w.0.e
@@ -3035,6 +3088,9 @@ menu .top.options.m.syntax
 .top.options.m.syntax add separator
 .top.options.m.syntax add radiobutton -label "SUTRS" \
         -value SUTRS -variable recordSyntax
+.top.options.m.syntax add separator
+.top.options.m.syntax add radiobutton -label "GRS1" \
+        -value GRS1 -variable recordSyntax
 
 menubutton .top.help -text "Help" -menu .top.help.m
 menu .top.help.m
@@ -3048,21 +3104,21 @@ pack .top.help -side right
 
 index-lines .lines 1 $queryButtonsFind [lindex $queryInfo 0] activate-index
 
-button .mid.search -width 7 -text {Search} -command {search-request 0} \
+button .mid.search -text Search -command {search-request 0} \
         -state disabled
-button .mid.scan -width 7 -text {Scan} \
+button .mid.scan -text Scan \
         -command scan-request -state disabled 
-button .mid.present -width 7 -text {Present} -command [list present-more 10] \
+button .mid.present -text {Present} -command [list present-more 10] \
         -state disabled
 
-button .mid.clear -width 7 -text {Clear} -command index-clear
+button .mid.clear -text Clear -command index-clear
 pack .mid.search .mid.scan .mid.present .mid.clear -side left \
-        -fill y -padx 5 -pady 3
+        -fill y -pady 1
 
 text .data.record -height 2 -width 20 -wrap none \
         -yscrollcommand [list .data.scroll set] -wrap $textWrap
 scrollbar .data.scroll -command [list .data.record yview]
-if {$tk4} {
+if {[tk4]} {
     .data.record configure -takefocus 0
     .data.scroll configure -takefocus 0
 }
@@ -3078,14 +3134,17 @@ if {! $monoFlag} {
     .data.record tag configure marc-id -foreground black
 }
 .data.record tag configure marc-data -foreground black
+.data.record tag configure marc-head \
+        -font -Adobe-Times-Medium-R-Normal-*-180-* \
+        -foreground white -background black
 
-button .bot.logo  -bitmap @${libdir}/bitmaps/book1 -command cancel-operation
-if {$tk4} {
+button .bot.logo -bitmap @${libdir}/bitmaps/book1 -command cancel-operation
+if {[tk4]} {
     .bot.logo configure -takefocus 0
 }
 frame .bot.a
 pack .bot.a -side left -fill x
-pack .bot.logo -side right -padx 2 -pady 2
+pack .bot.logo -side right -padx 2 -pady 2 -ipadx 1
 
 message .bot.a.target -text "" -aspect 1000 -border 1
 
@@ -3098,9 +3157,15 @@ label .bot.a.message -text "" -width 15 -relief \
 
 pack .bot.a.target -side top -anchor nw -padx 2 -pady 2
 pack .bot.a.status .bot.a.set .bot.a.message \
-        -side left -padx 2 -pady 2
+        -side left -padx 2 -pady 2 -ipadx 1 -ipady 1
 
-ir z39
-z39 logLevel all
+if {[catch {ir z39}]} {
+    set e [info sharedlibextension]
+    puts -nonewline "Loading irtcl$e ..."
+    load irtcl$e irtcl
+    ir z39
+    puts "ok"
+}
+#z39 logLevel all
 show-logo 1