summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorevrhel <ethanvrhel@gmail.com>2020-07-23 16:13:13 -0700
committerRobin Watts <Robin.Watts@artifex.com>2020-09-24 12:30:29 +0100
commit61578c23109bde1972df13f0ab5a83d199ab00dc (patch)
tree44060200db2e637a8f2d840f57d8233f0296856d
parent0d1e2067c202be29348d4274e4f04dadc3af7ef7 (diff)
downloadghostpdl-61578c23109bde1972df13f0ab5a83d199ab00dc.tar.gz
Worked on creating GUI
Added GUI (generated using NetBeans). Added support for callbacks into the GUI specifically related to the wanted viewer operations.
-rw-r--r--demos/java/gsviewer/src/com/artifex/gsviewer/Document.java29
-rw-r--r--demos/java/gsviewer/src/com/artifex/gsviewer/GSFileFilter.java35
-rw-r--r--demos/java/gsviewer/src/com/artifex/gsviewer/Main.java42
-rw-r--r--demos/java/gsviewer/src/com/artifex/gsviewer/ViewerGUIListenerImpl.java67
-rw-r--r--demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerGUIListener.java20
-rw-r--r--demos/java/gsviewer/src/com/artifex/gsviewer/gui/ViewerWindow.java404
6 files changed, 585 insertions, 12 deletions
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<Page> {
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")
+ // <editor-fold defaultstate="collapsed" desc="Generated
+ // Code">//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();
+ }// </editor-fold>
+
+ 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;
+ }
+}