[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Problem with (setf dialog-item-text)
- Subject: Problem with (setf dialog-item-text)
- From: Gilles.Serasset@imag.fr (Gilles Serasset)
- Date: Thu, 20 May 1993 17:54:25 -0800
Hello,
I am defining a view with an icon and a text. The size of the view depends
on the text:
-------------------- beginning of lisp ------------------------
(defclass icon-and-text-dialog-item (dialog-item)
((icon :accessor icon
:initarg :icon)
(icon-size :accessor icon-size
:initarg :icon-size
:initform *icon-default-size*)
(color-p :accessor color-p
:initarg :color-p)
))
(defmethod initialize-instance ((self icon-and-text-dialog-item) &rest initargs)
(declare (ignore initargs))
(call-next-method)
(set-view-size self
(+ (max (point-h (icon-size self))
(string-width (dialog-item-text self)
(view-font self)))
2)
(+ (point-v (icon-size self))
(font-line-height (view-font self))
4))
(let ((icon (icon self)))
(unless (or (typep icon 'fixnum) (pointerp icon))
(error "~s is not a valid icon (not a resource-id or pointer)." icon))
(if (typep icon 'fixnum)
(let ((icon-hdl (if (color-p self)
(#_getCicon icon)
(#_geticon icon))))
(if (%null-ptr-p icon-hdl)
(error "no icon resource with id ~s." icon)
(setf (icon self) icon-hdl))
)
)))
(defmethod view-draw-contents ((self icon-and-text-dialog-item))
(let* ((width (point-h (view-size self)))
(icon-topleft (make-point (truncate (- width (point-h (icon-size
self))) 2)
1))
(text-topleft (make-point (truncate (- width (string-width
(dialog-item-text self)
(view-font self)))
2)
(- (point-v (view-size self)) 2))))
(with-focused-view self
(with-back-color (or (part-color self :background) *white-color*)
(rlet ((r :rect
:topleft icon-topleft
:bottomright (add-points icon-topleft (icon-size self))))
(with-fore-color (or (part-color self :foreground) *black-color*)
(if (color-p self)
(#_plotCicon r (icon self))
(#_ploticon r (icon self)))))
(with-fore-color (or (part-color self :foreground) *black-color*)
(move-to self text-topleft)
(with-pstrs ((str (dialog-item-text self)))
(#_drawString str)))))
))
;;Then, I redefine the set-dialog-item-text function as follows:
(defmethod set-dialog-item-text ((self icon-and-text-dialog-item) text)
(call-next-method)
(set-view-size self
(+ (max (point-h (icon-size self))
(string-width text
(view-font self)))
2)
(+ (point-v (icon-size self))
(font-line-height (view-font self))
4))
(invalidate-view self t))
;;Everything works great, when I change the dialog-item-text, the size is
;;recalculated and the dialog-item is redisplayed properly.
;;Then, I define the method for (setf dialog-item-text):
(defmethod (setf dialog-item-text) ((self icon-and-text-dialog-item) text)
(set-dialog-item-text self text))
;;It does not work, the text is change, but the size is not recalculated and the
;;icon not redisplayed. WHY ????????
;;You can try it with:
(setf di (make-instance 'icon-and-text-dialog-item
:color-p nil
:dialog-item-text "Au revoir la compagnie"
:view-font '("courier" 9 :plain)
:icon 1
:icon-size #@(32 32)
:view-position #@(80 20)
))
(setf w (make-instance 'window
:color-p t
:view-subviews
(list di)))
(set-dialog-item-text di "Bonjour tous les gens qui sont la")
(setf (dialog-item-text di) "Salut")
--------------------- end of lisp ----------------------------------
I think I missed something, but what ?
Thanx,
Gilles,
=====================================================
L'ennemi est bete, il croit que l'ennemi c'est nous,
alors que c'est lui. P. Desproges
---- Gilles.Serasset@imag.fr (Gilles Serasset) ----
GETA IMAG, UJF et CNRS, BP 53X F-38041 GRENOBLE CEDEX