home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware 1 2 the Maxx
/
sw_1.zip
/
sw_1
/
WINDOWS
/
UTILS
/
WXLSLIB.ZIP
/
xlslib
/
dialogs.lsp
< prev
next >
Wrap
Lisp/Scheme
|
1992-02-20
|
13KB
|
334 lines
;;;;
;;;; graphics.lsp XLISP-STAT custom dialog objects and functions
;;;; XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney
;;;; Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz
;;;; You may give out copies of this software; for conditions see the file
;;;; COPYING included with this distribution.
;;;;
(provide "dialogs")
;;;;
;;;;
;;;; OK-or-Cancel Dialog Prototype
;;;;
;;;;
(defproto ok-or-cancel-dialog-proto
'(ok-button cancel-button) () modal-dialog-proto)
(defmeth ok-or-cancel-dialog-proto :isnew (items &rest args
&key (ok-default t)
(ok-action #'(lambda () t))
(cancel-action
#'(lambda () nil)))
(let ((items (if (consp items) items (list items)))
(ok-button (send modal-button-proto :new "OK"
:action ok-action))
(cancel-button (send modal-button-proto :new "Cancel"
:action cancel-action)))
(setf items (mapcar #'(lambda (x)
(if (stringp x)
(send text-item-proto :new x)
x))
items))
(setf (slot-value 'ok-button) ok-button)
(setf (slot-value 'cancel-button) cancel-button)
(apply #'call-next-method
(append items (list (list ok-button cancel-button)))
args)
(send self :default-button (if ok-default ok-button cancel-button))))
(defun ok-or-cancel-dialog (s &optional (ok-default t) &rest args)
"Args: (s &optional (ok-default t) &rest args)
Open modal dialog with string S and OK, Cancel buttons. Returns T for
OK, NIL for Cancel. S can contain format directives, which are filled
from the remaining arguments."
(let ((d (send ok-or-cancel-dialog-proto :new
(apply #'format nil s args) :ok-default ok-default)))
(send d :modal-dialog)))
;;;;
;;;;
;;;; Message Dialog Prototype
;;;;
;;;;
(defproto message-dialog-proto '() () modal-dialog-proto)
(defmeth message-dialog-proto :isnew (s)
(let ((text (if (consp s) s (list s)))
(ok-button (send modal-button-proto :new "OK")))
(call-next-method (append text (list ok-button)))
(send self :default-button ok-button)))
(defun message-dialog (&rest args)
"Args: (s &rest args)
Open modal dialog with string S and OK buttons. Returns NIL. S can contain
format directives, which are filled from the remaining arguments."
(let ((d (send message-dialog-proto :new (apply #'format nil args))))
(send d :modal-dialog)))
;;;;
;;;;
;;;; Get String/Value Dialog Prototype
;;;;
;;;;
(defproto get-string-dialog-proto () () ok-or-cancel-dialog-proto)
(defmeth get-string-dialog-proto :isnew (s &rest args &key (initial nil has-init))
(let* ((prompt-item (send text-item-proto :new s))
(edit-item (send edit-text-item-proto :new
(if has-init (format nil "~a" initial) "")
:text-length 20)))
(apply #'call-next-method
(list prompt-item edit-item)
:ok-action #'(lambda () (send edit-item :text))
args)))
(defun get-string-dialog (&rest args)
"Args: (s &key initial)
Opens a modal dialog with prompt S, a text field and OK, Cancel buttons.
INITIAL is converted to a string with ~A format directive. Returns string
of text field content on OK, NIL on cancel."
(let ((d (apply #'send get-string-dialog-proto :new args)))
(send d :modal-dialog)))
(defun get-value-dialog (prompt &rest args &key (initial "" supplied))
"Args: (s &key initial)
Opens a modal dialog with prompt S, a text field and OK, Cancel buttons.
INITIAL is converted to a string with ~S format directive. On Cancel returns
NIL. ON OK Returns list of result of reading and eval'ing the text field's
content."
(let* ((initial (if supplied
(format nil "~s" initial)
initial))
(s (apply #'get-string-dialog prompt :initial initial args)))
(if s (list (eval (read (make-string-input-stream s) nil))))))
;;;;
;;;;
;;;; Choose string/value dialog prototype
;;;;
;;;;
(defproto choose-item-dialog-proto () () ok-or-cancel-dialog-proto)
(defmeth choose-item-dialog-proto :isnew (s strings &rest args
&key (initial 0))
(let* ((prompt-item (send text-item-proto :new s))
(string-item (send choice-item-proto :new strings :value initial)))
(apply #'call-next-method (list prompt-item string-item)
:ok-action #'(lambda () (send string-item :value))
args)))
(defun choose-item-dialog (&rest args)
"Args: (s strings &key initial)
Opens modal dialog with prompt S, a choice item for list of strings STRINGS
and OK, Cancel buttons. Returns chosen string on OK, NIL on cancel."
(let ((d (apply #'send choose-item-dialog-proto :new args)))
(send d :modal-dialog)))
;;;;
;;;;
;;;; Choose string/value dialog prototype
;;;;
;;;;
(defproto choose-subset-dialog-proto () () ok-or-cancel-dialog-proto)
(defmeth choose-subset-dialog-proto :isnew (s strings &rest args
&key (initial nil))
(let ((prompt-item (send text-item-proto :new s))
(subset-items (mapcar #'(lambda (x y)
(send toggle-item-proto
:new x :value (member y initial)))
strings (iseq 0 (- (length strings) 1)))))
(apply #'call-next-method (cons prompt-item subset-items)
:ok-action #'(lambda ()
(list (which (mapcar #'(lambda (x) (send x :value))
subset-items))))
args)))
(defun choose-subset-dialog (&rest args)
"Args: (s strings &key initial)
Opens modal dialog with prompt S, a set of toggle items for list of
strings STRINGS, and OK, Cancel buttons. Returns list of list of indices
of chosen items on OK, NIL on cancel."
(let ((d (apply #'send choose-subset-dialog-proto :new args)))
(send d :modal-dialog)))
;;;;
;;;;
;;;; Sequence Scroll Bar Item Prototype
;;;;
;;;;
(defproto sequence-scroll-item-proto
'(sequence display-sequence value-text-item) () scroll-item-proto)
(defmeth sequence-scroll-item-proto :isnew
(x &key text-item (size '(180 16)) location action display)
(let* ((sequence (coerce x 'vector))
(display (if display (coerce display 'vector) sequence)))
(setf (slot-value 'sequence) sequence)
(setf (slot-value 'display-sequence) display)
(setf (slot-value 'value-text-item) text-item)
(call-next-method :size size
:location location
:min-value 0 :max-value (1- (length sequence))
:page-increment 5
:action action)))
(defmeth sequence-scroll-item-proto :scroll-action ()
(send self :display-value)
(send self :user-action))
(defmeth sequence-scroll-item-proto :do-action ()
(send self :display-value)
(send self :user-action))
(defmeth sequence-scroll-item-proto :value (&optional (val nil set))
(when set (call-next-method val) (send self :display-value))
(call-next-method))
(defmeth sequence-scroll-item-proto :display-value ()
(if (slot-value 'value-text-item)
(send (slot-value 'value-text-item) :text
(format nil "~s"
(elt (slot-value 'display-sequence)
(send self :value))))))
(defmeth sequence-scroll-item-proto :user-action ()
(if (slot-value 'action)
(funcall (slot-value 'action)
(elt (slot-value 'sequence) (send self :value)))))
;;;;
;;;;
;;;; Sequence Slider Dialog Prototype
;;;;
;;;;
(defproto sequence-slider-dialog-proto () () dialog-proto)
(defmeth sequence-slider-dialog-proto :isnew
(data &key (text "Value") (title "Slider") action display)
(let* ((name-item (send text-item-proto :new text))
(value-item (send text-item-proto :new " "
:location '(100 5)))
(scroll-item (send sequence-scroll-item-proto :new data
:text-item value-item
:action action :display display)))
(call-next-method (list name-item value-item scroll-item) :title title)
(send scroll-item :display-value)))
(defmeth sequence-slider-dialog-proto :value (&rest args)
(apply #'send (nth 2 (slot-value 'items)) :value args))
(defun sequence-slider-dialog (&rest args)
"Args: (data &key (text \"Value\") (title \"Slider\") action display)
Opens modeless dialog with title TITLE, prompt TEXT, a text display and a
scrollbar. The scrollbar scrolls through the DATA sequence and displays the
corresponding element of the DISPLAY sequence. When a scroll event occurs
ACTION is called with the current value of DATA as argument."
(apply #'send sequence-slider-dialog-proto :new args))
;;;;
;;;;
;;;; Interval Scroll Bar Item Prototype
;;;;
;;;;
(defproto interval-scroll-item-proto
'(interval num-points value-text-item) () scroll-item-proto)
(defmeth interval-scroll-item-proto :isnew
(x &key text-item (size '(180 16)) location action
(points (nth 2 (get-nice-range (nth 0 x) (nth 1 x) 50))))
(setf (slot-value 'interval) x)
(setf (slot-value 'num-points) points)
(setf (slot-value 'value-text-item) text-item)
(call-next-method :size size :location location :min-value 0
:max-value (1- points)
:action action))
(defmeth interval-scroll-item-proto :value (&optional (val nil set))
(let ((interval (slot-value 'interval))
(num-points (slot-value 'num-points)))
(if set
(let* ((min (elt interval 0))
(max (elt interval 1))
(val (floor (* (1- num-points) (/ (- val min) (- max min))))))
(call-next-method val)
(send self :display-value)
(send self :user-action)))
(let ((min (elt interval 0))
(max (elt interval 1)))
(+ min (* (/ (call-next-method) (1- num-points)) (- max min))))))
(defmeth interval-scroll-item-proto :max (&optional (max nil set))
(let ((value (send self :value)))
(when set (setf (elt interval 1) max) (send self :value value))
(elt interval 1)))
(defmeth interval-scroll-item-proto :min (&optional (min nil set))
(let ((value (send self :value)))
(when set (setf (elt interval 0) min) (send self :value value))
(elt interval 0)))
(defmeth interval-scroll-item-proto :user-action ()
(if (slot-value 'action)
(funcall (slot-value 'action) (send self :value))))
(defmeth interval-scroll-item-proto :display-value ()
(if (slot-value 'value-text-item)
(send (slot-value 'value-text-item)
:text (num-to-string (send self :value)))))
(defmeth interval-scroll-item-proto :scroll-action ()
(send self :display-value)
(send self :user-action))
(defmeth interval-scroll-item-proto :do-action ()
(send self :display-value)
(send self :user-action))
;;;;
;;;;
;;;; Interval Slider Dialog Prototype
;;;;
;;;;
(defproto interval-slider-dialog-proto () () dialog-proto)
(defmeth interval-slider-dialog-proto :isnew
(data &key (text "Value") (title "Slider") action (points 30) (nice t))
(if nice
(let ((range (get-nice-range (nth 0 data) (nth 1 data) points)))
(setq data (list (nth 0 range) (nth 1 range)))
(setq points (nth 2 range))))
(let* ((value-item (send text-item-proto :new " "
:location '(100 5)))
(name-item (send text-item-proto :new text))
(scroll-item (send interval-scroll-item-proto :new data
:text-item value-item
:action action :points points)))
(call-next-method (list name-item value-item scroll-item) :title title)
(send scroll-item :display-value)))
(defmeth interval-slider-dialog-proto :value (&rest args)
(apply #'send (nth 2 (slot-value 'items)) :value args))
(defun interval-slider-dialog (&rest args)
"Args: (data &key (text \"Value\") (title \"Slider\") action (points 30) (nice t))
Opens modeless dialog with title TITLE, prompt TEXT, a text display and a
scrollbar. The scrollbar scrolls through the interval DATA, a list of the form
(LOW HIGH), sequence and displays the value. When a scroll event occurs
ACTION is called with the current value in the interval as argument. If NICE
is not NIL DATA and POINTS are revised to produce a nice set of values."
(apply #'send interval-slider-dialog-proto :new args))