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);
+            }
+        }
+    }
 }


Reply via email to