(in-package :it.bese.ucw) (defun multiple-value-funcall->list (function &rest args) "The function to be called by m-v-bf" (multiple-value-call #'list (apply function args))) (defmacro multiple-value-bindf (vars form &body body) "Like M-V-B, only it works in actions. form must be a function call" `(destructuring-bind ,vars (multiple-value-funcall->list #',(car form) ,@(cdr form)) ,@body)) ;;;; ** Textarea Slot Presentation ;;;; This should really be in UCW. (defslot-presentation text-slot-presentation () ((rows :initarg :rows :accessor rows :initform nil) (columns :initarg :columns :accessor columns :initform nil) (html-contentp :initarg :escape-html-p :accessor escape-html-p :initform nil)) (:type-name text)) (defmethod present-slot ((slot text-slot-presentation) instance) (if (editablep slot) ( " (foreign-instance slot) " from " instance ) (let* ((i (foreign-instance slot)) (pres (mewa::make-presentation i :type :one-line :initargs (list :global-properties (list :editablep nil :linkedp nil))))) (when (and (ucw::parent slot) (slot-boundp slot 'ucw::place)) (setf (component.place pres) (component.place (ucw::parent slot)))) (when i ( (length (last-name x)) 0) (strcat (last-name x) ", ") " ") (first-name x)" " (company-name x))) :as-value (lambda (x) x) :submit-on-click-p nil))) (:type-name ajax-foreign-key)) (defmethod shared-initialize :after ((slot ajax-foreign-key-slot-presentation) slots &rest args) ;; If no search-slots than use the any slots of type string (unless (search-slots slot) (setf (search-slots slot) t) (let ((l (live-search slot))) (setf (lisp-on-lines::values-generator l) t)))) (defmethod present-slot :around ((slot ajax-foreign-key-slot-presentation) instance) (setf (foreign-instance slot) (when (presentation-slot-value slot instance) (meta-model:explode-foreign-key instance (slot-name slot)))) (flet ((render () (when (foreign-instance slot)(call-next-method)))) (if (slot-boundp slot 'place) (cond ((editablep slot) ( 0 (current slot)) ;;what to do here is open to debate (setf (current slot) (- (len slot)(number-to-display slot) )))) (defmethod present-slot ((slot has-very-many-slot-presentation) instance) ;;(<:as-html "isance: " instance) (if (slot-boundp slot 'place) (progn (>")) (call-next-method) (<:as-html "total :" (len slot))) (call-next-method))) (defmethod get-foreign-instances :around ((slot has-very-many-slot-presentation) instance) (let ((f (call-next-method))) (setf (len slot) (length f)) (setf (instances slot) f) (loop for cons on (nthcdr (current slot) f) for i from 0 upto (number-to-display slot) collect (car cons)))) (defslot-presentation has-a-slot-presentation (one-of-presentation) ((key :initarg :key :accessor key)) (:type-name has-a)) (defmethod get-foreign-slot-value ((slot has-a-slot-presentation) (object t) (slot-name t)) (slot-value object slot-name)) (defmethod present-slot ((slot has-a-slot-presentation) instance) (<:as-html (presentation-slot-value slot instance)) (if (editablep slot) (