/* * Copyright 2006-2017 ICEsoft Technologies Canada Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.icepdf.ri.common; import org.icepdf.core.util.Defs; import org.icepdf.ri.common.utility.annotation.AnnotationPanel; import org.icepdf.ri.common.utility.attachment.AttachmentPanel; import org.icepdf.ri.common.utility.layers.LayersPanel; import org.icepdf.ri.common.utility.outline.OutlinesTree; import org.icepdf.ri.common.utility.search.SearchPanel; import org.icepdf.ri.common.utility.signatures.SignaturesPanel; import org.icepdf.ri.common.utility.thumbs.ThumbnailsPanel; import org.icepdf.ri.common.views.DocumentViewController; import org.icepdf.ri.common.views.DocumentViewControllerImpl; import org.icepdf.ri.images.Images; import org.icepdf.ri.util.MacOSAdapter; import org.icepdf.ri.util.PropertiesManager; import javax.swing.*; import java.awt.*; import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; /** * <p>The purpose of this class is to facilitate in the building of user interface components * that are used to view and interact with PDF Documents.</p> * <br> * <p>As such, there are three main scenarios that are covered.</p> * <ol> * <li>Building a standalone Viewer JFrame that will behave much as a full-featured PDF viewing application.</li> * <li>Building an embeddable PDF Viewer JPanel, which can easily be added into any existing client application, * augmenting its capabilities to include the capacity for viewing PDF Documents.</li> * <li>Building a subset of the above, using the various building block methods in this class to construct GUI * components that provide certain aspects of the overall functionality, and adding those into * your application as desired.</li> * </ol> * <br> * <h2>Building a standalone window</h2> * <p>This is the main entry point for building a JFrame containing all of the graphical user interface * elements necessary for viewing PDF files.</p> * <p>The hierarchy of the methods that are invoked to construct the complete GUI * is provided below for your reference. * You may choose to use any of the individual methods to construct a sub-set of the complete * GUI that meets your specific requirements. This also provides you flexibility in the containers * that you add the components into and the overall layout of the application, etc.</p> * <br> * <b>public JFrame buildViewerFrame()</b> * <ul> * <li>public JMenuBar buildCompleteMenuBar() * <ul> * <li>public JMenu buildFileMenu() * <ul> * <li>public JMenuItem buildOpenFileMenuItem()</li> * <li>public JMenuItem buildOpenURLMenuItem()</li> * <li>public JMenuItem buildCloseMenuItem()</li> * <li>public JMenuItem buildSaveAsFileMenuItem()</li> * <li>public JMenuItem buildExportTextMenuItem()</li> * <li>public JMenuItem buildExportSVGMenuItem()</li> * <li>public JMenuItem buildPermissionsMenuItem()</li> * <li>public JMenuItem buildInformationMenuItem()</li> * <li>public JMenuItem buildPrintSetupMenuItem()</li> * <li>public JMenuItem buildPrintMenuItem()</li> * <li>public JMenuItem buildExitMenuItem()</li> * </ul> * </li> <!-- buildFileMenu() --> * <li>public JMenu buildViewMenu() * <ul> * <li>public JMenuItem buildFitActualSizeMenuItem()</li> * <li>public JMenuItem buildFitPageMenuItem()</li> * <li>public JMenuItem buildFitWidthMenuItem()</li> * <li>public JMenuItem buildZoomInMenuItem()</li> * <li>public JMenuItem buildZoomOutMenuItem()</li> * <li>public JMenuItem buildRotateLeftMenuItem()</li> * <li>public JMenuItem buildRotateRightMenuItem()</li> * <li>public JMenuItem buildShowHideToolBarMenuItem()</li> * <li>public JMenuItem buildShowHideUtilityPaneMenuItem()</li> * </ul> * </li> <!-- buildViewMenu() --> * <li>public JMenu buildDocumentMenu() * <ul> * <li>public JMenuItem buildFirstPageMenuItem()</li> * <li>public JMenuItem buildPreviousPageMenuItem()</li> * <li>public JMenuItem buildNextPageMenuItem()</li> * <li>public JMenuItem buildLastPageMenuItem()</li> * <li>public JMenuItem buildSearchMenuItem()</li> * <li>public JMenuItem buildGoToPageMenuItem()</li> * </ul> * </li> <!-- buildDocumentMenu() --> * <li>public JMenu buildWindowMenu() * <ul> * <li>public JMenuItem buildMinimiseAllMenuItem()</li> * <li>public JMenuItem buildBringAllToFrontMenuItem()</li> * <li>public void buildWindowListMenuItems(JMenu menu)</li> * </ul> * </li> <!-- buildWindowMenu() --> * <li>public JMenu buildHelpMenu() * <ul> * <li>public JMenuItem buildAboutMenuItem()</li> * </ul> * </li> <!-- buildHelpMenu() --> * </ul> * </li> <!-- buildCompleteMenuBar() --> * <li>public void buildContents(Container cp, boolean embeddableComponent) * <ul> * <li>public JToolBar buildCompleteToolBar(boolean embeddableComponent) * <ul> * <li>public JToolBar buildUtilityToolBar(boolean embeddableComponent) * <ul> * <li>public JButton buildOpenFileButton()</li> * <li>public JButton buildSaveAsFileButton()</li> * <li>public JButton buildPrintButton()</li> * <li>public JButton buildSearchButton()</li> * <li>public JButton buildShowHideUtilityPaneButton()</li> * </ul> * </li> <!-- buildUtilityToolBar(boolean embeddableComponent) --> * <li>public JToolBar buildPageNavigationToolBar() * <ul> * <li>public JButton buildFirstPageButton()</li> * <li>public JButton buildPreviousPageButton()</li> * <li>public JButton buildNextPageButton()</li> * <li>public JButton buildLastPageButton()</li> * <li>public JTextField buildCurrentPageNumberTextField()</li> * <li>public JLabel buildNumberOfPagesLabel()</li> * </ul> * </li> <!-- buildPageNavigationToolBar() --> * <li>public JToolBar buildZoomToolBar() * <ul> * <li>public JButton buildZoomOutButton()</li> * <li>public JComboBox buildZoomCombBox()</li> * <li>public JButton buildZoomInButton()</li> * </ul> * </li> <!-- buildZoomToolBar() --> * <li>public JToolBar buildFitToolBar() * <ul> * <li>public JToggleButton buildFitActualSizeButton()</li> * <li>public JToggleButton buildFitPageButton()</li> * <li>public JToggleButton buildFitWidthButton()</li> * </ul> * </li> <!-- buildFitToolBar() --> * <li>public JToolBar buildRotateToolBar() * <ul> * <li>public JButton buildRotateLeftButton()</li> * <li>public JButton buildRotateRightButton()</li> * </ul> * </li> <!-- buildRotateToolBar() --> * <li>public JToolBar buildToolToolBar() * <ul> * <li>public JToggleButton buildPanToolButton()</li> * <li>public JToggleButton buildZoomInToolButton()</li> * <li>public JToggleButton buildZoomOutToolButton()</li> * </ul> * </li> <!-- buildToolToolBar() --> * </ul> * </li> <!-- buildCompleteToolBar(boolean embeddableComponent) --> * <li>public JSplitPane buildUtilityAndDocumentSplitPane(boolean embeddableComponent) * <ul> * <li>public JTabbedPane buildUtilityTabbedPane() * <ul> * <li>public JComponent buildOutlineComponents()</li> * <li>public SearchPanel buildSearchPanel()</li> * </ul> * </li> <!-- buildUtilityTabbedPane() --> * <li>public JScrollPane buildDocumentComponents(boolean embeddableComponent)</li> * </ul> * </li> <!-- buildUtilityAndDocumentSplitPane(boolean embeddableComponent) --> * <li>public JLabel buildStatusPanel()</li> * </ul> * </li> <!-- buildContents(Container cp, boolean embeddableComponent) --> * </ul> * <h2>Building an embeddable component</h2> * <p>This is the main entry point for building a JPanel containing all of the GUI elements * necessary for viewing PDF files. The main differences between this and buildViewerFrame() are:</p> * <ul> * <li>The buildViewerPanel method returns a JPanel which you may then embed anywhere into your GUI * <li>The JPanel will not contain a menu bar. * <li>The JPanel uses the sub-set of the GUI components available in buildViewerFrame that are * suited to an embedded component scenario. * </ul> * <p>The following hierarchy of methods that are invoked to construct the complete Component GUI * is provided for your reference. * You may choose to use any of the individual methods below to construct a sub-set of the complete * GUI that meets your specific requirements. This also provides you flexibility in the containers * that you add the components into and the overall layout of the application, etc.</p> * <b>public JPanel buildViewerPanel()</b> * <ul> * <li>public void buildContents(Container cp, boolean embeddableComponent) * <ul> * <li>public JToolBar buildCompleteToolBar(boolean embeddableComponent) * <ul> * <li>public JToolBar buildUtilityToolBar(boolean embeddableComponent) * <ul> * <li>public JButton buildSaveAsFileButton()</li> * <li>public JButton buildPrintButton()</li> * <li>public JButton buildSearchButton()</li> * <li>public JButton buildShowHideUtilityPaneButton()</li> * </ul> * </li> <!-- buildUtilityToolBar(boolean embeddableComponent) --> * <li>public JToolBar buildPageNavigationToolBar() * <ul> * <li>public JButton buildFirstPageButton()</li> * <li>public JButton buildPreviousPageButton()</li> * <li>public JButton buildNextPageButton()</li> * <li>public JButton buildLastPageButton()</li> * <li>public JTextField buildCurrentPageNumberTextField()</li> * <li>public JLabel buildNumberOfPagesLabel()</li> * </ul> * </li> <!-- buildPageNavigationToolBar() --> * <li>public JToolBar buildZoomToolBar() * <ul> * <li>public JButton buildZoomOutButton()</li> * <li>public JComboBox buildZoomCombBox()</li> * <li>public JButton buildZoomInButton()</li> * </ul> * </li> <!-- buildZoomToolBar() --> * <li>public JToolBar buildFitToolBar() * <ul> * <li>public JToggleButton buildFitActualSizeButton()</li> * <li>public JToggleButton buildFitPageButton()</li> * <li>public JToggleButton buildFitWidthButton()</li> * </ul> * </li> <!-- buildFitToolBar() --> * <li>public JToolBar buildRotateToolBar() * <ul> * <li>public JButton buildRotateLeftButton()</li> * <li>public JButton buildRotateRightButton()</li> * </ul> * </li> <!-- buildRotateToolBar() --> * <li>public JToolBar buildToolToolBar() * <ul> * <li>public JToggleButton buildPanToolButton()</li> * <li>public JToggleButton buildZoomInToolButton()</li> * <li>public JToggleButton buildZoomOutToolButton()</li> * </ul> * </li> <!-- buildToolToolBar() --> * </ul> * </li> <!-- buildCompleteToolBar(boolean embeddableComponent) --> * <li>public JSplitPane buildUtilityAndDocumentSplitPane(boolean embeddableComponent) * <ul> * <li>public JTabbedPane buildUtilityTabbedPane() * <ul> * <li>public JComponent buildOutlineComponents()</li> * <li>public SearchPanel buildSearchPanel()</li> * </ul> * </li> <!-- buildUtilityTabbedPane() --> * <li>public JScrollPane buildDocumentComponents(boolean embeddableComponent)</li> * </ul> * </li> <!-- buildUtilityAndDocumentSplitPane(boolean embeddableComponent) --> * <li>public JLabel buildStatusPanel()</li> * </ul> * </li> <!-- buildContents(Container cp, boolean embeddableComponent) --> * </ul> * * @author Mark Collette * @since 2.0 */ public class SwingViewBuilder { private static final Logger logger = Logger.getLogger(SwingViewBuilder.class.toString()); public static final int TOOL_BAR_STYLE_FLOATING = 1; public static final int TOOL_BAR_STYLE_FIXED = 2; protected static final float[] DEFAULT_ZOOM_LEVELS = { 0.05f, 0.10f, 0.25f, 0.50f, 0.75f, 1.0f, 1.5f, 2.0f, 3.0f, 4.0f, 8.0f, 16.0f, 24.0f, 32.0f, 64.0f}; protected SwingController viewerController; protected Font buttonFont; protected boolean showButtonText; protected int toolbarStyle; protected float[] zoomLevels; protected boolean haveMadeAToolBar; protected int documentViewType; protected int documentPageFitMode; protected ResourceBundle messageBundle; protected PropertiesManager propertiesManager; public static boolean isMacOs; private static boolean isDemo; static { isMacOs = (Defs.sysProperty("mrj.version") != null); // check for demo system property isDemo = Defs.sysPropertyBoolean("org.icepdf.ri.viewer.demo", false); } /** * Construct a SwingVewBuilder with all of the default settings * * @param c SwingController that will interact with the GUI */ public SwingViewBuilder(SwingController c) { // Use all the defaults this(c, null, null, false, SwingViewBuilder.TOOL_BAR_STYLE_FIXED, null, DocumentViewControllerImpl.ONE_PAGE_VIEW, DocumentViewController.PAGE_FIT_WINDOW_HEIGHT); } /** * Constructor that accepts a different PropertiesManager and otherwise * defaults the remaining settings * * @param c SwingController that will interact with the GUI * @param properties PropertiesManager that can customize the UI */ public SwingViewBuilder(SwingController c, PropertiesManager properties) { this(c, properties, null, false, SwingViewBuilder.TOOL_BAR_STYLE_FIXED, null, DocumentViewControllerImpl.ONE_PAGE_VIEW, DocumentViewController.PAGE_FIT_WINDOW_HEIGHT); } /** * Construct a SwingVewBuilder with all of the default settings * * @param c SwingController that will interact with the GUI * @param documentViewType view type to build , single page, single column etc. * @param documentPageFitMode fit mode to initially load document with. */ public SwingViewBuilder(SwingController c, int documentViewType, int documentPageFitMode) { // Use all the defaults this(c, null, null, false, SwingViewBuilder.TOOL_BAR_STYLE_FIXED, null, documentViewType, documentPageFitMode); } /** * Construct a SwingVewBuilder with whichever settings you desire * * @param c SwingController that will interact with the GUI */ public SwingViewBuilder(SwingController c, Font bf, boolean bt, int ts, float[] zl, final int documentViewType, final int documentPageFitMode) { this(c, null, bf, bt, ts, zl, documentViewType, documentPageFitMode); } /** * Construct a SwingVewBuilder with whichever settings you desire * * @param c SwingController that will interact with the GUI */ public SwingViewBuilder(SwingController c, PropertiesManager properties, Font bf, boolean bt, int ts, float[] zl, final int documentViewType, final int documentPageFitMode) { viewerController = c; messageBundle = viewerController.getMessageBundle(); if (properties != null) { viewerController.setPropertiesManager(properties); this.propertiesManager = properties; } // Attempt to override the highlight color from the properties file overrideHighlightColor(); // update View Controller with previewer document page fit and view type info DocumentViewControllerImpl documentViewController = (DocumentViewControllerImpl) viewerController.getDocumentViewController(); documentViewController.setDocumentViewType(documentViewType, documentPageFitMode); buttonFont = bf; if (buttonFont == null) buttonFont = buildButtonFont(); showButtonText = bt; toolbarStyle = ts; zoomLevels = zl; if (zoomLevels == null) zoomLevels = DEFAULT_ZOOM_LEVELS; // set default doc view type, single page, facing page, etc. this.documentViewType = documentViewType; // set default view mode type, fit page, fit width, no-fit. this.documentPageFitMode = documentPageFitMode; } /** * This is a standard method for creating a standalone JFrame, that would * behave as a fully functional PDF Viewer application. * * @return a JFrame containing the PDF document's current page visualization, * menu bar, accelerator buttons, and document outline if available. * @see #buildViewerPanel */ public JFrame buildViewerFrame() { JFrame viewer = new JFrame(); viewer.setIconImage(new ImageIcon(Images.get("icepdf-app-icon-64x64.png")).getImage()); viewer.setTitle(messageBundle.getString("viewer.window.title.default")); viewer.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); JMenuBar menuBar = buildCompleteMenuBar(); if (menuBar != null) viewer.setJMenuBar(menuBar); Container contentPane = viewer.getContentPane(); buildContents(contentPane, false); if (viewerController != null) viewerController.setViewerFrame(viewer); return viewer; } /** * Used by the Applet and Pilot RI code to create an embeddable panel * for viewing PDF files, as opposed to buildViewerFrame(), which makes a * standalone JFrame * * @return JPanel containing the PDF document's current page visualization, * menu bar, accelerator buttons, and document outline if available. * @see #buildViewerFrame */ public JPanel buildViewerPanel() { JPanel panel = new JPanel(); buildContents(panel, true); return panel; } /** * The Container will contain the PDF document's current page visualization * and document outline if available. * * @param cp Container in which to put components for viewing PDF documents */ public void buildContents(Container cp, boolean embeddableComponent) { cp.setLayout(new BorderLayout()); JToolBar toolBar = buildCompleteToolBar(embeddableComponent); if (toolBar != null) cp.add(toolBar, BorderLayout.NORTH); // Builds the utility pane as well as the main document View, important // code entry point. JSplitPane utilAndDocSplit = buildUtilityAndDocumentSplitPane(embeddableComponent); if (utilAndDocSplit != null) cp.add(utilAndDocSplit, BorderLayout.CENTER); JPanel statusPanel = buildStatusPanel(); if (statusPanel != null) cp.add(statusPanel, BorderLayout.SOUTH); } public JMenuBar buildCompleteMenuBar() { JMenuBar menuBar = new JMenuBar(); addToMenuBar(menuBar, buildFileMenu()); addToMenuBar(menuBar, buildEditMenu()); addToMenuBar(menuBar, buildViewMenu()); addToMenuBar(menuBar, buildDocumentMenu()); addToMenuBar(menuBar, buildWindowMenu()); addToMenuBar(menuBar, buildHelpMenu()); // If running on MacOS, setup the native app. menu item handlers if (isMacOs) { try { // Generate and register the MacOSAdapter, passing it a hash of all the methods we wish to // use as delegates for various com.apple.eawt.ApplicationListener methods MacOSAdapter.setQuitHandler(viewerController, viewerController.getClass().getDeclaredMethod("exit", (Class[]) null)); MacOSAdapter.setAboutHandler(viewerController, viewerController.getClass().getDeclaredMethod("showAboutDialog", (Class[]) null)); } catch (Exception e) { logger.log(Level.FINE, "Error occurred while loading the MacOSAdapter:", e); } } return menuBar; } protected KeyStroke buildKeyStroke(int keyCode, int modifiers) { return buildKeyStroke(keyCode, modifiers, false); } /** * Create and return a KeyStroke with the specified code and modifier * Note this will automatically return null if the PROPERTY_SHOW_KEYBOARD_SHORTCUTS * property is 'false' * * @param keyCode to build * @param modifiers to build * @param onRelease to build * @return built KeyStroke */ protected KeyStroke buildKeyStroke(int keyCode, int modifiers, boolean onRelease) { doubleCheckPropertiesManager(); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_KEYBOARD_SHORTCUTS, true)) { return KeyStroke.getKeyStroke(keyCode, modifiers, onRelease); } return null; } /** * Return a valid mnemonic for the passed character, unless the * PropertiesManager.PROPERTY_SHOW_KEYBOARD_SHORTCUTS property is 'false', * in which case we'll return -1 * * @param mnemonic to build * @return built mnemonic */ protected int buildMnemonic(char mnemonic) { doubleCheckPropertiesManager(); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_KEYBOARD_SHORTCUTS, true)) { return mnemonic; } return -1; } public JMenu buildFileMenu() { JMenu fileMenu = new JMenu(messageBundle.getString("viewer.menu.file.label")); fileMenu.setMnemonic(buildMnemonic(messageBundle.getString("viewer.menu.file.mnemonic").charAt(0))); JMenuItem openFileMenuItem = buildOpenFileMenuItem(); JMenuItem openURLMenuItem = buildOpenURLMenuItem(); if (openFileMenuItem != null && openURLMenuItem != null) { JMenu openSubMenu = new JMenu(messageBundle.getString("viewer.menu.open.label")); openSubMenu.setIcon(new ImageIcon(Images.get("open_a_24.png"))); openSubMenu.setDisabledIcon(new ImageIcon(Images.get("open_i_24.png"))); openSubMenu.setRolloverIcon(new ImageIcon(Images.get("open_r_24.png"))); addToMenu(openSubMenu, openFileMenuItem); addToMenu(openSubMenu, openURLMenuItem); addToMenu(fileMenu, openSubMenu); } else if (openFileMenuItem != null || openURLMenuItem != null) { addToMenu(fileMenu, openFileMenuItem); addToMenu(fileMenu, openURLMenuItem); } fileMenu.addSeparator(); addToMenu(fileMenu, buildCloseMenuItem()); addToMenu(fileMenu, buildSaveAsFileMenuItem()); addToMenu(fileMenu, buildExportTextMenuItem()); fileMenu.addSeparator(); addToMenu(fileMenu, buildPermissionsMenuItem()); addToMenu(fileMenu, buildInformationMenuItem()); addToMenu(fileMenu, buildFontInformationMenuItem()); fileMenu.addSeparator(); addToMenu(fileMenu, buildPrintSetupMenuItem()); addToMenu(fileMenu, buildPrintMenuItem()); if (!isMacOs) { // Not on a Mac, so create the Exit menu item. fileMenu.addSeparator(); addToMenu(fileMenu, buildExitMenuItem()); } return fileMenu; } public JMenuItem buildOpenFileMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.open.file.label"), buildKeyStroke(KeyEventConstants.KEY_CODE_OPEN_FILE, KeyEventConstants.MODIFIER_OPEN_FILE)); if (viewerController != null && mi != null) viewerController.setOpenFileMenuItem(mi); return mi; } public JMenuItem buildOpenURLMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.open.URL.label"), buildKeyStroke(KeyEventConstants.KEY_CODE_OPEN_URL, KeyEventConstants.MODIFIER_OPEN_URL)); if (viewerController != null && mi != null) viewerController.setOpenURLMenuItem(mi); return mi; } public JMenuItem buildCloseMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.close.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_CLOSE, KeyEventConstants.MODIFIER_CLOSE)); if (viewerController != null && mi != null) viewerController.setCloseMenuItem(mi); return mi; } public JMenuItem buildSaveAsFileMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.saveAs.label"), "save", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_SAVE_AS, KeyEventConstants.MODIFIER_SAVE_AS, false)); if (viewerController != null && mi != null) viewerController.setSaveAsFileMenuItem(mi); return mi; } public JMenuItem buildExportTextMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.exportText.label"), null, null, null); if (viewerController != null && mi != null) viewerController.setExportTextMenuItem(mi); return mi; } public JMenuItem buildPermissionsMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.documentPermission.label"), null, null, null); if (viewerController != null && mi != null) viewerController.setPermissionsMenuItem(mi); return mi; } public JMenuItem buildInformationMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.documentInformation.label"), null, null, null); if (viewerController != null && mi != null) viewerController.setInformationMenuItem(mi); return mi; } public JMenuItem buildFontInformationMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.documentFonts.label"), null, null, null); if (viewerController != null && mi != null) viewerController.setFontInformationMenuItem(mi); return mi; } public JMenuItem buildPrintSetupMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.printSetup.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_PRINT_SETUP, KeyEventConstants.MODIFIER_PRINT_SETUP, false)); if (viewerController != null && mi != null) viewerController.setPrintSetupMenuItem(mi); return mi; } public JMenuItem buildPrintMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.print.label"), "print", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_PRINT, KeyEventConstants.MODIFIER_PRINT)); if (viewerController != null && mi != null) viewerController.setPrintMenuItem(mi); return mi; } public JMenuItem buildExitMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.exit.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_EXIT, KeyEventConstants.MODIFIER_EXIT)); if (viewerController != null && mi != null) viewerController.setExitMenuItem(mi); return mi; } public JMenu buildEditMenu() { JMenu viewMenu = new JMenu(messageBundle.getString("viewer.menu.edit.label")); viewMenu.setMnemonic(buildMnemonic(messageBundle.getString("viewer.menu.edit.mnemonic").charAt(0))); addToMenu(viewMenu, buildUndoMenuItem()); addToMenu(viewMenu, buildRedoMenuItem()); viewMenu.addSeparator(); addToMenu(viewMenu, buildCopyMenuItem()); addToMenu(viewMenu, buildDeleteMenuItem()); viewMenu.addSeparator(); addToMenu(viewMenu, buildSelectAllMenuItem()); addToMenu(viewMenu, buildDeselectAllMenuItem()); return viewMenu; } public JMenuItem buildUndoMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.edit.undo.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_UNDO, KeyEventConstants.MODIFIER_UNDO)); if (viewerController != null && mi != null) viewerController.setUndoMenuItem(mi); return mi; } public JMenuItem buildRedoMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.edit.redo.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_REDO, KeyEventConstants.MODIFIER_REDO)); if (viewerController != null && mi != null) viewerController.setReduMenuItem(mi); return mi; } public JMenuItem buildCopyMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.edit.copy.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_COPY, KeyEventConstants.MODIFIER_COPY)); if (viewerController != null && mi != null) viewerController.setCopyMenuItem(mi); return mi; } public JMenuItem buildDeleteMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.edit.delete.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_DELETE, KeyEventConstants.MODIFIER_DELETE)); if (viewerController != null && mi != null) viewerController.setDeleteMenuItem(mi); return mi; } public JMenuItem buildSelectAllMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.edit.selectAll.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_SELECT_ALL, KeyEventConstants.MODIFIER_SELECT_ALL)); if (viewerController != null && mi != null) viewerController.setSelectAllMenuItem(mi); return mi; } public JMenuItem buildDeselectAllMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.edit.deselectAll.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_DESELECT_ALL, KeyEventConstants.MODIFIER_DESELECT_ALL)); if (viewerController != null && mi != null) viewerController.setDselectAllMenuItem(mi); return mi; } public JMenu buildViewMenu() { JMenu viewMenu = new JMenu(messageBundle.getString("viewer.menu.view.label")); viewMenu.setMnemonic(buildMnemonic(messageBundle.getString("viewer.menu.view.mnemonic").charAt(0))); addToMenu(viewMenu, buildFitActualSizeMenuItem()); addToMenu(viewMenu, buildFitPageMenuItem()); addToMenu(viewMenu, buildFitWidthMenuItem()); viewMenu.addSeparator(); addToMenu(viewMenu, buildZoomInMenuItem()); addToMenu(viewMenu, buildZoomOutMenuItem()); viewMenu.addSeparator(); addToMenu(viewMenu, buildRotateLeftMenuItem()); addToMenu(viewMenu, buildRotateRightMenuItem()); viewMenu.addSeparator(); addToMenu(viewMenu, buildShowHideToolBarMenuItem()); addToMenu(viewMenu, buildShowHideUtilityPaneMenuItem()); return viewMenu; } public JMenuItem buildFitActualSizeMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.view.actualSize.label"), "actual_size", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_FIT_ACTUAL, KeyEventConstants.MODIFIER_FIT_ACTUAL)); if (viewerController != null && mi != null) viewerController.setFitActualSizeMenuItem(mi); return mi; } public JMenuItem buildFitPageMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.view.fitInWindow.label"), "fit_window", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_FIT_PAGE, KeyEventConstants.MODIFIER_FIT_PAGE)); if (viewerController != null && mi != null) viewerController.setFitPageMenuItem(mi); return mi; } public JMenuItem buildFitWidthMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.view.fitWidth.label"), null, null, buildKeyStroke(KeyEventConstants.KEY_CODE_FIT_WIDTH, KeyEventConstants.MODIFIER_FIT_WIDTH)); if (viewerController != null && mi != null) viewerController.setFitWidthMenuItem(mi); return mi; } public JMenuItem buildZoomInMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.view.zoomIn.label"), "zoom_in", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_ZOOM_IN, KeyEventConstants.MODIFIER_ZOOM_IN, false)); if (viewerController != null && mi != null) viewerController.setZoomInMenuItem(mi); return mi; } public JMenuItem buildZoomOutMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.view.zoomOut.label"), "zoom_out", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_ZOOM_OUT, KeyEventConstants.MODIFIER_ZOOM_OUT, false)); if (viewerController != null && mi != null) viewerController.setZoomOutMenuItem(mi); return mi; } public JMenuItem buildRotateLeftMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.view.rotateLeft.label"), "rotate_left", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_ROTATE_LEFT, KeyEventConstants.MODIFIER_ROTATE_LEFT)); if (viewerController != null && mi != null) viewerController.setRotateLeftMenuItem(mi); return mi; } public JMenuItem buildRotateRightMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.view.rotateRight.label"), "rotate_right", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_ROTATE_RIGHT, KeyEventConstants.MODIFIER_ROTATE_RIGHT)); if (viewerController != null && mi != null) viewerController.setRotateRightMenuItem(mi); return mi; } public JMenuItem buildShowHideToolBarMenuItem() { JMenuItem mi = makeMenuItem("", null); if (viewerController != null && mi != null) viewerController.setShowHideToolBarMenuItem(mi); return mi; } public JMenuItem buildShowHideUtilityPaneMenuItem() { JMenuItem mi = makeMenuItem("", null); if (viewerController != null && mi != null) viewerController.setShowHideUtilityPaneMenuItem(mi); return mi; } public JMenu buildDocumentMenu() { JMenu documentMenu = new JMenu(messageBundle.getString("viewer.menu.document.label")); documentMenu.setMnemonic(buildMnemonic(messageBundle.getString("viewer.menu.document.mnemonic").charAt(0))); addToMenu(documentMenu, buildFirstPageMenuItem()); addToMenu(documentMenu, buildPreviousPageMenuItem()); addToMenu(documentMenu, buildNextPageMenuItem()); addToMenu(documentMenu, buildLastPageMenuItem()); documentMenu.addSeparator(); addToMenu(documentMenu, buildSearchMenuItem()); addToMenu(documentMenu, buildGoToPageMenuItem()); return documentMenu; } public JMenuItem buildFirstPageMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.document.firstPage.label"), "page_first", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_FIRST_PAGE, KeyEventConstants.MODIFIER_FIRST_PAGE)); if (viewerController != null && mi != null) viewerController.setFirstPageMenuItem(mi); return mi; } public JMenuItem buildPreviousPageMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.document.previousPage.label"), "page_up", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_PREVIOUS_PAGE, KeyEventConstants.MODIFIER_PREVIOUS_PAGE)); if (viewerController != null && mi != null) viewerController.setPreviousPageMenuItem(mi); return mi; } public JMenuItem buildNextPageMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.document.nextPage.label"), "page_down", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_NEXT_PAGE, KeyEventConstants.MODIFIER_NEXT_PAGE)); if (viewerController != null && mi != null) viewerController.setNextPageMenuItem(mi); return mi; } public JMenuItem buildLastPageMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.document.lastPage.label"), "page_last", Images.SIZE_MEDIUM, buildKeyStroke(KeyEventConstants.KEY_CODE_LAST_PAGE, KeyEventConstants.MODIFIER_LAST_PAGE)); if (viewerController != null && mi != null) viewerController.setLastPageMenuItem(mi); return mi; } public JMenuItem buildSearchMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.document.search.label"), buildKeyStroke(KeyEventConstants.KEY_CODE_SEARCH, KeyEventConstants.MODIFIER_SEARCH)); if (viewerController != null && mi != null) viewerController.setSearchMenuItem(mi); return mi; } public JMenuItem buildGoToPageMenuItem() { JMenuItem mi = makeMenuItem( messageBundle.getString("viewer.menu.document.gotToPage.label"), buildKeyStroke(KeyEventConstants.KEY_CODE_GOTO, KeyEventConstants.MODIFIER_GOTO)); if (viewerController != null && mi != null) viewerController.setGoToPageMenuItem(mi); return mi; } public JMenu buildWindowMenu() { final JMenu windowMenu = new JMenu(messageBundle.getString("viewer.menu.window.label")); windowMenu.setMnemonic(buildMnemonic(messageBundle.getString("viewer.menu.window.mnemonic").charAt(0))); addToMenu(windowMenu, buildMinimiseAllMenuItem()); addToMenu(windowMenu, buildBringAllToFrontMenuItem()); windowMenu.addSeparator(); final int allowedCount = windowMenu.getItemCount(); windowMenu.addMenuListener(new javax.swing.event.MenuListener() { public void menuCanceled(javax.swing.event.MenuEvent e) { } public void menuDeselected(javax.swing.event.MenuEvent e) { } public void menuSelected(javax.swing.event.MenuEvent e) { int count = windowMenu.getItemCount(); while (count > allowedCount) { windowMenu.remove(count - 1); count--; } buildWindowListMenuItems(windowMenu); } }); return windowMenu; } public JMenuItem buildMinimiseAllMenuItem() { JMenuItem mi = makeMenuItem(messageBundle.getString("viewer.menu.window.minAll.label"), null); mi.setMnemonic(buildMnemonic(messageBundle.getString("viewer.menu.window.minAll.mnemonic").charAt(0))); if (viewerController != null) viewerController.setMinimiseAllMenuItem(mi); return mi; } public JMenuItem buildBringAllToFrontMenuItem() { JMenuItem mi = makeMenuItem(messageBundle.getString("viewer.menu.window.frontAll.label"), null); mi.setMnemonic(buildMnemonic(messageBundle.getString("viewer.menu.window.frontAll.mnemonic").charAt(0))); if (viewerController != null) viewerController.setBringAllToFrontMenuItem(mi); return mi; } @SuppressWarnings("unchecked") public void buildWindowListMenuItems(JMenu menu) { if (viewerController != null && viewerController.getWindowManagementCallback() != null) { WindowManagementCallback winMgr = viewerController.getWindowManagementCallback(); List<Object> windowDocOriginList = (List<Object>) winMgr.getWindowDocumentOriginList(viewerController); // Get the current window index, if it's given, and remove it from the list int currWindowIndex = -1; int count = windowDocOriginList.size(); if (count > 0 && windowDocOriginList.get(count - 1) instanceof Integer) { currWindowIndex = (Integer) windowDocOriginList.remove(--count); } shortenDocumentOrigins(windowDocOriginList); List<JMenuItem> windowListMenuItems = new ArrayList<JMenuItem>(Math.max(count, 1)); for (int i = 0; i < count; i++) { String number = Integer.toString(i + 1); String label = null; String mnemonic = null; try { label = messageBundle.getString("viewer.menu.window." + number + ".label"); mnemonic = messageBundle.getString("viewer.menu.window." + number + ".mnemonic"); } catch (Exception e) { logger.log(Level.FINER, "Error setting viewer window window title", e); } // Allows the user to have an arbitrary number of predefined entries String identifier = (String) windowDocOriginList.get(i); if (identifier == null) identifier = ""; String miText; if (label != null && label.length() > 0) miText = number + " " + identifier; else miText = " " + identifier; JMenuItem mi = new JMenuItem(miText); if (mnemonic != null && number.length() == 1) mi.setMnemonic(buildMnemonic(number.charAt(0))); if (currWindowIndex == i) mi.setEnabled(false); menu.add(mi); windowListMenuItems.add(mi); } viewerController.setWindowListMenuItems(windowListMenuItems); } } protected void shortenDocumentOrigins(List<Object> windowDocOriginList) { // At some point we should detect the same filename // in different subdirectories, and keep some of the // directory information, to help differentiate them for (int i = windowDocOriginList.size() - 1; i >= 0; i--) { String identifier = (String) windowDocOriginList.get(i); if (identifier == null) continue; int separatorIndex = identifier.lastIndexOf(java.io.File.separator); int forewardSlashIndex = identifier.lastIndexOf("/"); int backwardSlashIndex = identifier.lastIndexOf("\\"); int cutIndex = Math.max(separatorIndex, Math.max(forewardSlashIndex, backwardSlashIndex)); if (cutIndex >= 0) { identifier = identifier.substring(cutIndex); windowDocOriginList.set(i, identifier); } } } public JMenu buildHelpMenu() { JMenu helpMenu = new JMenu(messageBundle.getString("viewer.menu.help.label")); helpMenu.setMnemonic(buildMnemonic(messageBundle.getString("viewer.menu.help.mnemonic").charAt(0))); if (!isMacOs) { // Not on a Mac, so create the About menu item. addToMenu(helpMenu, buildAboutMenuItem()); } return helpMenu; } public JMenuItem buildAboutMenuItem() { JMenuItem mi = makeMenuItem(messageBundle.getString("viewer.menu.help.about.label"), null); if (viewerController != null && mi != null) viewerController.setAboutMenuItem(mi); return mi; } public JToolBar buildCompleteToolBar(boolean embeddableComponent) { JToolBar toolbar = new JToolBar(); toolbar.setLayout(new ToolbarLayout(ToolbarLayout.LEFT, 0, 0)); commonToolBarSetup(toolbar, true); // Attempt to get the properties manager so we can configure which toolbars are visible doubleCheckPropertiesManager(); // Build the main set of toolbars based on the property file configuration if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_UTILITY)) addToToolBar(toolbar, buildUtilityToolBar(embeddableComponent, propertiesManager)); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_PAGENAV)) addToToolBar(toolbar, buildPageNavigationToolBar()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_ZOOM)) addToToolBar(toolbar, buildZoomToolBar()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_FIT)) addToToolBar(toolbar, buildFitToolBar()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_ROTATE)) addToToolBar(toolbar, buildRotateToolBar()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_TOOL)) addToToolBar(toolbar, buildToolToolBar()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_ANNOTATION)) addToToolBar(toolbar, buildAnnotationlToolBar()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_FORMS)) addToToolBar(toolbar, buildFormsToolBar()); // we only add the configurable font engin in the demo version if (isDemo) { addToToolBar(toolbar, buildDemoToolBar()); } // Set the toolbar back to null if no components were added // The result of this will properly disable the necessary menu items for controlling the toolbar if (toolbar.getComponentCount() == 0) { toolbar = null; } if ((viewerController != null) && (toolbar != null)) viewerController.setCompleteToolBar(toolbar); return toolbar; } public JToolBar buildUtilityToolBar(boolean embeddableComponent) { return buildUtilityToolBar(embeddableComponent, null); } public JToolBar buildUtilityToolBar(boolean embeddableComponent, PropertiesManager propertiesManager) { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, false); // if embeddable component, we don't want to create the open dialog, as we // have no window manager for this case. if ((!embeddableComponent) && (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_OPEN))) addToToolBar(toolbar, buildOpenFileButton()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_SAVE)) addToToolBar(toolbar, buildSaveAsFileButton()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_PRINT)) addToToolBar(toolbar, buildPrintButton()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_SEARCH)) addToToolBar(toolbar, buildSearchButton()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_UPANE)) addToToolBar(toolbar, buildShowHideUtilityPaneButton()); // Don't bother with this toolbar if we don't have any visible buttons if (toolbar.getComponentCount() == 0) { return null; } return toolbar; } public JButton buildOpenFileButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.open.label"), messageBundle.getString("viewer.toolbar.open.tooltip"), "open", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setOpenFileButton(btn); return btn; } public JButton buildSaveAsFileButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.saveAs.label"), messageBundle.getString("viewer.toolbar.saveAs.tooltip"), "save", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setSaveAsFileButton(btn); return btn; } public JButton buildPrintButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.print.label"), messageBundle.getString("viewer.toolbar.print.tooltip"), "print", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setPrintButton(btn); return btn; } public JButton buildSearchButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.search.label"), messageBundle.getString("viewer.toolbar.search.tooltip"), "search", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setSearchButton(btn); return btn; } public JToggleButton buildShowHideUtilityPaneButton() { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.utilityPane.label"), messageBundle.getString("viewer.toolbar.utilityPane.tooltip"), "utility_pane", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setShowHideUtilityPaneButton(btn); return btn; } public JToolBar buildPageNavigationToolBar() { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, false); addToToolBar(toolbar, buildFirstPageButton()); addToToolBar(toolbar, buildPreviousPageButton()); addToToolBar(toolbar, buildCurrentPageNumberTextField()); addToToolBar(toolbar, buildNumberOfPagesLabel()); addToToolBar(toolbar, buildNextPageButton()); addToToolBar(toolbar, buildLastPageButton()); return toolbar; } public JButton buildFirstPageButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.navigation.firstPage.label"), messageBundle.getString("viewer.toolbar.navigation.firstPage.tooltip"), "first", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setFirstPageButton(btn); return btn; } public JButton buildPreviousPageButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.navigation.previousPage.label"), messageBundle.getString("viewer.toolbar.navigation.previousPage.tooltip"), "back", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setPreviousPageButton(btn); return btn; } public JButton buildNextPageButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.navigation.nextPage.label"), messageBundle.getString("viewer.toolbar.navigation.nextPage.tooltip"), "forward", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setNextPageButton(btn); return btn; } public JButton buildLastPageButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.navigation.lastPage.label"), messageBundle.getString("viewer.toolbar.navigation.lastPage.tooltip"), "last", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setLastPageButton(btn); return btn; } public JTextField buildCurrentPageNumberTextField() { JTextField pageNumberTextField = new JTextField("", 3); pageNumberTextField.setToolTipText(messageBundle.getString("viewer.toolbar.navigation.current.tooltip")); pageNumberTextField.setInputVerifier(new PageNumberTextFieldInputVerifier()); /** * Add a key listener and check to make sure the character intered * is a digit, period, the back_space or delete keys. If not the * invalid character is ignored and a system beep is triggered. */ pageNumberTextField.addKeyListener(new PageNumberTextFieldKeyListener()); if (viewerController != null) viewerController.setCurrentPageNumberTextField(pageNumberTextField); return pageNumberTextField; } public JLabel buildNumberOfPagesLabel() { JLabel lbl = new JLabel(); lbl.setToolTipText(messageBundle.getString("viewer.toolbar.navigation.pages.tooltip")); if (viewerController != null) viewerController.setNumberOfPagesLabel(lbl); return lbl; } public JToolBar buildZoomToolBar() { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, false); addToToolBar(toolbar, buildZoomOutButton()); addToToolBar(toolbar, buildZoomCombBox()); addToToolBar(toolbar, buildZoomInButton()); return toolbar; } public JButton buildZoomOutButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.zoom.out.label"), messageBundle.getString("viewer.toolbar.zoom.out.tooltip"), "zoom_out", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setZoomOutButton(btn); return btn; } public JComboBox buildZoomCombBox() { // Get the properties manager in preparation for trying to get the zoom levels doubleCheckPropertiesManager(); // Assign any different zoom ranges from the properties file if possible zoomLevels = PropertiesManager.checkAndStoreFloatArrayProperty(propertiesManager, PropertiesManager.PROPERTY_ZOOM_RANGES, zoomLevels); JComboBox tmp = new JComboBox(); tmp.setToolTipText(messageBundle.getString("viewer.toolbar.zoom.tooltip")); tmp.setPreferredSize(new Dimension(75, tmp.getHeight())); for (float zoomLevel : zoomLevels) tmp.addItem(NumberFormat.getPercentInstance().format(zoomLevel)); tmp.setEditable(true); if (viewerController != null) viewerController.setZoomComboBox(tmp, zoomLevels); return tmp; } public JButton buildZoomInButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.zoom.in.label"), messageBundle.getString("viewer.toolbar.zoom.in.tooltip"), "zoom_in", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setZoomInButton(btn); return btn; } public JToolBar buildFitToolBar() { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, false); addToToolBar(toolbar, buildFitActualSizeButton()); addToToolBar(toolbar, buildFitPageButton()); addToToolBar(toolbar, buildFitWidthButton()); return toolbar; } public JToggleButton buildFitActualSizeButton() { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.pageFit.actualsize.label"), messageBundle.getString("viewer.toolbar.pageFit.actualsize.tooltip"), "actual_size", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setFitActualSizeButton(btn); return btn; } public JToggleButton buildFitPageButton() { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.pageFit.fitWindow.label"), messageBundle.getString("viewer.toolbar.pageFit.fitWindow.tooltip"), "fit_window", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setFitHeightButton(btn); return btn; } public JToggleButton buildFontEngineButton() { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.pageFit.fontEngine.label"), messageBundle.getString("viewer.toolbar.pageFit.fontEngine.tooltip"), "font-engine", 118, 25, buttonFont); if (viewerController != null && btn != null) viewerController.setFontEngineButton(btn); return btn; } public JToggleButton buildFitWidthButton() { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.pageFit.fitWidth.label"), messageBundle.getString("viewer.toolbar.pageFit.fitWidth.tooltip"), "fit_width", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setFitWidthButton(btn); return btn; } public JToolBar buildRotateToolBar() { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, false); addToToolBar(toolbar, buildRotateRightButton()); addToToolBar(toolbar, buildRotateLeftButton()); return toolbar; } public JButton buildRotateLeftButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.rotation.left.label"), messageBundle.getString("viewer.toolbar.rotation.left.tooltip"), "rotate_left", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setRotateLeftButton(btn); return btn; } public JButton buildRotateRightButton() { JButton btn = makeToolbarButton( messageBundle.getString("viewer.toolbar.rotation.right.label"), messageBundle.getString("viewer.toolbar.rotation.right.tooltip"), "rotate_right", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setRotateRightButton(btn); return btn; } public JToolBar buildToolToolBar() { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, false); addToToolBar(toolbar, buildPanToolButton()); addToToolBar(toolbar, buildTextSelectToolButton()); addToToolBar(toolbar, buildZoomInToolButton()); addToToolBar(toolbar, buildZoomOutToolButton()); return toolbar; } public JToolBar buildAnnotationlToolBar() { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, false); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_ANNOTATION_SELECTION)) { addToToolBar(toolbar, buildSelectToolButton(Images.SIZE_LARGE)); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_ANNOTATION_HIGHLIGHT)) { addToToolBar(toolbar, buildHighlightAnnotationToolButton(Images.SIZE_LARGE)); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_TOOLBAR_ANNOTATION_TEXT)) { addToToolBar(toolbar, buildTextAnnotationToolButton(Images.SIZE_LARGE)); } return toolbar; } public JToolBar buildFormsToolBar() { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, false); addToToolBar(toolbar, buildFormHighlightButton(Images.SIZE_LARGE)); return toolbar; } public JToolBar buildAnnotationUtilityToolBar() { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, true); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_HIGHLIGHT)) { addToToolBar(toolbar, buildHighlightAnnotationUtilityToolButton(Images.SIZE_MEDIUM)); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_STRIKE_OUT)) { addToToolBar(toolbar, buildStrikeOutAnnotationToolButton()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_UNDERLINE)) { addToToolBar(toolbar, buildUnderlineAnnotationToolButton()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_LINE)) { addToToolBar(toolbar, buildLineAnnotationToolButton()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_LINK)) { addToToolBar(toolbar, buildLinkAnnotationToolButton()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_ARROW)) { addToToolBar(toolbar, buildLineArrowAnnotationToolButton()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_RECTANGLE)) { addToToolBar(toolbar, buildSquareAnnotationToolButton()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_CIRCLE)) { addToToolBar(toolbar, buildCircleAnnotationToolButton()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_INK)) { addToToolBar(toolbar, buildInkAnnotationToolButton()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_FREE_TEXT)) { addToToolBar(toolbar, buildFreeTextAnnotationToolButton()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITY_ANNOTATION_TEXT)) { addToToolBar(toolbar, buildTextAnnotationUtilityToolButton(Images.SIZE_MEDIUM)); } return toolbar; } public JToolBar buildDemoToolBar() { JToolBar toolbar = new JToolBar(); commonToolBarSetup(toolbar, false); addToToolBar(toolbar, buildFontEngineButton()); return toolbar; } public JToggleButton buildPanToolButton() { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.tool.pan.label"), messageBundle.getString("viewer.toolbar.tool.pan.tooltip"), "pan", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setPanToolButton(btn); return btn; } public JToggleButton buildTextSelectToolButton() { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.tool.text.label"), messageBundle.getString("viewer.toolbar.tool.text.tooltip"), "selection_text", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setTextSelectToolButton(btn); return btn; } public JToggleButton buildSelectToolButton(final String imageSize) { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.tool.select.label"), messageBundle.getString("viewer.toolbar.tool.select.tooltip"), "select", imageSize, buttonFont); if (viewerController != null && btn != null) viewerController.setSelectToolButton(btn); return btn; } public JToggleButton buildLinkAnnotationToolButton() { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.link.label"), messageBundle.getString("viewer.toolbar.tool.link.tooltip"), "link_annot", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setLinkAnnotationToolButton(btn); return btn; } public JToggleButton buildHighlightAnnotationToolButton(final String imageSize) { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.tool.highlight.label"), messageBundle.getString("viewer.toolbar.tool.highlight.tooltip"), "highlight_annot", imageSize, buttonFont); if (viewerController != null && btn != null) viewerController.setHighlightAnnotationToolButton(btn); return btn; } public JToggleButton buildHighlightAnnotationUtilityToolButton(final String imageSize) { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.highlight.label"), messageBundle.getString("viewer.toolbar.tool.highlight.tooltip"), "highlight_annot", imageSize, buttonFont); if (viewerController != null && btn != null) viewerController.setHighlightAnnotationUtilityToolButton(btn); return btn; } public JToggleButton buildStrikeOutAnnotationToolButton() { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.strikeOut.label"), messageBundle.getString("viewer.toolbar.tool.strikeOut.tooltip"), "strikeout", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setStrikeOutAnnotationToolButton(btn); return btn; } public JToggleButton buildUnderlineAnnotationToolButton() { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.underline.label"), messageBundle.getString("viewer.toolbar.tool.underline.tooltip"), "underline", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setUnderlineAnnotationToolButton(btn); return btn; } public JToggleButton buildLineAnnotationToolButton() { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.line.label"), messageBundle.getString("viewer.toolbar.tool.line.tooltip"), "line", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setLineAnnotationToolButton(btn); return btn; } public JToggleButton buildLineArrowAnnotationToolButton() { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.lineArrow.label"), messageBundle.getString("viewer.toolbar.tool.lineArrow.tooltip"), "arrow", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setLineArrowAnnotationToolButton(btn); return btn; } public JToggleButton buildSquareAnnotationToolButton() { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.rectangle.label"), messageBundle.getString("viewer.toolbar.tool.rectangle.tooltip"), "square", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setSquareAnnotationToolButton(btn); return btn; } public JToggleButton buildCircleAnnotationToolButton() { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.circle.label"), messageBundle.getString("viewer.toolbar.tool.circle.tooltip"), "circle", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setCircleAnnotationToolButton(btn); return btn; } public JToggleButton buildInkAnnotationToolButton() { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.ink.label"), messageBundle.getString("viewer.toolbar.tool.ink.tooltip"), "ink", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setInkAnnotationToolButton(btn); return btn; } public JToggleButton buildFreeTextAnnotationToolButton() { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.freeText.label"), messageBundle.getString("viewer.toolbar.tool.freeText.tooltip"), "freetext_annot", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setFreeTextAnnotationToolButton(btn); return btn; } public JToggleButton buildTextAnnotationToolButton(final String imageSize) { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.tool.textAnno.label"), messageBundle.getString("viewer.toolbar.tool.textAnno.tooltip"), "text_annot", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setTextAnnotationToolButton(btn); return btn; } public JToggleButton buildFormHighlightButton(final String imageSize) { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.tool.forms.highlight.label"), messageBundle.getString("viewer.toolbar.tool.forms.highlight.tooltip"), "form_highlight", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setFormHighlightButton(btn); return btn; } public JToggleButton buildTextAnnotationUtilityToolButton(final String imageSize) { JToggleButton btn = makeToolbarToggleButtonSmall( messageBundle.getString("viewer.toolbar.tool.textAnno.label"), messageBundle.getString("viewer.toolbar.tool.textAnno.tooltip"), "text_annot", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setTextAnnotationUtilityToolButton(btn); return btn; } public JToggleButton buildZoomInToolButton() { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.tool.zoomMarquis.label"), messageBundle.getString("viewer.toolbar.tool.zoomMarquis.tooltip"), "zoom_marquis", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setZoomInToolButton(btn); return btn; } public JToggleButton buildZoomOutToolButton() { JToggleButton btn = makeToolbarToggleButton( messageBundle.getString("viewer.toolbar.tool.zoomDynamic.label"), messageBundle.getString("viewer.toolbar.tool.zoomDynamic.tooltip"), "zoom_dynamic", Images.SIZE_LARGE, buttonFont); if (viewerController != null && btn != null) viewerController.setZoomDynamicToolButton(btn); return btn; } public JSplitPane buildUtilityAndDocumentSplitPane(boolean embeddableComponent) { JSplitPane splitpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); splitpane.setOneTouchExpandable(false); splitpane.setDividerSize(8); splitpane.setContinuousLayout(true); // set the utility pane the left of the split pane splitpane.setLeftComponent(buildUtilityTabbedPane()); // set the viewController embeddable flag. DocumentViewController viewController = viewerController.getDocumentViewController(); // will add key event listeners viewerController.setIsEmbeddedComponent(embeddableComponent); // remove F6 focus management key from the splitpane splitpane.getActionMap().getParent().remove("toggleFocus"); // add the viewControllers doc view container to the split pain splitpane.setRightComponent(viewController.getViewContainer()); // apply previously set divider location, default is -1 int dividerLocation = PropertiesManager.checkAndStoreIntegerProperty( propertiesManager, PropertiesManager.PROPERTY_DIVIDER_LOCATION, 260); splitpane.setDividerLocation(dividerLocation); // Add the split pan component to the view controller so that it can // manipulate the divider via the controller, hide, show, etc. for // utility pane. if (viewerController != null) viewerController.setUtilityAndDocumentSplitPane(splitpane); return splitpane; } public JTabbedPane buildUtilityTabbedPane() { JTabbedPane utilityTabbedPane = new JTabbedPane(); utilityTabbedPane.setPreferredSize(new Dimension(250, 400)); // Get a properties manager that can be used to configure utility pane visibility doubleCheckPropertiesManager(); // Build the main set of tabs based on the property file configuration if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITYPANE_BOOKMARKS)) { utilityTabbedPane.add( messageBundle.getString("viewer.utilityPane.bookmarks.tab.title"), buildOutlineComponents()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITYPANE_ATTACHMENTS)) { utilityTabbedPane.add( messageBundle.getString("viewer.utilityPane.attachments.tab.title"), buildAttachmentPanle()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITYPANE_SEARCH)) { utilityTabbedPane.add( messageBundle.getString("viewer.utilityPane.search.tab.title"), buildSearchPanel()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITYPANE_THUMBNAILS)) { utilityTabbedPane.add( messageBundle.getString("viewer.utilityPane.thumbs.tab.title"), buildThumbsPanel()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITYPANE_LAYERS)) { utilityTabbedPane.add( messageBundle.getString("viewer.utilityPane.layers.tab.title"), buildLayersComponents()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITYPANE_SIGNATURES)) { utilityTabbedPane.add( messageBundle.getString("viewer.utilityPane.signatures.tab.title"), buildSignatureComponents()); } if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_UTILITYPANE_ANNOTATION)) { utilityTabbedPane.add( messageBundle.getString("viewer.utilityPane.annotation.tab.title"), buildAnnotationPanel()); } // Ensure something was added to the utility pane, otherwise reset it to null // By doing this we will stop the utility pane management buttons from displaying if (utilityTabbedPane.getComponentCount() == 0) { utilityTabbedPane = null; } if (viewerController != null) viewerController.setUtilityTabbedPane(utilityTabbedPane); return utilityTabbedPane; } public JComponent buildOutlineComponents() { JTree tree = new OutlinesTree(); JScrollPane scroll = new JScrollPane(tree); if (viewerController != null) viewerController.setOutlineComponents(tree, scroll); return scroll; } public ThumbnailsPanel buildThumbsPanel() { ThumbnailsPanel thumbsPanel = new ThumbnailsPanel(viewerController, propertiesManager); if (viewerController != null) { viewerController.setThumbnailsPanel(thumbsPanel); } return thumbsPanel; } public LayersPanel buildLayersComponents() { LayersPanel layersPanel = new LayersPanel(viewerController); if (viewerController != null) { viewerController.setLayersPanel(layersPanel); } return layersPanel; } public JComponent buildSignatureComponents() { SignaturesPanel signaturesPanel = new SignaturesPanel(viewerController); if (viewerController != null) { viewerController.setSignaturesPanel(signaturesPanel); } return signaturesPanel; } public SearchPanel buildSearchPanel() { SearchPanel searchPanel = new SearchPanel(viewerController); if (viewerController != null) viewerController.setSearchPanel(searchPanel); return searchPanel; } public AttachmentPanel buildAttachmentPanle() { AttachmentPanel attachmentPanel = new AttachmentPanel(viewerController); if (viewerController != null) viewerController.setAttachmentPanel(attachmentPanel); return attachmentPanel; } public AnnotationPanel buildAnnotationPanel() { AnnotationPanel annotationPanel = new AnnotationPanel(viewerController, propertiesManager); annotationPanel.setAnnotationUtilityToolbar(buildAnnotationUtilityToolBar()); if (viewerController != null) viewerController.setAnnotationPanel(annotationPanel); return annotationPanel; } /** * Builds the status bar panel containing a status label on the left and * view mode controls on the right. The status bar can be shown or * hidden completely using the view property 'application.statusbar=true|false' * and the two child frame elements can be controlled using * 'application.statusbar.show.statuslabel=true|false' and * 'application.statusbar.show.viewmode=true|false'. The default value * for all properties is 'true'. * * @return status panel JPanel if visible, null if the proeprty * 'application.statusbar=false' is set. */ public JPanel buildStatusPanel() { // check to see if the status bars should be built. if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_STATUSBAR)) { JPanel statusPanel = new JPanel(new BorderLayout()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_STATUSBAR_STATUSLABEL)) { JPanel pgPanel = new JPanel(); JLabel lbl = new JLabel(" "); lbl.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); // So text isn't at the very edge pgPanel.add(lbl); statusPanel.add(pgPanel, BorderLayout.WEST); // set status label callback if (viewerController != null) { viewerController.setStatusLabel(lbl); } } JPanel viewPanel = new JPanel(); // Only add actual buttons to the view panel if requested by the properties file // Regardless we'll add the parent JPanel, to preserve the same layout behaviour if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_STATUSBAR_VIEWMODE)) { if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_STATUSBAR_VIEWMODE_SINGLE)) viewPanel.add(buildPageViewSinglePageNonConToggleButton()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_STATUSBAR_VIEWMODE_SINGLE_CONTINUOUS)) viewPanel.add(buildPageViewSinglePageConToggleButton()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_STATUSBAR_VIEWMODE_DOUBLE)) viewPanel.add(buildPageViewFacingPageNonConToggleButton()); if (PropertiesManager.checkAndStoreBooleanProperty(propertiesManager, PropertiesManager.PROPERTY_SHOW_STATUSBAR_VIEWMODE_DOUBLE_CONTINUOUS)) viewPanel.add(buildPageViewFacingPageConToggleButton()); } statusPanel.add(viewPanel, BorderLayout.CENTER); viewPanel.setLayout(new ToolbarLayout(ToolbarLayout.RIGHT, 0, 1)); JLabel lbl2 = new JLabel(" "); lbl2.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); // So text isn't at the very edge statusPanel.add(lbl2, BorderLayout.EAST); return statusPanel; } return null; } public JToggleButton buildPageViewSinglePageConToggleButton() { JToggleButton btn = makeToolbarToggleButton(messageBundle.getString("viewer.toolbar.pageView.continuous.singlePage.label"), messageBundle.getString("viewer.toolbar.pageView.continuous.singlePage.tooltip"), "single_page_column", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setPageViewSinglePageConButton(btn); return btn; } public JToggleButton buildPageViewFacingPageConToggleButton() { JToggleButton btn = makeToolbarToggleButton(messageBundle.getString("viewer.toolbar.pageView.continuous.facingPage.label"), messageBundle.getString("viewer.toolbar.pageView.continuous.facingPage.tooltip"), "two_page_column", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setPageViewFacingPageConButton(btn); return btn; } public JToggleButton buildPageViewSinglePageNonConToggleButton() { JToggleButton btn = makeToolbarToggleButton(messageBundle.getString("viewer.toolbar.pageView.nonContinuous.singlePage.label"), messageBundle.getString("viewer.toolbar.pageView.nonContinuous.singlePage.tooltip"), "single_page", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setPageViewSinglePageNonConButton(btn); return btn; } public JToggleButton buildPageViewFacingPageNonConToggleButton() { JToggleButton btn = makeToolbarToggleButton(messageBundle.getString("viewer.toolbar.pageView.nonContinuous.facingPage.label"), messageBundle.getString("viewer.toolbar.pageView.nonContinuous.facingPage.tooltip"), "two_page", Images.SIZE_MEDIUM, buttonFont); if (viewerController != null && btn != null) viewerController.setPageViewFacingPageNonConButton(btn); return btn; } /** * Utility method for creating a toolbar button. * * @param title display text for the menu item * @param toolTip tool tip text * @param imageName display image name * @param imageSize image size file extention constant * @param font display font * @return a button with the specified characteristics. */ protected JButton makeToolbarButton( String title, String toolTip, String imageName, final String imageSize, java.awt.Font font) { JButton tmp = new JButton(showButtonText ? title : ""); tmp.setFont(font); tmp.setToolTipText(toolTip); tmp.setPreferredSize(new Dimension(32, 32)); try { tmp.setIcon(new ImageIcon(Images.get(imageName + "_a" + imageSize + ".png"))); tmp.setPressedIcon(new ImageIcon(Images.get(imageName + "_i" + imageSize + ".png"))); tmp.setRolloverIcon(new ImageIcon(Images.get(imageName + "_r" + imageSize + ".png"))); tmp.setDisabledIcon(new ImageIcon(Images.get(imageName + "_i" + imageSize + ".png"))); } catch (NullPointerException e) { logger.warning("Failed to load toolbar button images: " + imageName + "_i" + imageSize + ".png"); } tmp.setRolloverEnabled(true); tmp.setBorderPainted(false); tmp.setContentAreaFilled(false); tmp.setFocusPainted(true); return tmp; } /** * Utility method for creating toggle buttons. * * @param title display text for the menu item * @param toolTip tool tip text * @param imageName display image name * @param font display font * @param imageSize imageSize image size constant * @return a toggle button with the specified characteristics. */ protected JToggleButton makeToolbarToggleButton( String title, String toolTip, String imageName, final String imageSize, java.awt.Font font) { JToggleButton tmp = new JToggleButton(showButtonText ? title : ""); tmp.setFont(font); tmp.setToolTipText(toolTip); tmp.setPreferredSize(new Dimension(32, 32)); tmp.setRolloverEnabled(true); try { tmp.setIcon(new ImageIcon(Images.get(imageName + "_a" + imageSize + ".png"))); tmp.setPressedIcon(new ImageIcon(Images.get(imageName + "_i" + imageSize + ".png"))); tmp.setRolloverIcon(new ImageIcon(Images.get(imageName + "_r" + imageSize + ".png"))); tmp.setDisabledIcon(new ImageIcon(Images.get(imageName + "_i" + imageSize + ".png"))); } catch (NullPointerException e) { logger.warning("Failed to load toolbar toggle button images: " + imageName + "_i" + imageSize + ".png"); } //tmp.setBorderPainted(false); tmp.setBorder(BorderFactory.createEmptyBorder()); tmp.setContentAreaFilled(false); tmp.setFocusPainted(true); return tmp; } /** * Utility method for creating small toggle buttons (24x24) that also * have a selected icon state. . * * @param title display text for the menu item * @param toolTip tool tip text * @param imageName display image name * @param font display font * @param imageSize imageSize image size constant * @return a toggle button with the specified characteristics. */ protected JToggleButton makeToolbarToggleButtonSmall( String title, String toolTip, String imageName, final String imageSize, java.awt.Font font) { JToggleButton tmp = new JToggleButton(showButtonText ? title : ""); tmp.setFont(font); tmp.setToolTipText(toolTip); tmp.setPreferredSize(new Dimension(24, 24)); try { tmp.setIcon(new ImageIcon(Images.get(imageName + "_a" + imageSize + ".png"))); tmp.setPressedIcon(new ImageIcon(Images.get(imageName + "_i" + imageSize + ".png"))); // tmp.setSelectedIcon(new ImageIcon(Images.get(imageName + "_s" + imageSize + ".png"))); tmp.setRolloverIcon(new ImageIcon(Images.get(imageName + "_r" + imageSize + ".png"))); tmp.setDisabledIcon(new ImageIcon(Images.get(imageName + "_i" + imageSize + ".png"))); } catch (NullPointerException e) { logger.warning("Failed to load toolbar toggle images: " + imageName + "_i" + imageSize + ".png"); } //tmp.setBorderPainted(false); tmp.setBorder(BorderFactory.createEmptyBorder()); tmp.setContentAreaFilled(false); tmp.setRolloverEnabled(true); tmp.setFocusPainted(true); return tmp; } protected JToggleButton makeToolbarToggleButton( String title, String toolTip, java.awt.Font font) { JToggleButton tmp = new JToggleButton(showButtonText ? title : ""); tmp.setFont(font); tmp.setToolTipText(toolTip); tmp.setPreferredSize(new Dimension(30, 30)); tmp.setText(title); tmp.setFocusPainted(true); return tmp; } protected JToggleButton makeToolbarToggleButton( String title, String toolTip, String imageName, int imageWidth, int imageHeight, java.awt.Font font) { JToggleButton tmp = new JToggleButton(showButtonText ? title : ""); tmp.setFont(font); tmp.setToolTipText(toolTip); tmp.setRolloverEnabled(false); tmp.setPreferredSize(new Dimension(imageWidth, imageHeight)); try { tmp.setIcon(new ImageIcon(Images.get(imageName + "_d.png"))); tmp.setPressedIcon(new ImageIcon(Images.get(imageName + "_d.png"))); tmp.setSelectedIcon(new ImageIcon(Images.get(imageName + "_n.png"))); tmp.setDisabledIcon(new ImageIcon(Images.get(imageName + "_n.png"))); } catch (NullPointerException e) { logger.warning("Failed to load toobar toggle button images: " + imageName + ".png"); } tmp.setBorderPainted(false); tmp.setBorder(BorderFactory.createEmptyBorder()); tmp.setContentAreaFilled(false); tmp.setFocusPainted(false); return tmp; } /** * Utility method for creating a menu item. * * @param text display text for the menu item * @return menu item complete with text and action listener */ protected JMenuItem makeMenuItem(String text, KeyStroke accel) { JMenuItem jmi = new JMenuItem(text); if (accel != null) jmi.setAccelerator(accel); return jmi; } /** * Utility method for creating a menu item with an image. * * @param text display text for the menu item * @param imageName display image for the menu item * @param imageSize size of the image. * @return memu item complete with text, image and action listener */ protected JMenuItem makeMenuItem(String text, String imageName, final String imageSize, KeyStroke accel) { JMenuItem jmi = new JMenuItem(text); if (imageName != null) { try { jmi.setIcon(new ImageIcon(Images.get(imageName + "_a" + imageSize + ".png"))); jmi.setDisabledIcon(new ImageIcon(Images.get(imageName + "_i" + imageSize + ".png"))); jmi.setRolloverIcon(new ImageIcon(Images.get(imageName + "_r" + imageSize + ".png"))); } catch (NullPointerException e) { logger.warning("Failed to load menu images: " + imageName + "_a" + imageSize + ".png"); } } else { jmi.setIcon(new ImageIcon(Images.get("menu_spacer.gif"))); jmi.setDisabledIcon(new ImageIcon(Images.get("menu_spacer.gif"))); jmi.setRolloverIcon(new ImageIcon(Images.get("menu_spacer.gif"))); } jmi.setBorder(BorderFactory.createEmptyBorder()); jmi.setContentAreaFilled(false); jmi.setFocusPainted(true); if (accel != null) jmi.setAccelerator(accel); return jmi; } protected void commonToolBarSetup(JToolBar toolbar, boolean isMainToolBar) { if (!isMainToolBar) { toolbar.requestFocus(); toolbar.setRollover(true); } if (toolbarStyle == TOOL_BAR_STYLE_FIXED) { toolbar.setFloatable(false); if (!isMainToolBar) { if (haveMadeAToolBar) toolbar.addSeparator(); haveMadeAToolBar = true; } } } /** * Method to try to get the properties manager from the window management callback, * if we don't already have a propertiesManager object */ protected void doubleCheckPropertiesManager() { if ((propertiesManager == null) && (viewerController != null) && (viewerController.getWindowManagementCallback() != null)) { propertiesManager = viewerController.getWindowManagementCallback().getProperties(); } } /** * Method to attempt to override the system property highlight color * If the current color is blank, we'll try to pull the same property from * our local propertiesManager and, if found, apply it to the system properties * This affects the search highlight coloring */ protected void overrideHighlightColor() { // Attempt to override the default highlight color // We will only attempt this if a -D system parameter was not passed if (Defs.sysProperty(PropertiesManager.SYSPROPERTY_HIGHLIGHT_COLOR) == null) { doubleCheckPropertiesManager(); // Try to pull the color from our local properties file // If we can find a value, then set it as the system property if (propertiesManager != null) { String newColor = propertiesManager.getString(PropertiesManager.SYSPROPERTY_HIGHLIGHT_COLOR, null); if (newColor != null) { Defs.setSystemProperty(PropertiesManager.SYSPROPERTY_HIGHLIGHT_COLOR, newColor); } } } } protected Font buildButtonFont() { return new java.awt.Font("Helvetica", java.awt.Font.PLAIN, 9); } protected void addToToolBar(JToolBar toolbar, JComponent comp) { if (comp != null) toolbar.add(comp); } protected void addToMenu(JMenu menu, JMenuItem mi) { if (mi != null) menu.add(mi); } protected void addToMenuBar(JMenuBar menuBar, JMenu menu) { if (menu != null) menuBar.add(menu); } }