;;;; ;;;; Scrollframe.stklos -- Scroll Frame Widget ;;;; ;;;; Copyright © 1999 Erick Gallesio - I3S-CNRS/ESSI ;;;; ;;;; Permission to use, copy, modify, distribute,and license this ;;;; software and its documentation for any purpose is hereby granted, ;;;; provided that existing copyright notices are retained in all ;;;; copies and that this notice is included verbatim in any ;;;; distributions. No written agreement, license, or royalty fee is ;;;; required for any of the authorized uses. ;;;; This software is provided ``AS IS'' without express or implied ;;;; warranty. ;;;; ;;;; Author: Erick Gallesio [eg@unice.fr] ;;;; Creation date: 8-Feb-1999 11:52 ;;;; Last file update: 3-Sep-1999 20:14 (eg) (require "Basics") (select-module STklos+Tk) ;============================================================================= ; ; < S c r o l l - f r a m e > ; ;============================================================================= ;;;; ;;;; Resources ;;;; ;;;; ;;;; Class definition ;;;; (define-class ( ) (scrollbar canvas iframe ; internal widgets for internal use only (class :init-keyword :class :init-form "ScrollFrame") (scroll-side :accessor scroll-side :allocation :virtual :init-keyword :scroll-side :slot-ref (lambda (o) (STk:v-scroll-side (slot-ref o 'scrollbar))) :slot-set! (lambda (o v) (STk:v-scroll-side-set! (slot-ref o 'scrollbar) v))) ;; Non allocated slots (background :accessor background :init-keyword :background :allocation :propagated :propagate-to (frame iframe scrollbar)) (width :accessor width :allocation :propagated :init-keyword :width :propagate-to (canvas)) (height :accessor height :allocation :propagated :init-keyword :height :propagate-to (canvas)) (relief :accessor relief :init-keyword :relief :allocation :propagated :propagate-to (frame)))) ;;;; ;;;; methods ;;;; (define-method initialize-composite-widget ((self ) initargs parent) (let* ((s (make :parent parent :orientation "vertical")) (c (make :parent parent)) (f (make :parent c))) ;; Set internal true slots (slot-set! self 'Id (slot-ref f 'Id)) (slot-set! self 'scrollbar s) (slot-set! self 'canvas c) (slot-set! self 'iframe f) ;; Place internal widgets (do as if we had a horizontal scroll to ;; reuse functions of other scrollable windows). (grid c :row 1 :column 1 :sticky "nswe") (grid s :row 1 :column 2 :sticky "ns") (grid 'rowconf parent 1 :weight 1) (grid 'columnconf parent 1 :weight 1) ;; Attach command to scrollbar and canvas (slot-set! c 'y-scroll-command (lambda l (apply (slot-ref s 'Id) 'set l))) (slot-set! s 'command (lambda args (apply (slot-ref c 'Id) 'yview args))) ;; Add a binding to the frame such as adding widget to it will reconfigure ;; the canvas (and hence the scrollbar) ((Id c) 'create 'window 0 0 :anchor 'nw :window f :tag "window") (bind f "" (lambda () ;(update 'idle) (slot-set! c 'scroll-region (list 0 0 (winfo 'width f) (winfo 'height f))))) (bind c "" (lambda () ((Id c) 'itemconf "window" :width (winfo 'width c)))))) (provide "Scrollframe") #| Example (define f (make )) (pack (make