extracted meta-model from LoL into its own archive
[clinton/lisp-on-lines.git] / src / mewa / mewa.lisp
index 1d8916c..af4ecbb 100644 (file)
@@ -1,16 +1,14 @@
-
 (in-package :mewa)
  
 (defparameter *default-type* :ucw)
 
 ;;; maps meta-model slot-types to slot-presentation
 (defparameter *slot-type-map*
 (in-package :mewa)
  
 (defparameter *default-type* :ucw)
 
 ;;; maps meta-model slot-types to slot-presentation
 (defparameter *slot-type-map*
-  '(boolean   ucw::mewa-boolean
-    string    ucw::mewa-string
-    number    ucw::mewa-currency
-    integer   ucw::mewa-integer
-    currency  ucw::mewa-currency
-    ))
+  '(boolean   mewa-boolean
+    string    mewa-string
+    number    mewa-currency
+    integer   mewa-integer
+    currency  mewa-currency))
 
 ;;; an alist of model-class-name . attributes
 ;;; should really be a hash-table.
 
 ;;; an alist of model-class-name . attributes
 ;;; should really be a hash-table.
@@ -51,7 +49,7 @@
   "return an exisiting class attribute map or create one. 
 
 A map is a cons of class-name . attributes. 
   "return an exisiting class attribute map or create one. 
 
 A map is a cons of class-name . attributes. 
