Author: junrue
Date: Mon May 22 22:53:07 2006
New Revision: 139
Added:
trunk/src/tests/uitoolkit/widget-unit-tests.lisp
Modified:
trunk/config.lisp
trunk/docs/manual/api.texinfo
trunk/graphic-forms-tests.asd
trunk/src/uitoolkit/widgets/control.lisp
trunk/src/uitoolkit/widgets/top-level.lisp
trunk/src/uitoolkit/widgets/widget-classes.lisp
trunk/src/uitoolkit/widgets/widget-utils.lisp
trunk/src/uitoolkit/widgets/window.lisp
Log:
refactored minimum/maximum-size slots so that both windows and controls have this feature
Modified: trunk/config.lisp
==============================================================================
--- trunk/config.lisp (original)
+++ trunk/config.lisp Mon May 22 22:53:07 2006
@@ -40,7 +40,7 @@
(in-package #:graphic-forms-system)
(defvar *cells-dir* "cells/")
-(defvar *cffi-dir* "cffi-0.9.0/")
+(defvar *cffi-dir* "cffi-060514/")
(defvar *closer-mop-dir* "closer-mop/")
(defvar *lw-compat-dir* "lw-compat/")
(defvar *gf-dir* "graphic-forms/")
Modified: trunk/docs/manual/api.texinfo
==============================================================================
--- trunk/docs/manual/api.texinfo (original)
+++ trunk/docs/manual/api.texinfo Mon May 22 22:53:07 2006
@@ -863,13 +863,14 @@
@end deffn
@anchor{maximum-size}
-@deffn GenericFunction maximum-size self
+@deffn GenericFunction maximum-size self => size
Returns a @ref{size} object describing the largest dimensions to which
-the user may resize this widget; by default returns @sc{nil},
-indicating that there is effectively no constraint. The corresponding
-@sc{setf} function sets this value; if the new maximum size is
-smaller than the current size, the widget is resized to the new
-maximum. @xref{minimum-size}.
+the user may resize this widget. By default, @ref{window}s and
+@ref{control}s return @sc{nil} indicating that there is effectively no
+constraint.@*@*
+The corresponding @sc{setf} function sets this value;
+if the new maximum size is smaller than the current size, the widget
+is resized to the new maximum. @xref{minimum-size}.
@end deffn
@deffn GenericFunction menu-bar self
@@ -877,13 +878,16 @@
@end deffn
@anchor{minimum-size}
-@deffn GenericFunction minimum-size self
+@deffn GenericFunction minimum-size self => size
Returns a @ref{size} object describing the smallest dimensions to
-which the user may resize this widget; by default returns @sc{nil},
-indicating that the minimum constraint is determined by the windowing
-system's configuration. The corresponding @sc{setf} function sets
-this value; if the new minimum size is larger than the current size,
-the widget is resized to the new minimum. @xref{maximum-size}.
+which the user may resize this widget. By default, @ref{window}
+objects return @sc{nil} indicating that the minimum constraint is
+determined by the windowing system's configuration; whereas,
+@ref{control}s return the same value by default as would
+@ref{preferred-size}.@*@*
+The corresponding @sc{setf} function sets this value; if the new
+minimum size is larger than the current size, the widget is resized to
+the new minimum. @xref{maximum-size}.
@end deffn
@deffn GenericFunction object-to-display self pnt
Modified: trunk/graphic-forms-tests.asd
==============================================================================
--- trunk/graphic-forms-tests.asd (original)
+++ trunk/graphic-forms-tests.asd Mon May 22 22:53:07 2006
@@ -77,6 +77,7 @@
(:file "graphics-context-unit-tests")
(:file "image-unit-tests")
(:file "layout-unit-tests")
+ (:file "widget-unit-tests")
(:file "hello-world")
(:file "event-tester")
(:file "layout-tester")
Added: trunk/src/tests/uitoolkit/widget-unit-tests.lisp
==============================================================================
--- (empty file)
+++ trunk/src/tests/uitoolkit/widget-unit-tests.lisp Mon May 22 22:53:07 2006
@@ -0,0 +1,46 @@
+;;;;
+;;;; widget-unit-tests.lisp
+;;;;
+;;;; Copyright (C) 2006, Jack D. Unrue
+;;;; All rights reserved.
+;;;;
+;;;; Redistribution and use in source and binary forms, with or without
+;;;; modification, are permitted provided that the following conditions
+;;;; are met:
+;;;;
+;;;; 1. Redistributions of source code must retain the above copyright
+;;;; notice, this list of conditions and the following disclaimer.
+;;;;
+;;;; 2. Redistributions in binary form must reproduce the above copyright
+;;;; notice, this list of conditions and the following disclaimer in the
+;;;; documentation and/or other materials provided with the distribution.
+;;;;
+;;;; 3. Neither the names of the authors nor the names of its contributors
+;;;; may be used to endorse or promote products derived from this software
+;;;; without specific prior written permission.
+;;;;
+;;;; THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS "AS IS" AND ANY
+;;;; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DIS-
+;;;; CLAIMED. IN NO EVENT SHALL THE AUTHORS AND CONTRIBUTORS BE LIABLE FOR ANY
+;;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+;;;; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+;;;; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+;;;; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+;;;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+;;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+;;;;
+
+(in-package :graphic-forms.uitoolkit.tests)
+
+(define-test class-registration-test
+ (assert-true (> (gfw::register-panel-window-class) 0) 'gfw::register-panel-class)
+ (assert-true (> (gfw::register-toplevel-erasebkgnd-window-class) 0) 'gfw::register-toplevel-erasebkgnd-window-class)
+ (assert-true (> (gfw::register-toplevel-noerasebkgnd-window-class) 0) 'gfw::register-toplevel-noerasebkgnd-window-class)
+ (assert-true (> (gfw::register-dialog-class) 0) 'gfw::register-dialog-class))
+
+(define-test repeat-class-registration-test
+ (assert-true (> (gfw::register-panel-window-class) 0) 'gfw::register-panel-class)
+ (assert-true (> (gfw::register-toplevel-erasebkgnd-window-class) 0) 'gfw::register-toplevel-erasebkgnd-window-class)
+ (assert-true (> (gfw::register-toplevel-noerasebkgnd-window-class) 0) 'gfw::register-toplevel-noerasebkgnd-window-class)
+ (assert-true (> (gfw::register-dialog-class) 0) 'gfw::register-dialog-class))
Modified: trunk/src/uitoolkit/widgets/control.lisp
==============================================================================
--- trunk/src/uitoolkit/widgets/control.lisp (original)
+++ trunk/src/uitoolkit/widgets/control.lisp Mon May 22 22:53:07 2006
@@ -143,9 +143,25 @@
(let ((class (define-dispatcher `((event-select . ,callback)))))
(setf (dispatcher ctrl) (make-instance (class-name class))))))
-(defmethod preferred-size :before ((ctrl control) width-hint height-hint)
+(defmethod (setf maximum-size) :after (max-size (self control))
+ (unless (gfs:disposed-p self)
+ (let ((size (constrain-new-size max-size (size self) #'min)))
+ (setf (size self) size))))
+
+(defmethod minimum-size :after ((self control))
+ (let ((size (slot-value self 'minimum-size)))
+ (if (null size)
+ (preferred-size self -1 -1)
+ size)))
+
+(defmethod (setf minimum-size) :after (min-size (self control))
+ (unless (gfs:disposed-p self)
+ (let ((size (constrain-new-size min-size (size self) #'max)))
+ (setf (size self) size))))
+
+(defmethod preferred-size :before ((self control) width-hint height-hint)
(declare (ignorable width-hint height-hint))
- (if (gfs:disposed-p ctrl)
+ (if (gfs:disposed-p self)
(error 'gfs:disposed-error)))
(defmethod print-object ((self control) stream)
Modified: trunk/src/uitoolkit/widgets/top-level.lisp
==============================================================================
--- trunk/src/uitoolkit/widgets/top-level.lisp (original)
+++ trunk/src/uitoolkit/widgets/top-level.lisp Mon May 22 22:53:07 2006
@@ -51,11 +51,6 @@
gfs::+cs-dblclks+
-1))
-(defun constrain-new-size (new-size current-size compare-fn)
- (let ((new-width (funcall compare-fn (gfs:size-width new-size) (gfs:size-width current-size)))
- (new-height (funcall compare-fn (gfs:size-height new-size) (gfs:size-height current-size))))
- (gfs:make-size :width new-width :height new-height)))
-
;;;
;;; methods
;;;
@@ -150,12 +145,6 @@
(error 'gfs:toolkit-error :detail "no object for menu handle"))
m)))
-(defmethod (setf maximum-size) :after (max-size (win top-level))
- (unless (or (gfs:disposed-p win) (null (layout-of win)))
- (let ((size (constrain-new-size max-size (size win) #'min)))
- (setf (size win) size)
- (perform (layout-of win) win (gfs:size-width size) (gfs:size-height size)))))
-
(defmethod (setf menu-bar) :before ((m menu) (win top-level))
(declare (ignore m))
(if (gfs:disposed-p win)
@@ -172,12 +161,6 @@
(gfs::set-menu hwnd (gfs:handle m))
(gfs::draw-menu-bar hwnd)))
-(defmethod (setf minimum-size) :after (min-size (win top-level))
- (unless (or (gfs:disposed-p win) (null (layout-of win)))
- (let ((size (constrain-new-size min-size (size win) #'max)))
- (setf (size win) size)
- (perform (layout-of win) win (gfs:size-width size) (gfs:size-height size)))))
-
(defmethod print-object ((self top-level) stream)
(print-unreadable-object (self stream :type t)
(format stream "handle: ~x " (gfs:handle self))
Modified: trunk/src/uitoolkit/widgets/widget-classes.lisp
==============================================================================
--- trunk/src/uitoolkit/widgets/widget-classes.lisp (original)
+++ trunk/src/uitoolkit/widgets/widget-classes.lisp Mon May 22 22:53:07 2006
@@ -84,6 +84,14 @@
:initform nil)
(pixel-point
:accessor pixel-point-of
+ :initform nil)
+ (maximum-size
+ :accessor maximum-size
+ :initarg :maximum-size
+ :initform nil)
+ (minimum-size
+ :accessor minimum-size
+ :initarg :minimum-size
:initform nil))
(:documentation "The base class for widgets having pre-defined native behavior."))
@@ -116,6 +124,14 @@
(layout
:accessor layout-of
:initarg :layout
+ :initform nil)
+ (maximum-size
+ :accessor maximum-size
+ :initarg :maximum-size
+ :initform nil)
+ (minimum-size
+ :accessor minimum-size
+ :initarg :minimum-size
:initform nil))
(:documentation "Base class for user-defined widgets that serve as containers."))
@@ -128,15 +144,7 @@
(defclass root-window (window) ()
(:documentation "This class encapsulates the root of the desktop window hierarchy."))
-(defclass top-level (window)
- ((maximum-size
- :accessor maximum-size
- :initarg :maximum-size
- :initform nil)
- (minimum-size
- :accessor minimum-size
- :initarg :minimum-size
- :initform nil))
+(defclass top-level (window) ()
(:documentation "Base class for windows that can be moved and resized by the user, and which normally have title bars."))
(defclass timer (event-source)
Modified: trunk/src/uitoolkit/widgets/widget-utils.lisp
==============================================================================
--- trunk/src/uitoolkit/widgets/widget-utils.lisp (original)
+++ trunk/src/uitoolkit/widgets/widget-utils.lisp Mon May 22 22:53:07 2006
@@ -168,3 +168,8 @@
(cffi:lisp-string-to-foreign tmp-str (cffi:make-pointer curr-addr) str-len)
(incf curr-addr str-len)))
buffer))
+
+(defun constrain-new-size (new-size current-size compare-fn)
+ (let ((new-width (funcall compare-fn (gfs:size-width new-size) (gfs:size-width current-size)))
+ (new-height (funcall compare-fn (gfs:size-height new-size) (gfs:size-height current-size))))
+ (gfs:make-size :width new-width :height new-height)))
Modified: trunk/src/uitoolkit/widgets/window.lisp
==============================================================================
--- trunk/src/uitoolkit/widgets/window.lisp (original)
+++ trunk/src/uitoolkit/widgets/window.lisp Mon May 22 22:53:07 2006
@@ -114,12 +114,10 @@
gfs::hicon gfs::hcursor gfs::hbrush
gfs::menuname gfs::classname gfs::smallicon)
wc-ptr gfs::wndclassex)
- ;; FIXME: move this if form outside of with-foreign-slots
- ;;
+ (setf gfs::cbsize (cffi:foreign-type-size 'gfs::wndclassex))
(if (zerop (gfs::get-class-info (gfs::get-module-handle (cffi:null-pointer))
str-ptr wc-ptr))
(progn
- (setf gfs::cbsize (cffi:foreign-type-size 'gfs::wndclassex))
(setf gfs::style style)
(setf gfs::wndproc proc-ptr)
(setf gfs::clsextra 0)
@@ -226,22 +224,41 @@
(outer-location win pnt)
pnt))
-(defmethod layout ((win window))
- (unless (null (layout-of win))
- (let ((sz (client-size win)))
- (perform (layout-of win) win (gfs:size-width sz) (gfs:size-height sz)))))
-
-(defmethod pack ((win window))
- (unless (null (layout-of win))
- (perform (layout-of win) win -1 -1))
+(defmethod layout ((self window))
+ (unless (null (layout-of self))
+ (let ((sz (client-size self)))
+ (perform (layout-of self) self (gfs:size-width sz) (gfs:size-height sz)))))
+
+(defmethod (setf maximum-size) :after (max-size (self window))
+ (unless (or (gfs:disposed-p self) (null (layout-of self)))
+ (let ((size (constrain-new-size max-size (size self) #'min)))
+ (setf (size self) size)
+ (perform (layout-of self) self (gfs:size-width size) (gfs:size-height size))
+ size)))
+
+(defmethod (setf minimum-size) :after (min-size (self window))
+ (unless (or (gfs:disposed-p self) (null (layout-of self)))
+ (let ((size (constrain-new-size min-size (size self) #'max)))
+ (setf (size self) size)
+ (perform (layout-of self) self (gfs:size-width size) (gfs:size-height size))
+ size)))
+
+(defmethod pack ((self window))
+ (unless (null (layout-of self))
+ (perform (layout-of self) self -1 -1))
(call-next-method))
-(defmethod preferred-size ((win window) width-hint height-hint)
- (let ((layout (layout-of win)))
- (if (and (layout-p win) layout)
- (let ((new-client-sz (compute-size layout win width-hint height-hint)))
- (compute-outer-size win new-client-sz))
- (size win))))
+(defmethod preferred-size :before ((self window) width-hint height-hint)
+ (declare (ignorable width-hint height-hint))
+ (if (gfs:disposed-p self)
+ (error 'gfs:disposed-error)))
+
+(defmethod preferred-size ((self window) width-hint height-hint)
+ (let ((layout (layout-of self)))
+ (if (and (layout-p self) layout)
+ (let ((new-client-sz (compute-size layout self width-hint height-hint)))
+ (compute-outer-size self new-client-sz))
+ (size self))))
(defmethod print-object ((self window) stream)
(print-unreadable-object (self stream :type t)
@@ -249,21 +266,21 @@
(format stream "dispatcher: ~a " (dispatcher self))
(format stream "size: ~a" (size self))))
-(defmethod show ((win window) flag)
+(defmethod show ((self window) flag)
(declare (ignore flag))
(call-next-method)
- (gfs::update-window (gfs:handle win)))
+ (gfs::update-window (gfs:handle self)))
-(defmethod size ((win window))
+(defmethod size ((self window))
(let ((sz (gfs:make-size)))
- (outer-size win sz)
+ (outer-size self sz)
sz))
-(defmethod window->display :before ((self top-level))
+(defmethod window->display :before ((self window))
(if (gfs:disposed-p self)
(error 'gfs:disposed-error)))
-(defmethod window->display ((self top-level))
+(defmethod window->display ((self window))
(let* ((hmonitor (gfs::monitor-from-window (gfs:handle self) gfs::+monitor-defaulttonearest+))
(display (make-instance 'display)))
(setf (slot-value display 'gfs:handle) hmonitor)