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