;;;; ;;;; S c r o l l b o x . s t k -- Scroll Listbox composite widget ;;;; ;;;; Copyright © 1993-1998 Erick Gallesio - I3S-CNRS/ESSI ;;;; ;;;; Permission to use, copy, and/or distribute this software and its ;;;; documentation for any purpose and without fee is hereby granted, provided ;;;; that both the above copyright notice and this permission notice appear in ;;;; all copies and derived works. Fees for distribution or use of this ;;;; software or derived works may only be charged with express written ;;;; permission of the copyright holder. ;;;; This software is provided ``as is'' without express or implied warranty. ;;;; ;;;; $Id: Scrollbox.stklos 1.4 Wed, 04 Feb 1998 11:34:59 +0100 eg $ ;;;; ;;;; Author: Erick Gallesio [eg@kaolin.unice.fr] ;;;; Creation date: 22-Mar-1994 13:05 ;;;; Last file update: 4-Feb-1998 10:58 (require "Basics") (select-module STklos+Tk) ;============================================================================= ; ; < S c r o l l - l i s t b o x > ; ;============================================================================= ;;;; ;;;; Resources ;;;; ;;;; ;;;; Class definition ;;;; (define-class ( ) ((class :init-keyword :class :init-form "ScrollListbox") (listbox :accessor listbox-of) (h-scrollbar :accessor h-scrollbar-of) (v-scrollbar :accessor v-scrollbar-of) (h-scroll-side :accessor h-scroll-side :allocation :virtual :init-keyword :h-scroll-side :slot-ref (lambda (o) (STk:h-scroll-side (slot-ref o 'h-scrollbar))) :slot-set! (lambda (o v) (STk:h-scroll-side-set! (slot-ref o 'h-scrollbar) v))) (v-scroll-side :accessor v-scroll-side :allocation :virtual :init-keyword :v-scroll-side :slot-ref (lambda (o) (STk:v-scroll-side (slot-ref o 'v-scrollbar))) :slot-set! (lambda (o v) (STk:v-scroll-side-set! (slot-ref o 'v-scrollbar) v))) ;; Non allocated slots (background :accessor background :init-keyword :background :allocation :propagated :propagate-to (frame listbox h-scrollbar v-scrollbar)) (border-width :accessor border-width :allocation :propagated :init-keyword :border-width :propagate-to (frame)) (relief :accessor relief :init-keyword :relief :allocation :propagated :propagate-to (frame)))) ;;;; ;;;; methods ;;;; (define-method initialize-composite-widget ((self ) initargs parent) (let* ((hs (make :parent parent :orientation "horizontal")) (vs (make :parent parent :orientation "vertical")) (l (make :parent parent))) ;; Set internal true slots (slot-set! self 'Id (slot-ref l 'Id)) (slot-set! self 'listbox l) (slot-set! self 'h-scrollbar hs) (slot-set! self 'v-scrollbar vs) ;; Place internal widgets (grid hs :row 0 :column 1 :sticky "we") (grid 'remove hs) (grid l :row 1 :column 1 :sticky "nswe") (grid vs :row 1 :column 2 :sticky "ns") (grid 'rowconf parent 1 :weight 1) (grid 'columnconf parent 1 :weight 1) ;; Attach command to scrollbar and listbox (slot-set! l 'x-scroll-command (lambda l (apply (slot-ref hs 'Id) 'set l))) (slot-set! l 'y-scroll-command (lambda l (apply (slot-ref vs 'Id) 'set l))) (slot-set! hs 'command (lambda args (apply (slot-ref l 'Id) 'xview args))) (slot-set! vs 'command (lambda args (apply (slot-ref l 'Id) 'yview args))) )) (provide "Scrollbox") #| Example: (define l1 (make :h-scroll-side "bottom" :relief "ridge" :border-width 2 :value '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17))) (define l2 (make :v-scroll-side #f :h-scroll-side "top" :relief "ridge" :border-width 2 :value '("A long long phrase which can be scrolled ..."))) (pack l1 l2 :side 'left :expand #t :fill 'both) |#