You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2015/07/25 16:44:55 UTC

svn commit: r1692625 - in /pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools: PDFDebugger.java pdfdebugger/pagepane/PagePane.java pdfdebugger/streampane/StreamImageView.java pdfdebugger/ui/ZoomMenu.java

Author: tilman
Date: Sat Jul 25 14:44:54 2015
New Revision: 1692625

URL: http://svn.apache.org/r1692625
Log:
PDFBOX-2530: zoom feature for images + refactor zoom menu as singleton, as done by Khyrul Bashar in GSoC2015

Added:
    pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/ui/ZoomMenu.java   (with props)
Modified:
    pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/PDFDebugger.java
    pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/pagepane/PagePane.java
    pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/streampane/StreamImageView.java

Modified: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/PDFDebugger.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/PDFDebugger.java?rev=1692625&r1=1692624&r2=1692625&view=diff
==============================================================================
--- pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/PDFDebugger.java (original)
+++ pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/PDFDebugger.java Sat Jul 25 14:44:54 2015
@@ -39,16 +39,13 @@ import java.util.List;
 import java.util.Set;
 import javax.swing.AbstractAction;
 import javax.swing.Action;
-import javax.swing.ButtonGroup;
 import javax.swing.JComponent;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
-import javax.swing.JRadioButtonMenuItem;
 import javax.swing.JScrollPane;
 import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
 import javax.swing.TransferHandler;
 import javax.swing.UIManager;
 import javax.swing.border.BevelBorder;
@@ -85,6 +82,7 @@ import org.apache.pdfbox.tools.pdfdebugg
 import org.apache.pdfbox.tools.pdfdebugger.treestatus.TreeStatus;
 import org.apache.pdfbox.tools.pdfdebugger.treestatus.TreeStatusPane;
 import org.apache.pdfbox.tools.pdfdebugger.ui.Tree;
+import org.apache.pdfbox.tools.pdfdebugger.ui.ZoomMenu;
 import org.apache.pdfbox.tools.util.FileOpenSaveDialog;
 import org.apache.pdfbox.tools.util.RecentFiles;
 
@@ -98,7 +96,6 @@ public class PDFDebugger extends javax.s
     private TreeStatusPane statusPane;
     private RecentFiles recentFiles;
     private boolean isPageMode;
-    private float scale = 1;
 
     private PDDocument document;
     private String currentFilePath;
@@ -155,15 +152,6 @@ public class PDFDebugger extends javax.s
         helpMenu = new JMenu();
         contentsMenuItem = new JMenuItem();
         aboutMenuItem = new JMenuItem();
-        zoomMenu = new JMenu();
-        zoom50Item = new JRadioButtonMenuItem();
-        zoom100Item = new JRadioButtonMenuItem();
-        zoom200Item = new JRadioButtonMenuItem();
-        zoom100Item.setSelected(true);
-        ButtonGroup bg = new ButtonGroup();
-        bg.add(zoom50Item);
-        bg.add(zoom100Item);
-        bg.add(zoom200Item);
 
         tree.setCellRenderer( new PDFTreeCellRenderer() );
         tree.setModel( null );
@@ -313,38 +301,9 @@ public class PDFDebugger extends javax.s
         aboutMenuItem.setText("About");
         helpMenu.add(aboutMenuItem);
         
-        zoomMenu.setText("Zoom");
-        zoom50Item.setText("50%");
-        zoom100Item.setText("100%");
-        zoom200Item.setText("200%");
-        Action zoomAction = new AbstractAction()
-        {
-            @Override
-            public void actionPerformed(ActionEvent actionEvent)
-            {
-                Object source = actionEvent.getSource();
-                if (zoom50Item.equals(source))
-                {
-                    scale = 0.5f;
-                }
-                if (zoom100Item.equals(source))
-                {
-                    scale = 1;
-                }
-                if (zoom200Item.equals(source))
-                {
-                    scale = 2;
-                }
-                jTree1ValueChanged(null);
-            }
-        };
-        zoom50Item.addActionListener(zoomAction);
-        zoom100Item.addActionListener(zoomAction);
-        zoom200Item.addActionListener(zoomAction);        
-        zoomMenu.add(zoom50Item);
-        zoomMenu.add(zoom100Item);
-        zoomMenu.add(zoom200Item);
-        viewMenu.add(zoomMenu);
+        ZoomMenu zoomMenu = ZoomMenu.getInstance();
+        zoomMenu.setEnableMenu(false);
+        viewMenu.add(zoomMenu.getMenu());
 
         setJMenuBar(menuBar);
 
