diff options
Diffstat (limited to 'filters/kword/pdf/xpdf/xpdf/XPDFViewer.cpp')
-rw-r--r-- | filters/kword/pdf/xpdf/xpdf/XPDFViewer.cpp | 2318 |
1 files changed, 2318 insertions, 0 deletions
diff --git a/filters/kword/pdf/xpdf/xpdf/XPDFViewer.cpp b/filters/kword/pdf/xpdf/xpdf/XPDFViewer.cpp new file mode 100644 index 000000000..8327a7a22 --- /dev/null +++ b/filters/kword/pdf/xpdf/xpdf/XPDFViewer.cpp @@ -0,0 +1,2318 @@ +//======================================================================== +// +// XPDFViewer.cpp +// +// Copyright 2002 Glyph & Cog, LLC +// +//======================================================================== + +#include <aconf.h> + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <X11/cursorfont.h> +#ifdef HAVE_X11_XPM_H +#include <X11/xpm.h> +#endif +#include "gmem.h" +#include "gfile.h" +#include "GString.h" +#include "GList.h" +#include "Error.h" +#include "GlobalParams.h" +#include "PDFDoc.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 "XPixmapOutputDev.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 + +//------------------------------------------------------------------------ +// 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" + +//------------------------------------------------------------------------ + +XPDFViewer::XPDFViewer(XPDFApp *appA, GString *fileName, + int pageA, GString *destName, + GString *ownerPassword, GString *userPassword) { + LinkDest *dest; + int pg, z; + GString *dir; + + app = appA; + win = NULL; + core = NULL; + password = NULL; + ok = gFalse; +#ifndef DISABLE_OUTLINE + outlineLabels = NULL; + outlineLabelsLength = outlineLabelsSize = 0; +#endif + + // do Motif-specific initialization and create the window; + // this also creates the core object + initWindow(); + initAboutDialog(); + initOpenDialog(); + initFindDialog(); + initSaveAsDialog(); + initPrintDialog(); + initPasswordDialog(); + + dest = NULL; // make gcc happy + pg = pageA; // make gcc happy + + if (fileName) { + if (loadFile(fileName, ownerPassword, userPassword)) { + getPageAndDest(pageA, destName, &pg, &dest); + if (pg > 0) { + core->resizeToPage(pg); + } + dir = makePathAbsolute(grabPath(fileName->getCString())); + setOpenDialogDir(dir->getCString()); + setSaveAsDialogDir(dir->getCString()); + delete dir; + } else { + return; + } + } + + // map the window -- we do this after calling resizeToPage to avoid + // an annoying on-screen resize + mapWindow(); + + // display the first page + z = app->getFullScreen() ? zoomPage : 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 + if (password) { + delete password; + } +} + +void XPDFViewer::open(GString *fileName, int pageA, GString *destName) { + LinkDest *dest; + int pg, z; + + if (!core->getDoc() || fileName->cmp(core->getDoc()->getFileName())) { + if (!loadFile(fileName, NULL, NULL)) { + return; + } + } + getPageAndDest(pageA, destName, &pg, &dest); + z = app->getFullScreen() ? zoomPage : 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); +} + +//------------------------------------------------------------------------ +// load / display +//------------------------------------------------------------------------ + +GBool XPDFViewer::loadFile(GString *fileName, GString *ownerPassword, + GString *userPassword) { + return core->loadFile(fileName, ownerPassword, userPassword) == errNone; +} + +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, int zoomA, int rotateA, + GBool scrollToTop, GBool addToHist) { + core->displayPage(pageA, zoomA, rotateA, scrollToTop, addToHist); +} + +void XPDFViewer::displayDest(LinkDest *dest, int 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(); + } +} + +//------------------------------------------------------------------------ +// password dialog +//------------------------------------------------------------------------ + +GString *XPDFViewer::reqPasswordCbk(void *data, GBool again) { + XPDFViewer *viewer = (XPDFViewer *)data; + + viewer->getPassword(again); + return viewer->password; +} + +//------------------------------------------------------------------------ +// actions +//------------------------------------------------------------------------ + +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, char *s, KeySym key, + Guint modifiers) { + XPDFViewer *viewer = (XPDFViewer *)data; + int z; + + if (s[0]) { + switch (s[0]) { + case 'O': + case 'o': + viewer->mapOpenDialog(gFalse); + break; + case 'R': + case 'r': + viewer->reloadFile(); + break; + case 'F': + case 'f': + case '\006': // ctrl-F + if (viewer->core->getDoc()) { + XtManageChild(viewer->findDialog); + } + break; + case '\007': // ctrl-G + if (viewer->core->getDoc()) { + XPDFViewer::findFindCbk(None, viewer, NULL); + } + break; + case '\020': // ctrl-P + if (viewer->core->getDoc()) { + XtManageChild(viewer->printDialog); + } + break; + case 'N': + case 'n': + viewer->core->gotoNextPage(1, !(modifiers & Mod5Mask)); + break; + case 'P': + case 'p': + viewer->core->gotoPrevPage(1, !(modifiers & Mod5Mask), gFalse); + break; + case ' ': + if (viewer->app->getFullScreen()) { + viewer->core->gotoNextPage(1, gTrue); + } else { + viewer->core->scrollPageDown(); + } + break; + case '\b': // bs + case '\177': // del + if (viewer->app->getFullScreen()) { + viewer->core->gotoPrevPage(1, gTrue, gFalse); + } else { + viewer->core->scrollPageUp(); + } + break; + case 'v': + viewer->core->goForward(); + break; + case 'b': + viewer->core->goBackward(); + break; + case 'g': + if (!viewer->app->getFullScreen()) { + XmTextFieldSetSelection( + viewer->pageNumText, 0, + strlen(XmTextFieldGetString(viewer->pageNumText)), + XtLastTimestampProcessed(viewer->display)); + XmProcessTraversal(viewer->pageNumText, XmTRAVERSE_CURRENT); + } + break; + case 'h': // vi-style left + if (!viewer->app->getFullScreen() && viewer->app->getViKeys()) { + viewer->core->scrollLeft(); + } + break; + case 'l': // vi-style right + if (!viewer->app->getFullScreen() && viewer->app->getViKeys()) { + viewer->core->scrollRight(); + } + break; + case 'k': // vi-style up + if (!viewer->app->getFullScreen() && viewer->app->getViKeys()) { + viewer->core->scrollUp(); + } + break; + case 'j': // vi-style down + if (!viewer->app->getFullScreen() && viewer->app->getViKeys()) { + viewer->core->scrollDown(); + } + break; + case '0': + if (!viewer->app->getFullScreen() && + viewer->core->getZoom() != defZoom) { + XtVaSetValues(viewer->zoomMenu, + XmNmenuHistory, viewer->getZoomMenuBtn(defZoom), + NULL); + viewer->displayPage(viewer->core->getPageNum(), defZoom, + viewer->core->getRotate(), gTrue, gFalse); + } + break; + case '+': + if (!viewer->app->getFullScreen() && + viewer->core->getZoom() >= minZoom && + viewer->core->getZoom() < maxZoom) { + z = viewer->core->getZoom() + 1; + XtVaSetValues(viewer->zoomMenu, + XmNmenuHistory, viewer->getZoomMenuBtn(z), + NULL); + viewer->displayPage(viewer->core->getPageNum(), z, + viewer->core->getRotate(), gTrue, gFalse); + } + break; + case '-': + if (!viewer->app->getFullScreen() && + viewer->core->getZoom() > minZoom && + viewer->core->getZoom() <= maxZoom) { + z = viewer->core->getZoom() - 1; + XtVaSetValues(viewer->zoomMenu, + XmNmenuHistory, viewer->getZoomMenuBtn(z), + NULL); + viewer->displayPage(viewer->core->getPageNum(), z, + viewer->core->getRotate(), gTrue, gFalse); + } + break; + case 'z': + if (!viewer->app->getFullScreen() && + viewer->core->getZoom() != zoomPage) { + XtVaSetValues(viewer->zoomMenu, + XmNmenuHistory, viewer->getZoomMenuBtn(zoomPage), + NULL); + viewer->displayPage(viewer->core->getPageNum(), zoomPage, + viewer->core->getRotate(), gTrue, gFalse); + } + break; + case 'w': + if (!viewer->app->getFullScreen() && + viewer->core->getZoom() != zoomWidth) { + XtVaSetValues(viewer->zoomMenu, + XmNmenuHistory, viewer->getZoomMenuBtn(zoomWidth), + NULL); + viewer->displayPage(viewer->core->getPageNum(), zoomWidth, + viewer->core->getRotate(), gTrue, gFalse); + } + break; + case '\014': // ^L + viewer->displayPage(viewer->core->getPageNum(), viewer->core->getZoom(), + viewer->core->getRotate(), gFalse, gFalse); + break; + case '\027': // ^W + viewer->app->close(viewer, gFalse); + break; + case '?': + XtManageChild(viewer->aboutDialog); + break; + case 'Q': + case 'q': + viewer->app->quit(); + break; + } + } +} + +void XPDFViewer::mouseCbk(void *data, XEvent *event) { + XPDFViewer *viewer = (XPDFViewer *)data; + + if (event->type == ButtonPress && event->xbutton.button == 3) { + XmMenuPosition(viewer->popupMenu, &event->xbutton); + XtManageChild(viewer->popupMenu); + } +} + +//------------------------------------------------------------------------ +// GUI code: main window +//------------------------------------------------------------------------ + +void XPDFViewer::initWindow() { + Widget btn, label, menuPane, lastBtn; +#ifndef DISABLE_OUTLINE + Widget clipWin; +#endif + Colormap colormap; + XColor xcol; + Arg args[20]; + int n; + char *title; + XmString s, s2, emptyString; + char buf[16]; + int i; + + display = XtDisplay(app->getAppShell()); + screenNum = XScreenNumberOfScreen(XtScreen(app->getAppShell())); + + // private colormap + if (app->getInstallCmap()) { + XtVaGetValues(app->getAppShell(), XmNcolormap, &colormap, NULL); + // ensure that BlackPixel and WhitePixel are reserved in the + // new colormap + xcol.red = xcol.green = xcol.blue = 0; + XAllocColor(display, colormap, &xcol); + xcol.red = xcol.green = xcol.blue = 65535; + XAllocColor(display, colormap, &xcol); + colormap = XCopyColormapAndFree(display, colormap); + } + + // top-level window + n = 0; + title = app->getTitle() ? app->getTitle()->getCString() + : (char *)xpdfAppName; + XtSetArg(args[n], XmNtitle, title); ++n; + XtSetArg(args[n], XmNiconName, title); ++n; + XtSetArg(args[n], XmNminWidth, 100); ++n; + XtSetArg(args[n], XmNminHeight, 100); ++n; + XtSetArg(args[n], XmNbaseWidth, 0); ++n; + XtSetArg(args[n], XmNbaseHeight, 0); ++n; + XtSetArg(args[n], XmNdeleteResponse, XmDO_NOTHING); ++n; + if (app->getFullScreen()) { + XtSetArg(args[n], XmNmwmDecorations, 0); ++n; + XtSetArg(args[n], XmNgeometry, "+0+0"); ++n; + } else if (app->getGeometry()) { + XtSetArg(args[n], XmNgeometry, app->getGeometry()->getCString()); ++n; + } + win = XtCreatePopupShell("win", topLevelShellWidgetClass, + app->getAppShell(), args, n); + if (app->getInstallCmap()) { + XtVaSetValues(win, XmNcolormap, colormap, NULL); + } + XmAddWMProtocolCallback(win, XInternAtom(display, "WM_DELETE_WINDOW", False), + &closeMsgCbk, this); + + // form + n = 0; + form = XmCreateForm(win, "form", args, n); + XtManageChild(form); + + // toolbar + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + toolBar = XmCreateForm(form, "toolBar", args, n); + XtManageChild(toolBar); + + // create an empty string -- this is used for buttons that will get + // pixmaps later + emptyString = XmStringCreateLocalized(""); + + // page movement buttons + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + XtSetArg(args[n], XmNsensitive, False); ++n; + XtSetArg(args[n], XmNlabelString, emptyString); ++n; + backBtn = XmCreatePushButton(toolBar, "back", args, n); + XtManageChild(backBtn); + XtAddCallback(backBtn, XmNactivateCallback, + &backCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, backBtn); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + XtSetArg(args[n], XmNsensitive, False); ++n; + XtSetArg(args[n], XmNlabelString, emptyString); ++n; + prevTenPageBtn = XmCreatePushButton(toolBar, "prevTenPage", args, n); + XtManageChild(prevTenPageBtn); + XtAddCallback(prevTenPageBtn, XmNactivateCallback, + &prevTenPageCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, prevTenPageBtn); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + XtSetArg(args[n], XmNsensitive, False); ++n; + XtSetArg(args[n], XmNlabelString, emptyString); ++n; + prevPageBtn = XmCreatePushButton(toolBar, "prevPage", args, n); + XtManageChild(prevPageBtn); + XtAddCallback(prevPageBtn, XmNactivateCallback, + &prevPageCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, prevPageBtn); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + XtSetArg(args[n], XmNsensitive, False); ++n; + XtSetArg(args[n], XmNlabelString, emptyString); ++n; + nextPageBtn = XmCreatePushButton(toolBar, "nextPage", args, n); + XtManageChild(nextPageBtn); + XtAddCallback(nextPageBtn, XmNactivateCallback, + &nextPageCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, nextPageBtn); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + XtSetArg(args[n], XmNsensitive, False); ++n; + XtSetArg(args[n], XmNlabelString, emptyString); ++n; + nextTenPageBtn = XmCreatePushButton(toolBar, "nextTenPage", args, n); + XtManageChild(nextTenPageBtn); + XtAddCallback(nextTenPageBtn, XmNactivateCallback, + &nextTenPageCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, nextTenPageBtn); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + XtSetArg(args[n], XmNsensitive, False); ++n; + XtSetArg(args[n], XmNlabelString, emptyString); ++n; + forwardBtn = XmCreatePushButton(toolBar, "forward", args, n); + XtManageChild(forwardBtn); + XtAddCallback(forwardBtn, XmNactivateCallback, + &forwardCbk, (XtPointer)this); + + // page number display + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, forwardBtn); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + s = XmStringCreateLocalized("Page "); + XtSetArg(args[n], XmNlabelString, s); ++n; + label = XmCreateLabel(toolBar, "pageLabel", args, n); + XmStringFree(s); + XtManageChild(label); + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, label); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 3); ++n; + XtSetArg(args[n], XmNmarginHeight, 3); ++n; + XtSetArg(args[n], XmNcolumns, 5); ++n; + pageNumText = XmCreateTextField(toolBar, "pageNum", args, n); + XtManageChild(pageNumText); + XtAddCallback(pageNumText, XmNactivateCallback, + &pageNumCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, pageNumText); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + s = XmStringCreateLocalized(" of 00000"); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); ++n; + XtSetArg(args[n], XmNrecomputeSize, False); ++n; + pageCountLabel = XmCreateLabel(toolBar, "pageCountLabel", args, n); + XmStringFree(s); + XtManageChild(pageCountLabel); + s = XmStringCreateLocalized(" of 0"); + XtVaSetValues(pageCountLabel, XmNlabelString, s, NULL); + XmStringFree(s); + + // zoom menu + n = 0; + menuPane = XmCreatePulldownMenu(toolBar, "zoomMenuPane", args, n); + for (i = minZoom; i <= maxZoom; ++i) { + n = 0; + sprintf(buf, "%s%d", i > 0 ? "+" : "", i); + s = XmStringCreateLocalized(buf); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNuserData, (XtPointer)i); ++n; + sprintf(buf, "zoom%s%d", i < 0 ? "M" : "", i < 0 ? -i : i); + btn = XmCreatePushButton(menuPane, buf, args, n); + XmStringFree(s); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &zoomMenuCbk, (XtPointer)this); + zoomMenuBtns[i - minZoom] = btn; + } + n = 0; + s = XmStringCreateLocalized("fit page"); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNuserData, (XtPointer)zoomPage); ++n; + btn = XmCreatePushButton(menuPane, "zoomPage", args, n); + XmStringFree(s); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &zoomMenuCbk, (XtPointer)this); + zoomMenuBtns[maxZoom - minZoom + 1] = btn; + n = 0; + s = XmStringCreateLocalized("fit width"); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNuserData, (XtPointer)zoomWidth); ++n; + btn = XmCreatePushButton(menuPane, "zoomWidth", args, n); + XmStringFree(s); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &zoomMenuCbk, (XtPointer)this); + zoomMenuBtns[maxZoom - minZoom + 2] = btn; + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, pageCountLabel); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 0); ++n; + XtSetArg(args[n], XmNmarginHeight, 0); ++n; + XtSetArg(args[n], XmNsubMenuId, menuPane); ++n; + zoomMenu = XmCreateOptionMenu(toolBar, "zoomMenu", args, n); + XtManageChild(zoomMenu); + + // find/print/about buttons + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, zoomMenu); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + XtSetArg(args[n], XmNlabelString, emptyString); ++n; + findBtn = XmCreatePushButton(toolBar, "find", args, n); + XtManageChild(findBtn); + XtAddCallback(findBtn, XmNactivateCallback, + &findCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, findBtn); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + XtSetArg(args[n], XmNlabelString, emptyString); ++n; + printBtn = XmCreatePushButton(toolBar, "print", args, n); + XtManageChild(printBtn); + XtAddCallback(printBtn, XmNactivateCallback, + &printCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, printBtn); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + XtSetArg(args[n], XmNlabelString, emptyString); ++n; + aboutBtn = XmCreatePushButton(toolBar, "about", args, n); + XtManageChild(aboutBtn); + XtAddCallback(aboutBtn, XmNactivateCallback, + &aboutCbk, (XtPointer)this); + lastBtn = aboutBtn; + + // quit button + n = 0; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNmarginWidth, 6); ++n; + s = XmStringCreateLocalized("Quit"); + XtSetArg(args[n], XmNlabelString, s); ++n; + quitBtn = XmCreatePushButton(toolBar, "quit", args, n); + XmStringFree(s); + XtManageChild(quitBtn); + XtAddCallback(quitBtn, XmNactivateCallback, + &quitCbk, (XtPointer)this); + + // link label + n = 0; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNleftWidget, lastBtn); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightWidget, btn); ++n; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + s = XmStringCreateLocalized(""); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNrecomputeSize, True); ++n; + XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); ++n; + linkLabel = XmCreateLabel(toolBar, "linkLabel", args, n); + XmStringFree(s); + XtManageChild(linkLabel); + +#ifndef DISABLE_OUTLINE + if (app->getFullScreen()) { +#endif + + // core + core = new XPDFCore(win, form, app->getPaperColor(), + app->getFullScreen(), app->getReverseVideo(), + app->getInstallCmap(), app->getRGBCubeSize()); + core->setUpdateCbk(&updateCbk, this); + core->setActionCbk(&actionCbk, this); + core->setKeyPressCbk(&keyPressCbk, this); + core->setMouseCbk(&mouseCbk, this); + core->setReqPasswordCbk(&reqPasswordCbk, this); + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNbottomWidget, toolBar); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetValues(core->getWidget(), args, n); + +#ifndef DISABLE_OUTLINE + } else { + + // paned window + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNbottomWidget, toolBar); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; + panedWin = XmCreatePanedWindow(form, "panedWin", args, n); + XtManageChild(panedWin); + + // scrolled window for outline container + n = 0; + XtSetArg(args[n], XmNpositionIndex, 0); ++n; + XtSetArg(args[n], XmNallowResize, True); ++n; + XtSetArg(args[n], XmNpaneMinimum, 1); ++n; + XtSetArg(args[n], XmNpaneMaximum, 10000); ++n; + XtSetArg(args[n], XmNwidth, 1); ++n; + XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); ++n; + outlineScroll = XmCreateScrolledWindow(panedWin, "outlineScroll", args, n); + XtManageChild(outlineScroll); + XtVaGetValues(outlineScroll, XmNclipWindow, &clipWin, NULL); + XtVaSetValues(clipWin, XmNbackground, app->getPaperColor(), NULL); + + // outline tree + n = 0; + XtSetArg(args[n], XmNbackground, app->getPaperColor()); ++n; + outlineTree = XPDFCreateTree(outlineScroll, "outlineTree", args, n); + XtManageChild(outlineTree); + XtAddCallback(outlineTree, XPDFNselectionCallback, &outlineSelectCbk, + (XtPointer)this); + + // core + core = new XPDFCore(win, panedWin, app->getPaperColor(), + app->getFullScreen(), app->getReverseVideo(), + app->getInstallCmap(), app->getRGBCubeSize()); + core->setUpdateCbk(&updateCbk, this); + core->setActionCbk(&actionCbk, this); + core->setKeyPressCbk(&keyPressCbk, this); + core->setMouseCbk(&mouseCbk, this); + core->setReqPasswordCbk(&reqPasswordCbk, this); + n = 0; + XtSetArg(args[n], XmNpositionIndex, 1); ++n; + XtSetArg(args[n], XmNallowResize, True); ++n; + XtSetArg(args[n], XmNpaneMinimum, 1); ++n; + XtSetArg(args[n], XmNpaneMaximum, 10000); ++n; + XtSetValues(core->getWidget(), args, n); + } +#endif + + // set the zoom menu to match the initial zoom setting + XtVaSetValues(zoomMenu, XmNmenuHistory, + getZoomMenuBtn(core->getZoom()), NULL); + + // set traversal order + XtVaSetValues(core->getDrawAreaWidget(), + XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, NULL); + XtVaSetValues(backBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(prevTenPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(prevPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(nextPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(nextTenPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(forwardBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(pageNumText, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(zoomMenu, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(findBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(printBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(aboutBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + XtVaSetValues(quitBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, + NULL); + + // popup menu + n = 0; + XtSetArg(args[n], XmNmenuPost, "<Btn3Down>"); ++n; + popupMenu = XmCreatePopupMenu(core->getDrawAreaWidget(), "popupMenu", + args, n); + n = 0; + s = XmStringCreateLocalized("Open..."); + XtSetArg(args[n], XmNlabelString, s); ++n; + s2 = XmStringCreateLocalized("O"); + XtSetArg(args[n], XmNacceleratorText, s2); ++n; + btn = XmCreatePushButton(popupMenu, "open", args, n); + XmStringFree(s); + XmStringFree(s2); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &openCbk, (XtPointer)this); + n = 0; + s = XmStringCreateLocalized("Open in new window..."); + XtSetArg(args[n], XmNlabelString, s); ++n; + btn = XmCreatePushButton(popupMenu, "openInNewWindow", args, n); + XmStringFree(s); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &openInNewWindowCbk, (XtPointer)this); + n = 0; + s = XmStringCreateLocalized("Reload"); + XtSetArg(args[n], XmNlabelString, s); ++n; + s2 = XmStringCreateLocalized("R"); + XtSetArg(args[n], XmNacceleratorText, s2); ++n; + btn = XmCreatePushButton(popupMenu, "reload", args, n); + XmStringFree(s); + XmStringFree(s2); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &reloadCbk, (XtPointer)this); + n = 0; + s = XmStringCreateLocalized("Save as..."); + XtSetArg(args[n], XmNlabelString, s); ++n; + btn = XmCreatePushButton(popupMenu, "saveAs", args, n); + XmStringFree(s); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &saveAsCbk, (XtPointer)this); + n = 0; + btn = XmCreateSeparator(popupMenu, "sep1", args, n); + XtManageChild(btn); + n = 0; + s = XmStringCreateLocalized("Rotate counterclockwise"); + XtSetArg(args[n], XmNlabelString, s); ++n; + btn = XmCreatePushButton(popupMenu, "rotateCCW", args, n); + XmStringFree(s); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &rotateCCWCbk, (XtPointer)this); + n = 0; + s = XmStringCreateLocalized("Rotate clockwise"); + XtSetArg(args[n], XmNlabelString, s); ++n; + btn = XmCreatePushButton(popupMenu, "rotateCW", args, n); + XmStringFree(s); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &rotateCWCbk, (XtPointer)this); + n = 0; + btn = XmCreateSeparator(popupMenu, "sep2", args, n); + XtManageChild(btn); + n = 0; + s = XmStringCreateLocalized("Close"); + XtSetArg(args[n], XmNlabelString, s); ++n; + s2 = XmStringCreateLocalized("Ctrl+W"); + XtSetArg(args[n], XmNacceleratorText, s2); ++n; + btn = XmCreatePushButton(popupMenu, "close", args, n); + XmStringFree(s); + XmStringFree(s2); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &closeCbk, (XtPointer)this); + n = 0; + s = XmStringCreateLocalized("Quit"); + XtSetArg(args[n], XmNlabelString, s); ++n; + s2 = XmStringCreateLocalized("Q"); + XtSetArg(args[n], XmNacceleratorText, s2); ++n; + btn = XmCreatePushButton(popupMenu, "quit", args, n); + XmStringFree(s); + XmStringFree(s2); + XtManageChild(btn); + XtAddCallback(btn, XmNactivateCallback, + &quitCbk, (XtPointer)this); + + XmStringFree(emptyString); +} + +void XPDFViewer::mapWindow() { +#ifdef HAVE_X11_XPM_H + Pixmap iconPixmap; +#endif + int depth; + Pixel bg, arm; + + // show the window + XtPopup(win, XtGrabNone); + core->takeFocus(); + + // create the icon +#ifdef HAVE_X11_XPM_H + if (XpmCreatePixmapFromData(display, XtWindow(win), xpdfIcon, + &iconPixmap, NULL, NULL) == XpmSuccess) { + XtVaSetValues(win, XmNiconPixmap, iconPixmap, NULL); + } +#endif + + // set button bitmaps (must be done after the window is mapped) + XtVaGetValues(backBtn, XmNdepth, &depth, + XmNbackground, &bg, XmNarmColor, &arm, NULL); + XtVaSetValues(backBtn, XmNlabelType, XmPIXMAP, + XmNlabelPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)backArrow_bits, + backArrow_width, + backArrow_height, + BlackPixel(display, screenNum), + bg, depth), + XmNarmPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)backArrow_bits, + backArrow_width, + backArrow_height, + BlackPixel(display, screenNum), + arm, depth), + XmNlabelInsensitivePixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)backArrowDis_bits, + backArrowDis_width, + backArrowDis_height, + BlackPixel(display, screenNum), + bg, depth), + NULL); + XtVaSetValues(prevTenPageBtn, XmNlabelType, XmPIXMAP, + XmNlabelPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)dblLeftArrow_bits, + dblLeftArrow_width, + dblLeftArrow_height, + BlackPixel(display, screenNum), + bg, depth), + XmNarmPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)dblLeftArrow_bits, + dblLeftArrow_width, + dblLeftArrow_height, + BlackPixel(display, screenNum), + arm, depth), + XmNlabelInsensitivePixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)dblLeftArrowDis_bits, + dblLeftArrowDis_width, + dblLeftArrowDis_height, + BlackPixel(display, screenNum), + bg, depth), + NULL); + XtVaSetValues(prevPageBtn, XmNlabelType, XmPIXMAP, + XmNlabelPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)leftArrow_bits, + leftArrow_width, + leftArrow_height, + BlackPixel(display, screenNum), + bg, depth), + XmNarmPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)leftArrow_bits, + leftArrow_width, + leftArrow_height, + BlackPixel(display, screenNum), + arm, depth), + XmNlabelInsensitivePixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)leftArrowDis_bits, + leftArrowDis_width, + leftArrowDis_height, + BlackPixel(display, screenNum), + bg, depth), + NULL); + XtVaSetValues(nextPageBtn, XmNlabelType, XmPIXMAP, + XmNlabelPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)rightArrow_bits, + rightArrow_width, + rightArrow_height, + BlackPixel(display, screenNum), + bg, depth), + XmNarmPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)rightArrow_bits, + rightArrow_width, + rightArrow_height, + BlackPixel(display, screenNum), + arm, depth), + XmNlabelInsensitivePixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)rightArrowDis_bits, + rightArrowDis_width, + rightArrowDis_height, + BlackPixel(display, screenNum), + bg, depth), + NULL); + XtVaSetValues(nextTenPageBtn, XmNlabelType, XmPIXMAP, + XmNlabelPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)dblRightArrow_bits, + dblRightArrow_width, + dblRightArrow_height, + BlackPixel(display, screenNum), + bg, depth), + XmNarmPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)dblRightArrow_bits, + dblRightArrow_width, + dblRightArrow_height, + BlackPixel(display, screenNum), + arm, depth), + XmNlabelInsensitivePixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)dblRightArrowDis_bits, + dblRightArrowDis_width, + dblRightArrowDis_height, + BlackPixel(display, screenNum), + bg, depth), + NULL); + XtVaSetValues(forwardBtn, XmNlabelType, XmPIXMAP, + XmNlabelPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)forwardArrow_bits, + forwardArrow_width, + forwardArrow_height, + BlackPixel(display, screenNum), + bg, depth), + XmNarmPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)forwardArrow_bits, + forwardArrow_width, + forwardArrow_height, + BlackPixel(display, screenNum), + arm, depth), + XmNlabelInsensitivePixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)forwardArrowDis_bits, + forwardArrowDis_width, + forwardArrowDis_height, + BlackPixel(display, screenNum), + bg, depth), + NULL); + XtVaSetValues(findBtn, XmNlabelType, XmPIXMAP, + XmNlabelPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)find_bits, + find_width, + find_height, + BlackPixel(display, screenNum), + bg, depth), + XmNarmPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)find_bits, + find_width, + find_height, + BlackPixel(display, screenNum), + arm, depth), + XmNlabelInsensitivePixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)findDis_bits, + findDis_width, + findDis_height, + BlackPixel(display, screenNum), + bg, depth), + NULL); + XtVaSetValues(printBtn, XmNlabelType, XmPIXMAP, + XmNlabelPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)print_bits, + print_width, + print_height, + BlackPixel(display, screenNum), + bg, depth), + XmNarmPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)print_bits, + print_width, + print_height, + BlackPixel(display, screenNum), + arm, depth), + XmNlabelInsensitivePixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)printDis_bits, + printDis_width, + printDis_height, + BlackPixel(display, screenNum), + bg, depth), + NULL); + XtVaSetValues(aboutBtn, XmNlabelType, XmPIXMAP, + XmNlabelPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)about_bits, + about_width, + about_height, + BlackPixel(display, screenNum), + bg, depth), + XmNarmPixmap, + XCreatePixmapFromBitmapData(display, XtWindow(toolBar), + (char *)about_bits, + about_width, + about_height, + BlackPixel(display, screenNum), + arm, depth), + NULL); +} + +void XPDFViewer::closeWindow() { + XtPopdown(win); + XtDestroyWidget(win); +} + +Widget XPDFViewer::getZoomMenuBtn(int z) { + if (z >= minZoom && z <= maxZoom) { + return zoomMenuBtns[z - minZoom]; + } + if (z == zoomPage) { + return zoomMenuBtns[maxZoom - minZoom + 1]; + } + if (z == zoomWidth) { + return zoomMenuBtns[maxZoom - minZoom + 2]; + } + return zoomMenuBtns[0]; +} + +void XPDFViewer::prevPageCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->core->gotoPrevPage(1, gTrue, gFalse); + viewer->core->takeFocus(); +} + +void XPDFViewer::prevTenPageCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->core->gotoPrevPage(10, gTrue, gFalse); + viewer->core->takeFocus(); +} + +void XPDFViewer::nextPageCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->core->gotoNextPage(1, gTrue); + viewer->core->takeFocus(); +} + +void XPDFViewer::nextTenPageCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->core->gotoNextPage(10, gTrue); + viewer->core->takeFocus(); +} + +void XPDFViewer::backCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->core->goBackward(); + viewer->core->takeFocus(); +} + +void XPDFViewer::forwardCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->core->goForward(); + viewer->core->takeFocus(); +} + +void XPDFViewer::zoomMenuCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + XtPointer userData; + + XtVaGetValues(widget, XmNuserData, &userData, NULL); + if ((int)userData != viewer->core->getZoom()) { + viewer->displayPage(viewer->core->getPageNum(), (int)userData, + viewer->core->getRotate(), gTrue, gFalse); + } + viewer->core->takeFocus(); +} + +void XPDFViewer::findCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + if (!viewer->core->getDoc()) { + return; + } + XtManageChild(viewer->findDialog); +} + +void XPDFViewer::printCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + if (!viewer->core->getDoc()) { + return; + } + XtManageChild(viewer->printDialog); +} + +void XPDFViewer::aboutCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + XtManageChild(viewer->aboutDialog); +} + +void XPDFViewer::quitCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->app->quit(); +} + +void XPDFViewer::openCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->mapOpenDialog(gFalse); +} + +void XPDFViewer::openInNewWindowCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->mapOpenDialog(gTrue); +} + +void XPDFViewer::reloadCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->reloadFile(); +} + +void XPDFViewer::saveAsCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + if (!viewer->core->getDoc()) { + return; + } + viewer->mapSaveAsDialog(); +} + +void XPDFViewer::rotateCCWCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + int r; + + r = viewer->core->getRotate(); + r = (r == 0) ? 270 : r - 90; + viewer->displayPage(viewer->core->getPageNum(), viewer->core->getZoom(), + r, gTrue, gFalse); +} + +void XPDFViewer::rotateCWCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + int r; + + r = viewer->core->getRotate(); + r = (r == 270) ? 0 : r + 90; + viewer->displayPage(viewer->core->getPageNum(), viewer->core->getZoom(), + r, gTrue, gFalse); +} + +void XPDFViewer::closeCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->app->close(viewer, gFalse); +} + +void XPDFViewer::closeMsgCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->app->close(viewer, gTrue); +} + +void XPDFViewer::pageNumCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + char *s, *p; + int pg; + char buf[20]; + + if (!viewer->core->getDoc()) { + goto err; + } + s = XmTextFieldGetString(viewer->pageNumText); + for (p = s; *p; ++p) { + if (!isdigit(*p)) { + goto err; + } + } + pg = atoi(s); + if (pg < 1 || pg > viewer->core->getDoc()->getNumPages()) { + goto err; + } + viewer->displayPage(pg, viewer->core->getZoom(), + viewer->core->getRotate(), gFalse, gTrue); + viewer->core->takeFocus(); + return; + + err: + XBell(viewer->display, 0); + sprintf(buf, "%d", viewer->core->getPageNum()); + XmTextFieldSetString(viewer->pageNumText, buf); +} + +void XPDFViewer::updateCbk(void *data, GString *fileName, + int pageNum, int numPages, char *linkLabel) { + XPDFViewer *viewer = (XPDFViewer *)data; + GString *title; + char buf[20]; + XmString s; + + if (fileName) { + if (!(title = viewer->app->getTitle())) { + title = (new GString(xpdfAppName))->append(": ")->append(fileName); + } + XtVaSetValues(viewer->win, XmNtitle, title->getCString(), + XmNiconName, title->getCString(), NULL); + if (!viewer->app->getTitle()) { + delete title; + } +#ifndef DISABLE_OUTLINE + if (!viewer->app->getFullScreen()) { + viewer->setupOutline(); + } +#endif + viewer->setupPrintDialog(); + } + + if (pageNum >= 0) { + s = XmStringCreateLocalized(""); + XtVaSetValues(viewer->linkLabel, XmNlabelString, s, NULL); + XmStringFree(s); + sprintf(buf, "%d", pageNum); + XmTextFieldSetString(viewer->pageNumText, buf); + XtVaSetValues(viewer->prevTenPageBtn, XmNsensitive, + pageNum > 1, NULL); + XtVaSetValues(viewer->prevPageBtn, XmNsensitive, + pageNum > 1, NULL); + XtVaSetValues(viewer->nextTenPageBtn, XmNsensitive, + pageNum < viewer->core->getDoc()->getNumPages(), NULL); + XtVaSetValues(viewer->nextPageBtn, XmNsensitive, + pageNum < viewer->core->getDoc()->getNumPages(), NULL); + XtVaSetValues(viewer->backBtn, XmNsensitive, + viewer->core->canGoBack(), NULL); + XtVaSetValues(viewer->forwardBtn, XmNsensitive, + viewer->core->canGoForward(), NULL); + } + + if (numPages >= 0) { + sprintf(buf, " of %d", numPages); + s = XmStringCreateLocalized(buf); + XtVaSetValues(viewer->pageCountLabel, XmNlabelString, s, NULL); + XmStringFree(s); + } + + if (linkLabel) { + s = XmStringCreateLocalized(linkLabel); + XtVaSetValues(viewer->linkLabel, XmNlabelString, s, NULL); + XmStringFree(s); + } +} + + +//------------------------------------------------------------------------ +// GUI code: outline +//------------------------------------------------------------------------ + +#ifndef DISABLE_OUTLINE + +void XPDFViewer::setupOutline() { + GList *items; + UnicodeMap *uMap; + GString *enc; + int i; + + // unmanage and destroy the old labels + if (outlineLabels) { + XtUnmanageChildren(outlineLabels, outlineLabelsLength); + for (i = 0; i < outlineLabelsLength; ++i) { + XtDestroyWidget(outlineLabels[i]); + } + gfree(outlineLabels); + outlineLabels = NULL; + outlineLabelsLength = outlineLabelsSize = 0; + } + + // create the new labels + items = core->getDoc()->getOutline()->getItems(); + if (items && items->getLength() > 0) { + enc = new GString("Latin1"); + uMap = globalParams->getUnicodeMap(enc); + delete enc; + setupOutlineItems(items, NULL, uMap); + uMap->decRefCnt(); + } + + // manage the new labels + XtManageChildren(outlineLabels, outlineLabelsLength); +} + +void XPDFViewer::setupOutlineItems(GList *items, Widget parent, + UnicodeMap *uMap) { + OutlineItem *item; + GList *kids; + Widget label; + Arg args[20]; + GString *title; + char buf[8]; + XmString s; + int i, j, n; + + for (i = 0; i < items->getLength(); ++i) { + item = (OutlineItem *)items->get(i); + title = new GString(); + for (j = 0; j < item->getTitleLength(); ++j) { + n = uMap->mapUnicode(item->getTitle()[j], buf, sizeof(buf)); + title->append(buf, n); + } + n = 0; + XtSetArg(args[n], XPDFNentryPosition, i); ++n; + if (parent) { + XtSetArg(args[n], XPDFNentryParent, parent); ++n; + } + XtSetArg(args[n], XPDFNentryExpanded, item->isOpen()); ++n; + s = XmStringCreateLocalized(title->getCString()); + delete title; + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNuserData, item); ++n; + XtSetArg(args[n], XmNmarginWidth, 0); ++n; + XtSetArg(args[n], XmNmarginHeight, 2); ++n; + XtSetArg(args[n], XmNshadowThickness, 0); ++n; + XtSetArg(args[n], XmNforeground, + app->getReverseVideo() ? WhitePixel(display, screenNum) + : BlackPixel(display, screenNum)); ++n; + XtSetArg(args[n], XmNbackground, app->getPaperColor()); ++n; + label = XmCreateLabelGadget(outlineTree, "label", args, n); + XmStringFree(s); + if (outlineLabelsLength == outlineLabelsSize) { + outlineLabelsSize += 64; + outlineLabels = (Widget *)grealloc(outlineLabels, + outlineLabelsSize * sizeof(Widget *)); + } + outlineLabels[outlineLabelsLength++] = label; + item->open(); + if ((kids = item->getKids())) { + setupOutlineItems(kids, label, uMap); + } + } +} + +void XPDFViewer::outlineSelectCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + XPDFTreeSelectCallbackStruct *data = + (XPDFTreeSelectCallbackStruct *)callData; + OutlineItem *item; + + XtVaGetValues(data->selectedItem, XmNuserData, &item, NULL); + if (item) { + viewer->core->doAction(item->getAction()); + } + viewer->core->takeFocus(); +} + +#endif // !DISABLE_OUTLINE + +//------------------------------------------------------------------------ +// GUI code: "about" dialog +//------------------------------------------------------------------------ + +void XPDFViewer::initAboutDialog() { + Widget scrolledWin, col, label, sep, closeBtn; + Arg args[20]; + int n, i; + XmString s; + char buf[20]; + + //----- dialog + n = 0; + s = XmStringCreateLocalized(xpdfAppName ": About"); + XtSetArg(args[n], XmNdialogTitle, s); ++n; + XtSetArg(args[n], XmNwidth, 450); ++n; + XtSetArg(args[n], XmNheight, 300); ++n; + aboutDialog = XmCreateFormDialog(win, "aboutDialog", args, n); + XmStringFree(s); + + //----- "close" button + n = 0; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightOffset, 4); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomOffset, 4); ++n; + closeBtn = XmCreatePushButton(aboutDialog, "Close", args, n); + XtManageChild(closeBtn); + n = 0; + XtSetArg(args[n], XmNdefaultButton, closeBtn); ++n; + XtSetArg(args[n], XmNcancelButton, closeBtn); ++n; + XtSetValues(aboutDialog, args, n); + + //----- scrolled window and RowColumn + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNbottomWidget, closeBtn); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); ++n; + scrolledWin = XmCreateScrolledWindow(aboutDialog, "scrolledWin", args, n); + XtManageChild(scrolledWin); + n = 0; + XtSetArg(args[n], XmNorientation, XmVERTICAL); ++n; + XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n; + col = XmCreateRowColumn(scrolledWin, "col", args, n); + XtManageChild(col); + + //----- fonts + aboutBigFont = XmFontListAppendEntry(NULL, + XmFontListEntryCreate(XmFONTLIST_DEFAULT_TAG, XmFONT_IS_FONT, + XLoadQueryFont(display, + "-*-times-bold-i-normal--20-*-*-*-*-*-iso8859-1"))); + aboutVersionFont = XmFontListAppendEntry(NULL, + XmFontListEntryCreate(XmFONTLIST_DEFAULT_TAG, XmFONT_IS_FONT, + XLoadQueryFont(display, + "-*-times-medium-r-normal--16-*-*-*-*-*-iso8859-1"))); + aboutFixedFont = XmFontListAppendEntry(NULL, + XmFontListEntryCreate(XmFONTLIST_DEFAULT_TAG, XmFONT_IS_FONT, + XLoadQueryFont(display, + "-*-courier-medium-r-normal--12-*-*-*-*-*-iso8859-1"))); + + //----- heading + n = 0; + s = XmStringCreateLocalized("Xpdf"); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNfontList, aboutBigFont); ++n; + label = XmCreateLabel(col, "h0", args, n); + XmStringFree(s); + XtManageChild(label); + n = 0; + s = XmStringCreateLocalized("Version " xpdfVersion); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n; + label = XmCreateLabel(col, "h1", args, n); + XmStringFree(s); + XtManageChild(label); + n = 0; + s = XmStringCreateLocalized(xpdfCopyright); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n; + label = XmCreateLabel(col, "h2", args, n); + XmStringFree(s); + XtManageChild(label); + n = 0; + s = XmStringCreateLocalized(" "); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n; + label = XmCreateLabel(col, "h3", args, n); + XmStringFree(s); + XtManageChild(label); + n = 0; + XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; + sep = XmCreateSeparator(col, "sep", args, n); + XtManageChild(sep); + n = 0; + s = XmStringCreateLocalized(" "); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n; + label = XmCreateLabel(col, "h4", args, n); + XmStringFree(s); + XtManageChild(label); + n = 0; + + //----- text + for (i = 0; aboutWinText[i]; ++i) { + n = 0; + s = XmStringCreateLocalized(aboutWinText[i]); + XtSetArg(args[n], XmNlabelString, s); ++n; + XtSetArg(args[n], XmNfontList, aboutFixedFont); ++n; + sprintf(buf, "t%d", i); + label = XmCreateLabel(col, buf, args, n); + XtManageChild(label); + XmStringFree(s); + } +} + +//------------------------------------------------------------------------ +// GUI code: "open" dialog +//------------------------------------------------------------------------ + +void XPDFViewer::initOpenDialog() { + Arg args[20]; + int n; + XmString s1, s2, s3; + + n = 0; + s1 = XmStringCreateLocalized("Open"); + XtSetArg(args[n], XmNokLabelString, s1); ++n; + s2 = XmStringCreateLocalized("*.[Pp][Dd][Ff]"); + XtSetArg(args[n], XmNpattern, s2); ++n; + s3 = XmStringCreateLocalized(xpdfAppName ": Open"); + XtSetArg(args[n], XmNdialogTitle, s3); ++n; + XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n; + XtSetArg(args[n], XmNautoUnmanage, True); ++n; + openDialog = XmCreateFileSelectionDialog(win, "openDialog", args, n); + XmStringFree(s1); + XmStringFree(s2); + XmStringFree(s3); + XtUnmanageChild(XmFileSelectionBoxGetChild(openDialog, + XmDIALOG_HELP_BUTTON)); + XtAddCallback(openDialog, XmNokCallback, + &openOkCbk, (XtPointer)this); +} + +void XPDFViewer::setOpenDialogDir(char *dir) { + XmString s; + + s = XmStringCreateLocalized(dir); + XtVaSetValues(openDialog, XmNdirectory, s, NULL); + XmStringFree(s); +} + +void XPDFViewer::mapOpenDialog(GBool openInNewWindowA) { + openInNewWindow = openInNewWindowA; + XmFileSelectionDoSearch(openDialog, NULL); + XtManageChild(openDialog); +} + +void XPDFViewer::openOkCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + XmFileSelectionBoxCallbackStruct *data = + (XmFileSelectionBoxCallbackStruct *)callData; + char *fileName; + XmStringContext context; + XmStringCharSet charSet; + XmStringDirection dir; + Boolean sep; + GString *fileNameStr; + + XmStringInitContext(&context, data->value); + if (XmStringGetNextSegment(context, &fileName, &charSet, &dir, &sep)) { + fileNameStr = new GString(fileName); + if (viewer->openInNewWindow) { + viewer->app->open(fileNameStr); + } else { + if (viewer->loadFile(fileNameStr)) { + viewer->displayPage(1, viewer->core->getZoom(), + viewer->core->getRotate(), gTrue, gTrue); + } + } + delete fileNameStr; + XtFree(charSet); + XtFree(fileName); + } + XmStringFreeContext(context); +} + +//------------------------------------------------------------------------ +// GUI code: "find" dialog +//------------------------------------------------------------------------ + +void XPDFViewer::initFindDialog() { + Widget row1, label, okBtn, closeBtn; + Arg args[20]; + int n; + XmString s; + + //----- dialog + n = 0; + s = XmStringCreateLocalized(xpdfAppName ": Find"); + XtSetArg(args[n], XmNdialogTitle, s); ++n; + XtSetArg(args[n], XmNnavigationType, XmNONE); ++n; + XtSetArg(args[n], XmNautoUnmanage, False); ++n; + findDialog = XmCreateFormDialog(win, "findDialog", args, n); + XmStringFree(s); + + //----- top row: search string entry + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNtopOffset, 4); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; + XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n; + row1 = XmCreateRowColumn(findDialog, "row1", args, n); + XtManageChild(row1); + n = 0; + s = XmStringCreateLocalized("Find text: "); + XtSetArg(args[n], XmNlabelString, s); ++n; + label = XmCreateLabel(row1, "label", args, n); + XmStringFree(s); + XtManageChild(label); + n = 0; + XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n; + findText = XmCreateTextField(row1, "text", args, n); + XtManageChild(findText); + + //----- "find" and "close" buttons + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, row1); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 4); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomOffset, 4); ++n; + XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n; + okBtn = XmCreatePushButton(findDialog, "Find", args, n); + XtManageChild(okBtn); + XtAddCallback(okBtn, XmNactivateCallback, + &findFindCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, row1); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightOffset, 4); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomOffset, 4); ++n; + XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n; + closeBtn = XmCreatePushButton(findDialog, "Close", args, n); + XtManageChild(closeBtn); + XtAddCallback(closeBtn, XmNactivateCallback, + &findCloseCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNdefaultButton, okBtn); ++n; + XtSetArg(args[n], XmNcancelButton, closeBtn); ++n; + XtSetArg(args[n], XmNinitialFocus, findText); ++n; + XtSetValues(findDialog, args, n); +} + +void XPDFViewer::findFindCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->core->find(XmTextFieldGetString(viewer->findText)); +} + +void XPDFViewer::findCloseCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + XtUnmanageChild(viewer->findDialog); +} + +//------------------------------------------------------------------------ +// GUI code: "save as" dialog +//------------------------------------------------------------------------ + +void XPDFViewer::initSaveAsDialog() { + Arg args[20]; + int n; + XmString s1, s2, s3; + + n = 0; + s1 = XmStringCreateLocalized("Save"); + XtSetArg(args[n], XmNokLabelString, s1); ++n; + s2 = XmStringCreateLocalized("*.[Pp][Dd][Ff]"); + XtSetArg(args[n], XmNpattern, s2); ++n; + s3 = XmStringCreateLocalized(xpdfAppName ": Save as"); + XtSetArg(args[n], XmNdialogTitle, s3); ++n; + XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n; + XtSetArg(args[n], XmNautoUnmanage, True); ++n; + saveAsDialog = XmCreateFileSelectionDialog(win, "saveAsDialog", args, n); + XmStringFree(s1); + XmStringFree(s2); + XmStringFree(s3); + XtUnmanageChild(XmFileSelectionBoxGetChild(saveAsDialog, + XmDIALOG_HELP_BUTTON)); + XtAddCallback(saveAsDialog, XmNokCallback, + &saveAsOkCbk, (XtPointer)this); +} + +void XPDFViewer::setSaveAsDialogDir(char *dir) { + XmString s; + + s = XmStringCreateLocalized(dir); + XtVaSetValues(saveAsDialog, XmNdirectory, s, NULL); + XmStringFree(s); +} + +void XPDFViewer::mapSaveAsDialog() { + XmFileSelectionDoSearch(saveAsDialog, NULL); + XtManageChild(saveAsDialog); +} + +void XPDFViewer::saveAsOkCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + XmFileSelectionBoxCallbackStruct *data = + (XmFileSelectionBoxCallbackStruct *)callData; + char *fileName; + GString *fileNameStr; + XmStringContext context; + XmStringCharSet charSet; + XmStringDirection dir; + Boolean sep; + + XmStringInitContext(&context, data->value); + if (XmStringGetNextSegment(context, &fileName, &charSet, &dir, &sep)) { + fileNameStr = new GString(fileName); + viewer->core->getDoc()->saveAs(fileNameStr); + delete fileNameStr; + XtFree(charSet); + XtFree(fileName); + } + XmStringFreeContext(context); +} + +//------------------------------------------------------------------------ +// GUI code: "print" dialog +//------------------------------------------------------------------------ + +void XPDFViewer::initPrintDialog() { + Widget sep1, sep2, row, label1, label2, okBtn, cancelBtn; + Arg args[20]; + int n; + XmString s; + + //----- dialog + n = 0; + s = XmStringCreateLocalized(xpdfAppName ": Print"); + XtSetArg(args[n], XmNdialogTitle, s); ++n; + XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n; + printDialog = XmCreateFormDialog(win, "printDialog", args, n); + XmStringFree(s); + + //----- "print with command" + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNtopOffset, 4); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n; + XtSetArg(args[n], XmNset, XmSET); ++n; + s = XmStringCreateLocalized("Print with command:"); + XtSetArg(args[n], XmNlabelString, s); ++n; + printWithCmdBtn = XmCreateToggleButton(printDialog, "printWithCmd", args, n); + XmStringFree(s); + XtManageChild(printWithCmdBtn); + XtAddCallback(printWithCmdBtn, XmNvalueChangedCallback, + &printWithCmdBtnCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, printWithCmdBtn); ++n; + XtSetArg(args[n], XmNtopOffset, 2); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 16); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightOffset, 4); ++n; + XtSetArg(args[n], XmNcolumns, 40); ++n; + printCmdText = XmCreateTextField(printDialog, "printCmd", args, n); + XtManageChild(printCmdText); + + //----- "print with command" + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, printCmdText); ++n; + XtSetArg(args[n], XmNtopOffset, 4); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n; + XtSetArg(args[n], XmNset, XmUNSET); ++n; + s = XmStringCreateLocalized("Print to file:"); + XtSetArg(args[n], XmNlabelString, s); ++n; + printToFileBtn = XmCreateToggleButton(printDialog, "printToFile", args, n); + XmStringFree(s); + XtManageChild(printToFileBtn); + XtAddCallback(printToFileBtn, XmNvalueChangedCallback, + &printToFileBtnCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, printToFileBtn); ++n; + XtSetArg(args[n], XmNtopOffset, 2); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 16); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightOffset, 4); ++n; + XtSetArg(args[n], XmNcolumns, 40); ++n; + XtSetArg(args[n], XmNsensitive, False); ++n; + printFileText = XmCreateTextField(printDialog, "printFile", args, n); + XtManageChild(printFileText); + + //----- separator + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, printFileText); ++n; + XtSetArg(args[n], XmNtopOffset, 8); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 8); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightOffset, 8); ++n; + XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; + sep1 = XmCreateSeparator(printDialog, "sep1", args, n); + XtManageChild(sep1); + + //----- page range + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, sep1); ++n; + XtSetArg(args[n], XmNtopOffset, 8); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 4); ++n; + XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; + XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n; + row = XmCreateRowColumn(printDialog, "row", args, n); + XtManageChild(row); + n = 0; + s = XmStringCreateLocalized("Pages:"); + XtSetArg(args[n], XmNlabelString, s); ++n; + label1 = XmCreateLabel(row, "label1", args, n); + XmStringFree(s); + XtManageChild(label1); + n = 0; + XtSetArg(args[n], XmNcolumns, 5); ++n; + printFirstPage = XmCreateTextField(row, "printFirstPage", args, n); + XtManageChild(printFirstPage); + n = 0; + s = XmStringCreateLocalized("to"); + XtSetArg(args[n], XmNlabelString, s); ++n; + label2 = XmCreateLabel(row, "label2", args, n); + XmStringFree(s); + XtManageChild(label2); + n = 0; + XtSetArg(args[n], XmNcolumns, 5); ++n; + printLastPage = XmCreateTextField(row, "printLastPage", args, n); + XtManageChild(printLastPage); + + //----- separator + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, row); ++n; + XtSetArg(args[n], XmNtopOffset, 8); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 8); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightOffset, 8); ++n; + XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; + sep2 = XmCreateSeparator(printDialog, "sep2", args, n); + XtManageChild(sep2); + + //----- "print" and "cancel" buttons + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, sep2); ++n; + XtSetArg(args[n], XmNtopOffset, 8); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 4); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomOffset, 4); ++n; + okBtn = XmCreatePushButton(printDialog, "Print", args, n); + XtManageChild(okBtn); + XtAddCallback(okBtn, XmNactivateCallback, + &printPrintCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, sep2); ++n; + XtSetArg(args[n], XmNtopOffset, 8); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightOffset, 4); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomOffset, 4); ++n; + cancelBtn = XmCreatePushButton(printDialog, "Cancel", args, n); + XtManageChild(cancelBtn); + n = 0; + XtSetArg(args[n], XmNdefaultButton, okBtn); ++n; + XtSetArg(args[n], XmNcancelButton, cancelBtn); ++n; + XtSetValues(printDialog, args, n); +} + +void XPDFViewer::setupPrintDialog() { + PDFDoc *doc; + char buf[20]; + GString *pdfFileName, *psFileName; + char *p; + + doc = core->getDoc(); + + psFileName = globalParams->getPSFile(); + if (psFileName && psFileName->getChar(0) != '|') { + XmTextFieldSetString(printFileText, psFileName->getCString()); + } else { + pdfFileName = doc->getFileName(); + p = pdfFileName->getCString() + pdfFileName->getLength() - 4; + if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) { + psFileName = new GString(pdfFileName->getCString(), + pdfFileName->getLength() - 4); + } else { + psFileName = pdfFileName->copy(); + } + psFileName->append(".ps"); + XmTextFieldSetString(printFileText, psFileName->getCString()); + delete psFileName; + } + + psFileName = globalParams->getPSFile(); + if (psFileName && psFileName->getChar(0) == '|') { + XmTextFieldSetString(printCmdText, + psFileName->getCString() + 1); + } + + sprintf(buf, "%d", doc->getNumPages()); + XmTextFieldSetString(printFirstPage, "1"); + XmTextFieldSetString(printLastPage, buf); +} + +void XPDFViewer::printWithCmdBtnCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + XmToggleButtonCallbackStruct *data = + (XmToggleButtonCallbackStruct *)callData; + + if (data->set != XmSET) { + XmToggleButtonSetState(viewer->printWithCmdBtn, True, False); + } + XmToggleButtonSetState(viewer->printToFileBtn, False, False); + XtVaSetValues(viewer->printCmdText, XmNsensitive, True, NULL); + XtVaSetValues(viewer->printFileText, XmNsensitive, False, NULL); +} + +void XPDFViewer::printToFileBtnCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + XmToggleButtonCallbackStruct *data = + (XmToggleButtonCallbackStruct *)callData; + + if (data->set != XmSET) { + XmToggleButtonSetState(viewer->printToFileBtn, True, False); + } + XmToggleButtonSetState(viewer->printWithCmdBtn, False, False); + XtVaSetValues(viewer->printFileText, XmNsensitive, True, NULL); + XtVaSetValues(viewer->printCmdText, XmNsensitive, False, NULL); +} + +void XPDFViewer::printPrintCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + unsigned char withCmd; + GString *psFileName; + int firstPage, lastPage; + PDFDoc *doc; + PSOutputDev *psOut; + + doc = viewer->core->getDoc(); + if (!doc->okToPrint()) { + error(-1, "Printing this document is not allowed."); + return; + } + + viewer->core->setBusyCursor(gTrue); + + XtVaGetValues(viewer->printWithCmdBtn, XmNset, &withCmd, NULL); + if (withCmd) { + psFileName = new GString(XmTextFieldGetString(viewer->printCmdText)); + psFileName->insert(0, '|'); + } else { + psFileName = new GString(XmTextFieldGetString(viewer->printFileText)); + } + + firstPage = atoi(XmTextFieldGetString(viewer->printFirstPage)); + lastPage = atoi(XmTextFieldGetString(viewer->printLastPage)); + if (firstPage < 1) { + firstPage = 1; + } else if (firstPage > doc->getNumPages()) { + firstPage = doc->getNumPages(); + } + if (lastPage < firstPage) { + lastPage = firstPage; + } else if (lastPage > doc->getNumPages()) { + lastPage = doc->getNumPages(); + } + + psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(), + doc->getCatalog(), firstPage, lastPage, + psModePS); + if (psOut->isOk()) { + doc->displayPages(psOut, firstPage, lastPage, 72, 0, gFalse); + } + delete psOut; + delete psFileName; + + viewer->core->setBusyCursor(gFalse); +} + +//------------------------------------------------------------------------ +// GUI code: password dialog +//------------------------------------------------------------------------ + +void XPDFViewer::initPasswordDialog() { + Widget row, label, okBtn, cancelBtn; + Arg args[20]; + int n; + XmString s; + + //----- dialog + n = 0; + s = XmStringCreateLocalized(xpdfAppName ": Password"); + XtSetArg(args[n], XmNdialogTitle, s); ++n; + XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n; + passwordDialog = XmCreateFormDialog(win, "passwordDialog", args, n); + XmStringFree(s); + + //----- message + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNtopOffset, 4); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 4); ++n; + s = XmStringCreateLocalized(" "); + XtSetArg(args[n], XmNlabelString, s); ++n; + passwordMsg = XmCreateLabel(passwordDialog, "msg", args, n); + XmStringFree(s); + XtManageChild(passwordMsg); + + //----- label and password entry + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, passwordMsg); ++n; + XtSetArg(args[n], XmNtopOffset, 4); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 4); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 4); ++n; + XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; + XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n; + row = XmCreateRowColumn(passwordDialog, "row", args, n); + XtManageChild(row); + n = 0; + s = XmStringCreateLocalized("Password: "); + XtSetArg(args[n], XmNlabelString, s); ++n; + label = XmCreateLabel(row, "label", args, n); + XmStringFree(s); + XtManageChild(label); + n = 0; + XtSetArg(args[n], XmNcolumns, 16); ++n; + passwordText = XmCreateTextField(row, "text", args, n); + XtManageChild(passwordText); + XtAddCallback(passwordText, XmNmodifyVerifyCallback, + &passwordTextVerifyCbk, this); + + //----- "Ok" and "Cancel" buttons + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, row); ++n; + XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNleftOffset, 4); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomOffset, 4); ++n; + XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n; + okBtn = XmCreatePushButton(passwordDialog, "Ok", args, n); + XtManageChild(okBtn); + XtAddCallback(okBtn, XmNactivateCallback, + &passwordOkCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; + XtSetArg(args[n], XmNtopWidget, row); ++n; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNrightOffset, 4); ++n; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; + XtSetArg(args[n], XmNbottomOffset, 4); ++n; + XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n; + cancelBtn = XmCreatePushButton(passwordDialog, "Cancel", args, n); + XtManageChild(cancelBtn); + XtAddCallback(cancelBtn, XmNactivateCallback, + &passwordCancelCbk, (XtPointer)this); + n = 0; + XtSetArg(args[n], XmNdefaultButton, okBtn); ++n; + XtSetArg(args[n], XmNcancelButton, cancelBtn); ++n; + XtSetArg(args[n], XmNinitialFocus, passwordText); ++n; + XtSetValues(passwordDialog, args, n); +} + +void XPDFViewer::passwordTextVerifyCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + XmTextVerifyCallbackStruct *data = + (XmTextVerifyCallbackStruct *)callData; + int i, n; + + i = (int)data->startPos; + n = (int)data->endPos - i; + if (i > viewer->password->getLength()) { + i = viewer->password->getLength(); + } + if (i + n > viewer->password->getLength()) { + n = viewer->password->getLength() - i; + } + viewer->password->del(i, n); + viewer->password->insert(i, data->text->ptr, data->text->length); + + for (i = 0; i < data->text->length; ++i) { + data->text->ptr[i] = '*'; + } + data->doit = True; +} + +void XPDFViewer::passwordOkCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->passwordDone = 1; +} + +void XPDFViewer::passwordCancelCbk(Widget widget, XtPointer ptr, + XtPointer callData) { + XPDFViewer *viewer = (XPDFViewer *)ptr; + + viewer->passwordDone = -1; +} + +void XPDFViewer::getPassword(GBool again) { + XmString s; + XEvent event; + + if (password) { + delete password; + } + password = new GString(); + + XmTextFieldSetString(passwordText, ""); + s = XmStringCreateLocalized( + again ? (char *)"Incorrect password. Please try again." + : (char *)"This document requires a password."); + XtVaSetValues(passwordMsg, XmNlabelString, s, NULL); + XmStringFree(s); + XtManageChild(passwordDialog); + passwordDone = 0; + do { + XtAppNextEvent(app->getAppContext(), &event); + XtDispatchEvent(&event); + } while (!passwordDone); + + if (passwordDone < 0) { + delete password; + password = NULL; + } +} |