diff remotePager.urs @ 16:2e397d373289

Add RemotePager.
author Karn Kallio <kkallio@eka>
date Thu, 18 Aug 2011 12:53:17 -0430
parents
children 4362b15220e4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotePager.urs	Thu Aug 18 12:53:17 2011 -0430
@@ -0,0 +1,78 @@
+(* How to format the control section. *)
+type formatCtl = {Width : int,
+                  (* Maximum number of page options to show. *)
+                  RangeCtl : $(mapU (transaction {} -> xbody) [First, Back, Next, Last]),
+                  (* A group of four functions taking transactions which will be used to return
+                   * an element having that transaction as onclick.  Used to format the buttons
+                   * controlling the selection of page options.  First starts the options at the
+                   * first page, Back starts the options one page lower, Next one page higher
+                   * and Last has them finish at the final page. *)
+                  PageCtl :  $(mapU (int -> transaction {} -> xbody) [Unsel, Sel]),
+                  (* Used to generate the xml bearing the page selection onclick action. Sel
+                   * is used for the currently shown page and Unsel for the others. *)
+                  WrapPageCtl : xbody -> xbody,
+                  (* The sequence of page selection controls will be wrapped by this. *)
+                  Wrap : $(mapU xbody [First, Back, Pages, Next, Last]) -> xbody
+                  (* Draws the control by placing the individual controls in the holes. *)}
+
+style firstCtl
+style backCtl
+style nextCtl
+style lastCtl
+style curPage
+style rangeCtl
+(* Default styles. *)
+
+val defaultFormat : formatCtl
+(* A reasonable default format. *)
+
+val defaultFormatLbl : $(mapU string [First, Back, Next, Last]) -> formatCtl
+(* A default format with configurable labels on the page range controls. *)
+
+type pageData = {Content : xbody, Available : int}
+(* Content and page count needed from the RPC. *)
+
+datatype response err = Good of pageData | Bad of err
+(* The RPC gives us either page information or an error code. *)
+
+functor Make(M : sig
+                 type errorMarker
+                 (* Classifies the possible error conditions returned by the rpc call. *)
+
+                 type pageGroup
+                 (* Classifies families of pages. *)
+
+                 val initPage : pageGroup -> transaction pageData
+                 (* Used once to initialize the first page and page count.
+                  * The RPC mechanism is not used and no error is possible. *)
+
+                 val getPage : pageGroup -> int -> transaction (response errorMarker)
+                 (* RPC giving the content of a requested page as well as the count
+                  * of how many pages are available.  The first page should be given
+                  * an index of 0. *)
+             end) : sig
+
+    type t
+    (* The type of remote pagers.  A remote pager is a
+     * widget which shows a list of available "pages" of
+     * information.  The user can click on a page they want
+     * displayed, which is then fetched from the server via
+     * a RPC. *)
+
+    val createFmt : formatCtl -> M.pageGroup -> transaction t
+    (* Get a remote pager widget with a custom format showing pages from the selected group. *)
+
+    val create : M.pageGroup -> transaction t
+    (* Get a remote pager widget with the default format (partly customizable via CSS). *)
+
+    val onError : t -> (M.errorMarker -> transaction {}) -> transaction {}
+    (* Allows setting an error handler.  In case of an rpc error code return, this will
+     * be called with the received error marker.  If not set, the default error handler
+     * does nothing. *)
+
+    val panelXml : t -> xbody
+    (* Returns a piece of xml holding the contents of the current page. *)
+
+    val ctlXml : t -> xbody
+    (* Returns a xml widget representing the clickable page selection controls. *)
+end