1 //========================================================================
2 //
3 // XPDFViewer.h
4 //
5 // Copyright 2002-2003 Glyph & Cog, LLC
6 //
7 //========================================================================
8 
9 #ifndef XPDFVIEWER_H
10 #define XPDFVIEWER_H
11 
12 #include <aconf.h>
13 
14 #ifdef USE_GCC_PRAGMAS
15 #pragma interface
16 #endif
17 
18 #define Object XtObject
19 #include <Xm/XmAll.h>
20 #undef Object
21 #include "gtypes.h"
22 #include "XPDFCore.h"
23 
24 #if (XmVERSION <= 1) && !defined(__sgi)
25 #define DISABLE_OUTLINE
26 #endif
27 
28 #if (XmVERSION >= 2 && !defined(LESSTIF_VERSION))
29 #  define USE_COMBO_BOX 1
30 #else
31 #  undef USE_COMBO_BOX
32 #endif
33 
34 class GString;
35 class GList;
36 class UnicodeMap;
37 class LinkDest;
38 class XPDFApp;
39 class XPDFViewer;
40 
41 //------------------------------------------------------------------------
42 
43 // NB: this must match the defn of zoomMenuBtnInfo in XPDFViewer.cc
44 #define nZoomMenuItems 10
45 
46 //------------------------------------------------------------------------
47 
48 struct XPDFViewerCmd {
49   const char *name;
50   int nArgs;
51   GBool requiresDoc;
52   GBool requiresEvent;
53   void (XPDFViewer::*func)(GString *args[], int nArgs, XEvent *event);
54 };
55 
56 //------------------------------------------------------------------------
57 // XPDFViewer
58 //------------------------------------------------------------------------
59 
60 class XPDFViewer {
61 public:
62 
63   XPDFViewer(XPDFApp *appA, GString *fileName,
64 	     int pageA, GString *destName, GBool fullScreen,
65 	     GString *ownerPassword, GString *userPassword);
66   XPDFViewer(XPDFApp *appA, PDFDoc *doc, int pageA,
67 	     GString *destName, GBool fullScreen);
isOk()68   GBool isOk() { return ok; }
69   ~XPDFViewer();
70 
71   void open(GString *fileName, int pageA, GString *destName);
72   void clear();
73   void reloadFile();
74 
75   void execCmd(GString *cmd, XEvent *event);
76 
getWindow()77   Widget getWindow() { return win; }
78 
79 private:
80 
81   //----- load / display
82   GBool loadFile(GString *fileName, GString *ownerPassword = NULL,
83 		 GString *userPassword = NULL);
84   void displayPage(int pageA, double zoomA, int rotateA,
85                    GBool scrollToTop, GBool addToHist);
86   void displayDest(LinkDest *dest, double zoomA, int rotateA,
87 		   GBool addToHist);
88   void getPageAndDest(int pageA, GString *destName,
89 		      int *pageOut, LinkDest **destOut);
90 
91   //----- hyperlinks / actions
92   void doLink(int wx, int wy, GBool onlyIfNoSelection, GBool newWin);
93   static void actionCbk(void *data, char *action);
94 
95   //----- keyboard/mouse input
96   static void keyPressCbk(void *data, KeySym key, Guint modifiers,
97 			  XEvent *event);
98   static void mouseCbk(void *data, XEvent *event);
99   int getModifiers(Guint modifiers);
100   int getContext(Guint modifiers);
101 
102   //----- command functions
103   void cmdAbout(GString *args[], int nArgs, XEvent *event);
104   void cmdCloseOutline(GString *args[], int nArgs, XEvent *event);
105   void cmdCloseWindow(GString *args[], int nArgs, XEvent *event);
106   void cmdCloseWindowOrQuit(GString *args[], int nArgs, XEvent *event);
107   void cmdContinuousMode(GString *args[], int nArgs, XEvent *event);
108   void cmdEndPan(GString *args[], int nArgs, XEvent *event);
109   void cmdEndSelection(GString *args[], int nArgs, XEvent *event);
110   void cmdFind(GString *args[], int nArgs, XEvent *event);
111   void cmdFindNext(GString *args[], int nArgs, XEvent *event);
112   void cmdFocusToDocWin(GString *args[], int nArgs, XEvent *event);
113   void cmdFocusToPageNum(GString *args[], int nArgs, XEvent *event);
114   void cmdFollowLink(GString *args[], int nArgs, XEvent *event);
115   void cmdFollowLinkInNewWin(GString *args[], int nArgs, XEvent *event);
116   void cmdFollowLinkInNewWinNoSel(GString *args[], int nArgs, XEvent *event);
117   void cmdFollowLinkNoSel(GString *args[], int nArgs, XEvent *event);
118   void cmdFullScreenMode(GString *args[], int nArgs, XEvent *event);
119   void cmdGoBackward(GString *args[], int nArgs, XEvent *event);
120   void cmdGoForward(GString *args[], int nArgs, XEvent *event);
121   void cmdGotoDest(GString *args[], int nArgs, XEvent *event);
122   void cmdGotoLastPage(GString *args[], int nArgs, XEvent *event);
123   void cmdGotoLastPageNoScroll(GString *args[], int nArgs, XEvent *event);
124   void cmdGotoPage(GString *args[], int nArgs, XEvent *event);
125   void cmdGotoPageNoScroll(GString *args[], int nArgs, XEvent *event);
126   void cmdNextPage(GString *args[], int nArgs, XEvent *event);
127   void cmdNextPageNoScroll(GString *args[], int nArgs, XEvent *event);
128   void cmdOpen(GString *args[], int nArgs, XEvent *event);
129   void cmdOpenFile(GString *args[], int nArgs, XEvent *event);
130   void cmdOpenFileAtDest(GString *args[], int nArgs, XEvent *event);
131   void cmdOpenFileAtDestInNewWin(GString *args[], int nArgs, XEvent *event);
132   void cmdOpenFileAtPage(GString *args[], int nArgs, XEvent *event);
133   void cmdOpenFileAtPageInNewWin(GString *args[], int nArgs, XEvent *event);
134   void cmdOpenFileInNewWin(GString *args[], int nArgs, XEvent *event);
135   void cmdOpenInNewWin(GString *args[], int nArgs, XEvent *event);
136   void cmdOpenOutline(GString *args[], int nArgs, XEvent *event);
137   void cmdPageDown(GString *args[], int nArgs, XEvent *event);
138   void cmdPageUp(GString *args[], int nArgs, XEvent *event);
139   void cmdPostPopupMenu(GString *args[], int nArgs, XEvent *event);
140   void cmdPrevPage(GString *args[], int nArgs, XEvent *event);
141   void cmdPrevPageNoScroll(GString *args[], int nArgs, XEvent *event);
142   void cmdPrint(GString *args[], int nArgs, XEvent *event);
143   void cmdQuit(GString *args[], int nArgs, XEvent *event);
144   void cmdRaise(GString *args[], int nArgs, XEvent *event);
145   void cmdRedraw(GString *args[], int nArgs, XEvent *event);
146   void cmdReload(GString *args[], int nArgs, XEvent *event);
147   void cmdRotateCCW(GString *args[], int nArgs, XEvent *event);
148   void cmdRotateCW(GString *args[], int nArgs, XEvent *event);
149   void cmdRun(GString *args[], int nArgs, XEvent *event);
150   void cmdScrollDown(GString *args[], int nArgs, XEvent *event);
151   void cmdScrollDownNextPage(GString *args[], int nArgs, XEvent *event);
152   void cmdScrollLeft(GString *args[], int nArgs, XEvent *event);
153   void cmdScrollOutlineDown(GString *args[], int nArgs, XEvent *event);
154   void cmdScrollOutlineUp(GString *args[], int nArgs, XEvent *event);
155   void cmdScrollRight(GString *args[], int nArgs, XEvent *event);
156   void cmdScrollToBottomEdge(GString *args[], int nArgs, XEvent *event);
157   void cmdScrollToBottomRight(GString *args[], int nArgs, XEvent *event);
158   void cmdScrollToLeftEdge(GString *args[], int nArgs, XEvent *event);
159   void cmdScrollToRightEdge(GString *args[], int nArgs, XEvent *event);
160   void cmdScrollToTopEdge(GString *args[], int nArgs, XEvent *event);
161   void cmdScrollToTopLeft(GString *args[], int nArgs, XEvent *event);
162   void cmdScrollUp(GString *args[], int nArgs, XEvent *event);
163   void cmdScrollUpPrevPage(GString *args[], int nArgs, XEvent *event);
164   void cmdSetSelection(GString *args[], int nArgs, XEvent *event);
165   void cmdSinglePageMode(GString *args[], int nArgs, XEvent *event);
166   void cmdStartPan(GString *args[], int nArgs, XEvent *event);
167   void cmdStartSelection(GString *args[], int nArgs, XEvent *event);
168   void cmdToggleContinuousMode(GString *args[], int nArgs, XEvent *event);
169   void cmdToggleFullScreenMode(GString *args[], int nArgs, XEvent *event);
170   void cmdToggleOutline(GString *args[], int nArgs, XEvent *event);
171   void cmdWindowMode(GString *args[], int nArgs, XEvent *event);
172   void cmdZoomFitPage(GString *args[], int nArgs, XEvent *event);
173   void cmdZoomFitWidth(GString *args[], int nArgs, XEvent *event);
174   void cmdZoomIn(GString *args[], int nArgs, XEvent *event);
175   void cmdZoomOut(GString *args[], int nArgs, XEvent *event);
176   void cmdZoomPercent(GString *args[], int nArgs, XEvent *event);
177   void cmdZoomToSelection(GString *args[], int nArgs, XEvent *event);
178 
179   //----- GUI code: main window
180   void initWindow(GBool fullScreen);
181   void initToolbar(Widget parent);
182 #ifndef DISABLE_OUTLINE
183   void initPanedWin(Widget parent);
184 #endif
185   void initCore(Widget parent, GBool fullScreen);
186   void initPopupMenu();
187   void addToolTip(Widget widget, char *text);
188   void mapWindow();
189   void closeWindow();
190   int getZoomIdx();
191   void setZoomIdx(int idx);
192   void setZoomVal(double z);
193   static void prevPageCbk(Widget widget, XtPointer ptr,
194 			  XtPointer callData);
195   static void prevTenPageCbk(Widget widget, XtPointer ptr,
196 			     XtPointer callData);
197   static void nextPageCbk(Widget widget, XtPointer ptr,
198 			  XtPointer callData);
199   static void nextTenPageCbk(Widget widget, XtPointer ptr,
200 			     XtPointer callData);
201   static void backCbk(Widget widget, XtPointer ptr,
202 		      XtPointer callData);
203   static void forwardCbk(Widget widget, XtPointer ptr,
204 			 XtPointer callData);
205 #if USE_COMBO_BOX
206   static void zoomComboBoxCbk(Widget widget, XtPointer ptr,
207 			      XtPointer callData);
208 #else
209   static void zoomMenuCbk(Widget widget, XtPointer ptr,
210 			  XtPointer callData);
211 #endif
212   static void findCbk(Widget widget, XtPointer ptr,
213 		      XtPointer callData);
214   static void printCbk(Widget widget, XtPointer ptr,
215 		       XtPointer callData);
216   static void aboutCbk(Widget widget, XtPointer ptr,
217 		       XtPointer callData);
218   static void quitCbk(Widget widget, XtPointer ptr,
219 		      XtPointer callData);
220   static void openCbk(Widget widget, XtPointer ptr,
221 		      XtPointer callData);
222   static void openInNewWindowCbk(Widget widget, XtPointer ptr,
223 				 XtPointer callData);
224   static void reloadCbk(Widget widget, XtPointer ptr,
225 			XtPointer callData);
226   static void saveAsCbk(Widget widget, XtPointer ptr,
227 			XtPointer callData);
228   static void continuousModeToggleCbk(Widget widget, XtPointer ptr,
229 				      XtPointer callData);
230   static void fullScreenToggleCbk(Widget widget, XtPointer ptr,
231 				  XtPointer callData);
232   static void rotateCCWCbk(Widget widget, XtPointer ptr,
233 			   XtPointer callData);
234   static void rotateCWCbk(Widget widget, XtPointer ptr,
235 			  XtPointer callData);
236   static void zoomToSelectionCbk(Widget widget, XtPointer ptr,
237 				 XtPointer callData);
238   static void closeCbk(Widget widget, XtPointer ptr,
239 		       XtPointer callData);
240   static void closeMsgCbk(Widget widget, XtPointer ptr,
241 			  XtPointer callData);
242   static void pageNumCbk(Widget widget, XtPointer ptr,
243 			 XtPointer callData);
244   static void updateCbk(void *data, GString *fileName,
245 			int pageNum, int numPages, const char *linkString);
246 
247   //----- GUI code: outline
248 #ifndef DISABLE_OUTLINE
249   void setupOutline();
250   void setupOutlineItems(GList *items, Widget parent, UnicodeMap *uMap);
251   static void outlineSelectCbk(Widget widget, XtPointer ptr,
252 			       XtPointer callData);
253 #endif
254 
255   //----- GUI code: "about" dialog
256   void initAboutDialog();
257 
258   //----- GUI code: "open" dialog
259   void initOpenDialog();
260   void mapOpenDialog(GBool openInNewWindowA);
261   static void openOkCbk(Widget widget, XtPointer ptr,
262 			XtPointer callData);
263 
264   //----- GUI code: "find" dialog
265   void initFindDialog();
266   static void findFindCbk(Widget widget, XtPointer ptr,
267 			  XtPointer callData);
268   void mapFindDialog();
269   void doFind(GBool next);
270   static void findCloseCbk(Widget widget, XtPointer ptr,
271 			   XtPointer callData);
272 
273   //----- GUI code: "save as" dialog
274   void initSaveAsDialog();
275   void mapSaveAsDialog();
276   static void saveAsOkCbk(Widget widget, XtPointer ptr,
277 			  XtPointer callData);
278 
279   //----- GUI code: "print" dialog
280   void initPrintDialog();
281   void setupPrintDialog();
282   static void printWithCmdBtnCbk(Widget widget, XtPointer ptr,
283 				 XtPointer callData);
284   static void printToFileBtnCbk(Widget widget, XtPointer ptr,
285 				XtPointer callData);
286   static void printPrintCbk(Widget widget, XtPointer ptr,
287 			    XtPointer callData);
288 
289   //----- Motif support
290   XmFontList createFontList(char *xlfd);
291 
292   static XPDFViewerCmd cmdTab[];
293 
294   XPDFApp *app;
295   GBool ok;
296 
297   Display *display;
298   int screenNum;
299   Widget win;			// top-level window
300   Widget form;
301   Widget panedWin;
302 #ifndef DISABLE_OUTLINE
303   Widget outlineScroll;
304   Widget outlineTree;
305   Widget *outlineLabels;
306   int outlineLabelsLength;
307   int outlineLabelsSize;
308   Dimension outlinePaneWidth;
309 #endif
310   XPDFCore *core;
311   Widget toolBar;
312   Widget backBtn;
313   Widget prevTenPageBtn;
314   Widget prevPageBtn;
315   Widget nextPageBtn;
316   Widget nextTenPageBtn;
317   Widget forwardBtn;
318   Widget pageNumText;
319   Widget pageCountLabel;
320 #if USE_COMBO_BOX
321   Widget zoomComboBox;
322 #else
323   Widget zoomMenu;
324   Widget zoomMenuBtns[nZoomMenuItems];
325 #endif
326   Widget zoomWidget;
327   Widget findBtn;
328   Widget printBtn;
329   Widget aboutBtn;
330   Widget linkLabel;
331   Widget quitBtn;
332   Widget popupMenu;
333 
334   Widget aboutDialog;
335   XmFontList aboutBigFont, aboutVersionFont, aboutFixedFont;
336 
337   Widget openDialog;
338   GBool openInNewWindow;
339 
340   Widget findDialog;
341   Widget findText;
342   Widget findBackwardToggle;
343   Widget findCaseSensitiveToggle;
344   Widget findWholeWordToggle;
345 
346   Widget saveAsDialog;
347 
348   Widget printDialog;
349   Widget printWithCmdBtn;
350   Widget printToFileBtn;
351   Widget printCmdText;
352   Widget printFileText;
353   Widget printFirstPage;
354   Widget printLastPage;
355 };
356 
357 #endif
358