[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Lockable-text-dialog-item
- To: serasset@imag.fr (Gilles Serasset)
- Subject: Re: Lockable-text-dialog-item
- From: bill@cambridge.apple.com (Bill St. Clair)
- Date: Fri, 3 Jul 1992 10:55:06 -0500
- Cc: info-mcl
>Hello,
>
>I would like to have a special text-dialog-item that behave like an
>editable-t-d-i when unlocked and like a static one when locked.
>
>Is there any dialog item like that somewhere.
Here's a 10 minute hack which should get you started. Figuring this
out yourself would probably be hard since the KEY-HANDLER-MIXIN class
is so badly documented.
-----------------------------------------------------------------
; lockable-text-dialog-item.lisp
; an editable-text-dialog-item that can be locked.
; While locked, it behaves more like a static-text-dialog-item.
(in-package :ccl)
(export '(lockable-text-dialog-item locked-p))
(defclass lockable-text-dialog-item (editable-text-dialog-item)
((locked-p :initform nil :initarg :locked :reader locked-p)))
; If we're the current-key-handler when we're locked, select another
; key handler.
(defmethod (setf locked-p) (value (self lockable-text-dialog-item))
(prog1 (setf (slot-value self 'locked-p) value)
(let ((w (view-window self)))
(when (and value (eq self (current-key-handler w)))
(change-key-handler w)))))
; This makes the dialog item unclickable when locked.
; You may prefer to keep it clickable, but override the default
; behavior and do something else when a click happens.
; (see the commented out code below)
(defmethod point-in-click-region-p ((self lockable-text-dialog-item) where)
(declare (ignore where))
(if (locked-p self)
nil
(call-next-method)))
(defmethod key-handler-p ((self lockable-text-dialog-item))
(if (locked-p self)
nil
(call-next-method)))
(defmethod view-cursor ((self lockable-text-dialog-item) point)
(declare (ignore point))
(if (locked-p self)
*arrow-cursor*
(call-next-method)))
#|
; Do this instead of the POINT-IN-CLICK-REGION-P method above,
; and subclasses will be able to have LOCKED-CLICK methods.
(defmethod view-click-event-handler ((self lockable-text-dialog-item) where)
(if (locked-p self)
(locked-click self where)
(call-next-method)))
(defmethod locked-click ((self lockable-text-dialog-item) where)
(declare (ignore where))
nil)
|#
#| ; Test code.
(defparameter *w* (let ((w (front-window)))
(prog1 (make-instance 'window)
(window-select w))))
(defparameter *e* (make-instance 'editable-text-dialog-item
:view-container *w*
:dialog-item-text "Not lockable"))
(defparameter *l* (make-instance 'lockable-text-dialog-item
:view-container *w*
:dialog-item-text "May be locked"))
; Play around with the lockable item after evaluating each of these
; two expressions.
(setf (locked-p *l*) t)
(setf (locked-p *l*) nil)
|#