package org.docear.plugin.bibtex.dialogs;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.nio.CharBuffer;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.Globals;
import net.sf.jabref.export.ExportFormats;
import net.sf.jabref.export.layout.LayoutHelper;
import org.docear.plugin.bibtex.ReferencesController;
import org.docear.plugin.bibtex.jabref.JabrefWrapper;
import org.freeplane.core.util.TextUtils;
import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
public class PdfMetadataTableDialog extends JPanel {
private static final long serialVersionUID = -627410651667772600L;
private JTable table;
private final BibtexEntryTableModel tableModel;
private final Collection<BibtexEntry> entries;
public PdfMetadataTableDialog(Collection<BibtexEntry> entries) {
this.entries = entries;
setPreferredSize(new Dimension(640, 200));
setLayout(new FormLayout(new ColumnSpec[] {
ColumnSpec.decode("434px:grow"),},
new RowSpec[] {
RowSpec.decode("max(48dlu;default)"),
RowSpec.decode("185px:grow"),}));
JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
add(panel, "1, 1, fill, fill");
panel.setLayout(new FormLayout(new ColumnSpec[] {
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("default:grow"),
FormFactory.RELATED_GAP_COLSPEC,},
new RowSpec[] {
RowSpec.decode("max(20dlu;default)"),}));
JLabel lblNewLabel = new JLabel(TextUtils.getText("docear.metadata.import.help"));
panel.add(lblNewLabel, "2, 1");
JScrollPane scrollPane = new JScrollPane();
add(scrollPane, "1, 2, fill, fill");
tableModel = new BibtexEntryTableModel();
table = new JTable(tableModel);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setShowGrid(false);
scrollPane.setViewportView(table);
table.getColumnModel().getColumn(0).setMinWidth(60);
table.getColumnModel().getColumn(0).setPreferredWidth(60);
table.getColumnModel().getColumn(0).setMaxWidth(60);
table.getColumnModel().getColumn(1).setMinWidth(40);
table.getColumnModel().getColumn(1).setPreferredWidth(40);
table.getColumnModel().getColumn(1).setMaxWidth(40);
table.getColumnModel().getColumn(2).setMinWidth(100);
table.getColumnModel().getColumn(2).setPreferredWidth(300);
table.getColumnModel().getColumn(3).setMinWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(100);
int cols = tableModel.getColumnCount();
for (int i = 4; i < cols; i++) {
int width = SwingUtilities.computeStringWidth(table.getFontMetrics(table.getTableHeader().getFont()), tableModel.getColumnName(i));
table.getColumnModel().getColumn(i).setMinWidth(width);
table.getColumnModel().getColumn(i).setPreferredWidth(width);
}
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
private static final long serialVersionUID = 4805846114365117400L;
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
label.setToolTipText(String.valueOf(value));
return label;
}
});
table.addMouseMotionListener(new MouseAdapter() {
public void mouseMoved(MouseEvent e) {
// Point p = table.getMousePosition();
// if(p == null) {
// return;
// }
// int row = p.y/table.getRowHeight();
// if(table.getRowCount() > row) {
// BibtexEntry entry = tableModel.getEntry(row);
// //DOCEAR - maybe show better tooltip
// }
}
});
tableModel.fireTableDataChanged();
table.setRowSelectionInterval(0,0);
}
public BibtexEntry getSelectedEntry() {
if(table.getSelectedRowCount() > 0) {
return tableModel.getEntry(table.getSelectedRow());
}
return null;
}
class BibtexEntryTableModel extends DefaultTableModel {
private static final long serialVersionUID = 2610007578887026651L;
public BibtexEntryTableModel() {
addColumn("Type");
addColumn("Year");
addColumn("Title");
addColumn("Author");
for (Iterator<BibtexEntry> iterator = entries.iterator(); iterator.hasNext();) {
BibtexEntry entry = iterator.next();
Set<String> fields = entry.getAllFields();
for (String field : fields) {
field = capitilize(field.toLowerCase());
if(this.findColumn(field) == -1) {
addColumn(field);
}
}
}
}
private String capitilize(String text) {
CharBuffer buffer = CharBuffer.allocate(text.length());
buffer.append(text);
buffer.rewind();
buffer.mark();
String c = String.valueOf(buffer.get());
buffer.reset();
buffer.put(c.toUpperCase().charAt(0));
return buffer.rewind().toString();
}
public BibtexEntry getEntry(int rowIndex) {
if(rowIndex < 0 || rowIndex >= entries.size()) {
throw new IndexOutOfBoundsException();
}
int i=0;
for (Iterator<BibtexEntry> iterator = entries.iterator(); iterator.hasNext(); i++) {
if(i==rowIndex) {
return iterator.next();
}
iterator.next();
}
return null;
}
public boolean isCellEditable(int row, int column) {
return false;
}
public int getRowCount() {
if(entries == null) {
return 0;
}
return entries.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
BibtexEntry entry = getEntry(rowIndex);
if(entry == null) {
return null;
}
if(columnIndex == 0) {
return entry.getType().getName();
}
StringBuffer sb = new StringBuffer();
StringReader sr = new StringReader(Globals.prefs.get("preview0").replaceAll("__NEWLINE__", "\n"));
ExportFormats.entryNumber = 1; // Set entry number in case that is included in the preview layout.
try {
sb.append(new LayoutHelper(sr).getLayoutFromText(Globals.FORMATTER_PACKAGE).doLayout(entry,ReferencesController.getController().getJabrefWrapper().getDatabase()));
}
catch (Exception e) {
}
return entry.getField(getColumnName(columnIndex).toLowerCase());
}
}
}