/*                                                                  History module for libwww
                                        HTHISTORY
                                             
   This is a simple history module for a WWW client.  It keeps a linear history, with
   destructive backtrack, and list sequencing (previous, next) operations.
   
   If you are building a client, you don't have to use this: just don't call it.  This
   module is not used by any other modules in the libwww, so if you don't refer to it you
   don't get it in your linked application.
   
 */
#ifndef HTHISTORY_H
#define HTHISTORY_H

#include "HTFormat.h"
#include "HTAnchor.h"

#ifdef SHORT_NAMES
#define HTHistory_record                HTHiReco
#define HTHistory_backtrack             HTHiBack
#define HTHistory_canBacktrack          HTHiCaBa
#define HTHistory_moveBy                HTHiMoBy
#define HTHistory_canMoveBy             HTHiCaMo
#define HTHistory_read                  HTHiRead
#define HTHistory_recall                HTHiReca
#define HTHistory_count                 HTHiCoun
#define HTHistory_leavingFrom           HTHiLeFr
#endif

/*                              Navigation
**                              ==========
*/

/*              Record the jump to an anchor
**              ----------------------------
*/

extern void HTHistory_record
  PARAMS(
    (HTAnchor * destination)
  );

/*              Go back in history (find the last visited node)
**              ------------------
*/

extern HTAnchor * HTHistory_backtrack
  NOPARAMS;  /* FIXME: Should we add a `sticky' option ? */

extern BOOL HTHistory_canBacktrack
  NOPARAMS;

/*              Browse through references in the same parent node
**              -------------------------------------------------
**
**      Take the n-th child's link after or before the one we took to get here.
**      Positive offset means go towards most recently added children.
*/

extern HTAnchor * HTHistory_moveBy
  PARAMS(
     (int offset)
     );

extern BOOL HTHistory_canMoveBy
  PARAMS(
     (int offset)
     );

#define HTHistory_next (HTHistory_moveBy (+1))
#define HTHistory_canNext (HTHistory_canMoveBy (+1))
#define HTHistory_previous (HTHistory_moveBy (-1))
#define HTHistory_canPrevious (HTHistory_canMoveBy (-1))


/*                              Retrieval
**                              =========
*/

/*              Read numbered visited anchor (1 is the oldest)
**              ----------------------------
*/

extern HTAnchor * HTHistory_read
  PARAMS(
    (int number)
  );

/*              Recall numbered visited anchor (1 is the oldest)
**              ------------------------------
**      This reads the anchor and stores it again in the list, except if last.
*/

extern HTAnchor * HTHistory_recall
  PARAMS(
    (int number)
  );

/*              Number of Anchors stored
**              ------------------------
**
**      This is needed in order to check the validity of certain commands
**      for menus, etc.
(not needed for now. Use canBacktrack, etc.)
extern int HTHistory_count NOPARAMS;
*/

/*              Change last history entry
**              -------------------------
**
**      Sometimes we load a node by one anchor but leave by a different
**      one, and it is the one we left from which we want to remember.
*/
extern void HTHistory_leavingFrom
  PARAMS(
    (HTAnchor * anchor)
  );

#endif /* HTHISTORY_H */

/*

    */
