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

📄 xpdfviewer.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 5 页
字号:
//========================================================================//// XPDFViewer.cc//// Copyright 2002-2003 Glyph & Cog, LLC////========================================================================#include <aconf.h>#ifdef USE_GCC_PRAGMAS#pragma implementation#endif#include <stdlib.h>#include <string.h>#include <ctype.h>#include <X11/keysym.h>#include <X11/cursorfont.h>#ifdef HAVE_X11_XPM_H#include <X11/xpm.h>#endif#if defined(__sgi) && (XmVERSION <= 1)#define Object XtObject#include <Sgm/HPanedW.h>#undef Object#endif#include "gmem.h"#include "gfile.h"#include "GString.h"#include "GList.h"#include "Error.h"#include "GlobalParams.h"#include "PDFDoc.h"#include "Link.h"#include "ErrorCodes.h"#include "Outline.h"#include "UnicodeMap.h"#ifndef DISABLE_OUTLINE#define Object XtObject#include "XPDFTree.h"#undef Object#endif#include "XPDFApp.h"#include "XPDFViewer.h"#include "PSOutputDev.h"#include "config.h"// these macro defns conflict with xpdf's Object class#ifdef LESSTIF_VERSION#undef XtDisplay#undef XtScreen#undef XtWindow#undef XtParent#undef XtIsRealized#endif#if XmVERSION <= 1#define XmSET   True#define XmUNSET False#endif// hack around old X includes which are missing these symbols#ifndef XK_Page_Up#define XK_Page_Up              0xFF55#endif#ifndef XK_Page_Down#define XK_Page_Down            0xFF56#endif#ifndef XK_KP_Home#define XK_KP_Home              0xFF95#endif#ifndef XK_KP_Left#define XK_KP_Left              0xFF96#endif#ifndef XK_KP_Up#define XK_KP_Up                0xFF97#endif#ifndef XK_KP_Right#define XK_KP_Right             0xFF98#endif#ifndef XK_KP_Down#define XK_KP_Down              0xFF99#endif#ifndef XK_KP_Prior#define XK_KP_Prior             0xFF9A#endif#ifndef XK_KP_Page_Up#define XK_KP_Page_Up           0xFF9A#endif#ifndef XK_KP_Next#define XK_KP_Next              0xFF9B#endif#ifndef XK_KP_Page_Down#define XK_KP_Page_Down         0xFF9B#endif#ifndef XK_KP_End#define XK_KP_End               0xFF9C#endif#ifndef XK_KP_Begin#define XK_KP_Begin             0xFF9D#endif#ifndef XK_KP_Insert#define XK_KP_Insert            0xFF9E#endif#ifndef XK_KP_Delete#define XK_KP_Delete            0xFF9F#endif//------------------------------------------------------------------------// GUI includes//------------------------------------------------------------------------#include "xpdfIcon.xpm"#include "leftArrow.xbm"#include "leftArrowDis.xbm"#include "dblLeftArrow.xbm"#include "dblLeftArrowDis.xbm"#include "rightArrow.xbm"#include "rightArrowDis.xbm"#include "dblRightArrow.xbm"#include "dblRightArrowDis.xbm"#include "backArrow.xbm"#include "backArrowDis.xbm"#include "forwardArrow.xbm"#include "forwardArrowDis.xbm"#include "find.xbm"#include "findDis.xbm"#include "print.xbm"#include "printDis.xbm"#include "about.xbm"#include "about-text.h"//------------------------------------------------------------------------struct ZoomMenuInfo {  char *label;  double zoom;};static ZoomMenuInfo zoomMenuInfo[nZoomMenuItems] = {  { "400%",      400 },  { "200%",      200 },  { "150%",      150 },  { "125%",      125 },  { "100%",      100 },  { "50%",        50 },  { "25%",        25 },  { "12.5%",      12.5 },  { "fit page",  zoomPage },  { "fit width", zoomWidth }};#define maxZoomIdx   0#define defZoomIdx   3#define minZoomIdx   7#define zoomPageIdx  8#define zoomWidthIdx 9//------------------------------------------------------------------------#define cmdMaxArgs 2XPDFViewerCmd XPDFViewer::cmdTab[] = {  { "about",                   0, gFalse, gFalse, &XPDFViewer::cmdAbout },  { "closeOutline",            0, gFalse, gFalse, &XPDFViewer::cmdCloseOutline },  { "closeWindow",             0, gFalse, gFalse, &XPDFViewer::cmdCloseWindow },  { "continuousMode",          0, gFalse, gFalse, &XPDFViewer::cmdContinuousMode },  { "endPan",                  0, gTrue,  gTrue,  &XPDFViewer::cmdEndPan },  { "endSelection",            0, gTrue,  gTrue,  &XPDFViewer::cmdEndSelection },  { "find",                    0, gTrue,  gFalse, &XPDFViewer::cmdFind },  { "findNext",                0, gTrue,  gFalse, &XPDFViewer::cmdFindNext },  { "focusToDocWin",           0, gFalse, gFalse, &XPDFViewer::cmdFocusToDocWin },  { "focusToPageNum",          0, gFalse, gFalse, &XPDFViewer::cmdFocusToPageNum },  { "followLink",              0, gTrue,  gTrue,  &XPDFViewer::cmdFollowLink },  { "followLinkInNewWin",      0, gTrue,  gTrue,  &XPDFViewer::cmdFollowLinkInNewWin },  { "followLinkInNewWinNoSel", 0, gTrue,  gTrue,  &XPDFViewer::cmdFollowLinkInNewWinNoSel },  { "followLinkNoSel",         0, gTrue,  gTrue,  &XPDFViewer::cmdFollowLinkNoSel },  { "fullScreenMode",          0, gFalse, gFalse, &XPDFViewer::cmdFullScreenMode },  { "goBackward",              0, gFalse, gFalse, &XPDFViewer::cmdGoBackward },  { "goForward",               0, gFalse, gFalse, &XPDFViewer::cmdGoForward },  { "gotoDest",                1, gTrue,  gFalse, &XPDFViewer::cmdGotoDest },  { "gotoLastPage",            0, gTrue,  gFalse, &XPDFViewer::cmdGotoLastPage },  { "gotoLastPageNoScroll",    0, gTrue,  gFalse, &XPDFViewer::cmdGotoLastPageNoScroll },  { "gotoPage",                1, gTrue,  gFalse, &XPDFViewer::cmdGotoPage },  { "gotoPageNoScroll",        1, gTrue,  gFalse, &XPDFViewer::cmdGotoPageNoScroll },  { "nextPage",                0, gTrue,  gFalse, &XPDFViewer::cmdNextPage },  { "nextPageNoScroll",        0, gTrue,  gFalse, &XPDFViewer::cmdNextPageNoScroll },  { "open",                    0, gFalse, gFalse, &XPDFViewer::cmdOpen },  { "openFile",                1, gFalse, gFalse, &XPDFViewer::cmdOpenFile },  { "openFileAtDest",          2, gFalse, gFalse, &XPDFViewer::cmdOpenFileAtDest },  { "openFileAtDestInNewWin",  2, gFalse, gFalse, &XPDFViewer::cmdOpenFileAtDestInNewWin },  { "openFileAtPage",          2, gFalse, gFalse, &XPDFViewer::cmdOpenFileAtPage },  { "openFileAtPageInNewWin",  2, gFalse, gFalse, &XPDFViewer::cmdOpenFileAtPageInNewWin },  { "openFileInNewWin",        1, gFalse, gFalse, &XPDFViewer::cmdOpenFileInNewWin },  { "openInNewWin",            0, gFalse, gFalse, &XPDFViewer::cmdOpenInNewWin },  { "openOutline",             0, gFalse, gFalse, &XPDFViewer::cmdOpenOutline },  { "pageDown",                0, gTrue,  gFalse, &XPDFViewer::cmdPageDown },  { "pageUp",                  0, gTrue,  gFalse, &XPDFViewer::cmdPageUp },  { "postPopupMenu",           0, gFalse, gTrue,  &XPDFViewer::cmdPostPopupMenu },  { "prevPage",                0, gTrue,  gFalse, &XPDFViewer::cmdPrevPage },  { "prevPageNoScroll",        0, gTrue,  gFalse, &XPDFViewer::cmdPrevPageNoScroll },  { "print",                   0, gTrue,  gFalse, &XPDFViewer::cmdPrint },  { "quit",                    0, gFalse, gFalse, &XPDFViewer::cmdQuit },  { "raise",                   0, gFalse, gFalse, &XPDFViewer::cmdRaise },  { "redraw",                  0, gTrue,  gFalse, &XPDFViewer::cmdRedraw },  { "reload",                  0, gTrue,  gFalse, &XPDFViewer::cmdReload },  { "run",                     1, gFalse, gFalse, &XPDFViewer::cmdRun },  { "scrollDown",              1, gTrue,  gFalse, &XPDFViewer::cmdScrollDown },  { "scrollDownNextPage",      1, gTrue,  gFalse, &XPDFViewer::cmdScrollDownNextPage },  { "scrollLeft",              1, gTrue,  gFalse, &XPDFViewer::cmdScrollLeft },  { "scrollOutlineDown",       1, gTrue,  gFalse, &XPDFViewer::cmdScrollOutlineDown },  { "scrollOutlineUp",         1, gTrue,  gFalse, &XPDFViewer::cmdScrollOutlineUp },  { "scrollRight",             1, gTrue,  gFalse, &XPDFViewer::cmdScrollRight },  { "scrollToBottomEdge",      0, gTrue,  gFalse, &XPDFViewer::cmdScrollToBottomEdge },  { "scrollToBottomRight",     0, gTrue,  gFalse, &XPDFViewer::cmdScrollToBottomRight },  { "scrollToLeftEdge",        0, gTrue,  gFalse, &XPDFViewer::cmdScrollToLeftEdge },  { "scrollToRightEdge",       0, gTrue,  gFalse, &XPDFViewer::cmdScrollToRightEdge },  { "scrollToTopEdge",         0, gTrue,  gFalse, &XPDFViewer::cmdScrollToTopEdge },  { "scrollToTopLeft",         0, gTrue,  gFalse, &XPDFViewer::cmdScrollToTopLeft },  { "scrollUp",                1, gTrue,  gFalse, &XPDFViewer::cmdScrollUp },  { "scrollUpPrevPage",        1, gTrue,  gFalse, &XPDFViewer::cmdScrollUpPrevPage },  { "singlePageMode",          0, gFalse, gFalse, &XPDFViewer::cmdSinglePageMode },  { "startPan",                0, gTrue,  gTrue,  &XPDFViewer::cmdStartPan },  { "startSelection",          0, gTrue,  gTrue,  &XPDFViewer::cmdStartSelection },  { "toggleContinuousMode",    0, gFalse, gFalse, &XPDFViewer::cmdToggleContinuousMode },  { "toggleFullScreenMode",    0, gFalse, gFalse, &XPDFViewer::cmdToggleFullScreenMode },  { "toggleOutline",           0, gFalse, gFalse, &XPDFViewer::cmdToggleOutline },  { "windowMode",              0, gFalse, gFalse, &XPDFViewer::cmdWindowMode },  { "zoomFitPage",             0, gFalse, gFalse, &XPDFViewer::cmdZoomFitPage },  { "zoomFitWidth",            0, gFalse, gFalse, &XPDFViewer::cmdZoomFitWidth },  { "zoomIn",                  0, gFalse, gFalse, &XPDFViewer::cmdZoomIn },  { "zoomOut",                 0, gFalse, gFalse, &XPDFViewer::cmdZoomOut },  { "zoomPercent",             1, gFalse, gFalse, &XPDFViewer::cmdZoomPercent },  { "zoomToSelection",         0, gTrue,  gFalse, &XPDFViewer::cmdZoomToSelection }};#define nCmds (sizeof(cmdTab) / sizeof(XPDFViewerCmd))//------------------------------------------------------------------------XPDFViewer::XPDFViewer(XPDFApp *appA, GString *fileName,		       int pageA, GString *destName, GBool fullScreen,		       GString *ownerPassword, GString *userPassword) {  LinkDest *dest;  int pg;  double z;  app = appA;  win = NULL;  core = NULL;  ok = gFalse;#ifndef DISABLE_OUTLINE  outlineLabels = NULL;  outlineLabelsLength = outlineLabelsSize = 0;  outlinePaneWidth = 175;#endif  // do Motif-specific initialization and create the window;  // this also creates the core object  initWindow(fullScreen);  initAboutDialog();  initFindDialog();  initPrintDialog();  openDialog = NULL;  saveAsDialog = NULL;  dest = NULL; // make gcc happy  pg = pageA; // make gcc happy  if (fileName) {    if (loadFile(fileName, ownerPassword, userPassword)) {      getPageAndDest(pageA, destName, &pg, &dest);#ifndef DISABLE_OUTLINE      if (outlineScroll != None &&	  core->getDoc()->getOutline()->getItems() &&	  core->getDoc()->getOutline()->getItems()->getLength() > 0) {	XtVaSetValues(outlineScroll, XmNwidth, outlinePaneWidth, NULL);      }#endif    } else {      return;    }  }  core->resizeToPage(pg);  // map the window -- we do this after calling resizeToPage to avoid  // an annoying on-screen resize  mapWindow();  // display the first page  z = core->getZoom();  if (dest) {    displayDest(dest, z, core->getRotate(), gTrue);    delete dest;  } else {    displayPage(pg, z, core->getRotate(), gTrue, gTrue);  }  ok = gTrue;}XPDFViewer::XPDFViewer(XPDFApp *appA, PDFDoc *doc, int pageA,		       GString *destName, GBool fullScreen) {  LinkDest *dest;  int pg;  double z;  app = appA;  win = NULL;  core = NULL;  ok = gFalse;#ifndef DISABLE_OUTLINE  outlineLabels = NULL;  outlineLabelsLength = outlineLabelsSize = 0;  outlinePaneWidth = 175;#endif  // do Motif-specific initialization and create the window;  // this also creates the core object  initWindow(fullScreen);  initAboutDialog();  initFindDialog();  initPrintDialog();  openDialog = NULL;  saveAsDialog = NULL;  dest = NULL; // make gcc happy  pg = pageA; // make gcc happy  if (doc) {    core->loadDoc(doc);    getPageAndDest(pageA, destName, &pg, &dest);#ifndef DISABLE_OUTLINE    if (outlineScroll != None &&	core->getDoc()->getOutline()->getItems() &&	core->getDoc()->getOutline()->getItems()->getLength() > 0) {      XtVaSetValues(outlineScroll, XmNwidth, outlinePaneWidth, NULL);    }#endif  }  core->resizeToPage(pg);  // map the window -- we do this after calling resizeToPage to avoid  // an annoying on-screen resize  mapWindow();  // display the first page  z = core->getZoom();  if (dest) {    displayDest(dest, z, core->getRotate(), gTrue);    delete dest;  } else {    displayPage(pg, z, core->getRotate(), gTrue, gTrue);  }  ok = gTrue;}XPDFViewer::~XPDFViewer() {  delete core;  XmFontListFree(aboutBigFont);  XmFontListFree(aboutVersionFont);  XmFontListFree(aboutFixedFont);  closeWindow();#ifndef DISABLE_OUTLINE  if (outlineLabels) {    gfree(outlineLabels);  }#endif}void XPDFViewer::open(GString *fileName, int pageA, GString *destName) {  LinkDest *dest;  int pg;  double z;  if (!core->getDoc() || fileName->cmp(core->getDoc()->getFileName())) {    if (!loadFile(fileName, NULL, NULL)) {      return;    }  }  getPageAndDest(pageA, destName, &pg, &dest);  z = core->getZoom();  if (dest) {    displayDest(dest, z, core->getRotate(), gTrue);    delete dest;  } else {    displayPage(pg, z, core->getRotate(), gTrue, gTrue);  }}void XPDFViewer::clear() {  char *title;  XmString s;  core->clear();  // set up title, number-of-pages display  title = app->getTitle() ? app->getTitle()->getCString()                          : (char *)xpdfAppName;  XtVaSetValues(win, XmNtitle, title, XmNiconName, title, NULL);  s = XmStringCreateLocalized("");  XtVaSetValues(pageNumText, XmNlabelString, s, NULL);  XmStringFree(s);  s = XmStringCreateLocalized(" of 0");  XtVaSetValues(pageCountLabel, XmNlabelString, s, NULL);  XmStringFree(s);  // disable buttons  XtVaSetValues(prevTenPageBtn, XmNsensitive, False, NULL);  XtVaSetValues(prevPageBtn, XmNsensitive, False, NULL);  XtVaSetValues(nextTenPageBtn, XmNsensitive, False, NULL);  XtVaSetValues(nextPageBtn, XmNsensitive, False, NULL);  // remove the old outline#ifndef DISABLE_OUTLINE  setupOutline();#endif}//------------------------------------------------------------------------// load / display//------------------------------------------------------------------------GBool XPDFViewer::loadFile(GString *fileName, GString *ownerPassword,			   GString *userPassword) {  return core->loadFile(fileName, ownerPassword, userPassword) == errNone;

⌨️ 快捷键说明

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