-attributes is an alist keyed on the attribute nreeame."
+attributes is an alist keyed on the attribute name."
   (or (assoc class-name *attribute-map*) 
       (progn 
        (setf *attribute-map* (acons class-name (list (list)) *attribute-map*)) 
   (or (assoc class-name *attribute-map*) 
       (progn 
        (setf *attribute-map* (acons class-name (list (list)) *attribute-map*)) 
@@ -97,7 +95,6 @@ attributes is an alist keyed on the attribute nreeame."
   (dolist (def definitions)
     (funcall #'set-attribute model (first def) (rest def))))
 
   (dolist (def definitions)
     (funcall #'set-attribute model (first def) (rest def))))
 
-
 (defmethod set-attribute-properties ((model t) attribute properties)
   (let ((a (find-attribute model attribute)))
     (if a
 (defmethod set-attribute-properties ((model t) attribute properties)
   (let ((a (find-attribute model attribute)))
     (if a
@@ -109,21 +106,18 @@ attributes is an alist keyed on the attribute nreeame."
     (funcall #'set-attribute-properties model (car def) (cdr def))))
   
 
     (funcall #'set-attribute-properties model (car def) (cdr def))))
   
 
-
-
-
 (defmethod default-attributes ((model t))
   "return the default attributes for a given model using the meta-model's meta-data"
   (append (mapcar #'(lambda (s) 
                      (cons (car s) 
                            (gen-pslot 
                             (if (meta-model:foreign-key-p model (car s))
 (defmethod default-attributes ((model t))
   "return the default attributes for a given model using the meta-model's meta-data"
   (append (mapcar #'(lambda (s) 
                      (cons (car s) 
                            (gen-pslot 
                             (if (meta-model:foreign-key-p model (car s))
-                                'ucw::foreign-key
+                                'foreign-key
                                 (cadr s))
                             (string (car s)) (car s)))) 
                  (meta-model:list-slot-types model))
          (mapcar #'(lambda (s) 
                                 (cadr s))
                             (string (car s)) (car s)))) 
                  (meta-model:list-slot-types model))
          (mapcar #'(lambda (s) 
-                     (cons s (append (gen-pslot 'ucw::has-many (string s) s) 
+                     (cons s (append (gen-pslot 'has-many (string s) s) 
                                      `(:presentation 
                                        (make-presentation 
                                         ,model 
                                      `(:presentation 
                                        (make-presentation 
                                         ,model 
@@ -131,6 +125,7 @@ attributes is an alist keyed on the attribute nreeame."
                  (meta-model:list-has-many model))))
 
 (defmethod set-default-attributes ((model t))
                  (meta-model:list-has-many model))))
 
 (defmethod set-default-attributes ((model t))
+  "Set the default attributes for MODEL"
   (clear-class-attributes model)
   (mapcar #'(lambda (x) 
              (setf (find-attribute model (car x)) (cdr x)))
   (clear-class-attributes model)
   (mapcar #'(lambda (x) 
              (setf (find-attribute model (car x)) (cdr x)))
@@ -143,9 +138,9 @@ attributes is an alist keyed on the attribute nreeame."
 
 
 
 
 
 
-
 (defcomponent mewa ()
 (defcomponent mewa ()
-  ((attributes
+  ((instance :accessor instance :initarg :instance) 
+   (attributes
     :initarg :attributes
     :accessor attributes
     :initform nil)
     :initarg :attributes
     :accessor attributes
     :initform nil)
@@ -153,6 +148,9 @@ attributes is an alist keyed on the attribute nreeame."
     :accessor attributes-getter
     :initform #'get-attributes
     :initarg :attributes-getter)
     :accessor attributes-getter
     :initform #'get-attributes
     :initarg :attributes-getter)
+   (attribute-slot-map
+    :accessor attribute-slot-map
+    :initform nil)
    (global-properties
     :initarg :global-properties
     :accessor global-properties
    (global-properties
     :initarg :global-properties
     :accessor global-properties
@@ -166,7 +164,7 @@ attributes is an alist keyed on the attribute nreeame."
     :accessor use-instance-class-p 
     :initform t)
    (initializedp :initform nil)
     :accessor use-instance-class-p 
     :initform t)
    (initializedp :initform nil)
-   (modifiedp :accessor modifiedp :initform nil)
+   (modifiedp :accessor modifiedp :initform nil :initarg :modifiedp)
    (modifications :accessor modifications :initform nil)))
 
 
    (modifications :accessor modifications :initform nil)))
 
 
@@ -182,7 +180,6 @@ attributes is an alist keyed on the attribute nreeame."
          (meta-model:list-has-many (instance self)))
   nil))
 
          (meta-model:list-has-many (instance self)))
   nil))
 
-
 (defmethod find-instance-classes ((self mewa))
   (mapcar #'class-name 
          (it.bese.arnesi.mopp:compute-class-precedence-list (class-of (instance self)))))
 (defmethod find-instance-classes ((self mewa))
   (mapcar #'class-name 
          (it.bese.arnesi.mopp:compute-class-precedence-list (class-of (instance self)))))
@@ -236,65 +233,67 @@ attributes is an alist keyed on the attribute nreeame."
                        (attributes self)))
       all-attributes))))
 
                        (attributes self)))
       all-attributes))))
 
+(defmethod find-slot-presentation-for-attribute ((self mewa) attribute)
+  (let ((class-name 
+        (or (gethash (if (consp (second attribute))
+                         (car (second attribute))
+                         (second attribute))
+                     *presentation-slot-type-mapping*) 
+            (error  "Can't find slot type for ~A in ~A but ~A" attribute *presentation-slot-type-mapping* (gethash 'mewa:has-very-many *presentation-slot-type-mapping*)))))
+               
+    (cons (first attribute) (apply #'make-instance 
+                                  class-name
+                                  (append (cddr attribute) (list :parent self :size 30))))))
+
 (defmethod find-slot-presentations ((self mewa))
 (defmethod find-slot-presentations ((self mewa))
-  (mapcar #'(lambda (s)
-             (let ((class-name (or (gethash (second s) ucw::*slot-type-mapping*) 'mewa-object-presentation)))
-             (apply #'make-instance 
-                    class-name
-                    (append (cddr s) (list :parent self :size 30)))))
+  (mapcar #'(lambda (a) (find-slot-presentation-for-attribute self a))
          (find-applicable-attributes self)))
 
          (find-applicable-attributes self)))
 
-
+(defmethod find-attribute-slot ((self mewa) (attribute symbol))
+  (cdr (assoc attribute (attribute-slot-map self))))
 
 (defmethod initialize-slots ((self mewa))
 
 (defmethod initialize-slots ((self mewa))
-  (when (use-instance-class-p self)
-    (setf (classes self) 
-         (append (find-instance-classes self)
-                 (classes self))))
-  (setf (slots self) (find-slot-presentations   self)))
+  (when (instance self)
+    (when (use-instance-class-p self)
+      (setf (classes self) 
+           (append (find-instance-classes self)
+                   (classes self))))
+    (setf (attribute-slot-map self) (find-slot-presentations self))
+    (setf (slots self) (mapcar #'(lambda (x)(cdr x)) (attribute-slot-map self )))))
   
   
-
-(defmethod make-presentation ((object t) &key (type :viewer) (initargs nil))
-  (let* ((p (make-instance 'mewa-object-presentation))
-        (a (progn (setf (slot-value p 'instance) object)
-                  (initialize-slots p) 
-                  (assoc type (find-all-attributes p))))
-        
-        (i (apply #'make-instance (second a) (plist-union initargs (cddr a)))))
-    (setf (slot-value i 'instance) object)
-    i))
-
 (defmethod make-presentation ((object t) &key (type :viewer) (initargs nil))
   (let* ((p (make-instance 'mewa-object-presentation))
 (defmethod make-presentation ((object t) &key (type :viewer) (initargs nil))
   (let* ((p (make-instance 'mewa-object-presentation))
-        (a (progn (setf (slot-value p 'instance) object)
+        (a (progn (setf (slot-value p 'ucw::instance) object)
                   (initialize-slots p) 
                   (assoc type (find-all-attributes p))))
                   (initialize-slots p) 
                   (assoc type (find-all-attributes p))))
-        
         (i (apply #'make-instance (or (second a)
         (i (apply #'make-instance (or (second a)
-                                      ;; if we didnt find the type, 
-                                      ;; use the symbol as a class. 
-                                      (if (eql (symbol-package type) 
-                                               (find-package 'keyword))
-                                          (symbol-name type)
-                                          type))
-                                      (plist-union initargs (cddr a)))))
+                                     ;; if we didnt find the type, 
+                                     ;; use the symbol as a class. 
+                                     (if (eql (symbol-package type) 
+                                              (find-package 'keyword))
+                                         (symbol-name type)
+                                         type))
+                  (plist-union initargs (cddr a)))))
     (setf (slot-value i 'instance) object)
     (initialize-slots i)
     (setf (slot-value i 'initializedp) t)
     i))
 
 
     (setf (slot-value i 'instance) object)
     (initialize-slots i)
     (setf (slot-value i 'initializedp) t)
     i))
 
 
-
-
-
-(defmethod call-component :before ((from standard-component) (to mewa))
+(defmethod initialize-slots-place ((place ucw::place) (mewa mewa))
+  (setf (slots mewa) (mapcar #'(lambda (x) 
+                              (prog1 x 
+                                (setf (component.place x) place)))
+                            (slots mewa))))
+  
+(arnesi:defmethod/cc call-component :before ((from standard-component) (to mewa))
   (unless (slot-value to 'initializedp)
     (initialize-slots to))
   (setf (slot-value to 'initializedp) t)
   (unless (slot-value to 'initializedp)
     (initialize-slots to))
   (setf (slot-value to 'initializedp) t)
-  (setf (slots to) (mapcar #'(lambda (x) (prog2 
-                                            (setf (component.place x) (component.place from))
-                                            x))
-                            (slots to))))
+  (initialize-slots-place (component.place from) to)
+  to)
+
+
 
 (defmacro call-presentation (object &rest args)
   `(present-object ,object :presentation (make-presentation ,object ,@args)))
 
 (defmacro call-presentation (object &rest args)
   `(present-object ,object :presentation (make-presentation ,object ,@args)))
@@ -304,25 +303,32 @@ attributes is an alist keyed on the attribute nreeame."
   ((body :initarg :body)))
 
 (defmethod render-on ((res response) (self about-dialog))
   ((body :initarg :body)))
 
 (defmethod render-on ((res response) (self about-dialog))
-  (render-on res (slot-value self 'body))
-  (call-next-method))
+  (call-next-method)
+  (render-on res (slot-value self 'body)))
+
+
+(defmethod instance-is-stored-p ((instance clsql:standard-db-object))
+  (slot-value instance 'clsql-sys::view-database))
+
+(defmethod instance-is-stored-p ((mewa mewa))
+  (instance-is-stored-p (instance mewa)))
 
 (defaction cancel-save-instance ((self mewa))
   (cond  
 
 (defaction cancel-save-instance ((self mewa))
   (cond  
-    ((slot-value (instance self) 'clsql-sys::view-database)
+    ((instance-is-stored-p (instance self))
       (meta-model::update-instance-from-records (instance self))
       (answer self))
     (t (answer nil))))
 
 (defaction save-instance ((self mewa))
   (meta-model:sync-instance (instance self))
       (meta-model::update-instance-from-records (instance self))
       (answer self))
     (t (answer nil))))
 
 (defaction save-instance ((self mewa))
   (meta-model:sync-instance (instance self))
-   (setf (modifiedp self) nil)
-       (answer self))
+  (setf (modifiedp self) nil)
+  (answer self))
 
 
 (defaction ensure-instance-sync ((self mewa))
   (when (modifiedp self)
 
 
 (defaction ensure-instance-sync ((self mewa))
   (when (modifiedp self)
-    (let ((message (format nil "Record has been modified, Do you wish to save the changes?<br/> ~a" (print (modifications self)))))
+    (let ((message (format nil "Record has been modified, Do you wish to save the changes?")))
       (case (call 'about-dialog
                   :body (make-presentation (instance self) 
                                           :type :viewer)
       (case (call 'about-dialog
                   :body (make-presentation (instance self) 
                                           :type :viewer)
@@ -336,13 +342,9 @@ attributes is an alist keyed on the attribute nreeame."
 
 (defaction ok ((self mewa) &optional arg)
   "Returns the component if it has not been modified. if it has been, prompt user to save or cancel"
 
 (defaction ok ((self mewa) &optional arg)
   "Returns the component if it has not been modified. if it has been, prompt user to save or cancel"
-  (declare (ignore arg))
-  (ensure-instance-sync self)
-  (answer self))
-
-
-
-
+  ;(declare (ignore arg))
+  (meta-model::sync-instance (instance self))
+  (answer (instance self)))
 
 (defmethod (setf presentation-slot-value) :around (value (slot slot-presentation) instance)
   (let* ((old (prog1 
 
 (defmethod (setf presentation-slot-value) :around (value (slot slot-presentation) instance)
   (let* ((old (prog1 
@@ -355,6 +357,24 @@ attributes is an alist keyed on the attribute nreeame."
       (setf (modifiedp self) instance
            (modifications self)  (append (list new old value slot instance) (modifications self)))))))
 
       (setf (modifiedp self) instance
            (modifications self)  (append (list new old value slot instance) (modifications self)))))))
 
+;;;; * Finally set up some defaults
+
+(setf (find-attribute t :viewer) 
+      '(mewa-object-presentation :global-properties (:editablep nil))
+      (find-attribute t :editor)
+      '(mewa-object-presentation :global-properties (:editablep t))
+      (find-attribute t :creator)
+      '(mewa-object-presentation :global-properties (:editablep t))
+      (find-attribute t :one-line)
+      '(mewa-one-line-presentation)
+      (find-attribute t :listing)
+      '(mewa-list-presentation :global-properties (:editablep nil) :editablep t)
+      (find-attribute t :search-model)
+      '(mewa-object-presentation))
+
+
+
+
 
 ;; This software is Copyright (c) Drew Crampsie, 2004-2005.
 ;; You are granted the rights to distribute
 
 ;; This software is Copyright (c) Drew Crampsie, 2004-2005.
 ;; You are granted the rights to distribute