⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xpdfviewer.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 5 页
字号:
}void XPDFViewer::reloadFile() {  int pg;  if (!core->getDoc()) {    return;  }  pg = core->getPageNum();  loadFile(core->getDoc()->getFileName());  if (pg > core->getDoc()->getNumPages()) {    pg = core->getDoc()->getNumPages();  }  displayPage(pg, core->getZoom(), core->getRotate(), gFalse, gFalse);}void XPDFViewer::displayPage(int pageA, double zoomA, int rotateA,			     GBool scrollToTop, GBool addToHist) {  core->displayPage(pageA, zoomA, rotateA, scrollToTop, addToHist);}void XPDFViewer::displayDest(LinkDest *dest, double zoomA, int rotateA,			     GBool addToHist) {  core->displayDest(dest, zoomA, rotateA, addToHist);}void XPDFViewer::getPageAndDest(int pageA, GString *destName,				int *pageOut, LinkDest **destOut) {  Ref pageRef;  // find the page number for a named destination  *pageOut = pageA;  *destOut = NULL;  if (destName && (*destOut = core->getDoc()->findDest(destName))) {    if ((*destOut)->isPageRef()) {      pageRef = (*destOut)->getPageRef();      *pageOut = core->getDoc()->findPage(pageRef.num, pageRef.gen);    } else {      *pageOut = (*destOut)->getPageNum();    }  }  if (*pageOut <= 0) {    *pageOut = 1;  }  if (*pageOut > core->getDoc()->getNumPages()) {    *pageOut = core->getDoc()->getNumPages();  }}//------------------------------------------------------------------------// hyperlinks / actions//------------------------------------------------------------------------void XPDFViewer::doLink(int wx, int wy, GBool onlyIfNoSelection,			GBool newWin) {  XPDFViewer *newViewer;  LinkAction *action;  int pg, selPg;  double xu, yu, selULX, selULY, selLRX, selLRY;  if (core->getHyperlinksEnabled() &&      core->cvtWindowToUser(wx, wy, &pg, &xu, &yu) &&      !(onlyIfNoSelection &&	core->getSelection(&selPg, &selULX, &selULY, &selLRX, &selLRY))) {    if ((action = core->findLink(pg, xu, yu))) {      if (newWin &&	  core->getDoc()->getFileName() &&	  (action->getKind() == actionGoTo ||	   action->getKind() == actionGoToR ||	   (action->getKind() == actionNamed &&	    ((LinkNamed *)action)->getName()->cmp("Quit")))) {	newViewer = app->open(core->getDoc()->getFileName());	newViewer->core->doAction(action);      } else {	core->doAction(action);      }    }  }}void XPDFViewer::actionCbk(void *data, char *action) {  XPDFViewer *viewer = (XPDFViewer *)data;  if (!strcmp(action, "Quit")) {    viewer->app->quit();  }}//------------------------------------------------------------------------// keyboard/mouse input//------------------------------------------------------------------------void XPDFViewer::keyPressCbk(void *data, KeySym key, Guint modifiers,			     XEvent *event) {  XPDFViewer *viewer = (XPDFViewer *)data;  int keyCode;  GList *cmds;  int i;  if (key >= 0x20 && key <= 0xfe) {    keyCode = (int)key;  } else if (key == XK_Tab ||	     key == XK_KP_Tab) {    keyCode = xpdfKeyCodeTab;  } else if (key == XK_Return) {    keyCode = xpdfKeyCodeReturn;  } else if (key == XK_KP_Enter) {    keyCode = xpdfKeyCodeEnter;  } else if (key == XK_BackSpace) {    keyCode = xpdfKeyCodeBackspace;  } else if (key == XK_Insert ||	     key == XK_KP_Insert) {    keyCode = xpdfKeyCodeInsert;  } else if (key == XK_Delete ||	     key == XK_KP_Delete) {    keyCode = xpdfKeyCodeDelete;  } else if (key == XK_Home ||	     key == XK_KP_Home) {    keyCode = xpdfKeyCodeHome;  } else if (key == XK_End ||	     key == XK_KP_End) {    keyCode = xpdfKeyCodeEnd;  } else if (key == XK_Page_Up ||	     key == XK_KP_Page_Up) {    keyCode = xpdfKeyCodePgUp;  } else if (key == XK_Page_Down ||	     key == XK_KP_Page_Down) {    keyCode = xpdfKeyCodePgDn;  } else if (key == XK_Left ||	     key == XK_KP_Left) {    keyCode = xpdfKeyCodeLeft;  } else if (key == XK_Right ||	     key == XK_KP_Right) {    keyCode = xpdfKeyCodeRight;  } else if (key == XK_Up ||	     key == XK_KP_Up) {    keyCode = xpdfKeyCodeUp;  } else if (key == XK_Down ||	     key == XK_KP_Down) {    keyCode = xpdfKeyCodeDown;  } else if (key >= XK_F1 && key <= XK_F35) {    keyCode = xpdfKeyCodeF1 + (key - XK_F1);  } else {    return;  }  if ((cmds = globalParams->getKeyBinding(keyCode,					  viewer->getModifiers(modifiers),					  viewer->getContext(modifiers)))) {    for (i = 0; i < cmds->getLength(); ++i) {      viewer->execCmd((GString *)cmds->get(i), event);    }    deleteGList(cmds, GString);  }}void XPDFViewer::mouseCbk(void *data, XEvent *event) {  XPDFViewer *viewer = (XPDFViewer *)data;  int keyCode;  GList *cmds;  int i;  if (event->type == ButtonPress) {    if (event->xbutton.button >= 1 && event->xbutton.button <= 7) {      keyCode = xpdfKeyCodeMousePress1 + event->xbutton.button - 1;    } else {      return;    }  } else if (event->type == ButtonRelease) {    if (event->xbutton.button >= 1 && event->xbutton.button <= 7) {      keyCode = xpdfKeyCodeMouseRelease1 + event->xbutton.button - 1;    } else {      return;    }  } else {    return;  }  if ((cmds = globalParams->getKeyBinding(keyCode,					  viewer->getModifiers(						      event->xkey.state),					  viewer->getContext(						      event->xkey.state)))) {    for (i = 0; i < cmds->getLength(); ++i) {      viewer->execCmd((GString *)cmds->get(i), event);    }    deleteGList(cmds, GString);  }}int XPDFViewer::getModifiers(Guint modifiers) {  int mods;  mods = 0;  if (modifiers & ShiftMask) {    mods |= xpdfKeyModShift;  }  if (modifiers & ControlMask) {    mods |= xpdfKeyModCtrl;  }  if (modifiers & Mod1Mask) {    mods |= xpdfKeyModAlt;  }  return mods;}int XPDFViewer::getContext(Guint modifiers) {  int context;  context = (core->getFullScreen() ? xpdfKeyContextFullScreen                                   : xpdfKeyContextWindow) |            (core->getContinuousMode() ? xpdfKeyContextContinuous                                       : xpdfKeyContextSinglePage) |            (core->getLinkAction() ? xpdfKeyContextOverLink                                   : xpdfKeyContextOffLink) |            ((modifiers & Mod5Mask) ? xpdfKeyContextScrLockOn	                            : xpdfKeyContextScrLockOff);  return context;}void XPDFViewer::execCmd(GString *cmd, XEvent *event) {  GString *name;  GString *args[cmdMaxArgs];  char *p0, *p1;  int nArgs, i;  int a, b, m, cmp;  //----- parse the command  name = NULL;  nArgs = 0;  for (i = 0; i < cmdMaxArgs; ++i) {    args[i] = NULL;  }  p0 = cmd->getCString();  for (p1 = p0; *p1 && isalnum(*p1); ++p1) ;  if (p1 == p0) {    goto err1;  }  name = new GString(p0, p1 - p0);  if (*p1 == '(') {    while (nArgs < cmdMaxArgs) {      p0 = p1 + 1;      for (p1 = p0; *p1 && *p1 != ',' && *p1 != ')'; ++p1) ;      args[nArgs++] = new GString(p0, p1 - p0);      if (*p1 != ',') {	break;      }    }    if (*p1 != ')') {      goto err1;    }    ++p1;  }  if (*p1) {    goto err1;  }    //----- find the command  a = -1;  b = nCmds;  // invariant: cmdTab[a].name < name < cmdTab[b].name  while (b - a > 1) {    m = (a + b) / 2;    cmp = strcmp(cmdTab[m].name, name->getCString());    if (cmp < 0) {      a = m;    } else if (cmp > 0) {      b = m;    } else {      a = b = m;    }  }  if (cmp != 0) {    goto err1;  }  //----- execute the command  if (nArgs != cmdTab[a].nArgs ||      (cmdTab[a].requiresEvent && !event)) {    goto err1;  }  if (cmdTab[a].requiresDoc && !core->getDoc()) {    // don't issue an error message for this -- it happens, e.g., when    // clicking in a window with no open PDF file    goto err2;  }  (this->*cmdTab[a].func)(args, nArgs, event);  //----- clean up  delete name;  for (i = 0; i < nArgs; ++i) {    if (args[i]) {      delete args[i];    }  }  return; err1:  error(-1, "Invalid command syntax: '%s'", cmd->getCString()); err2:  if (name) {    delete name;  }  for (i = 0; i < nArgs; ++i) {    if (args[i]) {      delete args[i];    }  }}//------------------------------------------------------------------------// command functions//------------------------------------------------------------------------static int mouseX(XEvent *event) {  switch (event->type) {  case ButtonPress:  case ButtonRelease:    return event->xbutton.x;  case KeyPress:    return event->xkey.x;  }  return 0;}static int mouseY(XEvent *event) {  switch (event->type) {  case ButtonPress:  case ButtonRelease:    return event->xbutton.y;  case KeyPress:    return event->xkey.y;  }  return 0;}void XPDFViewer::cmdAbout(GString *args[], int nArgs,			  XEvent *event) {  XtManageChild(aboutDialog);}void XPDFViewer::cmdCloseOutline(GString *args[], int nArgs,				 XEvent *event) {#ifndef DISABLE_OUTLINE  Dimension w;  if (outlineScroll == None) {    return;  }  XtVaGetValues(outlineScroll, XmNwidth, &w, NULL);  if (w > 1) {    outlinePaneWidth = w;    // this ugly kludge is apparently the only way to resize the panes    // within an XmPanedWindow    XtVaSetValues(outlineScroll, XmNpaneMinimum, 1,		  XmNpaneMaximum, 1, NULL);    XtVaSetValues(outlineScroll, XmNpaneMinimum, 1,		  XmNpaneMaximum, 10000, NULL);  }#endif}void XPDFViewer::cmdCloseWindow(GString *args[], int nArgs,				XEvent *event) {  app->close(this, gFalse);}void XPDFViewer::cmdContinuousMode(GString *args[], int nArgs,				   XEvent *event) {  Widget btn;  if (core->getContinuousMode()) {    return;  }  core->setContinuousMode(gTrue);  btn = XtNameToWidget(popupMenu, "continuousMode");  XtVaSetValues(btn, XmNset, XmSET, NULL);}void XPDFViewer::cmdEndPan(GString *args[], int nArgs,			   XEvent *event) {  core->endPan(mouseX(event), mouseY(event));}void XPDFViewer::cmdEndSelection(GString *args[], int nArgs,				 XEvent *event) {  core->endSelection(mouseX(event), mouseY(event));}void XPDFViewer::cmdFind(GString *args[], int nArgs,			 XEvent *event) {  mapFindDialog();}void XPDFViewer::cmdFindNext(GString *args[], int nArgs,			     XEvent *event) {  doFind(gTrue);}void XPDFViewer::cmdFocusToDocWin(GString *args[], int nArgs,				  XEvent *event) {  core->takeFocus();}void XPDFViewer::cmdFocusToPageNum(GString *args[], int nArgs,				   XEvent *event) {  XmTextFieldSetSelection(pageNumText, 0,			  strlen(XmTextFieldGetString(pageNumText)),			  XtLastTimestampProcessed(display));  XmProcessTraversal(pageNumText, XmTRAVERSE_CURRENT);}void XPDFViewer::cmdFollowLink(GString *args[], int nArgs,			       XEvent *event) {  doLink(mouseX(event), mouseY(event), gFalse, gFalse);}void XPDFViewer::cmdFollowLinkInNewWin(GString *args[], int nArgs,				       XEvent *event) {  doLink(mouseX(event), mouseY(event), gFalse, gTrue);}void XPDFViewer::cmdFollowLinkInNewWinNoSel(GString *args[], int nArgs,					    XEvent *event) {  doLink(mouseX(event), mouseY(event), gTrue, gTrue);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -