--- /dev/null
+(* $Id$
+ * ----------------------------------------------------------------------
+ *
+ *)
+
+open Pxp_types
+open Pxp_document
+open Pxp_yacc
+
+let empty_record = new element_impl (Pxp_yacc.default_extension);;
+let empty_dnode = new data_impl Pxp_yacc.default_extension;;
+
+class context the_filename the_obj_dtd the_index the_root the_topframe =
+ object (self)
+ val filename = the_filename
+ val obj_dtd = the_obj_dtd
+ val node_index = the_index
+ val mutable obj = empty_record # create_element
+ the_obj_dtd (T_element "record") []
+ val root = the_root
+ val topframe = the_topframe
+ val mutable wdg = None
+
+ val mutable history = ( [| |] : string array )
+ val mutable index = 0
+
+ initializer
+ self # load_obj
+
+ method obj = obj
+
+ (* history *)
+
+ method private leave_node =
+ begin match wdg with
+ None -> ()
+ | Some w -> Tk.destroy w
+ end;
+ wdg <- None
+
+ method private enter_node =
+ let where = history.(index) in
+ let n =
+ try node_index # find where with
+ Not_found -> failwith ("Mask not found: " ^ where) in
+ let w = n # extension # create_widget topframe self in
+ Tk.pack [w] (n # extension # pack_opts @ [ Tk.Expand true] );
+ wdg <- Some w
+
+
+
+ method previous =
+ if index > 0 then
+ index <- index - 1
+ else
+ raise Not_found;
+ self # leave_node;
+ self # enter_node;
+
+
+ method next =
+ if index < Array.length history - 1 then
+ index <- index + 1
+ else
+ raise Not_found;
+ self # leave_node;
+ self # enter_node;
+
+
+ method goto where =
+ assert (index <= Array.length history);
+ self # leave_node;
+ let persisting_history =
+ if index < Array.length history then
+ Array.sub history 0 (index+1)
+ else
+ history
+ in
+ history <- Array.concat [ persisting_history; [| where |] ];
+ index <- Array.length history - 1;
+ self # enter_node;
+
+
+ method current =
+ if index < Array.length history then
+ history.(index)
+ else
+ raise Not_found
+
+
+ (* read, write the slots of object *)
+
+ method search_slot name =
+ let rec search n =
+ match n # node_type with
+ T_element "string" ->
+ if n # required_string_attribute "name" = name then
+ n
+ else raise Not_found
+ | T_element _ ->
+ search_list (n # sub_nodes)
+ | T_data ->
+ raise Not_found
+ | _ ->
+ assert false
+
+ and search_list l =
+ match l with
+ x :: l' ->
+ (try search x with Not_found -> search_list l')
+ | [] ->
+ raise Not_found
+ in
+ search obj
+
+ method get_slot name =
+ let d = (self # search_slot name) # data in
+ d
+
+ method set_slot name value =
+ let dtd = obj # dtd in
+ begin try
+ let n = self # search_slot name in
+ n # delete
+ with
+ Not_found -> ()
+ end;
+ let e_string = empty_record # create_element dtd (T_element "string")
+ [ "name", name ] in
+ let dnode = empty_dnode # create_data dtd value in
+ e_string # add_node dnode;
+ e_string # local_validate();
+ obj # add_node e_string;
+ assert(self # get_slot name = value)
+
+ (* load, save object *)
+
+
+ method load_obj =
+ if Sys.file_exists filename then begin
+ obj <- parse_content_entity
+ default_config
+ (from_file filename)
+ obj_dtd
+ default_spec
+ end
+ else begin
+ print_string "New file!\n";
+ flush stdout
+ end
+
+
+ method save_obj =
+ let fd = open_out filename in
+ try
+
+ let re1 = Str.regexp "&" in
+ let re2 = Str.regexp "<" in
+ let re3 = Str.regexp "'" in
+ let re4 = Str.regexp ">" in
+ let protect s =
+ let s1 = Str.global_replace re1 "&" s in
+ let s2 = Str.global_replace re2 "<" s1 in
+ let s3 = Str.global_replace re3 "'" s2 in
+ let s4 = Str.global_replace re2 ">" s1 in
+ s3
+ in
+
+ let rec iterate (n : 'node extension node as 'node) =
+ match n # node_type with
+ T_data ->
+ output_string fd (protect (n # data))
+ | T_element name ->
+ output_string fd ("<" ^ name ^ "\n");
+ let anames = n # attribute_names in
+ List.iter
+ (fun aname ->
+ let aval = n # attribute aname in
+ let v =
+ match aval with
+ Value s ->
+ aname ^ "='" ^ protect s ^ "'\n"
+ | Valuelist l ->
+ aname ^ "='" ^ String.concat " " (List.map protect l) ^ "'\n"
+ | Implied_value ->
+ ""
+ in
+ output_string fd v)
+ anames;
+ output_string fd ">";
+ List.iter iterate (n # sub_nodes);
+ output_string fd ("</" ^ name ^ "\n>");
+ | _ ->
+ assert false
+ in
+
+ output_string fd "<?xml version='1.0' encoding='ISO-8859-1'?>\n";
+ iterate obj;
+ close_out fd
+ with
+ e ->
+ close_out fd;
+ raise e
+
+ end
+;;
+
+
+(* ======================================================================
+ * History:
+ *
+ * $Log$
+ * Revision 1.1 2000/11/17 09:57:31 lpadovan
+ * Initial revision
+ *
+ * Revision 1.7 2000/08/30 15:58:49 gerd
+ * Updated.
+ *
+ * Revision 1.6 2000/07/23 20:25:05 gerd
+ * Update because of API change: local_validate.
+ *
+ * Revision 1.5 2000/07/16 19:36:03 gerd
+ * Updated.
+ *
+ * Revision 1.4 2000/07/08 22:03:11 gerd
+ * Updates because of PXP interface changes.
+ *
+ * Revision 1.3 2000/06/04 20:29:19 gerd
+ * Updates because of renamed PXP modules.
+ *
+ * Revision 1.2 2000/05/30 00:09:08 gerd
+ * Minor fix.
+ *
+ * Revision 1.1 1999/08/21 19:11:05 gerd
+ * Initial revision.
+ *
+ *
+ *)