//
// Link.h
//
-// Copyright 1996 Derek B. Noonburg
+// Copyright 1996-2003 Glyph & Cog, LLC
//
//========================================================================
#ifndef LINK_H
#define LINK_H
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
#pragma interface
#endif
actionGoToR, // go to destination in new file
actionLaunch, // launch app (or open document)
actionURI, // URI
+ actionNamed, // named action
+ actionMovie, // movie action
actionUnknown // anything else
};
// Check link action type.
virtual LinkActionKind getKind() = 0;
+
+ // Parse a destination (old-style action) name, string, or array.
+ static LinkAction *parseDest(Object *obj);
+
+ // Parse an action dictionary.
+ static LinkAction *parseAction(Object *obj, GString *baseURI = NULL);
+
+ // Extract a file name from a file specification (string or
+ // dictionary).
+ static GString *getFileSpecName(Object *fileSpecObj);
};
//------------------------------------------------------------------------
class LinkDest {
public:
- // Build a LinkDest from the array. If <pageIsRef> is true, the
- // page is specified by an object reference; otherwise the page is
- // specified by a (zero-relative) page number.
- LinkDest(Array *a, GBool pageIsRef1);
+ // Build a LinkDest from the array.
+ LinkDest(Array *a);
// Copy a LinkDest.
LinkDest *copy() { return new LinkDest(this); }
class LinkURI: public LinkAction {
public:
- // Build a LinkURI given the URI (string).
- LinkURI(Object *uriObj);
+ // Build a LinkURI given the URI (string) and base URI.
+ LinkURI(Object *uriObj, GString *baseURI);
// Destructor.
virtual ~LinkURI();
GString *uri; // the URI
};
+//------------------------------------------------------------------------
+// LinkNamed
+//------------------------------------------------------------------------
+
+class LinkNamed: public LinkAction {
+public:
+
+ // Build a LinkNamed given the action name.
+ LinkNamed(Object *nameObj);
+
+ virtual ~LinkNamed();
+
+ virtual GBool isOk() { return name != NULL; }
+
+ virtual LinkActionKind getKind() { return actionNamed; }
+ GString *getName() { return name; }
+
+private:
+
+ GString *name;
+};
+
+//------------------------------------------------------------------------
+// LinkMovie
+//------------------------------------------------------------------------
+
+class LinkMovie: public LinkAction {
+public:
+
+ LinkMovie(Object *annotObj, Object *titleObj);
+
+ virtual ~LinkMovie();
+
+ virtual GBool isOk() { return annotRef.num >= 0 || title != NULL; }
+
+ virtual LinkActionKind getKind() { return actionMovie; }
+ GBool hasAnnotRef() { return annotRef.num >= 0; }
+ Ref *getAnnotRef() { return &annotRef; }
+ GString *getTitle() { return title; }
+
+private:
+
+ Ref annotRef;
+ GString *title;
+};
+
//------------------------------------------------------------------------
// LinkUnknown
//------------------------------------------------------------------------
public:
// Build a LinkUnknown with the specified action type.
- LinkUnknown(char *action1);
+ LinkUnknown(char *actionA);
// Destructor.
virtual ~LinkUnknown();
public:
// Construct a link, given its dictionary.
- Link(Dict *dict);
+ Link(Dict *dict, GString *baseURI);
// Destructor.
~Link();
// Was the link created successfully?
- GBool isOk() { return ok; }
+ GBool isOk() const { return ok; }
// Check if point is inside the link rectangle.
- GBool inRect(double x, double y)
+ GBool inRect(double x, double y) const
{ return x1 <= x && x <= x2 && y1 <= y && y <= y2; }
// Get action.
- LinkAction *getAction() { return action; }
+ LinkAction *getAction() const { return action; }
// Get border corners and width.
void getBorder(double *xa1, double *ya1, double *xa2, double *ya2,
- double *wa)
+ double *wa) const
{ *xa1 = x1; *ya1 = y1; *xa2 = x2; *ya2 = y2; *wa = borderW; }
private:
public:
// Extract links from array of annotations.
- Links(Object *annots);
+ Links(Object *annots, GString *baseURI);
// Destructor.
~Links();
// Iterate through list of links.
- int getNumLinks() { return numLinks; }
- Link *getLink(int i) { return links[i]; }
+ int getNumLinks() const { return numLinks; }
+ Link *getLink(int i) const { return links[i]; }
// If point <x>,<y> is in a link, return the associated action;
// else return NULL.
- LinkAction *find(double x, double y);
+ LinkAction *find(double x, double y) const;
// Return true if <x>,<y> is in a link.
- GBool onLink(double x, double y);
+ GBool onLink(double x, double y) const;
private: