summaryrefslogtreecommitdiff
path: root/platform/java/example/Viewer.java
diff options
context:
space:
mode:
authorfredrossperry <fredrossperry@gmail.com>2016-07-06 14:28:27 -0700
committerRobin Watts <robin.watts@artifex.com>2016-07-11 23:50:00 +0100
commit4a2b261f195c73aa3cd731d93d3b7778ce985269 (patch)
tree523f3aba0701f5b73c0ed8375450c82eb8a0a18e /platform/java/example/Viewer.java
parent8d4b16f46062ba56d636865ca9ad7cb7e8a11551 (diff)
downloadmupdf-4a2b261f195c73aa3cd731d93d3b7778ce985269.tar.xz
Java desktop example: detect retina and scale accordingly
also: zoom in/out buttons
Diffstat (limited to 'platform/java/example/Viewer.java')
-rw-r--r--platform/java/example/Viewer.java65
1 files changed, 62 insertions, 3 deletions
diff --git a/platform/java/example/Viewer.java b/platform/java/example/Viewer.java
index 91b0fa1d..310aeb15 100644
--- a/platform/java/example/Viewer.java
+++ b/platform/java/example/Viewer.java
@@ -14,10 +14,14 @@ import java.awt.event.ActionListener;
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;
import java.awt.event.ActionEvent;
+import java.awt.GraphicsEnvironment;
+import java.awt.GraphicsDevice;
+import java.awt.Toolkit;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.swing.JOptionPane;
+import java.lang.reflect.Field;
public class Viewer extends Frame implements WindowListener, ActionListener
{
@@ -25,19 +29,23 @@ public class Viewer extends Frame implements WindowListener, ActionListener
protected Panel toolbar;
protected PageCanvas pageCanvas;
protected Label pageLabel;
- protected Button firstButton, prevButton, nextButton, lastButton;
+ protected Button firstButton, prevButton, nextButton, lastButton, zoomInButton, zoomOutButton;
protected int pageCount;
protected int pageNumber;
+ private float retinaScale;
+
public Viewer(Document doc_) {
super("MuPDF");
+ retinaScale = getRetinaScale();
+
this.doc = doc_;
pageCount = doc.countPages();
pageNumber = 0;
- setSize(600, 900);
+ setSize(1200, 900);
setTitle("MuPDF: " + doc.getMetaData(Document.META_INFO_TITLE));
toolbar = new Panel();
@@ -50,12 +58,18 @@ public class Viewer extends Frame implements WindowListener, ActionListener
nextButton.addActionListener(this);
lastButton = new Button(">|");
lastButton.addActionListener(this);
+ zoomInButton = new Button("+");
+ zoomInButton.addActionListener(this);
+ zoomOutButton = new Button("-");
+ zoomOutButton.addActionListener(this);
pageLabel = new Label();
toolbar.add(firstButton);
toolbar.add(prevButton);
toolbar.add(nextButton);
toolbar.add(lastButton);
+ toolbar.add(zoomInButton);
+ toolbar.add(zoomOutButton);
toolbar.add(pageLabel);
add(toolbar, BorderLayout.NORTH);
@@ -69,7 +83,7 @@ public class Viewer extends Frame implements WindowListener, ActionListener
pageLabel.setText("Page " + (pageNumber + 1) + " / " + pageCount);
if (pageCanvas != null)
remove(pageCanvas);
- pageCanvas = new PageCanvas(doc.loadPage(pageNumber));
+ pageCanvas = new PageCanvas(doc.loadPage(pageNumber), retinaScale);
add(pageCanvas, BorderLayout.CENTER);
validate();
}
@@ -80,19 +94,30 @@ public class Viewer extends Frame implements WindowListener, ActionListener
if (source == firstButton)
pageNumber = 0;
+
if (source == lastButton)
pageNumber = pageCount - 1;
+
if (source == prevButton) {
pageNumber = pageNumber - 1;
if (pageNumber < 0)
pageNumber = 0;
}
+
if (source == nextButton) {
pageNumber = pageNumber + 1;
if (pageNumber >= pageCount)
pageNumber = pageCount - 1;
}
+ if (source == zoomInButton) {
+ pageCanvas.zoomIn();
+ }
+
+ if (source == zoomOutButton) {
+ pageCanvas.zoomOut();
+ }
+
if (pageNumber != oldPageNumber)
stuff();
}
@@ -200,4 +225,38 @@ public class Viewer extends Frame implements WindowListener, ActionListener
{
JOptionPane.showMessageDialog(null, infoMessage, "InfoBox: " + titleBar, JOptionPane.INFORMATION_MESSAGE);
}
+
+ public float getRetinaScale()
+ {
+ // first try Oracle's VM (we should also test for 1.7.0_40 or higher)
+ final String vendor = System.getProperty("java.vm.vendor");
+ boolean isOracle = vendor != null && vendor.toLowerCase().contains("Oracle".toLowerCase());
+ if (isOracle)
+ {
+ GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ final GraphicsDevice device = env.getDefaultScreenDevice();
+ try {
+ Field field = device.getClass().getDeclaredField("scale");
+ if (field != null) {
+ field.setAccessible(true);
+ Object scale = field.get(device);
+ if (scale instanceof Integer && ((Integer)scale).intValue() == 2) {
+ return 2.0f;
+ }
+ }
+ }
+ catch (Exception ignore) {
+ }
+ return 1.0f;
+ }
+
+ // try Apple VM
+ final Float scaleFactor = (Float)Toolkit.getDefaultToolkit().getDesktopProperty("apple.awt.contentScaleFactor");
+ if (scaleFactor != null && scaleFactor.intValue() == 2) {
+ return 2.0f;
+ }
+
+ return 1.0f;
+ }
+
}