1 //========================================================================
5 // Copyright 2002-2003 Glyph & Cog, LLC
7 //========================================================================
11 #ifdef USE_GCC_PRAGMAS
12 #pragma implementation
18 #include <X11/cursorfont.h>
22 #if defined(__sgi) && (XmVERSION <= 1)
23 #define Object XtObject
24 #include <Sgm/HPanedW.h>
32 #include "GlobalParams.h"
35 #include "ErrorCodes.h"
37 #include "UnicodeMap.h"
38 #ifndef DISABLE_OUTLINE
39 #define Object XtObject
44 #include "XPDFViewer.h"
45 #include "PSOutputDev.h"
48 // these macro defns conflict with xpdf's Object class
49 #ifdef LESSTIF_VERSION
62 //------------------------------------------------------------------------
64 //------------------------------------------------------------------------
66 #include "xpdfIcon.xpm"
67 #include "leftArrow.xbm"
68 #include "leftArrowDis.xbm"
69 #include "dblLeftArrow.xbm"
70 #include "dblLeftArrowDis.xbm"
71 #include "rightArrow.xbm"
72 #include "rightArrowDis.xbm"
73 #include "dblRightArrow.xbm"
74 #include "dblRightArrowDis.xbm"
75 #include "backArrow.xbm"
76 #include "backArrowDis.xbm"
77 #include "forwardArrow.xbm"
78 #include "forwardArrowDis.xbm"
80 #include "findDis.xbm"
82 #include "printDis.xbm"
84 #include "about-text.h"
86 //------------------------------------------------------------------------
93 static ZoomMenuInfo zoomMenuInfo
[nZoomMenuItems
] = {
102 { "fit page", zoomPage
},
103 { "fit width", zoomWidth
}
109 #define zoomPageIdx 8
110 #define zoomWidthIdx 9
112 //------------------------------------------------------------------------
114 XPDFViewer::XPDFViewer(XPDFApp
*appA
, GString
*fileName
,
115 int pageA
, GString
*destName
,
116 GString
*ownerPassword
, GString
*userPassword
) {
125 #ifndef DISABLE_OUTLINE
126 outlineLabels
= NULL
;
127 outlineLabelsLength
= outlineLabelsSize
= 0;
130 // do Motif-specific initialization and create the window;
131 // this also creates the core object
139 dest
= NULL
; // make gcc happy
140 pg
= pageA
; // make gcc happy
143 if (loadFile(fileName
, ownerPassword
, userPassword
)) {
144 getPageAndDest(pageA
, destName
, &pg
, &dest
);
145 #ifndef DISABLE_OUTLINE
146 if (!app
->getFullScreen() &&
147 core
->getDoc()->getOutline()->getItems() &&
148 core
->getDoc()->getOutline()->getItems()->getLength() > 0) {
149 XtVaSetValues(outlineScroll
, XmNwidth
, 175, NULL
);
153 core
->resizeToPage(pg
);
160 // map the window -- we do this after calling resizeToPage to avoid
161 // an annoying on-screen resize
164 // display the first page
165 z
= app
->getFullScreen() ? zoomPage
: core
->getZoom();
167 displayDest(dest
, z
, core
->getRotate(), gTrue
);
170 displayPage(pg
, z
, core
->getRotate(), gTrue
, gTrue
);
176 XPDFViewer::~XPDFViewer() {
178 XmFontListFree(aboutBigFont
);
179 XmFontListFree(aboutVersionFont
);
180 XmFontListFree(aboutFixedFont
);
182 #ifndef DISABLE_OUTLINE
184 gfree(outlineLabels
);
189 void XPDFViewer::open(GString
*fileName
, int pageA
, GString
*destName
) {
194 if (!core
->getDoc() || fileName
->cmp(core
->getDoc()->getFileName())) {
195 if (!loadFile(fileName
, NULL
, NULL
)) {
199 getPageAndDest(pageA
, destName
, &pg
, &dest
);
200 z
= app
->getFullScreen() ? zoomPage
: core
->getZoom();
202 displayDest(dest
, z
, core
->getRotate(), gTrue
);
205 displayPage(pg
, z
, core
->getRotate(), gTrue
, gTrue
);
209 void XPDFViewer::clear() {
215 // set up title, number-of-pages display
216 title
= app
->getTitle() ? app
->getTitle()->getCString()
217 : (char *)xpdfAppName
;
218 XtVaSetValues(win
, XmNtitle
, title
, XmNiconName
, title
, NULL
);
219 s
= XmStringCreateLocalized("");
220 XtVaSetValues(pageNumText
, XmNlabelString
, s
, NULL
);
222 s
= XmStringCreateLocalized(" of 0");
223 XtVaSetValues(pageCountLabel
, XmNlabelString
, s
, NULL
);
227 XtVaSetValues(prevTenPageBtn
, XmNsensitive
, False
, NULL
);
228 XtVaSetValues(prevPageBtn
, XmNsensitive
, False
, NULL
);
229 XtVaSetValues(nextTenPageBtn
, XmNsensitive
, False
, NULL
);
230 XtVaSetValues(nextPageBtn
, XmNsensitive
, False
, NULL
);
232 // remove the old outline
233 #ifndef DISABLE_OUTLINE
238 //------------------------------------------------------------------------
240 //------------------------------------------------------------------------
242 GBool
XPDFViewer::loadFile(GString
*fileName
, GString
*ownerPassword
,
243 GString
*userPassword
) {
244 return core
->loadFile(fileName
, ownerPassword
, userPassword
) == errNone
;
247 void XPDFViewer::reloadFile() {
250 if (!core
->getDoc()) {
253 pg
= core
->getPageNum();
254 loadFile(core
->getDoc()->getFileName());
255 if (pg
> core
->getDoc()->getNumPages()) {
256 pg
= core
->getDoc()->getNumPages();
258 displayPage(pg
, core
->getZoom(), core
->getRotate(), gFalse
, gFalse
);
261 void XPDFViewer::displayPage(int pageA
, double zoomA
, int rotateA
,
262 GBool scrollToTop
, GBool addToHist
) {
263 core
->displayPage(pageA
, zoomA
, rotateA
, scrollToTop
, addToHist
);
266 void XPDFViewer::displayDest(LinkDest
*dest
, double zoomA
, int rotateA
,
268 core
->displayDest(dest
, zoomA
, rotateA
, addToHist
);
271 void XPDFViewer::getPageAndDest(int pageA
, GString
*destName
,
272 int *pageOut
, LinkDest
**destOut
) {
275 // find the page number for a named destination
278 if (destName
&& (*destOut
= core
->getDoc()->findDest(destName
))) {
279 if ((*destOut
)->isPageRef()) {
280 pageRef
= (*destOut
)->getPageRef();
281 *pageOut
= core
->getDoc()->findPage(pageRef
.num
, pageRef
.gen
);
283 *pageOut
= (*destOut
)->getPageNum();
290 if (*pageOut
> core
->getDoc()->getNumPages()) {
291 *pageOut
= core
->getDoc()->getNumPages();
295 //------------------------------------------------------------------------
297 //------------------------------------------------------------------------
299 void XPDFViewer::actionCbk(void *data
, char *action
) {
300 XPDFViewer
*viewer
= (XPDFViewer
*)data
;
302 if (!strcmp(action
, "Quit")) {
307 //------------------------------------------------------------------------
308 // keyboard/mouse input
309 //------------------------------------------------------------------------
311 void XPDFViewer::keyPressCbk(void *data
, char *s
, KeySym key
,
313 XPDFViewer
*viewer
= (XPDFViewer
*)data
;
320 viewer
->mapOpenDialog(gFalse
);
324 viewer
->reloadFile();
328 case '\006': // ctrl-F
329 if (viewer
->core
->getDoc()) {
330 viewer
->mapFindDialog();
333 case '\007': // ctrl-G
334 if (viewer
->core
->getDoc()) {
335 viewer
->doFind(gTrue
);
338 case '\020': // ctrl-P
339 if (viewer
->core
->getDoc()) {
340 XtManageChild(viewer
->printDialog
);
345 viewer
->core
->gotoNextPage(1, !(modifiers
& Mod5Mask
));
349 viewer
->core
->gotoPrevPage(1, !(modifiers
& Mod5Mask
), gFalse
);
352 if (viewer
->app
->getFullScreen()) {
353 viewer
->core
->gotoNextPage(1, gTrue
);
355 viewer
->core
->scrollPageDown();
360 if (viewer
->app
->getFullScreen()) {
361 viewer
->core
->gotoPrevPage(1, gTrue
, gFalse
);
363 viewer
->core
->scrollPageUp();
367 viewer
->core
->goForward();
370 viewer
->core
->goBackward();
373 if (!viewer
->app
->getFullScreen()) {
374 XmTextFieldSetSelection(
375 viewer
->pageNumText
, 0,
376 strlen(XmTextFieldGetString(viewer
->pageNumText
)),
377 XtLastTimestampProcessed(viewer
->display
));
378 XmProcessTraversal(viewer
->pageNumText
, XmTRAVERSE_CURRENT
);
381 case 'h': // vi-style left
382 if (!viewer
->app
->getFullScreen() && viewer
->app
->getViKeys()) {
383 viewer
->core
->scrollLeft();
386 case 'l': // vi-style right
387 if (!viewer
->app
->getFullScreen() && viewer
->app
->getViKeys()) {
388 viewer
->core
->scrollRight();
391 case 'k': // vi-style up
392 if (!viewer
->app
->getFullScreen() && viewer
->app
->getViKeys()) {
393 viewer
->core
->scrollUp();
396 case 'j': // vi-style down
397 if (!viewer
->app
->getFullScreen() && viewer
->app
->getViKeys()) {
398 viewer
->core
->scrollDown();
402 if (!viewer
->app
->getFullScreen() &&
403 viewer
->core
->getZoom() != defZoom
) {
404 viewer
->setZoomIdx(defZoomIdx
);
405 viewer
->displayPage(viewer
->core
->getPageNum(), defZoom
,
406 viewer
->core
->getRotate(), gTrue
, gFalse
);
410 if (!viewer
->app
->getFullScreen()) {
411 z
= viewer
->getZoomIdx();
412 if (z
<= minZoomIdx
&& z
> maxZoomIdx
) {
414 viewer
->setZoomIdx(z
);
415 viewer
->displayPage(viewer
->core
->getPageNum(),
416 zoomMenuInfo
[z
].zoom
,
417 viewer
->core
->getRotate(), gTrue
, gFalse
);
422 if (!viewer
->app
->getFullScreen()) {
423 z
= viewer
->getZoomIdx();
424 if (z
< minZoomIdx
&& z
>= maxZoomIdx
) {
426 viewer
->setZoomIdx(z
);
427 viewer
->displayPage(viewer
->core
->getPageNum(),
428 zoomMenuInfo
[z
].zoom
,
429 viewer
->core
->getRotate(), gTrue
, gFalse
);
434 if (!viewer
->app
->getFullScreen() &&
435 viewer
->core
->getZoom() != zoomPage
) {
436 viewer
->setZoomIdx(zoomPageIdx
);
437 viewer
->displayPage(viewer
->core
->getPageNum(), zoomPage
,
438 viewer
->core
->getRotate(), gTrue
, gFalse
);
442 if (!viewer
->app
->getFullScreen() &&
443 viewer
->core
->getZoom() != zoomWidth
) {
444 viewer
->setZoomIdx(zoomWidthIdx
);
445 viewer
->displayPage(viewer
->core
->getPageNum(), zoomWidth
,
446 viewer
->core
->getRotate(), gTrue
, gFalse
);
450 viewer
->displayPage(viewer
->core
->getPageNum(), viewer
->core
->getZoom(),
451 viewer
->core
->getRotate(), gFalse
, gFalse
);
454 viewer
->app
->close(viewer
, gFalse
);
457 XtManageChild(viewer
->aboutDialog
);
467 void XPDFViewer::mouseCbk(void *data
, XEvent
*event
) {
468 XPDFViewer
*viewer
= (XPDFViewer
*)data
;
470 if (event
->type
== ButtonPress
&& event
->xbutton
.button
== 3) {
471 XmMenuPosition(viewer
->popupMenu
, &event
->xbutton
);
472 XtManageChild(viewer
->popupMenu
);
474 // this is magic (taken from DDD) - weird things happen if this
475 // call isn't made (this is done in two different places, in hopes
476 // of squashing this stupid bug)
477 XtUngrabButton(viewer
->core
->getDrawAreaWidget(), AnyButton
, AnyModifier
);
481 //------------------------------------------------------------------------
482 // GUI code: main window
483 //------------------------------------------------------------------------
485 void XPDFViewer::initWindow() {
486 Widget btn
, label
, lastBtn
, zoomWidget
;
487 #ifndef DISABLE_OUTLINE
495 XmString s
, s2
, emptyString
;
498 display
= XtDisplay(app
->getAppShell());
499 screenNum
= XScreenNumberOfScreen(XtScreen(app
->getAppShell()));
502 if (app
->getInstallCmap()) {
503 XtVaGetValues(app
->getAppShell(), XmNcolormap
, &colormap
, NULL
);
504 // ensure that BlackPixel and WhitePixel are reserved in the
506 xcol
.red
= xcol
.green
= xcol
.blue
= 0;
507 XAllocColor(display
, colormap
, &xcol
);
508 xcol
.red
= xcol
.green
= xcol
.blue
= 65535;
509 XAllocColor(display
, colormap
, &xcol
);
510 colormap
= XCopyColormapAndFree(display
, colormap
);
515 title
= app
->getTitle() ? app
->getTitle()->getCString()
516 : (char *)xpdfAppName
;
517 XtSetArg(args
[n
], XmNtitle
, title
); ++n
;
518 XtSetArg(args
[n
], XmNiconName
, title
); ++n
;
519 XtSetArg(args
[n
], XmNminWidth
, 100); ++n
;
520 XtSetArg(args
[n
], XmNminHeight
, 100); ++n
;
521 XtSetArg(args
[n
], XmNbaseWidth
, 0); ++n
;
522 XtSetArg(args
[n
], XmNbaseHeight
, 0); ++n
;
523 XtSetArg(args
[n
], XmNdeleteResponse
, XmDO_NOTHING
); ++n
;
524 if (app
->getFullScreen()) {
525 XtSetArg(args
[n
], XmNmwmDecorations
, 0); ++n
;
526 XtSetArg(args
[n
], XmNgeometry
, "+0+0"); ++n
;
527 } else if (app
->getGeometry()) {
528 XtSetArg(args
[n
], XmNgeometry
, app
->getGeometry()->getCString()); ++n
;
530 win
= XtCreatePopupShell("win", topLevelShellWidgetClass
,
531 app
->getAppShell(), args
, n
);
532 if (app
->getInstallCmap()) {
533 XtVaSetValues(win
, XmNcolormap
, colormap
, NULL
);
535 XmAddWMProtocolCallback(win
, XInternAtom(display
, "WM_DELETE_WINDOW", False
),
540 form
= XmCreateForm(win
, "form", args
, n
);
545 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
546 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
547 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
548 toolBar
= XmCreateForm(form
, "toolBar", args
, n
);
549 XtManageChild(toolBar
);
551 // create an empty string -- this is used for buttons that will get
553 emptyString
= XmStringCreateLocalized("");
555 // page movement buttons
557 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
558 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
559 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
560 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
561 XtSetArg(args
[n
], XmNsensitive
, False
); ++n
;
562 XtSetArg(args
[n
], XmNlabelString
, emptyString
); ++n
;
563 backBtn
= XmCreatePushButton(toolBar
, "back", args
, n
);
564 addToolTip(backBtn
, "Back");
565 XtManageChild(backBtn
);
566 XtAddCallback(backBtn
, XmNactivateCallback
,
567 &backCbk
, (XtPointer
)this);
569 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
570 XtSetArg(args
[n
], XmNleftWidget
, backBtn
); ++n
;
571 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
572 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
573 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
574 XtSetArg(args
[n
], XmNsensitive
, False
); ++n
;
575 XtSetArg(args
[n
], XmNlabelString
, emptyString
); ++n
;
576 prevTenPageBtn
= XmCreatePushButton(toolBar
, "prevTenPage", args
, n
);
577 addToolTip(prevTenPageBtn
, "-10 pages");
578 XtManageChild(prevTenPageBtn
);
579 XtAddCallback(prevTenPageBtn
, XmNactivateCallback
,
580 &prevTenPageCbk
, (XtPointer
)this);
582 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
583 XtSetArg(args
[n
], XmNleftWidget
, prevTenPageBtn
); ++n
;
584 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
585 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
586 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
587 XtSetArg(args
[n
], XmNsensitive
, False
); ++n
;
588 XtSetArg(args
[n
], XmNlabelString
, emptyString
); ++n
;
589 prevPageBtn
= XmCreatePushButton(toolBar
, "prevPage", args
, n
);
590 addToolTip(prevPageBtn
, "Previous page");
591 XtManageChild(prevPageBtn
);
592 XtAddCallback(prevPageBtn
, XmNactivateCallback
,
593 &prevPageCbk
, (XtPointer
)this);
595 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
596 XtSetArg(args
[n
], XmNleftWidget
, prevPageBtn
); ++n
;
597 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
598 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
599 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
600 XtSetArg(args
[n
], XmNsensitive
, False
); ++n
;
601 XtSetArg(args
[n
], XmNlabelString
, emptyString
); ++n
;
602 nextPageBtn
= XmCreatePushButton(toolBar
, "nextPage", args
, n
);
603 addToolTip(nextPageBtn
, "Next page");
604 XtManageChild(nextPageBtn
);
605 XtAddCallback(nextPageBtn
, XmNactivateCallback
,
606 &nextPageCbk
, (XtPointer
)this);
608 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
609 XtSetArg(args
[n
], XmNleftWidget
, nextPageBtn
); ++n
;
610 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
611 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
612 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
613 XtSetArg(args
[n
], XmNsensitive
, False
); ++n
;
614 XtSetArg(args
[n
], XmNlabelString
, emptyString
); ++n
;
615 nextTenPageBtn
= XmCreatePushButton(toolBar
, "nextTenPage", args
, n
);
616 addToolTip(nextTenPageBtn
, "+10 pages");
617 XtManageChild(nextTenPageBtn
);
618 XtAddCallback(nextTenPageBtn
, XmNactivateCallback
,
619 &nextTenPageCbk
, (XtPointer
)this);
621 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
622 XtSetArg(args
[n
], XmNleftWidget
, nextTenPageBtn
); ++n
;
623 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
624 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
625 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
626 XtSetArg(args
[n
], XmNsensitive
, False
); ++n
;
627 XtSetArg(args
[n
], XmNlabelString
, emptyString
); ++n
;
628 forwardBtn
= XmCreatePushButton(toolBar
, "forward", args
, n
);
629 addToolTip(forwardBtn
, "Forward");
630 XtManageChild(forwardBtn
);
631 XtAddCallback(forwardBtn
, XmNactivateCallback
,
632 &forwardCbk
, (XtPointer
)this);
634 // page number display
636 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
637 XtSetArg(args
[n
], XmNleftWidget
, forwardBtn
); ++n
;
638 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
639 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
640 s
= XmStringCreateLocalized("Page ");
641 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
642 label
= XmCreateLabel(toolBar
, "pageLabel", args
, n
);
644 XtManageChild(label
);
646 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
647 XtSetArg(args
[n
], XmNleftWidget
, label
); ++n
;
648 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
649 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
650 XtSetArg(args
[n
], XmNmarginWidth
, 3); ++n
;
651 XtSetArg(args
[n
], XmNmarginHeight
, 3); ++n
;
652 XtSetArg(args
[n
], XmNcolumns
, 5); ++n
;
653 pageNumText
= XmCreateTextField(toolBar
, "pageNum", args
, n
);
654 XtManageChild(pageNumText
);
655 XtAddCallback(pageNumText
, XmNactivateCallback
,
656 &pageNumCbk
, (XtPointer
)this);
658 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
659 XtSetArg(args
[n
], XmNleftWidget
, pageNumText
); ++n
;
660 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
661 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
662 s
= XmStringCreateLocalized(" of 00000");
663 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
664 XtSetArg(args
[n
], XmNalignment
, XmALIGNMENT_BEGINNING
); ++n
;
665 XtSetArg(args
[n
], XmNrecomputeSize
, False
); ++n
;
666 pageCountLabel
= XmCreateLabel(toolBar
, "pageCountLabel", args
, n
);
668 XtManageChild(pageCountLabel
);
669 s
= XmStringCreateLocalized(" of 0");
670 XtVaSetValues(pageCountLabel
, XmNlabelString
, s
, NULL
);
675 XmString st
[nZoomMenuItems
];
677 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
678 XtSetArg(args
[n
], XmNleftWidget
, pageCountLabel
); ++n
;
679 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
680 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
681 XtSetArg(args
[n
], XmNmarginWidth
, 0); ++n
;
682 XtSetArg(args
[n
], XmNmarginHeight
, 0); ++n
;
683 XtSetArg(args
[n
], XmNcomboBoxType
, XmDROP_DOWN_COMBO_BOX
); ++n
;
684 XtSetArg(args
[n
], XmNpositionMode
, XmONE_BASED
); ++n
;
685 XtSetArg(args
[n
], XmNcolumns
, 7); ++n
;
686 for (i
= 0; i
< nZoomMenuItems
; ++i
) {
687 st
[i
] = XmStringCreateLocalized(zoomMenuInfo
[i
].label
);
689 XtSetArg(args
[n
], XmNitems
, st
); ++n
;
690 XtSetArg(args
[n
], XmNitemCount
, nZoomMenuItems
); ++n
;
691 zoomComboBox
= XmCreateComboBox(toolBar
, "zoomComboBox", args
, n
);
692 for (i
= 0; i
< nZoomMenuItems
; ++i
) {
695 addToolTip(zoomComboBox
, "Zoom");
696 XtAddCallback(zoomComboBox
, XmNselectionCallback
,
697 &zoomComboBoxCbk
, (XtPointer
)this);
698 XtManageChild(zoomComboBox
);
699 zoomWidget
= zoomComboBox
;
704 menuPane
= XmCreatePulldownMenu(toolBar
, "zoomMenuPane", args
, n
);
705 for (i
= 0; i
< nZoomMenuItems
; ++i
) {
707 s
= XmStringCreateLocalized(zoomMenuInfo
[i
].label
);
708 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
709 XtSetArg(args
[n
], XmNuserData
, (XtPointer
)i
); ++n
;
710 sprintf(buf
, "zoom%d", i
);
711 btn
= XmCreatePushButton(menuPane
, buf
, args
, n
);
714 XtAddCallback(btn
, XmNactivateCallback
,
715 &zoomMenuCbk
, (XtPointer
)this);
716 zoomMenuBtns
[i
] = btn
;
719 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
720 XtSetArg(args
[n
], XmNleftWidget
, pageCountLabel
); ++n
;
721 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
722 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
723 XtSetArg(args
[n
], XmNmarginWidth
, 0); ++n
;
724 XtSetArg(args
[n
], XmNmarginHeight
, 0); ++n
;
725 XtSetArg(args
[n
], XmNsubMenuId
, menuPane
); ++n
;
726 zoomMenu
= XmCreateOptionMenu(toolBar
, "zoomMenu", args
, n
);
727 addToolTip(zoomMenu
, "Zoom");
728 XtManageChild(zoomMenu
);
729 zoomWidget
= zoomMenu
;
732 // find/print/about buttons
734 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
735 XtSetArg(args
[n
], XmNleftWidget
, zoomWidget
); ++n
;
736 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
737 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
738 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
739 XtSetArg(args
[n
], XmNlabelString
, emptyString
); ++n
;
740 findBtn
= XmCreatePushButton(toolBar
, "find", args
, n
);
741 addToolTip(findBtn
, "Find");
742 XtManageChild(findBtn
);
743 XtAddCallback(findBtn
, XmNactivateCallback
,
744 &findCbk
, (XtPointer
)this);
746 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
747 XtSetArg(args
[n
], XmNleftWidget
, findBtn
); ++n
;
748 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
749 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
750 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
751 XtSetArg(args
[n
], XmNlabelString
, emptyString
); ++n
;
752 printBtn
= XmCreatePushButton(toolBar
, "print", args
, n
);
753 addToolTip(printBtn
, "Print");
754 XtManageChild(printBtn
);
755 XtAddCallback(printBtn
, XmNactivateCallback
,
756 &printCbk
, (XtPointer
)this);
758 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
759 XtSetArg(args
[n
], XmNleftWidget
, printBtn
); ++n
;
760 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
761 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
762 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
763 XtSetArg(args
[n
], XmNlabelString
, emptyString
); ++n
;
764 aboutBtn
= XmCreatePushButton(toolBar
, "about", args
, n
);
765 addToolTip(aboutBtn
, "About / help");
766 XtManageChild(aboutBtn
);
767 XtAddCallback(aboutBtn
, XmNactivateCallback
,
768 &aboutCbk
, (XtPointer
)this);
773 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
774 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
775 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
776 XtSetArg(args
[n
], XmNmarginWidth
, 6); ++n
;
777 s
= XmStringCreateLocalized("Quit");
778 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
779 quitBtn
= XmCreatePushButton(toolBar
, "quit", args
, n
);
781 XtManageChild(quitBtn
);
782 XtAddCallback(quitBtn
, XmNactivateCallback
,
783 &quitCbk
, (XtPointer
)this);
787 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
788 XtSetArg(args
[n
], XmNleftWidget
, lastBtn
); ++n
;
789 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_WIDGET
); ++n
;
790 XtSetArg(args
[n
], XmNrightWidget
, quitBtn
); ++n
;
791 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
792 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
793 s
= XmStringCreateLocalized("");
794 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
795 XtSetArg(args
[n
], XmNrecomputeSize
, True
); ++n
;
796 XtSetArg(args
[n
], XmNalignment
, XmALIGNMENT_BEGINNING
); ++n
;
797 linkLabel
= XmCreateLabel(toolBar
, "linkLabel", args
, n
);
799 XtManageChild(linkLabel
);
801 #ifndef DISABLE_OUTLINE
802 if (app
->getFullScreen()) {
806 core
= new XPDFCore(win
, form
,
807 app
->getPaperRGB(), app
->getPaperPixel(),
808 app
->getMattePixel(),
809 app
->getFullScreen(), app
->getReverseVideo(),
810 app
->getInstallCmap(), app
->getRGBCubeSize());
811 core
->setUpdateCbk(&updateCbk
, this);
812 core
->setActionCbk(&actionCbk
, this);
813 core
->setKeyPressCbk(&keyPressCbk
, this);
814 core
->setMouseCbk(&mouseCbk
, this);
816 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
817 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_WIDGET
); ++n
;
818 XtSetArg(args
[n
], XmNbottomWidget
, toolBar
); ++n
;
819 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
820 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
821 XtSetValues(core
->getWidget(), args
, n
);
823 #ifndef DISABLE_OUTLINE
828 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
829 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_WIDGET
); ++n
;
830 XtSetArg(args
[n
], XmNbottomWidget
, toolBar
); ++n
;
831 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
832 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
833 XtSetArg(args
[n
], XmNorientation
, XmHORIZONTAL
); ++n
;
834 #if defined(__sgi) && (XmVERSION <= 1)
835 panedWin
= SgCreateHorzPanedWindow(form
, "panedWin", args
, n
);
837 panedWin
= XmCreatePanedWindow(form
, "panedWin", args
, n
);
839 XtManageChild(panedWin
);
841 // scrolled window for outline container
843 XtSetArg(args
[n
], XmNpositionIndex
, 0); ++n
;
844 XtSetArg(args
[n
], XmNallowResize
, True
); ++n
;
845 XtSetArg(args
[n
], XmNpaneMinimum
, 1); ++n
;
846 XtSetArg(args
[n
], XmNpaneMaximum
, 10000); ++n
;
847 #if !(defined(__sgi) && (XmVERSION <= 1))
848 XtSetArg(args
[n
], XmNwidth
, 1); ++n
;
850 XtSetArg(args
[n
], XmNscrollingPolicy
, XmAUTOMATIC
); ++n
;
851 outlineScroll
= XmCreateScrolledWindow(panedWin
, "outlineScroll", args
, n
);
852 XtManageChild(outlineScroll
);
853 XtVaGetValues(outlineScroll
, XmNclipWindow
, &clipWin
, NULL
);
854 XtVaSetValues(clipWin
, XmNbackground
, app
->getPaperPixel(), NULL
);
858 XtSetArg(args
[n
], XmNbackground
, app
->getPaperPixel()); ++n
;
859 outlineTree
= XPDFCreateTree(outlineScroll
, "outlineTree", args
, n
);
860 XtManageChild(outlineTree
);
861 XtAddCallback(outlineTree
, XPDFNselectionCallback
, &outlineSelectCbk
,
865 core
= new XPDFCore(win
, panedWin
,
866 app
->getPaperRGB(), app
->getPaperPixel(),
867 app
->getMattePixel(),
868 app
->getFullScreen(), app
->getReverseVideo(),
869 app
->getInstallCmap(), app
->getRGBCubeSize());
870 core
->setUpdateCbk(&updateCbk
, this);
871 core
->setActionCbk(&actionCbk
, this);
872 core
->setKeyPressCbk(&keyPressCbk
, this);
873 core
->setMouseCbk(&mouseCbk
, this);
875 XtSetArg(args
[n
], XmNpositionIndex
, 1); ++n
;
876 XtSetArg(args
[n
], XmNallowResize
, True
); ++n
;
877 XtSetArg(args
[n
], XmNpaneMinimum
, 1); ++n
;
878 XtSetArg(args
[n
], XmNpaneMaximum
, 10000); ++n
;
879 XtSetValues(core
->getWidget(), args
, n
);
883 // set the zoom menu to match the initial zoom setting
884 setZoomVal(core
->getZoom());
886 // set traversal order
887 XtVaSetValues(core
->getDrawAreaWidget(),
888 XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
, NULL
);
889 XtVaSetValues(backBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
891 XtVaSetValues(prevTenPageBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
893 XtVaSetValues(prevPageBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
895 XtVaSetValues(nextPageBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
897 XtVaSetValues(nextTenPageBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
899 XtVaSetValues(forwardBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
901 XtVaSetValues(pageNumText
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
903 XtVaSetValues(zoomWidget
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
905 XtVaSetValues(findBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
907 XtVaSetValues(printBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
909 XtVaSetValues(aboutBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
911 XtVaSetValues(quitBtn
, XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
,
917 // older versions of Motif need this, newer ones choke on it,
918 // sometimes not displaying the menu at all, maybe depending on the
919 // state of the NumLock key (taken from DDD)
920 XtSetArg(args
[n
], XmNmenuPost
, "<Btn3Down>"); ++n
;
922 popupMenu
= XmCreatePopupMenu(core
->getDrawAreaWidget(), "popupMenu",
925 s
= XmStringCreateLocalized("Open...");
926 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
927 s2
= XmStringCreateLocalized("O");
928 XtSetArg(args
[n
], XmNacceleratorText
, s2
); ++n
;
929 btn
= XmCreatePushButton(popupMenu
, "open", args
, n
);
933 XtAddCallback(btn
, XmNactivateCallback
,
934 &openCbk
, (XtPointer
)this);
936 s
= XmStringCreateLocalized("Open in new window...");
937 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
938 btn
= XmCreatePushButton(popupMenu
, "openInNewWindow", args
, n
);
941 XtAddCallback(btn
, XmNactivateCallback
,
942 &openInNewWindowCbk
, (XtPointer
)this);
944 s
= XmStringCreateLocalized("Reload");
945 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
946 s2
= XmStringCreateLocalized("R");
947 XtSetArg(args
[n
], XmNacceleratorText
, s2
); ++n
;
948 btn
= XmCreatePushButton(popupMenu
, "reload", args
, n
);
952 XtAddCallback(btn
, XmNactivateCallback
,
953 &reloadCbk
, (XtPointer
)this);
955 s
= XmStringCreateLocalized("Save as...");
956 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
957 btn
= XmCreatePushButton(popupMenu
, "saveAs", args
, n
);
960 XtAddCallback(btn
, XmNactivateCallback
,
961 &saveAsCbk
, (XtPointer
)this);
963 btn
= XmCreateSeparator(popupMenu
, "sep1", args
, n
);
966 s
= XmStringCreateLocalized("Continuous view");
967 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
968 XtSetArg(args
[n
], XmNindicatorType
, XmN_OF_MANY
); ++n
;
969 XtSetArg(args
[n
], XmNvisibleWhenOff
, True
); ++n
;
970 XtSetArg(args
[n
], XmNset
, core
->getContinuousMode() ? XmSET
: XmUNSET
); ++n
;
971 btn
= XmCreateToggleButton(popupMenu
, "continuousMode", args
, n
);
974 XtAddCallback(btn
, XmNvalueChangedCallback
,
975 &continuousModeToggleCbk
, (XtPointer
)this);
977 s
= XmStringCreateLocalized("Rotate counterclockwise");
978 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
979 btn
= XmCreatePushButton(popupMenu
, "rotateCCW", args
, n
);
982 XtAddCallback(btn
, XmNactivateCallback
,
983 &rotateCCWCbk
, (XtPointer
)this);
985 s
= XmStringCreateLocalized("Rotate clockwise");
986 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
987 btn
= XmCreatePushButton(popupMenu
, "rotateCW", args
, n
);
990 XtAddCallback(btn
, XmNactivateCallback
,
991 &rotateCWCbk
, (XtPointer
)this);
993 btn
= XmCreateSeparator(popupMenu
, "sep2", args
, n
);
996 s
= XmStringCreateLocalized("Close");
997 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
998 s2
= XmStringCreateLocalized("Ctrl+W");
999 XtSetArg(args
[n
], XmNacceleratorText
, s2
); ++n
;
1000 btn
= XmCreatePushButton(popupMenu
, "close", args
, n
);
1004 XtAddCallback(btn
, XmNactivateCallback
,
1005 &closeCbk
, (XtPointer
)this);
1007 s
= XmStringCreateLocalized("Quit");
1008 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1009 s2
= XmStringCreateLocalized("Q");
1010 XtSetArg(args
[n
], XmNacceleratorText
, s2
); ++n
;
1011 btn
= XmCreatePushButton(popupMenu
, "quit", args
, n
);
1015 XtAddCallback(btn
, XmNactivateCallback
,
1016 &quitCbk
, (XtPointer
)this);
1018 // this is magic (taken from DDD) - weird things happen if this
1020 XtUngrabButton(core
->getDrawAreaWidget(), AnyButton
, AnyModifier
);
1022 XmStringFree(emptyString
);
1025 void XPDFViewer::addToolTip(Widget widget
, char *text
) {
1026 #ifdef XmNtoolTipString
1029 WidgetList children
;
1031 if (XtIsComposite(widget
)) {
1032 XtVaGetValues(widget
, XmNnumChildren
, &n
, XmNchildren
, &children
, NULL
);
1033 for (i
= 0; i
< n
; ++i
) {
1034 addToolTip(children
[i
], text
);
1037 s
= XmStringCreateLocalized(text
);
1038 XtVaSetValues(widget
, XmNtoolTipString
, s
, NULL
);
1044 void XPDFViewer::mapWindow() {
1045 #ifdef HAVE_X11_XPM_H
1052 XtPopup(win
, XtGrabNone
);
1056 #ifdef HAVE_X11_XPM_H
1057 if (XpmCreatePixmapFromData(display
, XtWindow(win
), xpdfIcon
,
1058 &iconPixmap
, NULL
, NULL
) == XpmSuccess
) {
1059 XtVaSetValues(win
, XmNiconPixmap
, iconPixmap
, NULL
);
1063 // set button bitmaps (must be done after the window is mapped)
1064 XtVaGetValues(backBtn
, XmNdepth
, &depth
,
1065 XmNforeground
, &fg
, XmNbackground
, &bg
,
1066 XmNarmColor
, &arm
, NULL
);
1067 XtVaSetValues(backBtn
, XmNlabelType
, XmPIXMAP
,
1069 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1070 (char *)backArrow_bits
,
1075 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1076 (char *)backArrow_bits
,
1080 XmNlabelInsensitivePixmap
,
1081 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1082 (char *)backArrowDis_bits
,
1084 backArrowDis_height
,
1087 XtVaSetValues(prevTenPageBtn
, XmNlabelType
, XmPIXMAP
,
1089 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1090 (char *)dblLeftArrow_bits
,
1092 dblLeftArrow_height
,
1095 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1096 (char *)dblLeftArrow_bits
,
1098 dblLeftArrow_height
,
1100 XmNlabelInsensitivePixmap
,
1101 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1102 (char *)dblLeftArrowDis_bits
,
1103 dblLeftArrowDis_width
,
1104 dblLeftArrowDis_height
,
1107 XtVaSetValues(prevPageBtn
, XmNlabelType
, XmPIXMAP
,
1109 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1110 (char *)leftArrow_bits
,
1115 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1116 (char *)leftArrow_bits
,
1120 XmNlabelInsensitivePixmap
,
1121 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1122 (char *)leftArrowDis_bits
,
1124 leftArrowDis_height
,
1127 XtVaSetValues(nextPageBtn
, XmNlabelType
, XmPIXMAP
,
1129 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1130 (char *)rightArrow_bits
,
1135 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1136 (char *)rightArrow_bits
,
1140 XmNlabelInsensitivePixmap
,
1141 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1142 (char *)rightArrowDis_bits
,
1143 rightArrowDis_width
,
1144 rightArrowDis_height
,
1147 XtVaSetValues(nextTenPageBtn
, XmNlabelType
, XmPIXMAP
,
1149 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1150 (char *)dblRightArrow_bits
,
1151 dblRightArrow_width
,
1152 dblRightArrow_height
,
1155 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1156 (char *)dblRightArrow_bits
,
1157 dblRightArrow_width
,
1158 dblRightArrow_height
,
1160 XmNlabelInsensitivePixmap
,
1161 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1162 (char *)dblRightArrowDis_bits
,
1163 dblRightArrowDis_width
,
1164 dblRightArrowDis_height
,
1167 XtVaSetValues(forwardBtn
, XmNlabelType
, XmPIXMAP
,
1169 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1170 (char *)forwardArrow_bits
,
1172 forwardArrow_height
,
1175 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1176 (char *)forwardArrow_bits
,
1178 forwardArrow_height
,
1180 XmNlabelInsensitivePixmap
,
1181 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1182 (char *)forwardArrowDis_bits
,
1183 forwardArrowDis_width
,
1184 forwardArrowDis_height
,
1187 XtVaSetValues(findBtn
, XmNlabelType
, XmPIXMAP
,
1189 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1195 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1200 XmNlabelInsensitivePixmap
,
1201 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1202 (char *)findDis_bits
,
1207 XtVaSetValues(printBtn
, XmNlabelType
, XmPIXMAP
,
1209 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1215 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1220 XmNlabelInsensitivePixmap
,
1221 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1222 (char *)printDis_bits
,
1227 XtVaSetValues(aboutBtn
, XmNlabelType
, XmPIXMAP
,
1229 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1235 XCreatePixmapFromBitmapData(display
, XtWindow(toolBar
),
1243 void XPDFViewer::closeWindow() {
1245 XtDestroyWidget(win
);
1248 int XPDFViewer::getZoomIdx() {
1252 XtVaGetValues(zoomComboBox
, XmNselectedPosition
, &z
, NULL
);
1258 XtVaGetValues(zoomMenu
, XmNmenuHistory
, &w
, NULL
);
1259 for (i
= 0; i
< nZoomMenuItems
; ++i
) {
1260 if (w
== zoomMenuBtns
[i
]) {
1264 // this should never happen
1269 void XPDFViewer::setZoomIdx(int idx
) {
1271 XtVaSetValues(zoomComboBox
, XmNselectedPosition
, idx
+ 1, NULL
);
1273 XtVaSetValues(zoomMenu
, XmNmenuHistory
, zoomMenuBtns
[idx
], NULL
);
1277 void XPDFViewer::setZoomVal(double z
) {
1283 for (i
= 0; i
< nZoomMenuItems
; ++i
) {
1284 if (z
== zoomMenuInfo
[i
].zoom
) {
1285 XtVaSetValues(zoomComboBox
, XmNselectedPosition
, i
+ 1, NULL
);
1289 sprintf(buf
, "%d", (int)z
);
1290 s
= XmStringCreateLocalized(buf
);
1291 XtVaSetValues(zoomComboBox
, XmNselectedItem
, s
, NULL
);
1296 for (i
= 0; i
< nZoomMenuItems
; ++i
) {
1297 if (z
== zoomMenuInfo
[i
].zoom
) {
1298 XtVaSetValues(zoomMenu
, XmNmenuHistory
, zoomMenuBtns
[i
], NULL
);
1302 for (i
= maxZoomIdx
; i
< minZoomIdx
; ++i
) {
1303 if (z
> zoomMenuInfo
[i
].zoom
) {
1307 XtVaSetValues(zoomMenu
, XmNmenuHistory
, zoomMenuBtns
[i
], NULL
);
1311 void XPDFViewer::prevPageCbk(Widget widget
, XtPointer ptr
,
1312 XtPointer callData
) {
1313 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1315 viewer
->core
->gotoPrevPage(1, gTrue
, gFalse
);
1316 viewer
->core
->takeFocus();
1319 void XPDFViewer::prevTenPageCbk(Widget widget
, XtPointer ptr
,
1320 XtPointer callData
) {
1321 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1323 viewer
->core
->gotoPrevPage(10, gTrue
, gFalse
);
1324 viewer
->core
->takeFocus();
1327 void XPDFViewer::nextPageCbk(Widget widget
, XtPointer ptr
,
1328 XtPointer callData
) {
1329 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1331 viewer
->core
->gotoNextPage(1, gTrue
);
1332 viewer
->core
->takeFocus();
1335 void XPDFViewer::nextTenPageCbk(Widget widget
, XtPointer ptr
,
1336 XtPointer callData
) {
1337 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1339 viewer
->core
->gotoNextPage(10, gTrue
);
1340 viewer
->core
->takeFocus();
1343 void XPDFViewer::backCbk(Widget widget
, XtPointer ptr
,
1344 XtPointer callData
) {
1345 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1347 viewer
->core
->goBackward();
1348 viewer
->core
->takeFocus();
1351 void XPDFViewer::forwardCbk(Widget widget
, XtPointer ptr
,
1352 XtPointer callData
) {
1353 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1355 viewer
->core
->goForward();
1356 viewer
->core
->takeFocus();
1361 void XPDFViewer::zoomComboBoxCbk(Widget widget
, XtPointer ptr
,
1362 XtPointer callData
) {
1363 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1364 XmComboBoxCallbackStruct
*data
= (XmComboBoxCallbackStruct
*)callData
;
1367 XmStringContext context
;
1368 XmStringCharSet charSet
;
1369 XmStringDirection dir
;
1372 z
= viewer
->core
->getZoom();
1373 if (data
->item_position
== 0) {
1374 XmStringInitContext(&context
, data
->item_or_text
);
1375 if (XmStringGetNextSegment(context
, &s
, &charSet
, &dir
, &sep
)) {
1383 XmStringFreeContext(context
);
1385 z
= zoomMenuInfo
[data
->item_position
- 1].zoom
;
1387 // only redraw if this was triggered by an event; otherwise
1388 // the caller is responsible for doing the redraw
1389 if (z
!= viewer
->core
->getZoom() && data
->event
) {
1390 viewer
->displayPage(viewer
->core
->getPageNum(), z
,
1391 viewer
->core
->getRotate(), gTrue
, gFalse
);
1393 viewer
->core
->takeFocus();
1396 #else // USE_COMBO_BOX
1398 void XPDFViewer::zoomMenuCbk(Widget widget
, XtPointer ptr
,
1399 XtPointer callData
) {
1400 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1401 XmPushButtonCallbackStruct
*data
= (XmPushButtonCallbackStruct
*)callData
;
1405 XtVaGetValues(widget
, XmNuserData
, &userData
, NULL
);
1406 z
= zoomMenuInfo
[(long)userData
].zoom
;
1407 // only redraw if this was triggered by an event; otherwise
1408 // the caller is responsible for doing the redraw
1409 if (z
!= viewer
->core
->getZoom() && data
->event
) {
1410 viewer
->displayPage(viewer
->core
->getPageNum(), z
,
1411 viewer
->core
->getRotate(), gTrue
, gFalse
);
1413 viewer
->core
->takeFocus();
1416 #endif // USE_COMBO_BOX
1418 void XPDFViewer::findCbk(Widget widget
, XtPointer ptr
,
1419 XtPointer callData
) {
1420 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1422 if (!viewer
->core
->getDoc()) {
1425 viewer
->mapFindDialog();
1428 void XPDFViewer::printCbk(Widget widget
, XtPointer ptr
,
1429 XtPointer callData
) {
1430 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1432 if (!viewer
->core
->getDoc()) {
1435 XtManageChild(viewer
->printDialog
);
1438 void XPDFViewer::aboutCbk(Widget widget
, XtPointer ptr
,
1439 XtPointer callData
) {
1440 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1442 XtManageChild(viewer
->aboutDialog
);
1445 void XPDFViewer::quitCbk(Widget widget
, XtPointer ptr
,
1446 XtPointer callData
) {
1447 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1449 viewer
->app
->quit();
1452 void XPDFViewer::openCbk(Widget widget
, XtPointer ptr
,
1453 XtPointer callData
) {
1454 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1456 viewer
->mapOpenDialog(gFalse
);
1459 void XPDFViewer::openInNewWindowCbk(Widget widget
, XtPointer ptr
,
1460 XtPointer callData
) {
1461 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1463 viewer
->mapOpenDialog(gTrue
);
1466 void XPDFViewer::reloadCbk(Widget widget
, XtPointer ptr
,
1467 XtPointer callData
) {
1468 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1470 viewer
->reloadFile();
1473 void XPDFViewer::saveAsCbk(Widget widget
, XtPointer ptr
,
1474 XtPointer callData
) {
1475 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1477 if (!viewer
->core
->getDoc()) {
1480 viewer
->mapSaveAsDialog();
1483 void XPDFViewer::continuousModeToggleCbk(Widget widget
, XtPointer ptr
,
1484 XtPointer callData
) {
1485 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1486 XmToggleButtonCallbackStruct
*data
=
1487 (XmToggleButtonCallbackStruct
*)callData
;
1489 viewer
->core
->setContinuousMode(data
->set
== XmSET
);
1492 void XPDFViewer::rotateCCWCbk(Widget widget
, XtPointer ptr
,
1493 XtPointer callData
) {
1494 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1497 r
= viewer
->core
->getRotate();
1498 r
= (r
== 0) ? 270 : r
- 90;
1499 viewer
->displayPage(viewer
->core
->getPageNum(), viewer
->core
->getZoom(),
1503 void XPDFViewer::rotateCWCbk(Widget widget
, XtPointer ptr
,
1504 XtPointer callData
) {
1505 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1508 r
= viewer
->core
->getRotate();
1509 r
= (r
== 270) ? 0 : r
+ 90;
1510 viewer
->displayPage(viewer
->core
->getPageNum(), viewer
->core
->getZoom(),
1514 void XPDFViewer::closeCbk(Widget widget
, XtPointer ptr
,
1515 XtPointer callData
) {
1516 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1518 viewer
->app
->close(viewer
, gFalse
);
1521 void XPDFViewer::closeMsgCbk(Widget widget
, XtPointer ptr
,
1522 XtPointer callData
) {
1523 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1525 viewer
->app
->close(viewer
, gTrue
);
1528 void XPDFViewer::pageNumCbk(Widget widget
, XtPointer ptr
,
1529 XtPointer callData
) {
1530 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1535 if (!viewer
->core
->getDoc()) {
1538 s
= XmTextFieldGetString(viewer
->pageNumText
);
1539 for (p
= s
; *p
; ++p
) {
1545 if (pg
< 1 || pg
> viewer
->core
->getDoc()->getNumPages()) {
1548 viewer
->displayPage(pg
, viewer
->core
->getZoom(),
1549 viewer
->core
->getRotate(), gFalse
, gTrue
);
1550 viewer
->core
->takeFocus();
1554 XBell(viewer
->display
, 0);
1555 sprintf(buf
, "%d", viewer
->core
->getPageNum());
1556 XmTextFieldSetString(viewer
->pageNumText
, buf
);
1559 void XPDFViewer::updateCbk(void *data
, GString
*fileName
,
1560 int pageNum
, int numPages
, char *linkString
) {
1561 XPDFViewer
*viewer
= (XPDFViewer
*)data
;
1567 if (!(title
= viewer
->app
->getTitle())) {
1568 title
= (new GString(xpdfAppName
))->append(": ")->append(fileName
);
1570 XtVaSetValues(viewer
->win
, XmNtitle
, title
->getCString(),
1571 XmNiconName
, title
->getCString(), NULL
);
1572 if (!viewer
->app
->getTitle()) {
1575 #ifndef DISABLE_OUTLINE
1576 if (!viewer
->app
->getFullScreen()) {
1577 viewer
->setupOutline();
1580 viewer
->setupPrintDialog();
1584 s
= XmStringCreateLocalized("");
1585 XtVaSetValues(viewer
->linkLabel
, XmNlabelString
, s
, NULL
);
1587 sprintf(buf
, "%d", pageNum
);
1588 XmTextFieldSetString(viewer
->pageNumText
, buf
);
1589 XtVaSetValues(viewer
->prevTenPageBtn
, XmNsensitive
,
1591 XtVaSetValues(viewer
->prevPageBtn
, XmNsensitive
,
1593 XtVaSetValues(viewer
->nextTenPageBtn
, XmNsensitive
,
1594 pageNum
< viewer
->core
->getDoc()->getNumPages(), NULL
);
1595 XtVaSetValues(viewer
->nextPageBtn
, XmNsensitive
,
1596 pageNum
< viewer
->core
->getDoc()->getNumPages(), NULL
);
1597 XtVaSetValues(viewer
->backBtn
, XmNsensitive
,
1598 viewer
->core
->canGoBack(), NULL
);
1599 XtVaSetValues(viewer
->forwardBtn
, XmNsensitive
,
1600 viewer
->core
->canGoForward(), NULL
);
1603 if (numPages
>= 0) {
1604 sprintf(buf
, " of %d", numPages
);
1605 s
= XmStringCreateLocalized(buf
);
1606 XtVaSetValues(viewer
->pageCountLabel
, XmNlabelString
, s
, NULL
);
1611 s
= XmStringCreateLocalized(linkString
);
1612 XtVaSetValues(viewer
->linkLabel
, XmNlabelString
, s
, NULL
);
1618 //------------------------------------------------------------------------
1619 // GUI code: outline
1620 //------------------------------------------------------------------------
1622 #ifndef DISABLE_OUTLINE
1624 void XPDFViewer::setupOutline() {
1630 // unmanage and destroy the old labels
1631 if (outlineLabels
) {
1632 XtUnmanageChildren(outlineLabels
, outlineLabelsLength
);
1633 for (i
= 0; i
< outlineLabelsLength
; ++i
) {
1634 XtDestroyWidget(outlineLabels
[i
]);
1636 gfree(outlineLabels
);
1637 outlineLabels
= NULL
;
1638 outlineLabelsLength
= outlineLabelsSize
= 0;
1641 if (core
->getDoc()) {
1643 // create the new labels
1644 items
= core
->getDoc()->getOutline()->getItems();
1645 if (items
&& items
->getLength() > 0) {
1646 enc
= new GString("Latin1");
1647 uMap
= globalParams
->getUnicodeMap(enc
);
1649 setupOutlineItems(items
, NULL
, uMap
);
1653 // manage the new labels
1654 XtManageChildren(outlineLabels
, outlineLabelsLength
);
1658 void XPDFViewer::setupOutlineItems(GList
*items
, Widget parent
,
1669 for (i
= 0; i
< items
->getLength(); ++i
) {
1670 item
= (OutlineItem
*)items
->get(i
);
1671 title
= new GString();
1672 for (j
= 0; j
< item
->getTitleLength(); ++j
) {
1673 n
= uMap
->mapUnicode(item
->getTitle()[j
], buf
, sizeof(buf
));
1674 title
->append(buf
, n
);
1677 XtSetArg(args
[n
], XPDFNentryPosition
, i
); ++n
;
1679 XtSetArg(args
[n
], XPDFNentryParent
, parent
); ++n
;
1681 XtSetArg(args
[n
], XPDFNentryExpanded
, item
->isOpen()); ++n
;
1682 s
= XmStringCreateLocalized(title
->getCString());
1684 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1685 XtSetArg(args
[n
], XmNuserData
, item
); ++n
;
1686 XtSetArg(args
[n
], XmNmarginWidth
, 0); ++n
;
1687 XtSetArg(args
[n
], XmNmarginHeight
, 2); ++n
;
1688 XtSetArg(args
[n
], XmNshadowThickness
, 0); ++n
;
1689 XtSetArg(args
[n
], XmNforeground
,
1690 app
->getReverseVideo() ? WhitePixel(display
, screenNum
)
1691 : BlackPixel(display
, screenNum
)); ++n
;
1692 XtSetArg(args
[n
], XmNbackground
, app
->getPaperPixel()); ++n
;
1693 label
= XmCreateLabelGadget(outlineTree
, "label", args
, n
);
1695 if (outlineLabelsLength
== outlineLabelsSize
) {
1696 outlineLabelsSize
+= 64;
1697 outlineLabels
= (Widget
*)greallocn(outlineLabels
,
1698 outlineLabelsSize
, sizeof(Widget
*));
1700 outlineLabels
[outlineLabelsLength
++] = label
;
1702 if ((kids
= item
->getKids())) {
1703 setupOutlineItems(kids
, label
, uMap
);
1708 void XPDFViewer::outlineSelectCbk(Widget widget
, XtPointer ptr
,
1709 XtPointer callData
) {
1710 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1711 XPDFTreeSelectCallbackStruct
*data
=
1712 (XPDFTreeSelectCallbackStruct
*)callData
;
1715 XtVaGetValues(data
->selectedItem
, XmNuserData
, &item
, NULL
);
1717 if (item
->getAction()) {
1718 viewer
->core
->doAction(item
->getAction());
1721 viewer
->core
->takeFocus();
1724 #endif // !DISABLE_OUTLINE
1726 //------------------------------------------------------------------------
1727 // GUI code: "about" dialog
1728 //------------------------------------------------------------------------
1730 void XPDFViewer::initAboutDialog() {
1731 Widget scrolledWin
, col
, label
, sep
, closeBtn
;
1739 s
= XmStringCreateLocalized(xpdfAppName
": About");
1740 XtSetArg(args
[n
], XmNdialogTitle
, s
); ++n
;
1741 XtSetArg(args
[n
], XmNwidth
, 450); ++n
;
1742 XtSetArg(args
[n
], XmNheight
, 300); ++n
;
1743 aboutDialog
= XmCreateFormDialog(win
, "aboutDialog", args
, n
);
1746 //----- "close" button
1748 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
1749 XtSetArg(args
[n
], XmNrightOffset
, 4); ++n
;
1750 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
1751 XtSetArg(args
[n
], XmNbottomOffset
, 4); ++n
;
1752 closeBtn
= XmCreatePushButton(aboutDialog
, "Close", args
, n
);
1753 XtManageChild(closeBtn
);
1755 XtSetArg(args
[n
], XmNdefaultButton
, closeBtn
); ++n
;
1756 XtSetArg(args
[n
], XmNcancelButton
, closeBtn
); ++n
;
1757 XtSetValues(aboutDialog
, args
, n
);
1759 //----- scrolled window and RowColumn
1761 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
1762 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_WIDGET
); ++n
;
1763 XtSetArg(args
[n
], XmNbottomWidget
, closeBtn
); ++n
;
1764 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
1765 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
1766 XtSetArg(args
[n
], XmNscrollingPolicy
, XmAUTOMATIC
); ++n
;
1767 scrolledWin
= XmCreateScrolledWindow(aboutDialog
, "scrolledWin", args
, n
);
1768 XtManageChild(scrolledWin
);
1770 XtSetArg(args
[n
], XmNorientation
, XmVERTICAL
); ++n
;
1771 XtSetArg(args
[n
], XmNpacking
, XmPACK_TIGHT
); ++n
;
1772 col
= XmCreateRowColumn(scrolledWin
, "col", args
, n
);
1777 createFontList("-*-times-bold-i-normal--20-*-*-*-*-*-iso8859-1");
1779 createFontList("-*-times-medium-r-normal--16-*-*-*-*-*-iso8859-1");
1781 createFontList("-*-courier-medium-r-normal--12-*-*-*-*-*-iso8859-1");
1785 s
= XmStringCreateLocalized("Xpdf");
1786 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1787 XtSetArg(args
[n
], XmNfontList
, aboutBigFont
); ++n
;
1788 label
= XmCreateLabel(col
, "h0", args
, n
);
1790 XtManageChild(label
);
1792 s
= XmStringCreateLocalized("Version " xpdfVersion
);
1793 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1794 XtSetArg(args
[n
], XmNfontList
, aboutVersionFont
); ++n
;
1795 label
= XmCreateLabel(col
, "h1", args
, n
);
1797 XtManageChild(label
);
1799 s
= XmStringCreateLocalized(xpdfCopyright
);
1800 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1801 XtSetArg(args
[n
], XmNfontList
, aboutVersionFont
); ++n
;
1802 label
= XmCreateLabel(col
, "h2", args
, n
);
1804 XtManageChild(label
);
1806 s
= XmStringCreateLocalized(" ");
1807 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1808 XtSetArg(args
[n
], XmNfontList
, aboutVersionFont
); ++n
;
1809 label
= XmCreateLabel(col
, "h3", args
, n
);
1811 XtManageChild(label
);
1813 XtSetArg(args
[n
], XmNorientation
, XmHORIZONTAL
); ++n
;
1814 sep
= XmCreateSeparator(col
, "sep", args
, n
);
1817 s
= XmStringCreateLocalized(" ");
1818 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1819 XtSetArg(args
[n
], XmNfontList
, aboutVersionFont
); ++n
;
1820 label
= XmCreateLabel(col
, "h4", args
, n
);
1822 XtManageChild(label
);
1826 for (i
= 0; aboutWinText
[i
]; ++i
) {
1828 s
= XmStringCreateLocalized(aboutWinText
[i
]);
1829 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1830 XtSetArg(args
[n
], XmNfontList
, aboutFixedFont
); ++n
;
1831 sprintf(buf
, "t%d", i
);
1832 label
= XmCreateLabel(col
, buf
, args
, n
);
1833 XtManageChild(label
);
1838 //------------------------------------------------------------------------
1839 // GUI code: "open" dialog
1840 //------------------------------------------------------------------------
1842 void XPDFViewer::initOpenDialog() {
1845 XmString s1
, s2
, s3
;
1849 s1
= XmStringCreateLocalized("Open");
1850 XtSetArg(args
[n
], XmNokLabelString
, s1
); ++n
;
1851 s2
= XmStringCreateLocalized("*.[Pp][Dd][Ff]");
1852 XtSetArg(args
[n
], XmNpattern
, s2
); ++n
;
1853 s3
= XmStringCreateLocalized(xpdfAppName
": Open");
1854 XtSetArg(args
[n
], XmNdialogTitle
, s3
); ++n
;
1855 XtSetArg(args
[n
], XmNdialogStyle
, XmDIALOG_PRIMARY_APPLICATION_MODAL
); ++n
;
1856 XtSetArg(args
[n
], XmNautoUnmanage
, True
); ++n
;
1857 openDialog
= XmCreateFileSelectionDialog(win
, "openDialog", args
, n
);
1861 XtUnmanageChild(XmFileSelectionBoxGetChild(openDialog
,
1862 XmDIALOG_HELP_BUTTON
));
1863 XtAddCallback(openDialog
, XmNokCallback
,
1864 &openOkCbk
, (XtPointer
)this);
1866 if (core
->getDoc() && core
->getDoc()->getFileName()) {
1867 dir
= makePathAbsolute(grabPath(
1868 core
->getDoc()->getFileName()->getCString()));
1869 s1
= XmStringCreateLocalized(dir
->getCString());
1870 XtVaSetValues(openDialog
, XmNdirectory
, s1
, NULL
);
1876 void XPDFViewer::mapOpenDialog(GBool openInNewWindowA
) {
1880 openInNewWindow
= openInNewWindowA
;
1881 XmFileSelectionDoSearch(openDialog
, NULL
);
1882 XtManageChild(openDialog
);
1885 void XPDFViewer::openOkCbk(Widget widget
, XtPointer ptr
,
1886 XtPointer callData
) {
1887 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
1888 XmFileSelectionBoxCallbackStruct
*data
=
1889 (XmFileSelectionBoxCallbackStruct
*)callData
;
1891 XmStringContext context
;
1892 XmStringCharSet charSet
;
1893 XmStringDirection dir
;
1895 GString
*fileNameStr
;
1897 XmStringInitContext(&context
, data
->value
);
1898 if (XmStringGetNextSegment(context
, &fileName
, &charSet
, &dir
, &sep
)) {
1899 fileNameStr
= new GString(fileName
);
1900 if (viewer
->openInNewWindow
) {
1901 viewer
->app
->open(fileNameStr
);
1903 if (viewer
->loadFile(fileNameStr
)) {
1904 viewer
->displayPage(1, viewer
->core
->getZoom(),
1905 viewer
->core
->getRotate(), gTrue
, gTrue
);
1912 XmStringFreeContext(context
);
1915 //------------------------------------------------------------------------
1916 // GUI code: "find" dialog
1917 //------------------------------------------------------------------------
1919 void XPDFViewer::initFindDialog() {
1920 Widget form1
, label
, okBtn
, closeBtn
;
1927 s
= XmStringCreateLocalized(xpdfAppName
": Find");
1928 XtSetArg(args
[n
], XmNdialogTitle
, s
); ++n
;
1929 XtSetArg(args
[n
], XmNnavigationType
, XmNONE
); ++n
;
1930 XtSetArg(args
[n
], XmNautoUnmanage
, False
); ++n
;
1931 findDialog
= XmCreateFormDialog(win
, "findDialog", args
, n
);
1934 //----- "find" and "close" buttons
1936 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
1937 XtSetArg(args
[n
], XmNleftOffset
, 4); ++n
;
1938 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
1939 XtSetArg(args
[n
], XmNbottomOffset
, 4); ++n
;
1940 XtSetArg(args
[n
], XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
); ++n
;
1941 okBtn
= XmCreatePushButton(findDialog
, "Find", args
, n
);
1942 XtManageChild(okBtn
);
1943 XtAddCallback(okBtn
, XmNactivateCallback
,
1944 &findFindCbk
, (XtPointer
)this);
1946 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
1947 XtSetArg(args
[n
], XmNrightOffset
, 4); ++n
;
1948 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
1949 XtSetArg(args
[n
], XmNbottomOffset
, 4); ++n
;
1950 XtSetArg(args
[n
], XmNnavigationType
, XmEXCLUSIVE_TAB_GROUP
); ++n
;
1951 closeBtn
= XmCreatePushButton(findDialog
, "Close", args
, n
);
1952 XtManageChild(closeBtn
);
1953 XtAddCallback(closeBtn
, XmNactivateCallback
,
1954 &findCloseCbk
, (XtPointer
)this);
1958 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
1959 XtSetArg(args
[n
], XmNleftOffset
, 4); ++n
;
1960 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_WIDGET
); ++n
;
1961 XtSetArg(args
[n
], XmNbottomWidget
, okBtn
); ++n
;
1962 XtSetArg(args
[n
], XmNindicatorType
, XmN_OF_MANY
); ++n
;
1964 XtSetArg(args
[n
], XmNindicatorOn
, True
); ++n
;
1966 XtSetArg(args
[n
], XmNindicatorOn
, XmINDICATOR_FILL
); ++n
;
1968 XtSetArg(args
[n
], XmNset
, XmUNSET
); ++n
;
1969 s
= XmStringCreateLocalized("Search backward");
1970 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1971 findBackwardToggle
= XmCreateToggleButton(findDialog
, "backward", args
, n
);
1973 XtManageChild(findBackwardToggle
);
1975 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
1976 XtSetArg(args
[n
], XmNleftWidget
, findBackwardToggle
); ++n
;
1977 XtSetArg(args
[n
], XmNleftOffset
, 16); ++n
;
1978 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
1979 XtSetArg(args
[n
], XmNrightOffset
, 4); ++n
;
1980 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_WIDGET
); ++n
;
1981 XtSetArg(args
[n
], XmNbottomWidget
, okBtn
); ++n
;
1982 XtSetArg(args
[n
], XmNindicatorType
, XmN_OF_MANY
); ++n
;
1984 XtSetArg(args
[n
], XmNindicatorOn
, True
); ++n
;
1986 XtSetArg(args
[n
], XmNindicatorOn
, XmINDICATOR_FILL
); ++n
;
1988 XtSetArg(args
[n
], XmNset
, XmUNSET
); ++n
;
1989 s
= XmStringCreateLocalized("Match case");
1990 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
1991 findCaseSensitiveToggle
=
1992 XmCreateToggleButton(findDialog
, "matchCase", args
, n
);
1994 XtManageChild(findCaseSensitiveToggle
);
1996 //----- search string entry
1998 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
1999 XtSetArg(args
[n
], XmNtopOffset
, 4); ++n
;
2000 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_WIDGET
); ++n
;
2001 XtSetArg(args
[n
], XmNbottomWidget
, findBackwardToggle
); ++n
;
2002 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2003 XtSetArg(args
[n
], XmNleftOffset
, 2); ++n
;
2004 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
2005 XtSetArg(args
[n
], XmNrightOffset
, 2); ++n
;
2006 form1
= XmCreateForm(findDialog
, "form", args
, n
);
2007 XtManageChild(form1
);
2009 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
2010 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
2011 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2012 s
= XmStringCreateLocalized("Find text: ");
2013 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
2014 label
= XmCreateLabel(form1
, "label", args
, n
);
2016 XtManageChild(label
);
2018 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
2019 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
2020 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_WIDGET
); ++n
;
2021 XtSetArg(args
[n
], XmNleftWidget
, label
); ++n
;
2022 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
2023 findText
= XmCreateTextField(form1
, "text", args
, n
);
2024 XtManageChild(findText
);
2025 #ifdef LESSTIF_VERSION
2026 XtAddCallback(findText
, XmNactivateCallback
,
2027 &findFindCbk
, (XtPointer
)this);
2030 //----- dialog parameters
2032 XtSetArg(args
[n
], XmNdefaultButton
, okBtn
); ++n
;
2033 XtSetArg(args
[n
], XmNcancelButton
, closeBtn
); ++n
;
2034 #if XmVersion > 1001
2035 XtSetArg(args
[n
], XmNinitialFocus
, findText
); ++n
;
2037 XtSetValues(findDialog
, args
, n
);
2040 void XPDFViewer::findFindCbk(Widget widget
, XtPointer ptr
,
2041 XtPointer callData
) {
2042 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
2044 viewer
->doFind(gFalse
);
2047 void XPDFViewer::mapFindDialog() {
2048 XmTextFieldSetSelection(findText
, 0, XmTextFieldGetLastPosition(findText
),
2049 XtLastTimestampProcessed(display
));
2050 XmTextFieldSetInsertionPosition(findText
, 0);
2051 XtManageChild(findDialog
);
2054 void XPDFViewer::doFind(GBool next
) {
2055 if (XtWindow(findDialog
)) {
2056 XDefineCursor(display
, XtWindow(findDialog
), core
->getBusyCursor());
2058 core
->find(XmTextFieldGetString(findText
),
2059 XmToggleButtonGetState(findCaseSensitiveToggle
),
2061 XmToggleButtonGetState(findBackwardToggle
),
2063 if (XtWindow(findDialog
)) {
2064 XUndefineCursor(display
, XtWindow(findDialog
));
2068 void XPDFViewer::findCloseCbk(Widget widget
, XtPointer ptr
,
2069 XtPointer callData
) {
2070 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
2072 XtUnmanageChild(viewer
->findDialog
);
2075 //------------------------------------------------------------------------
2076 // GUI code: "save as" dialog
2077 //------------------------------------------------------------------------
2079 void XPDFViewer::initSaveAsDialog() {
2082 XmString s1
, s2
, s3
;
2086 s1
= XmStringCreateLocalized("Save");
2087 XtSetArg(args
[n
], XmNokLabelString
, s1
); ++n
;
2088 s2
= XmStringCreateLocalized("*.[Pp][Dd][Ff]");
2089 XtSetArg(args
[n
], XmNpattern
, s2
); ++n
;
2090 s3
= XmStringCreateLocalized(xpdfAppName
": Save as");
2091 XtSetArg(args
[n
], XmNdialogTitle
, s3
); ++n
;
2092 XtSetArg(args
[n
], XmNdialogStyle
, XmDIALOG_PRIMARY_APPLICATION_MODAL
); ++n
;
2093 XtSetArg(args
[n
], XmNautoUnmanage
, True
); ++n
;
2094 saveAsDialog
= XmCreateFileSelectionDialog(win
, "saveAsDialog", args
, n
);
2098 XtUnmanageChild(XmFileSelectionBoxGetChild(saveAsDialog
,
2099 XmDIALOG_HELP_BUTTON
));
2100 XtAddCallback(saveAsDialog
, XmNokCallback
,
2101 &saveAsOkCbk
, (XtPointer
)this);
2103 if (core
->getDoc() && core
->getDoc()->getFileName()) {
2104 dir
= makePathAbsolute(grabPath(
2105 core
->getDoc()->getFileName()->getCString()));
2106 s1
= XmStringCreateLocalized(dir
->getCString());
2107 XtVaSetValues(saveAsDialog
, XmNdirectory
, s1
, NULL
);
2113 void XPDFViewer::mapSaveAsDialog() {
2114 if (!saveAsDialog
) {
2117 XmFileSelectionDoSearch(saveAsDialog
, NULL
);
2118 XtManageChild(saveAsDialog
);
2121 void XPDFViewer::saveAsOkCbk(Widget widget
, XtPointer ptr
,
2122 XtPointer callData
) {
2123 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
2124 XmFileSelectionBoxCallbackStruct
*data
=
2125 (XmFileSelectionBoxCallbackStruct
*)callData
;
2127 GString
*fileNameStr
;
2128 XmStringContext context
;
2129 XmStringCharSet charSet
;
2130 XmStringDirection dir
;
2133 XmStringInitContext(&context
, data
->value
);
2134 if (XmStringGetNextSegment(context
, &fileName
, &charSet
, &dir
, &sep
)) {
2135 fileNameStr
= new GString(fileName
);
2136 viewer
->core
->getDoc()->saveAs(fileNameStr
);
2141 XmStringFreeContext(context
);
2144 //------------------------------------------------------------------------
2145 // GUI code: "print" dialog
2146 //------------------------------------------------------------------------
2148 void XPDFViewer::initPrintDialog() {
2149 Widget sep1
, sep2
, row
, label1
, label2
, okBtn
, cancelBtn
;
2153 GString
*psFileName
;
2157 s
= XmStringCreateLocalized(xpdfAppName
": Print");
2158 XtSetArg(args
[n
], XmNdialogTitle
, s
); ++n
;
2159 XtSetArg(args
[n
], XmNdialogStyle
, XmDIALOG_PRIMARY_APPLICATION_MODAL
); ++n
;
2160 printDialog
= XmCreateFormDialog(win
, "printDialog", args
, n
);
2163 //----- "print with command"
2165 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); ++n
;
2166 XtSetArg(args
[n
], XmNtopOffset
, 4); ++n
;
2167 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2168 XtSetArg(args
[n
], XmNindicatorType
, XmONE_OF_MANY
); ++n
;
2169 XtSetArg(args
[n
], XmNset
, XmSET
); ++n
;
2170 s
= XmStringCreateLocalized("Print with command:");
2171 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
2172 printWithCmdBtn
= XmCreateToggleButton(printDialog
, "printWithCmd", args
, n
);
2174 XtManageChild(printWithCmdBtn
);
2175 XtAddCallback(printWithCmdBtn
, XmNvalueChangedCallback
,
2176 &printWithCmdBtnCbk
, (XtPointer
)this);
2178 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_WIDGET
); ++n
;
2179 XtSetArg(args
[n
], XmNtopWidget
, printWithCmdBtn
); ++n
;
2180 XtSetArg(args
[n
], XmNtopOffset
, 2); ++n
;
2181 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2182 XtSetArg(args
[n
], XmNleftOffset
, 16); ++n
;
2183 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
2184 XtSetArg(args
[n
], XmNrightOffset
, 4); ++n
;
2185 XtSetArg(args
[n
], XmNcolumns
, 40); ++n
;
2186 printCmdText
= XmCreateTextField(printDialog
, "printCmd", args
, n
);
2187 XtManageChild(printCmdText
);
2189 //----- "print to file"
2191 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_WIDGET
); ++n
;
2192 XtSetArg(args
[n
], XmNtopWidget
, printCmdText
); ++n
;
2193 XtSetArg(args
[n
], XmNtopOffset
, 4); ++n
;
2194 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2195 XtSetArg(args
[n
], XmNindicatorType
, XmONE_OF_MANY
); ++n
;
2196 XtSetArg(args
[n
], XmNset
, XmUNSET
); ++n
;
2197 s
= XmStringCreateLocalized("Print to file:");
2198 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
2199 printToFileBtn
= XmCreateToggleButton(printDialog
, "printToFile", args
, n
);
2201 XtManageChild(printToFileBtn
);
2202 XtAddCallback(printToFileBtn
, XmNvalueChangedCallback
,
2203 &printToFileBtnCbk
, (XtPointer
)this);
2205 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_WIDGET
); ++n
;
2206 XtSetArg(args
[n
], XmNtopWidget
, printToFileBtn
); ++n
;
2207 XtSetArg(args
[n
], XmNtopOffset
, 2); ++n
;
2208 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2209 XtSetArg(args
[n
], XmNleftOffset
, 16); ++n
;
2210 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
2211 XtSetArg(args
[n
], XmNrightOffset
, 4); ++n
;
2212 XtSetArg(args
[n
], XmNcolumns
, 40); ++n
;
2213 XtSetArg(args
[n
], XmNsensitive
, False
); ++n
;
2214 printFileText
= XmCreateTextField(printDialog
, "printFile", args
, n
);
2215 XtManageChild(printFileText
);
2219 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_WIDGET
); ++n
;
2220 XtSetArg(args
[n
], XmNtopWidget
, printFileText
); ++n
;
2221 XtSetArg(args
[n
], XmNtopOffset
, 8); ++n
;
2222 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2223 XtSetArg(args
[n
], XmNleftOffset
, 8); ++n
;
2224 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
2225 XtSetArg(args
[n
], XmNrightOffset
, 8); ++n
;
2226 XtSetArg(args
[n
], XmNorientation
, XmHORIZONTAL
); ++n
;
2227 sep1
= XmCreateSeparator(printDialog
, "sep1", args
, n
);
2228 XtManageChild(sep1
);
2232 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_WIDGET
); ++n
;
2233 XtSetArg(args
[n
], XmNtopWidget
, sep1
); ++n
;
2234 XtSetArg(args
[n
], XmNtopOffset
, 8); ++n
;
2235 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2236 XtSetArg(args
[n
], XmNleftOffset
, 4); ++n
;
2237 XtSetArg(args
[n
], XmNorientation
, XmHORIZONTAL
); ++n
;
2238 XtSetArg(args
[n
], XmNpacking
, XmPACK_TIGHT
); ++n
;
2239 row
= XmCreateRowColumn(printDialog
, "row", args
, n
);
2242 s
= XmStringCreateLocalized("Pages:");
2243 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
2244 label1
= XmCreateLabel(row
, "label1", args
, n
);
2246 XtManageChild(label1
);
2248 XtSetArg(args
[n
], XmNcolumns
, 5); ++n
;
2249 printFirstPage
= XmCreateTextField(row
, "printFirstPage", args
, n
);
2250 XtManageChild(printFirstPage
);
2252 s
= XmStringCreateLocalized("to");
2253 XtSetArg(args
[n
], XmNlabelString
, s
); ++n
;
2254 label2
= XmCreateLabel(row
, "label2", args
, n
);
2256 XtManageChild(label2
);
2258 XtSetArg(args
[n
], XmNcolumns
, 5); ++n
;
2259 printLastPage
= XmCreateTextField(row
, "printLastPage", args
, n
);
2260 XtManageChild(printLastPage
);
2264 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_WIDGET
); ++n
;
2265 XtSetArg(args
[n
], XmNtopWidget
, row
); ++n
;
2266 XtSetArg(args
[n
], XmNtopOffset
, 8); ++n
;
2267 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2268 XtSetArg(args
[n
], XmNleftOffset
, 8); ++n
;
2269 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
2270 XtSetArg(args
[n
], XmNrightOffset
, 8); ++n
;
2271 XtSetArg(args
[n
], XmNorientation
, XmHORIZONTAL
); ++n
;
2272 sep2
= XmCreateSeparator(printDialog
, "sep2", args
, n
);
2273 XtManageChild(sep2
);
2275 //----- "print" and "cancel" buttons
2277 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_WIDGET
); ++n
;
2278 XtSetArg(args
[n
], XmNtopWidget
, sep2
); ++n
;
2279 XtSetArg(args
[n
], XmNtopOffset
, 8); ++n
;
2280 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
2281 XtSetArg(args
[n
], XmNleftOffset
, 4); ++n
;
2282 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
2283 XtSetArg(args
[n
], XmNbottomOffset
, 4); ++n
;
2284 okBtn
= XmCreatePushButton(printDialog
, "Print", args
, n
);
2285 XtManageChild(okBtn
);
2286 XtAddCallback(okBtn
, XmNactivateCallback
,
2287 &printPrintCbk
, (XtPointer
)this);
2289 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_WIDGET
); ++n
;
2290 XtSetArg(args
[n
], XmNtopWidget
, sep2
); ++n
;
2291 XtSetArg(args
[n
], XmNtopOffset
, 8); ++n
;
2292 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_FORM
); ++n
;
2293 XtSetArg(args
[n
], XmNrightOffset
, 4); ++n
;
2294 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); ++n
;
2295 XtSetArg(args
[n
], XmNbottomOffset
, 4); ++n
;
2296 cancelBtn
= XmCreatePushButton(printDialog
, "Cancel", args
, n
);
2297 XtManageChild(cancelBtn
);
2299 XtSetArg(args
[n
], XmNdefaultButton
, okBtn
); ++n
;
2300 XtSetArg(args
[n
], XmNcancelButton
, cancelBtn
); ++n
;
2301 XtSetValues(printDialog
, args
, n
);
2303 //----- initial values
2304 if ((psFileName
= globalParams
->getPSFile())) {
2305 if (psFileName
->getChar(0) == '|') {
2306 XmTextFieldSetString(printCmdText
,
2307 psFileName
->getCString() + 1);
2309 XmTextFieldSetString(printFileText
, psFileName
->getCString());
2315 void XPDFViewer::setupPrintDialog() {
2318 GString
*pdfFileName
, *psFileName
, *psFileName2
;
2321 doc
= core
->getDoc();
2322 psFileName
= globalParams
->getPSFile();
2323 if (!psFileName
|| psFileName
->getChar(0) == '|') {
2324 pdfFileName
= doc
->getFileName();
2325 p
= pdfFileName
->getCString() + pdfFileName
->getLength() - 4;
2326 if (!strcmp(p
, ".pdf") || !strcmp(p
, ".PDF")) {
2327 psFileName2
= new GString(pdfFileName
->getCString(),
2328 pdfFileName
->getLength() - 4);
2330 psFileName2
= pdfFileName
->copy();
2332 psFileName2
->append(".ps");
2333 XmTextFieldSetString(printFileText
, psFileName2
->getCString());
2336 if (psFileName
&& psFileName
->getChar(0) == '|') {
2337 XmToggleButtonSetState(printWithCmdBtn
, True
, False
);
2338 XmToggleButtonSetState(printToFileBtn
, False
, False
);
2339 XtVaSetValues(printCmdText
, XmNsensitive
, True
, NULL
);
2340 XtVaSetValues(printFileText
, XmNsensitive
, False
, NULL
);
2342 XmToggleButtonSetState(printWithCmdBtn
, False
, False
);
2343 XmToggleButtonSetState(printToFileBtn
, True
, False
);
2344 XtVaSetValues(printCmdText
, XmNsensitive
, False
, NULL
);
2345 XtVaSetValues(printFileText
, XmNsensitive
, True
, NULL
);
2351 sprintf(buf
, "%d", doc
->getNumPages());
2352 XmTextFieldSetString(printFirstPage
, "1");
2353 XmTextFieldSetString(printLastPage
, buf
);
2356 void XPDFViewer::printWithCmdBtnCbk(Widget widget
, XtPointer ptr
,
2357 XtPointer callData
) {
2358 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
2359 XmToggleButtonCallbackStruct
*data
=
2360 (XmToggleButtonCallbackStruct
*)callData
;
2362 if (data
->set
!= XmSET
) {
2363 XmToggleButtonSetState(viewer
->printWithCmdBtn
, True
, False
);
2365 XmToggleButtonSetState(viewer
->printToFileBtn
, False
, False
);
2366 XtVaSetValues(viewer
->printCmdText
, XmNsensitive
, True
, NULL
);
2367 XtVaSetValues(viewer
->printFileText
, XmNsensitive
, False
, NULL
);
2370 void XPDFViewer::printToFileBtnCbk(Widget widget
, XtPointer ptr
,
2371 XtPointer callData
) {
2372 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
2373 XmToggleButtonCallbackStruct
*data
=
2374 (XmToggleButtonCallbackStruct
*)callData
;
2376 if (data
->set
!= XmSET
) {
2377 XmToggleButtonSetState(viewer
->printToFileBtn
, True
, False
);
2379 XmToggleButtonSetState(viewer
->printWithCmdBtn
, False
, False
);
2380 XtVaSetValues(viewer
->printFileText
, XmNsensitive
, True
, NULL
);
2381 XtVaSetValues(viewer
->printCmdText
, XmNsensitive
, False
, NULL
);
2384 void XPDFViewer::printPrintCbk(Widget widget
, XtPointer ptr
,
2385 XtPointer callData
) {
2386 XPDFViewer
*viewer
= (XPDFViewer
*)ptr
;
2387 unsigned char withCmd
;
2388 GString
*psFileName
;
2389 int firstPage
, lastPage
;
2393 doc
= viewer
->core
->getDoc();
2394 if (!doc
->okToPrint()) {
2395 error(-1, "Printing this document is not allowed.");
2399 viewer
->core
->setBusyCursor(gTrue
);
2401 XtVaGetValues(viewer
->printWithCmdBtn
, XmNset
, &withCmd
, NULL
);
2403 psFileName
= new GString(XmTextFieldGetString(viewer
->printCmdText
));
2404 psFileName
->insert(0, '|');
2406 psFileName
= new GString(XmTextFieldGetString(viewer
->printFileText
));
2409 firstPage
= atoi(XmTextFieldGetString(viewer
->printFirstPage
));
2410 lastPage
= atoi(XmTextFieldGetString(viewer
->printLastPage
));
2411 if (firstPage
< 1) {
2413 } else if (firstPage
> doc
->getNumPages()) {
2414 firstPage
= doc
->getNumPages();
2416 if (lastPage
< firstPage
) {
2417 lastPage
= firstPage
;
2418 } else if (lastPage
> doc
->getNumPages()) {
2419 lastPage
= doc
->getNumPages();
2422 psOut
= new PSOutputDev(psFileName
->getCString(), doc
->getXRef(),
2423 doc
->getCatalog(), firstPage
, lastPage
,
2425 if (psOut
->isOk()) {
2426 doc
->displayPages(psOut
, firstPage
, lastPage
, 72, 72,
2427 0, gTrue
, globalParams
->getPSCrop(), gFalse
);
2432 viewer
->core
->setBusyCursor(gFalse
);
2435 //------------------------------------------------------------------------
2437 //------------------------------------------------------------------------
2439 XmFontList
XPDFViewer::createFontList(char *xlfd
) {
2440 XmFontList fontList
;
2442 #if XmVersion <= 1001
2448 font
= XLoadQueryFont(display
, xlfd
);
2450 fontList
= XmFontListCreate(font
, XmSTRING_DEFAULT_CHARSET
);
2452 params
= (String
)xlfd
;
2454 XtAppWarningMsg(app
->getAppContext(),
2455 "noSuchFont", "CvtStringToXmFontList",
2456 "XtToolkitError", "No such font: %s",
2463 XmFontListEntry entry
;
2465 entry
= XmFontListEntryLoad(display
, xlfd
,
2466 XmFONT_IS_FONT
, XmFONTLIST_DEFAULT_TAG
);
2467 fontList
= XmFontListAppendEntry(NULL
, entry
);
2468 XmFontListEntryFree(&entry
);