/*
* $Id$
*
* Copyright 2007 Bruno Lowagie.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.lowagie.rups.view.itext;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import com.lowagie.rups.controller.PdfReaderController;
import com.lowagie.rups.model.ObjectLoader;
import com.lowagie.rups.model.TreeNodeFactory;
import com.lowagie.rups.view.PageSelectionListener;
import com.lowagie.rups.view.itext.treenodes.PdfObjectTreeNode;
import com.lowagie.rups.view.itext.treenodes.PdfPageTreeNode;
import com.lowagie.rups.view.itext.treenodes.PdfPagesTreeNode;
import com.lowagie.rups.view.itext.treenodes.PdfTrailerTreeNode;
import com.lowagie.rups.view.models.JTableAutoModel;
import com.lowagie.rups.view.models.JTableAutoModelInterface;
import com.lowagie.text.pdf.PdfName;
import com.lowagie.text.pdf.PdfPageLabels;
/**
* A JTable listing all the pages in a PDF file: the object number of each
* page dictionary and the page numbers (with label information if present).
*/
public class PagesTable extends JTable implements JTableAutoModelInterface, Observer {
/** A list with page nodes. */
protected ArrayList<PdfPageTreeNode> list = new ArrayList<PdfPageTreeNode>();
/** Nodes in the FormTree correspond with nodes in the main PdfTree. */
protected PdfReaderController controller;
/***/
protected PageSelectionListener listener;
/**
* Constructs a PagesTable.
* @param listener the page navigation listener.
*/
public PagesTable(PdfReaderController controller, PageSelectionListener listener) {
this.controller = controller;
this.listener = listener;
}
/**
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
public void update(Observable observable, Object obj) {
if (obj == null) {
list = new ArrayList<PdfPageTreeNode>();
repaint();
return;
}
if (obj instanceof ObjectLoader) {
ObjectLoader loader = (ObjectLoader)obj;
String[] pagelabels = PdfPageLabels.getPageLabels(loader.getReader());
int i = 0;
TreeNodeFactory factory = loader.getNodes();
PdfTrailerTreeNode trailer = controller.getPdfTree().getRoot();
PdfObjectTreeNode catalog = factory.getChildNode(trailer, PdfName.ROOT);
PdfPagesTreeNode pages = (PdfPagesTreeNode)factory.getChildNode(catalog, PdfName.PAGES);
if (pages == null) {
return;
}
Enumeration p = pages.depthFirstEnumeration();
PdfObjectTreeNode child;
StringBuffer buf;
while (p.hasMoreElements()) {
child = (PdfObjectTreeNode)p.nextElement();
if (child instanceof PdfPageTreeNode) {
buf = new StringBuffer("Page ");
buf.append(++i);
if (pagelabels != null) {
buf.append(" ( ");
buf.append(pagelabels[i - 1]);
buf.append(" )");
}
child.setUserObject(buf.toString());
list.add((PdfPageTreeNode)child);
}
}
}
setModel(new JTableAutoModel(this));
}
/**
* @see javax.swing.JTable#getColumnCount()
*/
public int getColumnCount() {
return 2;
}
/**
* @see javax.swing.JTable#getRowCount()
*/
public int getRowCount() {
return list.size();
}
/**
* @see javax.swing.JTable#getValueAt(int, int)
*/
public Object getValueAt(int rowIndex, int columnIndex) {
if (getRowCount() == 0) return null;
switch (columnIndex) {
case 0:
return "Object " + list.get(rowIndex).getNumber();
case 1:
return list.get(rowIndex);
}
return null;
}
/**
* @see javax.swing.JTable#getColumnName(int)
*/
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0:
return "Object";
case 1:
return "Page";
default:
return null;
}
}
/**
* @see javax.swing.JTable#valueChanged(javax.swing.event.ListSelectionEvent)
*/
@Override
public void valueChanged(ListSelectionEvent evt) {
if (evt != null)
super.valueChanged(evt);
if (controller == null)
return;
if (getRowCount() > 0) {
controller.selectNode(list.get(getSelectedRow()));
if (listener != null)
listener.gotoPage(getSelectedRow() + 1);
}
}
/** A serial version UID. */
private static final long serialVersionUID = -6523261089453886508L;
}