@@ -477,13 +436,9 @@ public class PDFDebugger extends javax.s
                 
                 if (isPage(selectedNode))
                 {
-                    zoomMenu.setEnabled(true);
-                    SwingUtilities.updateComponentTreeUI(menuBar);
                     showPage(selectedNode);
                     return;
                 }
-                zoomMenu.setEnabled(false);
-                SwingUtilities.updateComponentTreeUI(menuBar);
                 
                 if (isSpecialColorSpace(selectedNode) || isOtherColorSpace(selectedNode))
                 {
@@ -601,26 +556,6 @@ public class PDFDebugger extends javax.s
         return getUnderneathObject(selectedNode) instanceof COSStream;
     }
 
-    private boolean isFont(Object selectedNode)
-    {
-        selectedNode = getUnderneathObject(selectedNode);
-        if (selectedNode instanceof COSDictionary)
-        {
-            COSDictionary dic = (COSDictionary)selectedNode;
-            return  dic.containsKey(COSName.TYPE) &&
-                    dic.getCOSName(COSName.TYPE).equals(COSName.FONT) &&
-                    !isCIDFont(dic);
-        }
-        return false;
-    }
-
-    private boolean isCIDFont(COSDictionary dic)
-    {
-        return dic.containsKey(COSName.SUBTYPE) &&
-                (dic.getCOSName(COSName.SUBTYPE).equals(COSName.CID_FONT_TYPE0)
-                || dic.getCOSName(COSName.SUBTYPE).equals(COSName.CID_FONT_TYPE2));
-    }
-
     /**
      * Show a Panel describing color spaces in more detail and interactive way.
      * @param csNode the special color space containing node.
@@ -673,7 +608,7 @@ public class PDFDebugger extends javax.s
         COSBase typeItem = page.getItem(COSName.TYPE);
         if (COSName.PAGE.equals(typeItem))
         {
-            PagePane pagePane = new PagePane(document, page, scale);
+            PagePane pagePane = new PagePane(document, page);
             jSplitPane1.setRightComponent(new JScrollPane(pagePane.getPanel()));
         }
     }
@@ -1057,10 +992,6 @@ public class PDFDebugger extends javax.s
     private JMenu recentFilesMenu;
     private JMenu viewMenu;
     private JMenuItem viewModeItem;
-    private JMenu zoomMenu;
-    private JRadioButtonMenuItem zoom50Item;
-    private JRadioButtonMenuItem zoom100Item;
-    private JRadioButtonMenuItem zoom200Item;
     private JScrollPane jScrollPane1;
     private JScrollPane jScrollPane2;
     private javax.swing.JSplitPane jSplitPane1;

Modified: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/pagepane/PagePane.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/pagepane/PagePane.java?rev=1692625&r1=1692624&r2=1692625&view=diff
==============================================================================
--- pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/pagepane/PagePane.java (original)
+++ pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/pagepane/PagePane.java Sat Jul 25 14:44:54 2015
@@ -19,6 +19,8 @@ package org.apache.pdfbox.tools.pdfdebug
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
@@ -27,10 +29,13 @@ import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.SwingWorker;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.rendering.PDFRenderer;
+import org.apache.pdfbox.tools.pdfdebugger.ui.ZoomMenu;
 
 /**
  * Display the page number and a page rendering.
@@ -38,20 +43,19 @@ import org.apache.pdfbox.rendering.PDFRe
  * @author Tilman Hausherr
  * @author John Hewson
  */
