org.apache.pdfbox.pdfviewer.PDFTreeModel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of pdfbox Show documentation
Show all versions of pdfbox Show documentation
The Apache PDFBox library is an open source Java tool for working with PDF documents.
/* * 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.pdfviewer; /** * A tree model that uses a cos document. * * * @author wurtz * @author Ben Litchfield * @version $Revision: 1.9 $ */ import javax.swing.tree.TreePath; import javax.swing.tree.TreeModel; //import java.awt.event.*; import javax.swing.event.TreeModelListener; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSBase; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSDocument; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.cos.COSObject; import org.apache.pdfbox.pdmodel.PDDocument; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * A class to model a PDF document as a tree structure. * * @author Ben Litchfield * @version $Revision: 1.9 $ */ public class PDFTreeModel implements TreeModel { private PDDocument document; /** * constructor. */ public PDFTreeModel() { //default constructor } /** * Constructor to take a document. * * @param doc The document to display in the tree. */ public PDFTreeModel(PDDocument doc) { setDocument(doc); } /** * Set the document to display in the tree. * * @param doc The document to display in the tree. */ public void setDocument(PDDocument doc) { document = doc; } /** * Adds a listener for the
* only if the tree has no nodes. * * @return the root of the tree * */ public Object getRoot() { return document.getDocument().getTrailer(); } /** ReturnsTreeModelEvent
* posted after the tree changes. * * @param l the listener to add * @see #removeTreeModelListener * */ public void addTreeModelListener(TreeModelListener l) { //required for interface } /** * Returns the child ofparent
at indexindex
* in the parent's * child array.parent
must be a node previously obtained * from this data source. This should not returnnull
* ifindex
* is a valid index forparent
(that isindex >= 0 && * index < getChildCount(parent
)). * * @param parent a node in the tree, obtained from this data source * @param index The index into the parent object to location the child object. * @return the child ofparent
at indexindex
* */ public Object getChild(Object parent, int index) { Object retval = null; if( parent instanceof COSArray ) { ArrayEntry entry = new ArrayEntry(); entry.setIndex( index ); entry.setValue( ((COSArray)parent).getObject( index ) ); retval = entry; } else if( parent instanceof COSDictionary ) { COSDictionary dict = ((COSDictionary)parent); Listkeys = new ArrayList (dict.keySet()); Collections.sort( keys ); Object key = keys.get( index ); Object value = dict.getDictionaryObject( (COSName)key ); MapEntry entry = new MapEntry(); entry.setKey( key ); entry.setValue( value ); retval = entry; } else if( parent instanceof MapEntry ) { retval = getChild( ((MapEntry)parent).getValue(), index ); } else if( parent instanceof ArrayEntry ) { retval = getChild( ((ArrayEntry)parent).getValue(), index ); } else if( parent instanceof COSDocument ) { retval = ((COSDocument)parent).getObjects().get( index ); } else if( parent instanceof COSObject ) { retval = ((COSObject)parent).getObject(); } else { throw new RuntimeException( "Unknown COS type " + parent.getClass().getName() ); } return retval; } /** Returns the number of children of parent
. * Returns 0 if the node * is a leaf or if it has no children.parent
must be a node * previously obtained from this data source. * * @param parent a node in the tree, obtained from this data source * @return the number of children of the nodeparent
* */ public int getChildCount(Object parent) { int retval = 0; if( parent instanceof COSArray ) { retval = ((COSArray)parent).size(); } else if( parent instanceof COSDictionary ) { retval = ((COSDictionary)parent).size(); } else if( parent instanceof MapEntry ) { retval = getChildCount( ((MapEntry)parent).getValue() ); } else if( parent instanceof ArrayEntry ) { retval = getChildCount( ((ArrayEntry)parent).getValue() ); } else if( parent instanceof COSDocument ) { retval = ((COSDocument)parent).getObjects().size(); } else if( parent instanceof COSObject ) { retval = 1; } return retval; } /** Returns the index of child in parent. Ifparent
* isnull
orchild
isnull
, * returns -1. * * @param parent a note in the tree, obtained from this data source * @param child the node we are interested in * @return the index of the child in the parent, or -1 if either *child
orparent
arenull
* */ public int getIndexOfChild(Object parent, Object child) { int retval = -1; if( parent != null && child != null ) { if( parent instanceof COSArray ) { COSArray array = (COSArray)parent; if( child instanceof ArrayEntry ) { ArrayEntry arrayEntry = (ArrayEntry)child; retval = arrayEntry.getIndex(); } else { retval = array.indexOf( (COSBase)child ); } } else if( parent instanceof COSDictionary ) { MapEntry entry = (MapEntry)child; COSDictionary dict = (COSDictionary)parent; Listkeys = new ArrayList (dict.keySet()); Collections.sort( keys ); for( int i=0; retval == -1 && i null true
ifnode
is a leaf. * It is possible for this method to returnfalse
* even ifnode
has no children. * A directory in a filesystem, for example, * may contain no files; the node representing * the directory is not a leaf, but it also has no children. * * @param node a node in the tree, obtained from this data source * @return true ifnode
is a leaf * */ public boolean isLeaf(Object node) { boolean isLeaf = !(node instanceof COSDictionary || node instanceof COSArray || node instanceof COSDocument || node instanceof COSObject || (node instanceof MapEntry && !isLeaf(((MapEntry)node).getValue()) ) || (node instanceof ArrayEntry && !isLeaf(((ArrayEntry)node).getValue()) )); return isLeaf; } /** Removes a listener previously added with *addTreeModelListener
. * * @see #addTreeModelListener * @param l the listener to remove * */ public void removeTreeModelListener(TreeModelListener l) { //required for interface } /** Messaged when the user has altered the value for the item identified * bypath
tonewValue
. * IfnewValue
signifies a truly new value * the model should post atreeNodesChanged
event. * * @param path path to the node that the user has altered * @param newValue the new value from the TreeCellEditor * */ public void valueForPathChanged(TreePath path, Object newValue) { //required for interface } }