diff options
author | Calvin Morrison <calvin@pobox.com> | 2023-04-05 14:13:39 -0400 |
---|---|---|
committer | Calvin Morrison <calvin@pobox.com> | 2023-04-05 14:13:39 -0400 |
commit | 835e373b3eeaabcd0621ed6798ab500f37982fae (patch) | |
tree | dfa16b0e2e1b4956b38f693220eac4e607802133 /xpdf-qt/XpdfViewer.h |
Diffstat (limited to 'xpdf-qt/XpdfViewer.h')
-rw-r--r-- | xpdf-qt/XpdfViewer.h | 508 |
1 files changed, 508 insertions, 0 deletions
diff --git a/xpdf-qt/XpdfViewer.h b/xpdf-qt/XpdfViewer.h new file mode 100644 index 0000000..f957626 --- /dev/null +++ b/xpdf-qt/XpdfViewer.h @@ -0,0 +1,508 @@ +//======================================================================== +// +// XpdfViewer.h +// +// Copyright 2015 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef XPDFVIEWER_H +#define XPDFVIEWER_H + +#include <aconf.h> + +#include <QDialog> +#include <QIcon> +#include <QLocalServer> +#include <QMainWindow> +#include <QToolButton> +#include "gtypes.h" +#include "Error.h" +#include "XpdfWidget.h" + +class GString; +class GList; +class PropertyListAnimation; +class QComboBox; +class QDialog; +class QHBoxLayout; +class QInputEvent; +class QLabel; +class QLineEdit; +class QListWidget; +class QListWidgetItem; +class QMenu; +class QModelIndex; +class QProgressDialog; +class QSignalMapper; +class QSplitter; +class QStackedLayout; +class QStackedWidget; +class QTextBrowser; +class QTimer; +class QToolBar; +class QToolButton; +class XpdfApp; +class XpdfMenuButton; +class XpdfTabInfo; +class XpdfViewer; + +//------------------------------------------------------------------------ + +struct XpdfViewerCmd { + const char *name; + int nArgs; + GBool requiresDoc; + GBool requiresEvent; + void (XpdfViewer::*func)(GString *args[], int nArgs, QInputEvent *event); +}; + +//------------------------------------------------------------------------ +// XpdfMenuButton +//------------------------------------------------------------------------ + +class XpdfMenuButton: public QToolButton { + Q_OBJECT + +public: + + XpdfMenuButton(QMenu *menuA); + +private slots: + + void btnPressed(); + +private: + + QMenu *menu; +}; + +//------------------------------------------------------------------------ +// XpdfErrorWindow +//------------------------------------------------------------------------ + +class XpdfErrorWindow: public QWidget { + Q_OBJECT + +public: + + XpdfErrorWindow(XpdfViewer *viewerA, int errorEventTypeA); + virtual ~XpdfErrorWindow(); + virtual QSize sizeHint() const; + virtual void closeEvent(QCloseEvent *event); + virtual void keyPressEvent(QKeyEvent *event); + virtual void customEvent(QEvent *event); + +private slots: + + void clearBtnPressed(); + +private: + + static void errorCbk(void *data, ErrorCategory category, + int pos, char *msg); + static void dummyErrorCbk(void *data, ErrorCategory category, + int pos, char *msg); + + XpdfViewer *viewer; + int errorEventType; + QListWidget *list; + QSize lastSize; +}; + +//------------------------------------------------------------------------ +// XpdfViewer +//------------------------------------------------------------------------ + +class XpdfViewer: public QMainWindow { + Q_OBJECT + +public: + + XpdfViewer(XpdfApp *appA, GBool fullScreen); + + static XpdfViewer *create(XpdfApp *app, QString fileName, int page, + QString destName, int rot, QString password, + GBool fullScreen); + + virtual ~XpdfViewer(); + + virtual QSize sizeHint() const; + + void tweakSize(); + + // Open a file in the current tab. Returns a boolean indicating + // success. + GBool open(QString fileName, int page, QString destName, int rot, + QString password); + + // Open a file in a new tab. Returns a boolean indicating success. + GBool openInNewTab(QString fileName, int page, QString destName, + int rot, QString password, GBool switchToTab); + + // Check that [fileName] is open in the current tab -- if not, open + // it. In either case, switch to [page] or [destName]. Returns a + // boolean indicating success. + GBool checkOpen(QString fileName, int page, QString destName, + QString password); + + virtual QMenu *createPopupMenu(); + + // Start up the remote server socket. + void startRemoteServer(const QString &remoteServerName); + + // Execute a command [cmd], with [event] for context. + void execCmd(const char *cmd, QInputEvent *event); + +public slots: + + bool close(); + +private slots: + + void remoteServerConnection(); + void remoteServerRead(); + + void pdfResized(); + void pdfPaintDone(bool finished); + void preLoad(); + void postLoad(); + void keyPress(QKeyEvent *e); + void mousePress(QMouseEvent *e); + void mouseRelease(QMouseEvent *e); + void mouseClick(QMouseEvent *e); + void mouseDoubleClick(QMouseEvent *e); + void mouseTripleClick(QMouseEvent *e); + void mouseWheel(QWheelEvent *e); + void mouseMove(QMouseEvent *e); + void pageChange(int pg); + void sidebarSplitterMoved(int pos, int index); +#if XPDFWIDGET_PRINTING + void printStatus(int nextPage, int firstPage, int lastPage); + void cancelPrint(); +#endif + + void openMenuAction(); + void openInNewWinMenuAction(); + void reloadMenuAction(); + void saveAsMenuAction(); + void saveImageMenuAction(); +#if XPDFWIDGET_PRINTING + void printMenuAction(); +#endif + void quitMenuAction(); + void copyMenuAction(); + void singlePageModeMenuAction(); + void continuousModeMenuAction(); + void sideBySideSingleModeMenuAction(); + void sideBySideContinuousModeMenuAction(); + void horizontalContinuousModeMenuAction(); + void fullScreenMenuAction(bool checked); + void rotateClockwiseMenuAction(); + void rotateCounterclockwiseMenuAction(); + void zoomToSelectionMenuAction(); + void toggleToolbarMenuAction(bool checked); + void toggleSidebarMenuAction(bool checked); + void viewPageLabelsMenuAction(bool checked); + void documentInfoMenuAction(); + void newTabMenuAction(); + void newWindowMenuAction(); + void closeTabMenuAction(); + void closeWindowMenuAction(); + void openErrorWindowMenuAction(); + void helpMenuAction(); + void keyBindingsMenuAction(); + void aboutMenuAction(); + + void popupMenuAction(int idx); + + void toggleSidebarButtonPressed(); + void pageNumberChanged(); + void backButtonPressed(); + void forwardButtonPressed(); + void zoomOutButtonPressed(); + void zoomInButtonPressed(); + void zoomIndexChanged(int idx); + void zoomEditingFinished(); + void fitWidthButtonPressed(); + void fitPageButtonPressed(); + void selectModeButtonPressed(); + void statusIndicatorPressed(); + void findTextChanged(); + void findNextButtonPressed(); + void findPrevButtonPressed(); + void newTabButtonPressed(); + + void switchTab(QListWidgetItem *current, QListWidgetItem *previous); + void tabsReordered(const QModelIndex &srcParent, int srcStart, int srcEnd, + const QModelIndex &destParent, int destRow); + void infoComboBoxChanged(int idx); + void outlineItemClicked(const QModelIndex& idx); + void layerItemClicked(const QModelIndex& idx); + void attachmentSaveClicked(int idx); + + void clearFindError(); + +private: + + friend class XpdfErrorWindow; + + //--- commands + int mouseX(QInputEvent *event); + int mouseY(QInputEvent *event); + void cmdAbout(GString *args[], int nArgs, QInputEvent *event); + void cmdBlockSelectMode(GString *args[], int nArgs, QInputEvent *event); + void cmdCheckOpenFile(GString *args[], int nArgs, QInputEvent *event); + void cmdCheckOpenFileAtDest(GString *args[], int nArgs, QInputEvent *event); + void cmdCheckOpenFileAtPage(GString *args[], int nArgs, QInputEvent *event); + void cmdCloseTabOrQuit(GString *args[], int nArgs, QInputEvent *event); + void cmdCloseSidebar(GString *args[], int nArgs, QInputEvent *event); + void cmdCloseSidebarMoveResizeWin(GString *args[], int nArgs, QInputEvent *event); + void cmdCloseSidebarResizeWin(GString *args[], int nArgs, QInputEvent *event); + void cmdCloseWindowOrQuit(GString *args[], int nArgs, QInputEvent *event); + void cmdContinuousMode(GString *args[], int nArgs, QInputEvent *event); + void cmdCopy(GString *args[], int nArgs, QInputEvent *event); + void cmdCopyLinkTarget(GString *args[], int nArgs, QInputEvent *event); +#if 0 // for debugging + void cmdDebug1(GString *args[], int nArgs, QInputEvent *event); +#endif + void cmdEndPan(GString *args[], int nArgs, QInputEvent *event); + void cmdEndSelection(GString *args[], int nArgs, QInputEvent *event); + void cmdExpandSidebar(GString *args[], int nArgs, QInputEvent *event); + void cmdFind(GString *args[], int nArgs, QInputEvent *event); + void cmdFindFirst(GString *args[], int nArgs, QInputEvent *event); + void cmdFindNext(GString *args[], int nArgs, QInputEvent *event); + void cmdFindPrevious(GString *args[], int nArgs, QInputEvent *event); + void cmdFocusToDocWin(GString *args[], int nArgs, QInputEvent *event); + void cmdFocusToPageNum(GString *args[], int nArgs, QInputEvent *event); + void cmdFollowLink(GString *args[], int nArgs, QInputEvent *event); + void cmdFollowLinkInNewTab(GString *args[], int nArgs, QInputEvent *event); + void cmdFollowLinkInNewTabNoSel(GString *args[], int nArgs, QInputEvent *event); + void cmdFollowLinkInNewWin(GString *args[], int nArgs, QInputEvent *event); + void cmdFollowLinkInNewWinNoSel(GString *args[], int nArgs, QInputEvent *event); + void cmdFollowLinkNoSel(GString *args[], int nArgs, QInputEvent *event); + void cmdFullScreenMode(GString *args[], int nArgs, QInputEvent *event); + void cmdGoBackward(GString *args[], int nArgs, QInputEvent *event); + void cmdGoForward(GString *args[], int nArgs, QInputEvent *event); + void cmdGotoDest(GString *args[], int nArgs, QInputEvent *event); + void cmdGotoLastPage(GString *args[], int nArgs, QInputEvent *event); + void cmdGotoPage(GString *args[], int nArgs, QInputEvent *event); + void cmdHelp(GString *args[], int nArgs, QInputEvent *event); + void cmdHideMenuBar(GString *args[], int nArgs, QInputEvent *event); + void cmdHideToolbar(GString *args[], int nArgs, QInputEvent *event); + void cmdHorizontalContinuousMode(GString *args[], int nArgs, QInputEvent *event); + void cmdLinearSelectMode(GString *args[], int nArgs, QInputEvent *event); + void cmdLoadTabState(GString *args[], int nArgs, QInputEvent *event); + void cmdNewTab(GString *args[], int nArgs, QInputEvent *event); + void cmdNewWindow(GString *args[], int nArgs, QInputEvent *event); + void cmdNextPage(GString *args[], int nArgs, QInputEvent *event); + void cmdNextPageNoScroll(GString *args[], int nArgs, QInputEvent *event); + void cmdNextTab(GString *args[], int nArgs, QInputEvent *event); + void cmdOpen(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenErrorWindow(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenFile(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenFile2(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenFileAtDest(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenFileAtDestIn(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenFileAtPage(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenFileAtPageIn(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenFileIn(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenIn(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenSidebar(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenSidebarMoveResizeWin(GString *args[], int nArgs, QInputEvent *event); + void cmdOpenSidebarResizeWin(GString *args[], int nArgs, QInputEvent *event); + void cmdPageDown(GString *args[], int nArgs, QInputEvent *event); + void cmdPageUp(GString *args[], int nArgs, QInputEvent *event); + void cmdPostPopupMenu(GString *args[], int nArgs, QInputEvent *event); + void cmdPrevPage(GString *args[], int nArgs, QInputEvent *event); + void cmdPrevPageNoScroll(GString *args[], int nArgs, QInputEvent *event); + void cmdPrevTab(GString *args[], int nArgs, QInputEvent *event); +#if XPDFWIDGET_PRINTING + void cmdPrint(GString *args[], int nArgs, QInputEvent *event); +#endif + void cmdQuit(GString *args[], int nArgs, QInputEvent *event); + void cmdRaise(GString *args[], int nArgs, QInputEvent *event); + void cmdReload(GString *args[], int nArgs, QInputEvent *event); + void cmdRotateCW(GString *args[], int nArgs, QInputEvent *event); + void cmdRotateCCW(GString *args[], int nArgs, QInputEvent *event); + void cmdRun(GString *args[], int nArgs, QInputEvent *event); + void cmdSaveAs(GString *args[], int nArgs, QInputEvent *event); + void cmdSaveImage(GString *args[], int nArgs, QInputEvent *event); + void cmdSaveTabState(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollDown(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollDownNextPage(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollLeft(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollOutlineDown(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollOutlineUp(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollRight(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollToBottomEdge(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollToBottomRight(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollToLeftEdge(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollToRightEdge(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollToTopEdge(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollToTopLeft(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollUp(GString *args[], int nArgs, QInputEvent *event); + void cmdScrollUpPrevPage(GString *args[], int nArgs, QInputEvent *event); + void cmdSelectLine(GString *args[], int nArgs, QInputEvent *event); + void cmdSelectWord(GString *args[], int nArgs, QInputEvent *event); + void cmdSetSelection(GString *args[], int nArgs, QInputEvent *event); + void cmdShowAttachmentsPane(GString *args[], int nArgs, QInputEvent *event); + void cmdShowDocumentInfo(GString *args[], int nArgs, QInputEvent *event); + void cmdShowKeyBindings(GString *args[], int nArgs, QInputEvent *event); + void cmdShowLayersPane(GString *args[], int nArgs, QInputEvent *event); + void cmdShowMenuBar(GString *args[], int nArgs, QInputEvent *event); + void cmdShowOutlinePane(GString *args[], int nArgs, QInputEvent *event); + void cmdShowToolbar(GString *args[], int nArgs, QInputEvent *event); + void cmdShrinkSidebar(GString *args[], int nArgs, QInputEvent *event); + void cmdSideBySideContinuousMode(GString *args[], int nArgs, QInputEvent *event); + void cmdSideBySideSingleMode(GString *args[], int nArgs, QInputEvent *event); + void cmdSinglePageMode(GString *args[], int nArgs, QInputEvent *event); + void cmdStartExtendedSelection(GString *args[], int nArgs, QInputEvent *event); + void cmdStartPan(GString *args[], int nArgs, QInputEvent *event); + void cmdStartSelection(GString *args[], int nArgs, QInputEvent *event); + void cmdToggleContinuousMode(GString *args[], int nArgs, QInputEvent *event); + void cmdToggleFullScreenMode(GString *args[], int nArgs, QInputEvent *event); + void cmdToggleMenuBar(GString *args[], int nArgs, QInputEvent *event); + void cmdToggleSelectMode(GString *args[], int nArgs, QInputEvent *event); + void cmdToggleSidebar(GString *args[], int nArgs, QInputEvent *event); + void cmdToggleSidebarMoveResizeWin(GString *args[], int nArgs, QInputEvent *event); + void cmdToggleSidebarResizeWin(GString *args[], int nArgs, QInputEvent *event); + void cmdToggleToolbar(GString *args[], int nArgs, QInputEvent *event); + void cmdViewPageLabels(GString *args[], int nArgs, QInputEvent *event); + void cmdViewPageNumbers(GString *args[], int nArgs, QInputEvent *event); + void cmdWindowMode(GString *args[], int nArgs, QInputEvent *event); + void cmdZoomFitPage(GString *args[], int nArgs, QInputEvent *event); + void cmdZoomFitWidth(GString *args[], int nArgs, QInputEvent *event); + void cmdZoomIn(GString *args[], int nArgs, QInputEvent *event); + void cmdZoomOut(GString *args[], int nArgs, QInputEvent *event); + void cmdZoomPercent(GString *args[], int nArgs, QInputEvent *event); + void cmdZoomToSelection(GString *args[], int nArgs, QInputEvent *event); + int scaleScroll(int delta); + void followLink(QInputEvent *event, GBool onlyIfNoSel, + GBool newTab, GBool newWindow); + + //--- GUI events + int getModifiers(Qt::KeyboardModifiers qtMods); + int getContext(Qt::KeyboardModifiers qtMods); + int getMouseButton(Qt::MouseButton qtBtn); + virtual void keyPressEvent(QKeyEvent *e); + virtual void dragEnterEvent(QDragEnterEvent *e); + virtual void dropEvent(QDropEvent *e); + virtual bool eventFilter(QObject *watched, QEvent *event); + + //--- GUI setup + void createWindow(); + void createToolBar(); + QToolButton *addToolBarButton(const QIcon &icon, + const char *slot, const char *tip); + XpdfMenuButton *addToolBarMenuButton(const QIcon &icon, + const char *tip, QMenu *menu); + void addToolBarSeparator(); + void addToolBarSpacing(int w); + void addToolBarStretch(); + void createMainMenu(); + void createXpdfPopupMenu(); + QWidget *createTabPane(); + QWidget *createInfoPane(); + void updateInfoPane(); + void destroyWindow(); + void enterFullScreenMode(); + void exitFullScreenMode(); + void addTab(); + void closeTab(XpdfTabInfo *tab); + void gotoTab(int idx); + void updateModeInfo(); + void updateZoomInfo(); + void updateSelectModeInfo(); + void updateDocInfo(); + void updatePageNumberOrLabel(int pg); + void updateOutline(int pg); + void setOutlineOpenItems(const QModelIndex &idx); + void fillAttachmentList(); + void statusIndicatorStart(); + void statusIndicatorStop(); + void statusIndicatorOk(); + void statusIndicatorError(); + void showFindError(); + void createDocumentInfoDialog(); + void updateDocumentInfoDialog(XpdfWidget *view); + QString createDocumentInfoMetadataHTML(XpdfWidget *view); + QString createDocumentInfoFontsHTML(XpdfWidget *view); + void createKeyBindingsDialog(); + QString createKeyBindingsHTML(); + void createAboutDialog(); + void execSaveImageDialog(); + + static XpdfViewerCmd cmdTab[]; + + XpdfApp *app; + + // menu + QMenuBar *mainMenu; + QMenu *displayModeSubmenu; + QAction *fullScreenMenuItem; + QAction *toggleToolbarMenuItem; + QAction *toggleSidebarMenuItem; + QAction *viewPageLabelsMenuItem; + + // popup menu + QMenu *popupMenu; + QSignalMapper *popupMenuSignalMapper; + + // toolbar + int toolBarFontSize; // used for HiDPI scaling + QToolBar *toolBar; + QLineEdit *pageNumber; + QLabel *pageCount; + QComboBox *zoomComboBox; + QToolButton *fitWidthBtn; + QToolButton *fitPageBtn; + QToolButton *selectModeBtn; + PropertyListAnimation *indicatorAnimation; + QList<QVariant> indicatorIcons; + QList<QVariant> indicatorErrIcons; + QLineEdit *findEdit; + QAction *findCaseSensitiveAction; + QAction *findWholeWordsAction; + + // sidebar pane + QSplitter *sidebarSplitter; + int initialSidebarWidth; + int sidebarWidth; + QListWidget *tabList; + QComboBox *infoComboBox; + QStackedLayout *infoStack; + + // viewer pane + QStackedWidget *viewerStack; + + QLabel *linkTargetBar; + QString linkTargetInfo; + + GList *tabInfo; // [XpdfTabInfo] + XpdfTabInfo *currentTab; + XpdfTabInfo *lastOpenedTab; + + double scaleFactor; + + XpdfWidget::DisplayMode fullScreenPreviousDisplayMode; + double fullScreenPreviousZoom; + + QTimer *findErrorTimer; + + XpdfErrorWindow *errorWindow; + QDialog *documentInfoDialog; + QTextBrowser *documentInfoMetadataTab; + QTextBrowser *documentInfoFontsTab; + QDialog *keyBindingsDialog; + QDialog *aboutDialog; +#if XPDFWIDGET_PRINTING + QProgressDialog *printStatusDialog; +#endif + + QString lastFileOpened; + + QLocalServer *remoteServer; +}; + +#endif |