Author: tilman Date: Sun Sep 17 12:57:53 2023 New Revision: 1912362 URL: http://svn.apache.org/viewvc?rev=1912362&view=rev Log: PDFBOX-5663: add about dialog inspired from tika
Added: pdfbox/branches/3.0/debugger/src/main/resources/org/apache/pdfbox/debugger/about.html - copied unchanged from r1912357, pdfbox/trunk/debugger/src/main/resources/org/apache/pdfbox/debugger/about.html pdfbox/branches/3.0/debugger/src/main/resources/org/apache/pdfbox/debugger/pdfbox-logo.png - copied unchanged from r1912357, pdfbox/trunk/debugger/src/main/resources/org/apache/pdfbox/debugger/pdfbox-logo.png Modified: pdfbox/branches/3.0/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java Modified: pdfbox/branches/3.0/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java URL: http://svn.apache.org/viewvc/pdfbox/branches/3.0/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java?rev=1912362&r1=1912361&r2=1912362&view=diff ============================================================================== --- pdfbox/branches/3.0/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java (original) +++ pdfbox/branches/3.0/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java Sun Sep 17 12:57:53 2023 @@ -17,11 +17,13 @@ package org.apache.pdfbox.debugger; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FileDialog; import java.awt.Frame; +import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; @@ -32,6 +34,7 @@ import java.awt.event.KeyEvent; import java.awt.event.WindowEvent; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -40,6 +43,8 @@ import java.io.PrintStream; import java.lang.reflect.Method; import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -55,7 +60,10 @@ import javax.print.attribute.PrintReques import javax.print.attribute.standard.Sides; import javax.swing.AbstractAction; import javax.swing.Action; +import javax.swing.Box; import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; @@ -69,6 +77,8 @@ import javax.swing.KeyStroke; import javax.swing.TransferHandler; import javax.swing.UIManager; import javax.swing.border.BevelBorder; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; @@ -153,7 +163,7 @@ import picocli.CommandLine.Model.Command */ @SuppressWarnings({ "serial", "squid:MaximumInheritanceDepth", "squid:S1948" }) @Command(name = "pdfdebugger", description = "Analyzes and inspects the internal structure of a PDF document") -public class PDFDebugger extends JFrame implements Callable<Integer> +public class PDFDebugger extends JFrame implements Callable<Integer>, HyperlinkListener { private static Log LOG; // needs late initialization @@ -438,6 +448,18 @@ public class PDFDebugger extends JFrame menuBar.add(viewMenu.getMenu()); setJMenuBar(menuBar); + menuBar.add(Box.createHorizontalGlue()); + JMenu help = new JMenu("Help"); + help.setMnemonic(KeyEvent.VK_H); + + JMenuItem item = new JMenuItem("About PDFBox", KeyEvent.VK_A); + item.setActionCommand("about"); + item.addActionListener(actionEvent -> + textDialog("About Apache PDFBox", PDFDebugger.class.getResource("about.html"))); + help.add(item); + + menuBar.add(help); + setExtendedState(windowPrefs.getExtendedState()); setBounds(windowPrefs.getBounds()); @@ -1593,4 +1615,77 @@ public class PDFDebugger extends JFrame } return null; } + + private void textDialog(String title, URL resource) + { + try + { + JDialog dialog = new JDialog(this, title, true); + JEditorPane editor = new JEditorPane(resource); + editor.setContentType("text/html"); + editor.setEditable(false); + editor.setBackground(Color.WHITE); + editor.setPreferredSize(new Dimension(400, 250)); + + // put it in the middle of the parent, but not outside of the screen + // GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice() + // doesn't work give the numbers we need + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + double screenWidth = screenSize.getWidth(); + double screenHeight = screenSize.getHeight(); + Rectangle parentBounds = this.getBounds(); + editor.addHyperlinkListener(this); + dialog.add(editor); + dialog.pack(); + + int x = (int) (parentBounds.getX() + (parentBounds.getWidth() - editor.getWidth()) / 2); + int y = (int) (parentBounds.getY() + (parentBounds.getHeight() - editor.getHeight()) / 2); + x = (int) Math.min(x, screenWidth * 3 / 4); + y = (int) Math.min(y, screenHeight * 3 / 4); + x = Math.max(0, x); + y = Math.max(0, y); + dialog.setLocation(x, y); + + dialog.setVisible(true); + } + catch (IOException ex) + { + new ErrorDialog(ex).setVisible(true); + } + } + + @Override + public void hyperlinkUpdate(HyperlinkEvent he) + { + if (he.getEventType() == HyperlinkEvent.EventType.ACTIVATED) + { + try + { + URL url = he.getURL(); + try (InputStream stream = url.openStream()) + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + IOUtils.copy(stream,baos); + JEditorPane editor + = new JEditorPane("text/plain", baos.toString(StandardCharsets.UTF_8.name())); + editor.setEditable(false); + editor.setBackground(Color.WHITE); + editor.setCaretPosition(0); + editor.setPreferredSize(new Dimension(600, 400)); + + String name = url.toString(); + name = name.substring(name.lastIndexOf('/') + 1); + + JDialog dialog = new JDialog(this, "Apache PDFBox: " + name, true); + dialog.add(new JScrollPane(editor)); + dialog.pack(); + dialog.setVisible(true); + } + } + catch (IOException ex) + { + new ErrorDialog(ex).setVisible(true); + } + } + } }