/*	Hypertext "Anchor" Object				     HTAnchor.h
**	==========================
**
**	An anchor represents a region of a hypertext document which is linked
**	to another anchor in the same or a different document.
*/

#ifndef HTANCHOR_H
#define HTANCHOR_H

/* Version 0 (TBL) written in Objective-C for the NeXT browser */
/* Version 1 of 24-Oct-1991 (JFG), written in C, browser-independant */

#include "HTList.h"
#include "HTAtom.h"
/* #include "HTFormat.h" */

#ifdef SHORT_NAMES
#define HTAnchor_findChild			HTAnFiCh
#define HTAnchor_findChildAndLink		HTAnFiLi
#define HTAnchor_findAddress			HTAnFiAd
#define HTAnchor_delete				HTAnDele
#define HTAnchor_makeLastChild			HTAnMaLa
#define HTAnchor_parent				HTAnPare
#define HTAnchor_setDocument			HTAnSeDo
#define HTAnchor_document			HTAnDocu
#define HTAnchor_setFormat			HTAnSeFo
#define HTAnchor_format				HTAnForm
#define HTAnchor_setIndex			HTAnSeIn
#define HTAnchor_isIndex			HTAnIsIn
#define HTAnchor_address			HTAnAddr
#define HTAnchor_hasChildren			HTAnHaCh
#define HTAnchor_title				HTAnTitl
#define HTAnchor_setTitle			HTAnSeTi
#define HTAnchor_appendTitle			HTAnApTi
#define HTAnchor_link				HTAnLink
#define HTAnchor_followMainLink			HTAnFoMa
#define HTAnchor_followTypedLink		HTAnFoTy
#define HTAnchor_makeMainLink			HTAnMaMa
#endif

/*			Main definition of anchor
**			=========================
*/

typedef void HyperDoc;
typedef void HTLinkType;
typedef struct _HTAnchor HTAnchor;
typedef struct _HTAnchor HTParentAnchor;
typedef struct _HTAnchor HTChildAnchor;

struct _HTAnchor {		/* Generic anchor : just links */
  char * name;
  char * href;
};




/*	Create new or find old sub-anchor
**	---------------------------------
**
**	This one is for a new anchor being edited into an existing
**	document. The parent anchor must already exist.
*/

extern HTChildAnchor * HTAnchor_findChild
  PARAMS(
     (HTParentAnchor *parent,
      CONST char *tag)
  );

/*	Create or find a child anchor with a possible link
**	--------------------------------------------------
**
**	Create new anchor with a given parent and possibly
**	a name, and possibly a link to a _relatively_ named anchor.
**	(Code originally in ParseHTML.h)
*/
extern HTChildAnchor * HTAnchor_findChildAndLink
  PARAMS((
      HTParentAnchor * parent,	/* May not be 0 */
      CONST char * tag,         /* May be "" or 0 */
      CONST char * href,	/* May be "" or 0 */
      HTLinkType * ltype	/* May be 0 */
  ));


/*	Create new or find old named anchor
**	-----------------------------------
**
**	This one is for a reference which is found in a document, and might
**	not be already loaded.
**	Note: You are not guaranteed a new anchor -- you might get an old one,
**	like with fonts.
*/

extern HTAnchor * HTAnchor_findAddress
  PARAMS(
     (CONST char * address)
     );


/*	Delete an anchor and possibly related things (auto garbage collection)
**	--------------------------------------------
**
**	The anchor is only deleted if the corresponding document is not loaded.
**	All outgoing links from parent and children are deleted, and this anchor
**	is removed from the sources list of all its targets.
**	We also try to delete the targets whose documents are not loaded.
**	If this anchor's source list is empty, we delete it and its children.
*/

extern BOOL HTAnchor_delete
  PARAMS(
     (HTParentAnchor *this)
     );


/*		Move an anchor to the head of the list of its siblings
**		------------------------------------------------------
**
**	This is to ensure that an anchor which might have already existed
**	is put in the correct order as we load the document.
*/

extern void HTAnchor_makeLastChild
  PARAMS(
     (HTChildAnchor *this)
     );

/*	Data access functions
**	---------------------
*/

extern HTParentAnchor * HTAnchor_parent
  PARAMS(
     (HTAnchor *this)
     );

extern void HTAnchor_setDocument
  PARAMS(
     (HTParentAnchor *this, HyperDoc *doc)
     );

extern HyperDoc * HTAnchor_document
  PARAMS(
     (HTParentAnchor *this)
     );
/* We don't want code to change an address after anchor creation... yet ?
extern void HTAnchor_setAddress
  PARAMS(
     (HTAnchor *this, char *addr)
     );
*/

extern char * HTAnchor_address
  PARAMS(
     (HTAnchor *this)
     );

/*
extern void HTAnchor_setFormat
  PARAMS(
     (HTParentAnchor *this, HTFormat *form)
     );

extern HTFormat * HTAnchor_format
  PARAMS(
     (HTParentAnchor *this)
     );
*/
extern void HTAnchor_setIndex
  PARAMS(
     (HTParentAnchor *this)
     );

extern BOOL HTAnchor_isIndex
  PARAMS(
     (HTParentAnchor *this)
     );

extern BOOL HTAnchor_hasChildren
  PARAMS(
     (HTParentAnchor *this)
     );

/*	Title handling
*/
extern CONST char * HTAnchor_title
  PARAMS(
     (HTParentAnchor *this)
     );

extern void HTAnchor_setTitle
  PARAMS(
     (HTParentAnchor *this, CONST char * title)
     );

extern void HTAnchor_appendTitle
  PARAMS(
     (HTParentAnchor *this, CONST char * title)
     );

/*	Link this Anchor to another given one
**	-------------------------------------
*/

extern BOOL HTAnchor_link
  PARAMS(
     (HTAnchor *source, HTAnchor *destination, HTLinkType *type)
     );

/*	Manipulation of links
**	---------------------
*/

extern HTAnchor * HTAnchor_followMainLink
  PARAMS(
     (HTAnchor *this)
     );

extern HTAnchor * HTAnchor_followTypedLink
  PARAMS(
     (HTAnchor *this, HTLinkType *type)
     );

extern BOOL HTAnchor_makeMainLink
  PARAMS(
     (HTAnchor *this, HTLinkType *movingLink)
     );

#endif /* HTANCHOR_H */
