-}
-
-static void doLink(int mx, int my) {
- LinkActionKind kind;
- LinkAction *action = NULL;
- LinkDest *dest;
- GString *namedDest;
- char *s;
- GString *fileName;
- Ref pageRef;
- int pg;
- double x, y;
- int dx, dy;
- LTKButtonDialog *dialog;
-
- // look for a link
- out->cvtDevToUser(mx, my, &x, &y);
- if ((action = doc->findLink(x, y))) {
- switch (kind = action->getKind()) {
-
- // GoTo / GoToR action
- case actionGoTo:
- case actionGoToR:
- if (kind == actionGoTo) {
- dest = NULL;
- namedDest = NULL;
- if ((dest = ((LinkGoTo *)action)->getDest()))
- dest = dest->copy();
- else if ((namedDest = ((LinkGoTo *)action)->getNamedDest()))
- namedDest = namedDest->copy();
- } else {
- dest = NULL;
- namedDest = NULL;
- if ((dest = ((LinkGoToR *)action)->getDest()))
- dest = dest->copy();
- else if ((namedDest = ((LinkGoToR *)action)->getNamedDest()))
- namedDest = namedDest->copy();
- s = ((LinkGoToR *)action)->getFileName()->getCString();
- //~ translate path name for VMS (deal with '/')
- if (isAbsolutePath(s))
- fileName = new GString(s);
- else
- fileName = appendToPath(
- grabPath(doc->getFileName()->getCString()), s);
- if (!loadFile(fileName)) {
- if (dest)
- delete dest;
- if (namedDest)
- delete namedDest;
- return;
- }
- }
- if (namedDest) {
- dest = doc->findDest(namedDest);
- delete namedDest;
- }
- if (!dest) {
- if (kind == actionGoToR)
- displayPage(1, zoom, 0);
- } else {
- if (dest->isPageRef()) {
- pageRef = dest->getPageRef();
- pg = doc->findPage(pageRef.num, pageRef.gen);
- } else {
- pg = dest->getPageNum();
- }
- if (pg > 0 && pg != page)
- displayPage(pg, zoom, rotate);
- else if (pg <= 0)
- displayPage(1, zoom, rotate);
- switch (dest->getKind()) {
- case destXYZ:
- out->cvtUserToDev(dest->getLeft(), dest->getTop(), &dx, &dy);
- if (dest->getChangeLeft() || dest->getChangeTop()) {
- if (dest->getChangeLeft())
- hScrollbar->setPos(dx, canvas->getWidth());
- if (dest->getChangeTop())
- vScrollbar->setPos(dy, canvas->getHeight());
- canvas->scroll(hScrollbar->getPos(), vScrollbar->getPos());
- }
- //~ what is the zoom parameter?
- break;
- case destFit:
- case destFitB:
- //~ do fit
- hScrollbar->setPos(0, canvas->getWidth());
- vScrollbar->setPos(0, canvas->getHeight());
- canvas->scroll(hScrollbar->getPos(), vScrollbar->getPos());
- break;
- case destFitH:
- case destFitBH:
- //~ do fit
- out->cvtUserToDev(0, dest->getTop(), &dx, &dy);
- hScrollbar->setPos(0, canvas->getWidth());
- vScrollbar->setPos(dy, canvas->getHeight());
- canvas->scroll(hScrollbar->getPos(), vScrollbar->getPos());
- break;
- case destFitV:
- case destFitBV:
- //~ do fit
- out->cvtUserToDev(dest->getLeft(), 0, &dx, &dy);
- hScrollbar->setPos(dx, canvas->getWidth());
- vScrollbar->setPos(0, canvas->getHeight());
- canvas->scroll(hScrollbar->getPos(), vScrollbar->getPos());
- break;
- case destFitR:
- //~ do fit
- out->cvtUserToDev(dest->getLeft(), dest->getTop(), &dx, &dy);
- hScrollbar->setPos(dx, canvas->getWidth());
- vScrollbar->setPos(dy, canvas->getHeight());
- canvas->scroll(hScrollbar->getPos(), vScrollbar->getPos());
- break;
- }
- delete dest;
- }
- break;
-
- // Launch action
- case actionLaunch:
- fileName = ((LinkLaunch *)action)->getFileName();
- s = fileName->getCString();
- if (!strcmp(s + fileName->getLength() - 4, ".pdf") ||
- !strcmp(s + fileName->getLength() - 4, ".PDF")) {
- //~ translate path name for VMS (deal with '/')
- if (isAbsolutePath(s))
- fileName = fileName->copy();
- else
- fileName = appendToPath(
- grabPath(doc->getFileName()->getCString()), s);
- if (!loadFile(fileName))
- return;
- displayPage(1, zoom, rotate);
- } else {
- fileName = fileName->copy();
- if (((LinkLaunch *)action)->getParams()) {
- fileName->append(' ');
- fileName->append(((LinkLaunch *)action)->getParams());
- }
-#ifdef VMS
- fileName->insert(0, "spawn/nowait ");
-#elif defined(__EMX__)
- fileName->insert(0, "start /min /n ");
-#else
- fileName->append(" &");
-#endif
- dialog = new LTKButtonDialog(win, "xpdf: Launch",
- "Execute the command:",
- fileName->getCString(),
- NULL, "Ok", "Cancel");
- if (dialog->go())
- system(fileName->getCString());
- delete dialog;
- delete fileName;
- }
- break;
-
- // URI action
- case actionURI:
- if (urlCommand) {
- for (s = urlCommand->getCString(); *s; ++s) {
- if (s[0] == '%' && s[1] == 's')
- break;
- }
- if (s) {
- fileName = new GString(urlCommand->getCString(),
- s - urlCommand->getCString());
- fileName->append(((LinkURI *)action)->getURI());
- fileName->append(s+2);
- } else {
- fileName = urlCommand->copy();
- }
-#ifdef VMS
- fileName->insert(0, "spawn/nowait ");
-#elif defined(__EMX__)
- fileName->insert(0, "start /min /n ");
-#else
- fileName->append(" &");
-#endif
- system(fileName->getCString());
- delete fileName;
- } else {
- fprintf(errFile, "URI: %s\n",
- ((LinkURI *)action)->getURI()->getCString());
- }
- break;
-
- // unknown action type
- case actionUnknown:
- error(-1, "Unknown link action type: '%s'",
- ((LinkUnknown *)action)->getAction()->getCString());
- break;