logo       
Google Custom Search
    AddThis Social Bookmark Button

r10260 - trunk/libraries/koala/sources/examples/buddha: msg#00040

Subject: r10260 - trunk/libraries/koala/sources/examples/buddha
Author: hannes
Date: Mon Oct 10 03:44:54 2005
New Revision: 10260

Modified:
   trunk/libraries/koala/sources/examples/buddha/buddha.dylan
   trunk/libraries/koala/sources/examples/buddha/cidr.dylan
   trunk/libraries/koala/sources/examples/buddha/class-editor.dylan
Log:
Bug: 7257
made save work in class-editor


Modified: trunk/libraries/koala/sources/examples/buddha/buddha.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/buddha/buddha.dylan  (original)
+++ trunk/libraries/koala/sources/examples/buddha/buddha.dylan  Mon Oct 10 
03:44:54 2005
@@ -106,6 +106,7 @@
   end;
   let obj = element($obj-table, obj-string, default: *config*);
   with-buddha-template(out, "Edit")
+    show-errors(errors);
     with-xml()
       div(id => "content") {
         do(edit-form(obj)),
@@ -135,6 +136,23 @@
   end;
 end;
 
+define method show-errors (errors)
+  if (errors & (errors.size > 0))
+    with-xml()
+      div(id => "error")
+      { ul
+        {
+          do(for(error in errors)
+               collect(with-xml()
+                         li(error.error-string)
+                       end);
+             end)
+         }
+       }
+    end;
+  end;
+end;
+
 define method get-reference (object :: <object>) => (res :: <string>)
   let address = copy-sequence(format-to-string("%=", address-of(object)),
                               start: 1);
@@ -150,20 +168,7 @@
      #key errors)
   let out = output-stream(response);
   with-buddha-template(out, "Save Database")
-    if (errors & errors.size > 0)
-      collect(with-xml()
-                div(id => "error")
-                { ul
-                  {
-                    do(for(error in errors)
-                         collect(with-xml()
-                                   li(error.error-string)
-                                 end);
-                       end)
-                  }
-                }
-              end);
-    end;
+    show-errors(errors);
     collect(with-xml()
               div(id => "content")
               { form(action => "/save", \method => "post")

Modified: trunk/libraries/koala/sources/examples/buddha/cidr.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/buddha/cidr.dylan    (original)
+++ trunk/libraries/koala/sources/examples/buddha/cidr.dylan    Mon Oct 10 
03:44:54 2005
@@ -53,6 +53,11 @@
               integer-to-string(cidr.cidr-netmask));
 end;
 
+define method as (class == <cidr>, string :: <string>)
+ => (res :: <cidr>)
+  make(<cidr>, network-address: string)
+end;
+
 define method base-network-address (cidr :: <cidr>)
  => (ip-address :: <ip-address>)
   make(<ip-address>,

Modified: trunk/libraries/koala/sources/examples/buddha/class-editor.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/buddha/class-editor.dylan    
(original)
+++ trunk/libraries/koala/sources/examples/buddha/class-editor.dylan    Mon Oct 
10 03:44:54 2005
@@ -20,10 +20,18 @@
              collect(with-xml()
                        \select(name => slot.slot-name)
                        { do(for (ele in slot.slot-global-list(*config*))
-                              collect(with-xml()
-                                        option(as(<string>, ele),
-                                               value => get-reference(ele))
-                                      end)
+                              if (ele = slot.slot-getter-method(object))
+                                collect(with-xml()
+                                          option(as(<string>, ele),
+                                                 value => get-reference(ele),
+                                                 selected => "selected")
+                                        end);
+                              else
+                                collect(with-xml()
+                                          option(as(<string>, ele),
+                                                 value => get-reference(ele))
+                                        end)
+                              end if;
                             end)
                        }
                       end);
@@ -238,7 +246,7 @@
     errors := add!(errors, e);
     return();
   end;
-  //respont-to-get... with same object-string
+  respond-to-get(#"edit", request, response, errors: errors);
 end;
 
 define method add-object (parent-object :: <object>, request :: <request>)
@@ -282,23 +290,53 @@
 define method save-object (object :: <object>, request :: <request>)
   //data-slots and ref-slots may have changed...
   for (slot in data-slots(object))
-    let value = as(slot.slot-type, get-query-value(slot.slot-name));
-    //do more error checking
-    //slot-setter! (only if not same)
-    if (value ~= slot.slot-getter-method(object))
-      slot.slot-setter-method(object, value);
+    //convert value to type of slot
+    let value = get-query-value(slot.slot-name);
+    if (slot.slot-type = <boolean>)
+      if (value = slot.slot-name)
+        value := #t;
+      else
+        value := #f;
+      end;
+    else
+      value := as(slot.slot-type, value);
+    end;
+    //do more error checking //maybe use another generic function, not as?
+    //slot-setter! (only if not same object)
+    if (value & (value ~= slot.slot-getter-method(object)))
+      slot.slot-setter-method(value, object);
     end;
   end;
+  //now something completely different
   for (slot in reference-slots(object))
+    //get new value via reference
     let value = element($obj-table,
                         get-query-value(slot.slot-name),
                         default: #f);
-    //error check it
+    //error check it!
     //slot-setter!
-    if (value ~= slot.slot-getter-method(object))
-      slot.slot-setter-method(object, value);
+    let current-object = slot.slot-getter-method(object);
+    if (value & (value ~= current-object))
+      //remove old object from list of objects of referenced object
+      let class-name = debug-name(object-class(object));
+      let class-getter-name = concatenate(copy-sequence(class-name,
+                                                        start: 1,
+                                                        end: class-name.size - 
1),
+                                          "s");
+      let list-slot = choose(method(x)
+                                 x.slot-name = class-getter-name
+                             end,
+                             list-reference-slots(current-object))[0];
+
+      let old-list = list-slot.slot-getter-method(current-object);
+      old-list := remove!(old-list, object);
+
+      //set slot in object
+      slot.slot-setter-method(value, object);
+
+      //add new object to list of objects of referenced object
+      let new-list = list-slot.slot-getter-method(value);
+      new-list := add!(new-list, object);
     end;
-    //may be removed from some lists and added to others...
-    //hmm, only if a reference changes, iirc
   end;
-end;
\ No newline at end of file
+end;
-- 
Gd-chatter mailing list
Gd-chatter@xxxxxxxxxxxxxxxx
https://gauss.gwydiondylan.org/mailman/listinfo/gd-chatter




Try Searching:
servers, voip, java, networking, microsoft ...
<Prev in Thread] Current Thread [Next in Thread>