-public class PagePane
+public class PagePane implements ActionListener, AncestorListener
 {
     private JPanel panel;
     private int pageIndex = -1;
     private final PDDocument document;
     private JLabel label;
-    private final float scale;
+    private ZoomMenu zoomMenu;
 
-    public PagePane(PDDocument document, COSDictionary page, float scale)
+    public PagePane(PDDocument document, COSDictionary page)
     {
         PDPage pdPage = new PDPage(page);
         pageIndex = document.getPages().indexOf(pdPage);
         this.document = document;
-        this.scale = scale;
         initUI();
     }
 
@@ -73,10 +77,11 @@ public class PagePane
         label.setAlignmentX(Component.CENTER_ALIGNMENT);
         label.setText("Loading...");
         panel.add(label);
+        panel.addAncestorListener(this);
 
         // render in a background thread: rendering is read-only, so this should be ok, despite
         // the fact that PDDocument is not officially thread safe
-        new RenderWorker().execute();
+        new RenderWorker(1).execute();
     }
 
     /**
@@ -89,11 +94,55 @@ public class PagePane
         return panel;
     }
 
+    @Override
+    public void actionPerformed(ActionEvent actionEvent)
+    {
+        String actionCommand = actionEvent.getActionCommand();
+        if (actionCommand.equals(ZoomMenu.ZOOM_50_PERCENT))
+        {
+            new RenderWorker(0.5f).execute();
+        }
+        else if (actionCommand.equals(ZoomMenu.ZOOM_100_PERCENT))
+        {
+            new RenderWorker(1).execute();
+        }
+        else if (actionCommand.equals(ZoomMenu.ZOOM_200_PERCENT))
+        {
+            new RenderWorker(2).execute();
+        }
+    }
+
+    @Override
+    public void ancestorAdded(AncestorEvent ancestorEvent)
+    {
+        zoomMenu = ZoomMenu.getInstance().menuListeners(this);
+        zoomMenu.setZoomSelection(ZoomMenu.ZOOM_100_PERCENT);
+        zoomMenu.setEnableMenu(true);
+    }
+
+    @Override
+    public void ancestorRemoved(AncestorEvent ancestorEvent)
+    {
+        zoomMenu.setEnableMenu(false);
+    }
+
+    @Override
+    public void ancestorMoved(AncestorEvent ancestorEvent)
+    {
+
+    }
+
     /**
      * Note that PDDocument is not officially thread safe, caution advised.
      */
     private class RenderWorker extends SwingWorker<BufferedImage, Integer>
     {
+        private final float scale;
+
+        private RenderWorker(float scale)
+        {
+            this.scale = scale;
+        }
         @Override
         protected BufferedImage doInBackground() throws IOException
         {

Modified: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/streampane/StreamImageView.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/streampane/StreamImageView.java?rev=1692625&r1=1692624&r2=1692625&view=diff
==============================================================================
--- pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/streampane/StreamImageView.java (original)
+++ pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/streampane/StreamImageView.java Sat Jul 25 14:44:54 2015
@@ -19,6 +19,9 @@ package org.apache.pdfbox.tools.pdfdebug
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Dimension;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.awt.image.BufferedImage;
 import javax.swing.Box;
 import javax.swing.BoxLayout;
@@ -28,16 +31,21 @@ import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.border.LineBorder;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+import org.apache.pdfbox.tools.pdfdebugger.ui.ZoomMenu;
 
 /**
  * @author Khyrul Bashar
  *
  * A class that provides the container for the image in case of image showing in stream pane.
  */
-class StreamImageView
+class StreamImageView implements ActionListener, AncestorListener
 {
-    private final BufferedImage image;
+    private BufferedImage image;
     private JScrollPane scrollPane;
+    private JLabel label;
+    private ZoomMenu zoomMenu;
 
     /**
      * constructor.
@@ -54,18 +62,19 @@ class StreamImageView
         JPanel panel = new JPanel();
         panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
 
-        JLabel label = new JLabel();
+        label = new JLabel();
         label.setBorder(new LineBorder(Color.BLACK));
         label.setAlignmentX(Component.CENTER_ALIGNMENT);
         label.setIcon(new ImageIcon(image));
-        
+
         panel.add(Box.createVerticalGlue());
         panel.add(label);
         panel.add(Box.createVerticalGlue());
-        
+
         scrollPane = new JScrollPane();
-        scrollPane.setViewportView(panel);
         scrollPane.setPreferredSize(new Dimension(300, 400));
+        scrollPane.addAncestorListener(this);
+        scrollPane.setViewportView(panel);
     }
 
     /**
@@ -76,4 +85,55 @@ class StreamImageView
     {
         return scrollPane;
     }
+
+    private Image zoomImage(BufferedImage origin, float scale)
+    {
+        int resizedWidth = (int) (origin.getWidth()*scale);
+        int resizedHeight = (int) (origin.getHeight()*scale);
+        return origin.getScaledInstance(resizedWidth, resizedHeight, BufferedImage.SCALE_SMOOTH);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent actionEvent)
+    {
+        String actionCommand = actionEvent.getActionCommand();
+        if (actionCommand.equals(ZoomMenu.ZOOM_50_PERCENT))
+        {
+            addImage(zoomImage(image, 0.5f));
+        }
+        else if (actionCommand.equals(ZoomMenu.ZOOM_100_PERCENT))
+        {
+            addImage(zoomImage(image, 1));
+        }
+        else if (actionCommand.equals(ZoomMenu.ZOOM_200_PERCENT))
+        {
+            addImage(zoomImage(image, 2));
+        }
+    }
+
+    private void addImage(Image img)
+    {
+        label.setIcon(new ImageIcon(img));
+        label.revalidate();
+    }
+
+    @Override
+    public void ancestorAdded(AncestorEvent ancestorEvent)
+    {
+        zoomMenu = ZoomMenu.getInstance().menuListeners(this);
+        zoomMenu.setZoomSelection(ZoomMenu.ZOOM_100_PERCENT);
+        zoomMenu.setEnableMenu(true);
+    }
+
+    @Override
+    public void ancestorRemoved(AncestorEvent ancestorEvent)
+    {
+        zoomMenu.setEnableMenu(false);
+    }
+
+    @Override
+    public void ancestorMoved(AncestorEvent ancestorEvent)
+    {
+
+    }
 }

Added: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/ui/ZoomMenu.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/ui/ZoomMenu.java?rev=1692625&view=auto
==============================================================================
--- pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/ui/ZoomMenu.java (added)
+++ pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/ui/ZoomMenu.java Sat Jul 25 14:44:54 2015
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.tools.pdfdebugger.ui;
+
+import java.awt.Component;
+import java.awt.event.ActionListener;
+import javax.swing.ButtonGroup;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JRadioButtonMenuItem;
+
+/**
+ * @author Khyrul Bashar
+ */
+public class ZoomMenu
+{
+    public static final String ZOOM_50_PERCENT = "50%";
+    public static final String ZOOM_100_PERCENT = "100%";
+    public static final String ZOOM_200_PERCENT = "200%";
+
+    private static ZoomMenu instance;
+    private JMenu menu = null;
+    private JRadioButtonMenuItem zoom50Item;
+    private JRadioButtonMenuItem zoom100Item;
+    private JRadioButtonMenuItem zoom200Item;
+
+    private ZoomMenu()
+    {
+        menu = createZoomMenu();
+    }
+
+    public static ZoomMenu getInstance()
+    {
+        if (instance == null)
+        {
+            instance = new ZoomMenu();
+        }
+        return instance;
+    }
+
+    public JMenu getMenu()
+    {
+        return this.menu;
+    }
+
+    public void setEnableMenu(boolean isEnable)
+    {
+        menu.setEnabled(isEnable);
+    }
+
+    public ZoomMenu menuListeners(ActionListener listener)
+    {
+        for (Component comp: menu.getMenuComponents())
+        {
+            JMenuItem menuItem = (JMenuItem) comp;
+            removeActionListeners(menuItem);
+            menuItem.addActionListener(listener);
+        }
+        return instance;
+    }
+
+    public void setZoomSelection(String selection)
+    {
+        if (ZOOM_50_PERCENT.equals(selection))
+        {
+            zoom50Item.setSelected(true);
+        }
+        else if (ZOOM_100_PERCENT.equals(selection))
+        {
+            zoom100Item.setSelected(true);
+        }
+        else if (ZOOM_200_PERCENT.equals(selection))
+        {
+            zoom200Item.setSelected(true);
+        }
+        else
+        {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    private void removeActionListeners(JMenuItem menuItem)
+    {
+        for (ActionListener listener: menuItem.getActionListeners())
+        {
+            menuItem.removeActionListener(listener);
+        }
+    }
+
+    private JMenu createZoomMenu()
+    {
+        menu = new JMenu();
+        menu.setText("Zoom");
+
+        zoom50Item = new JRadioButtonMenuItem();
+        zoom100Item = new JRadioButtonMenuItem();
+        zoom200Item = new JRadioButtonMenuItem();
+        zoom100Item.setSelected(true);
+
+        ButtonGroup bg = new ButtonGroup();
+        bg.add(zoom50Item);
+        bg.add(zoom100Item);
+        bg.add(zoom200Item);
+
+        zoom50Item.setText(ZOOM_50_PERCENT);
+        zoom100Item.setText(ZOOM_100_PERCENT);
+        zoom200Item.setText(ZOOM_200_PERCENT);
+
+        menu.add(zoom50Item);
+        menu.add(zoom100Item);
+        menu.add(zoom200Item);
+
+        return menu;
+    }
+}

Propchange: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/pdfdebugger/ui/ZoomMenu.java
------------------------------------------------------------------------------
    svn:eol-style = native