📄 xpdfviewer.cc
字号:
//========================================================================//// 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 + -