From 61578c23109bde1972df13f0ab5a83d199ab00dc Mon Sep 17 00:00:00 2001 From: evrhel Date: Thu, 23 Jul 2020 16:13:13 -0700 Subject: Worked on creating GUI Added GUI (generated using NetBeans). Added support for callbacks into the GUI specifically related to the wanted viewer operations. --- .../src/com/artifex/gsviewer/Document.java | 29 ++ .../src/com/artifex/gsviewer/GSFileFilter.java | 35 ++ .../gsviewer/src/com/artifex/gsviewer/Main.java | 42 ++- .../artifex/gsviewer/ViewerGUIListenerImpl.java | 67 ++++ .../artifex/gsviewer/gui/ViewerGUIListener.java | 20 + .../src/com/artifex/gsviewer/gui/ViewerWindow.java | 404 +++++++++++++++++++++ 6 files changed, 585 insertions(+), 12 deletions(-) create mode 100644 demos/java/gsviewer/src/com/artifex/gsviewer/GSFileFilter.java create mode 100644 demos/java/gsviewer/src/com/artifex/gsviewer/ViewerGUIListenerImpl.java create mode 100644 demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerGUIListener.java create mode 100644 demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerWindow.java diff --git a/demos/java/gsviewer/src/com/artifex/gsviewer/Document.java b/demos/java/gsviewer/src/com/artifex/gsviewer/Document.java index c40c9bcbc..2d5035e19 100644 --- a/demos/java/gsviewer/src/com/artifex/gsviewer/Document.java +++ b/demos/java/gsviewer/src/com/artifex/gsviewer/Document.java @@ -23,6 +23,35 @@ public class Document implements List { private static final DocumentLoader documentLoader = new DocumentLoader(); private static final int format = GS_COLORS_RGB | GS_DISPLAY_DEPTH_8 | GS_DISPLAY_BIGENDIAN; + public static void loadDocumentAsync(final File file, final DocAsyncLoadCallback cb) + throws NullPointerException { + Objects.requireNonNull(cb, "DocAsyncLoadCallback"); + final Thread t = new Thread(() -> { + Document doc = null; + Exception exception = null; + try { + doc = new Document(file); + } catch (FileNotFoundException | IllegalStateException | NullPointerException e) { + exception = e; + } + cb.onDocumentLoad(doc, exception); + }); + t.setName("Document-Loader-Thread"); + t.setDaemon(true); + t.start(); + } + + public static void loadDocumentAsync(final String filename, final DocAsyncLoadCallback cb) + throws NullPointerException { + loadDocumentAsync(new File(filename), cb); + } + + @FunctionalInterface + public static interface DocAsyncLoadCallback { + + public void onDocumentLoad(Document doc, Exception exception); + } + private static void initDocInstance(LongReference instanceRef) throws IllegalStateException { int code = gsapi_new_instance(instanceRef, GS_NULL); if (code != GS_ERROR_OK) { diff --git a/demos/java/gsviewer/src/com/artifex/gsviewer/GSFileFilter.java b/demos/java/gsviewer/src/com/artifex/gsviewer/GSFileFilter.java new file mode 100644 index 000000000..6136e973b --- /dev/null +++ b/demos/java/gsviewer/src/com/artifex/gsviewer/GSFileFilter.java @@ -0,0 +1,35 @@ +package com.artifex.gsviewer; + +import java.io.File; + +import javax.swing.filechooser.FileFilter; + +public class GSFileFilter extends FileFilter { + + public static final GSFileFilter INSTANCE = new GSFileFilter(); + + @Override + public boolean accept(File f) { + if (f.isDirectory()) + return true; + final String name = f.getName(); + final int ind = name.lastIndexOf('.'); + final String ext = name.substring(ind); + return + equals(ext, "pdf") || + equals(ext, "eps") || + equals(ext, "ps") || + equals(ext, "xps") || + equals(ext, "oxps") || + equals(ext, "bin"); + } + + @Override + public String getDescription() { + return "Ghostscript Files"; + } + + private boolean equals(String extension, String compare) { + return extension.equalsIgnoreCase(compare); + } +} diff --git a/demos/java/gsviewer/src/com/artifex/gsviewer/Main.java b/demos/java/gsviewer/src/com/artifex/gsviewer/Main.java index e3cc84fd4..b1c3014e9 100644 --- a/demos/java/gsviewer/src/com/artifex/gsviewer/Main.java +++ b/demos/java/gsviewer/src/com/artifex/gsviewer/Main.java @@ -5,24 +5,42 @@ import java.io.FileNotFoundException; import java.io.IOException; import javax.imageio.ImageIO; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import com.artifex.gsviewer.gui.ViewerWindow; public class Main { public static void main(String[] args) throws FileNotFoundException { - Document doc = new Document("010104_momentum_concepts.pdf"); + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e1) { + e1.printStackTrace(); + } + + ViewerWindow win = new ViewerWindow(new ViewerGUIListenerImpl()); + SwingUtilities.invokeLater(() -> { + win.setVisible(true); + }); + + + //Document doc = new Document("010104_momentum_concepts.pdf"); //doc.loadHighRes(1, 3); //doc.unloadHighRes(2); - doc.loadHighResList(1, 2, 3); - - int pageNum = 1; - for (Page page : doc) { - try { - ImageIO.write(page.getDisplayableImage(), "PNG", new File("page-" + pageNum + ".png")); - } catch (IOException e) { - System.err.println("Failed to write page " + pageNum); - } - pageNum++; - } + //doc.loadHighResList(1, 2, 3); + + //int pageNum = 1; + //for (Page page : doc) { + // try { + // ImageIO.write(page.getDisplayableImage(), "PNG", new File("page-" + pageNum + ".png")); + // } catch (IOException e) { + // System.err.println("Failed to write page " + pageNum); + // } + // pageNum++; + //} } } diff --git a/demos/java/gsviewer/src/com/artifex/gsviewer/ViewerGUIListenerImpl.java b/demos/java/gsviewer/src/com/artifex/gsviewer/ViewerGUIListenerImpl.java new file mode 100644 index 000000000..108be1974 --- /dev/null +++ b/demos/java/gsviewer/src/com/artifex/gsviewer/ViewerGUIListenerImpl.java @@ -0,0 +1,67 @@ +package com.artifex.gsviewer; + +import java.awt.Point; +import java.io.File; + +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; + +import com.artifex.gsviewer.gui.ViewerGUIListener; +import com.artifex.gsviewer.gui.ViewerWindow; + +public class ViewerGUIListenerImpl implements ViewerGUIListener { + + @Override + public void onPageChange(ViewerWindow source, int oldPage, int newPage) { + System.out.println("Page change: " + oldPage + " to " + newPage); + } + + @Override + public void onZoomChange(ViewerWindow source, double oldZoom, double newZoom) { + System.out.println("Zoom change: " + oldZoom + " to " + newZoom); + } + + @Override + public void onScrollChange(ViewerWindow source, Point oldScroll, Point newScroll) { + System.out.println("Scroll change: " + oldScroll + " to " + newScroll); + } + + @Override + public void onOpenFile(ViewerWindow source) { + System.out.println("Open file"); + JFileChooser chooser = new JFileChooser(); + chooser.setFileFilter(GSFileFilter.INSTANCE); + chooser.setCurrentDirectory(new File("").getAbsoluteFile()); + int status = chooser.showOpenDialog(source); + if (status == JFileChooser.APPROVE_OPTION) { + File toOpen = chooser.getSelectedFile(); + System.out.println("To open: " + toOpen.getAbsolutePath()); + Document.loadDocumentAsync(toOpen, (final Document doc, final Exception exception) -> { + if (exception != null) { + JOptionPane.showMessageDialog(source, exception.toString(), + "Failed to load", JOptionPane.ERROR_MESSAGE); + } else { + System.out.println("Loaded document"); + } + }); + } + } + + @Override + public void onCloseFile(ViewerWindow source) { + System.out.println("Close file"); + } + + @Override + public void onClosing(ViewerWindow source) { + System.out.println("Closing"); + source.dispose(); + System.exit(0); + } + + @Override + public void onSettingsOpen(ViewerWindow source) { + System.out.println("Settings open"); + } + +} diff --git a/demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerGUIListener.java b/demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerGUIListener.java new file mode 100644 index 000000000..f56bbc5cb --- /dev/null +++ b/demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerGUIListener.java @@ -0,0 +1,20 @@ +package com.artifex.gsviewer.gui; + +import java.awt.Point; + +public interface ViewerGUIListener { + + public void onPageChange(ViewerWindow source, int oldPage, int newPage); + + public void onZoomChange(ViewerWindow source, double oldZoom, double newZoom); + + public void onScrollChange(ViewerWindow source, Point oldScroll, Point newScroll); + + public void onOpenFile(ViewerWindow source); + + public void onCloseFile(ViewerWindow source); + + public void onClosing(ViewerWindow source); + + public void onSettingsOpen(ViewerWindow source); +} diff --git a/demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerWindow.java b/demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerWindow.java new file mode 100644 index 000000000..ca144d683 --- /dev/null +++ b/demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerWindow.java @@ -0,0 +1,404 @@ +package com.artifex.gsviewer.gui; + +/** + * Auto-generated form using NetBeans. + */ +public class ViewerWindow extends javax.swing.JFrame { + + private static final long serialVersionUID = 1L; + + private ViewerGUIListener guiListener; + private int currentPage, maxPage; + private double currentZoom; + + /** + * Creates new form ViewerWindow + */ + public ViewerWindow() { + this(null); + } + + public ViewerWindow(final ViewerGUIListener listener) { + initComponents(); + this.guiListener = listener; + this.currentPage = 0; + this.maxPage = 0; + this.currentZoom = 1.0; + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + viewerScrollPane = new javax.swing.JScrollPane(); + viewerContentPane = new javax.swing.JPanel(); + miniViewerScrollPane = new javax.swing.JScrollPane(); + miniViewerContentPane = new javax.swing.JPanel(); + zoomSlider = new javax.swing.JSlider(); + increaseZoomButton = new javax.swing.JButton(); + decreaseZoomButton = new javax.swing.JButton(); + lastPageButton = new javax.swing.JButton(); + maxPagesLabel = new javax.swing.JTextField(); + nextPageButton = new javax.swing.JButton(); + progressBar = new javax.swing.JProgressBar(); + pageNumberField = new javax.swing.JTextField(); + pageSlashLabel = new javax.swing.JLabel(); + menuBar = new javax.swing.JMenuBar(); + fileMenu = new javax.swing.JMenu(); + openMenu = new javax.swing.JMenuItem(); + closeMenuItem = new javax.swing.JMenuItem(); + fileMenuSeparator = new javax.swing.JPopupMenu.Separator(); + exitMenuItem = new javax.swing.JMenuItem(); + editMenu = new javax.swing.JMenu(); + settingsMenuItem = new javax.swing.JMenuItem(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); + setTitle("Viewer"); + setMinimumSize(new java.awt.Dimension(640, 650)); + addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); + + viewerScrollPane.setMinimumSize(new java.awt.Dimension(85, 110)); + + javax.swing.GroupLayout viewerContentPaneLayout = new javax.swing.GroupLayout(viewerContentPane); + viewerContentPane.setLayout(viewerContentPaneLayout); + viewerContentPaneLayout.setHorizontalGroup( + viewerContentPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 502, Short.MAX_VALUE) + ); + viewerContentPaneLayout.setVerticalGroup( + viewerContentPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 639, Short.MAX_VALUE) + ); + + viewerScrollPane.setViewportView(viewerContentPane); + + miniViewerScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + + javax.swing.GroupLayout miniViewerContentPaneLayout = new javax.swing.GroupLayout(miniViewerContentPane); + miniViewerContentPane.setLayout(miniViewerContentPaneLayout); + miniViewerContentPaneLayout.setHorizontalGroup( + miniViewerContentPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 118, Short.MAX_VALUE) + ); + miniViewerContentPaneLayout.setVerticalGroup( + miniViewerContentPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 639, Short.MAX_VALUE) + ); + + miniViewerScrollPane.setViewportView(miniViewerContentPane); + + zoomSlider.setMajorTickSpacing(25); + zoomSlider.setMinorTickSpacing(5); + zoomSlider.setPaintTicks(true); + zoomSlider.setSnapToTicks(true); + zoomSlider.addMouseListener(new java.awt.event.MouseAdapter() { + @Override + public void mouseReleased(java.awt.event.MouseEvent evt) { + zoomSliderMouseReleased(evt); + } + }); + + increaseZoomButton.setText("+"); + increaseZoomButton.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + increaseZoomButtonActionPerformed(evt); + } + }); + + decreaseZoomButton.setText("-"); + decreaseZoomButton.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + decreaseZoomButtonActionPerformed(evt); + } + }); + + lastPageButton.setText("<"); + lastPageButton.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + lastPageButtonActionPerformed(evt); + } + }); + + maxPagesLabel.setEditable(false); + maxPagesLabel.setText("0"); + + nextPageButton.setText(">"); + nextPageButton.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + nextPageButtonActionPerformed(evt); + } + }); + + pageNumberField.setText("0"); + pageNumberField.addKeyListener(new java.awt.event.KeyAdapter() { + @Override + public void keyPressed(java.awt.event.KeyEvent evt) { + pageNumberFieldKeyPressed(evt); + } + }); + + pageSlashLabel.setText("/"); + + fileMenu.setText("File"); + + openMenu.setText("Open"); + openMenu.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + openMenuActionPerformed(evt); + } + }); + fileMenu.add(openMenu); + + closeMenuItem.setText("Close"); + closeMenuItem.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + closeMenuItemActionPerformed(evt); + } + }); + fileMenu.add(closeMenuItem); + fileMenu.add(fileMenuSeparator); + + exitMenuItem.setText("Exit"); + exitMenuItem.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + exitMenuItemActionPerformed(evt); + } + }); + fileMenu.add(exitMenuItem); + + menuBar.add(fileMenu); + + editMenu.setText("Edit"); + + settingsMenuItem.setText("Settings"); + settingsMenuItem.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + settingsMenuItemActionPerformed(evt); + } + }); + editMenu.add(settingsMenuItem); + + menuBar.add(editMenu); + + setJMenuBar(menuBar); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(miniViewerScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(2, 2, 2) + .addComponent(decreaseZoomButton, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(zoomSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(increaseZoomButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lastPageButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(pageNumberField, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(pageSlashLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(maxPagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(4, 4, 4) + .addComponent(nextPageButton) + .addGap(2, 2, 2)) + .addComponent(viewerScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(miniViewerScrollPane) + .addComponent(viewerScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(decreaseZoomButton) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(increaseZoomButton) + .addComponent(nextPageButton) + .addComponent(maxPagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(pageNumberField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lastPageButton) + .addComponent(pageSlashLabel))) + .addComponent(zoomSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(14, 14, 14) + .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + + pack(); + }// + + private void lastPageButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_lastPageButtonActionPerformed + if (maxPage > 0) { + final int oldPage = currentPage; + currentPage = Math.max(currentPage - 1, 1); + pageNumberField.setText(new StringBuilder().append(currentPage).toString()); + if (guiListener != null) + guiListener.onPageChange(this, oldPage, currentPage); + } else { + pageNumberField.setText(new StringBuilder().append(0).toString()); + } + }// GEN-LAST:event_lastPageButtonActionPerformed + + private void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_nextPageButtonActionPerformed + if (maxPage > 0) { + final int oldPage = currentPage; + currentPage = Math.min(currentPage + 1, maxPage); + pageNumberField.setText(new StringBuilder().append(currentPage).toString()); + if (guiListener != null) + guiListener.onPageChange(this, oldPage, currentPage); + } else { + pageNumberField.setText(new StringBuilder().append(0).toString()); + } + }// GEN-LAST:event_nextPageButtonActionPerformed + + private void formWindowClosing(java.awt.event.WindowEvent evt) {// GEN-FIRST:event_formWindowClosing + if (guiListener != null) + guiListener.onClosing(this); + }// GEN-LAST:event_formWindowClosing + + private void pageNumberFieldKeyPressed(java.awt.event.KeyEvent evt) {// GEN-FIRST:event_pageNumberFieldKeyPressed + if (evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { + final String text = pageNumberField.getText(); + try { + final int newPage = Integer.parseInt(text); + if (newPage < 1 || newPage > maxPage) + throw new IllegalArgumentException(); + final int oldPage = currentPage; + this.currentPage = newPage; + if (guiListener != null) + guiListener.onPageChange(this, oldPage, currentPage); + } catch (IllegalArgumentException e) { + System.err.println(new StringBuilder().append("Invalid page number \""). + append(text).append('\"').toString()); + } finally { + pageNumberField.setText(new StringBuilder().append(currentPage).toString()); + } + } + }// GEN-LAST:event_pageNumberFieldKeyPressed + + private void zoomSliderMouseReleased(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_zoomSliderMouseReleased + final double sliderValue = zoomSlider.getValue() / 50.0; + final double oldZoom = currentZoom; + this.currentZoom = sliderValue; + if (guiListener != null && oldZoom != currentZoom) + guiListener.onZoomChange(this, oldZoom, currentZoom); + }// GEN-LAST:event_zoomSliderMouseReleased + + private void increaseZoomButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_increaseZoomButtonActionPerformed + final double oldZoom = currentZoom; + this.currentZoom = Math.min(Math.ceil((oldZoom * 10) + 1) / 10, 2.0); + zoomSlider.setValue((int)(currentZoom * 50)); + if (guiListener != null && oldZoom != currentZoom) + guiListener.onZoomChange(this, oldZoom, currentZoom); + }// GEN-LAST:event_increaseZoomButtonActionPerformed + + private void decreaseZoomButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_decreaseZoomButtonActionPerformed + final double oldZoom = currentZoom; + this.currentZoom = Math.max(Math.floor((oldZoom * 10) - 1) / 10, 0.0); + zoomSlider.setValue((int)(currentZoom * 50)); + if (guiListener != null && oldZoom != currentZoom) + guiListener.onZoomChange(this, oldZoom, currentZoom); + }// GEN-LAST:event_decreaseZoomButtonActionPerformed + + private void openMenuActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_openMenuActionPerformed + if (guiListener != null) + guiListener.onOpenFile(this); + }// GEN-LAST:event_openMenuActionPerformed + + private void closeMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_closeMenuItemActionPerformed + if (guiListener != null) + guiListener.onCloseFile(this); + }// GEN-LAST:event_closeMenuItemActionPerformed + + private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_exitMenuItemActionPerformed + if (guiListener != null) + guiListener.onClosing(this); + }// GEN-LAST:event_exitMenuItemActionPerformed + + private void settingsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_settingsMenuItemActionPerformed + if (guiListener != null) + guiListener.onSettingsOpen(this); + }// GEN-LAST:event_settingsMenuItemActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JMenuItem closeMenuItem; + private javax.swing.JButton decreaseZoomButton; + private javax.swing.JMenu editMenu; + private javax.swing.JMenuItem exitMenuItem; + private javax.swing.JMenu fileMenu; + private javax.swing.JPopupMenu.Separator fileMenuSeparator; + private javax.swing.JButton increaseZoomButton; + private javax.swing.JButton lastPageButton; + private javax.swing.JTextField maxPagesLabel; + private javax.swing.JMenuBar menuBar; + private javax.swing.JPanel miniViewerContentPane; + private javax.swing.JScrollPane miniViewerScrollPane; + private javax.swing.JButton nextPageButton; + private javax.swing.JMenuItem openMenu; + private javax.swing.JTextField pageNumberField; + private javax.swing.JLabel pageSlashLabel; + private javax.swing.JProgressBar progressBar; + private javax.swing.JMenuItem settingsMenuItem; + private javax.swing.JPanel viewerContentPane; + private javax.swing.JScrollPane viewerScrollPane; + private javax.swing.JSlider zoomSlider; + // End of variables declaration//GEN-END:variables + + public void setGUIListener(final ViewerGUIListener listener) { + this.guiListener = listener; + } + + public void setPage(final int newPage) { + try { + if (newPage < 1 || newPage > maxPage) + throw new IllegalArgumentException(); + final int oldPage = currentPage; + currentPage = newPage; + if (guiListener != null) + guiListener.onPageChange(this, oldPage, currentPage); + } catch (IllegalArgumentException e) { + System.err.println(new StringBuilder().append("Invalid page number \""). + append(newPage).append('\"').toString()); + } finally { + pageNumberField.setText(new StringBuilder().append(currentPage).toString()); + } + } + + public void setMaxPage(final int max) { + this.maxPage = max; + } +} -- cgit v1.2.1