;;;; ;;;; c l a s s - b r o w s e r . s t k l o s -- Class browser ;;;; ;;;; Copyright © 1998-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: 25-Aug-1998 20:12 ;;;; Last file update: 3-Sep-1999 19:49 (eg) (require "Tk-classes") (require "method-editor") (define-module class-browser (import STklos STklos+Tk Tk) (export class-browser browse-class) (define *browser-current* #f) (define *browser-notepad* #f) (define *browser-tree* #f) (define *browser-window* #f) (define-class () ()) (define-class () ((entry :init-form #f) (items-type :init-form ))) (define-method open-item((self )) (unless (slot-ref self 'open) (let* ((data (slot-ref self 'data)) (children (slot-ref self 'children)) (hierarchy (slot-ref self 'parent)) (subclasses (class-direct-subclasses data))) (when (and (null? children) (not (null? subclasses))) (for-each (lambda (x) (if (null? (class-direct-subclasses x)) (add-leave hierarchy self x) (add-node hierarchy self x))) (sort subclasses (lambda (x y) (stringstring (class-name x)) (symbol->string (class-name y)))))))) ;; Do the redisplay (next-method))) (define-method close-item((self )) (slot-set! self 'children '()) (next-method)) (define-method label-item((self )) (let* ((data (slot-ref self 'data)) (len (length (class-direct-supers data))) (name (class-name data))) (if (> len 2) (format #f "~A : ~A" name len) ; class has multiple super-classes name))) (define-method select-item ((self )) (let* ((data (slot-ref self 'data)) (parent (slot-ref self 'parent)) (entry (slot-ref parent 'entry))) (unless (equal? data *browser-current*) (set! *browser-current* data) ;; Update all the listboxes with information relative to the current class (select-tab (current-tab *browser-notepad*)) (slot-set! entry 'value (class-name data)) (next-method)))) (define (create-hierarchy top) (let* ((f (make :parent top)) (e (make :parent f :title "Current Class" :relief "ridge" :border-width 2)) (h (make :parent f :relief "raised" :border-width 2))) (pack e :expand #f :fill "x" :padx 3 :pady 3) (pack h :expand #t :fill "both") (slot-set! h 'entry e) (add-node h #f ) (set! *browser-tree* h) f)) ;============================================================================= (define (create-notepad toplevel) (define lbs (make-vector 8)) (define n (make :parent toplevel)) (define index 0) (define (create-listbox parent txt index) (let* ((f (make :parent parent)) (l (make