package org.docear.plugin.bibtex.dialogs; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Iterator; import java.util.List; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.AbstractTableModel; import net.sf.jabref.BibtexEntry; import net.sf.jabref.GUIGlobals; import org.apache.commons.io.IOUtils; import org.docear.plugin.bibtex.ReferencesController; import org.docear.plugin.bibtex.jabref.JabrefWrapper; import org.docear.plugin.core.ui.MultiLineActionLabel; import org.docear.plugin.pdfutilities.PdfUtilitiesController; import org.freeplane.core.ui.components.UITools; import org.freeplane.core.util.LogUtils; import org.freeplane.core.util.TextUtils; import org.freeplane.features.mode.Controller; public class DuplicateLinkDialogPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; final private List<BibtexEntry> entries; private JTable table; private URI uri; private File file; private URL url; public DuplicateLinkDialogPanel(final List<BibtexEntry> entries, URL url) { this.entries = entries; try { this.uri = url.toURI(); } catch (URISyntaxException e) { LogUtils.warn(e); } this.url = url; init(); } public DuplicateLinkDialogPanel(final List<BibtexEntry> entries, File file) { this.entries = entries; this.uri = file.toURI(); this.file = file; init(); } /** * Create the panel. */ private void init() { table = new JTable(getTableModel()); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setFont(GUIGlobals.CURRENTFONT); table.setRowHeight(GUIGlobals.TABLE_ROW_PADDING + GUIGlobals.CURRENTFONT.getSize()); table.getColumnModel().getColumn(0).setPreferredWidth(75); table.getColumnModel().getColumn(1).setPreferredWidth(200); table.getColumnModel().getColumn(2).setPreferredWidth(350); table.getColumnModel().getColumn(3).setPreferredWidth(75); table.getColumnModel().getColumn(4).setPreferredWidth(100); table.getSelectionModel().setSelectionInterval(0, 0); JScrollPane scrollPane = new JScrollPane(); scrollPane.setPreferredSize(new Dimension(800, 300)); setLayout(new BorderLayout()); Component message = null; if (this.file != null) { message = new MultiLineActionLabel(TextUtils.format("docear.reference.duplicate_file.message", file.getName())); } else { message = new MultiLineActionLabel(TextUtils.format("docear.reference.duplicate_url.message", url.toExternalForm())); } ((MultiLineActionLabel) message).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if("open_uri".equals(e.getActionCommand())) { try { if ("file".equals(uri.getScheme())) { PdfUtilitiesController.getController().openPdfOnPage(uri, 0); } else { Controller.getCurrentController().getViewController().openDocument(uri); } } catch (IOException ex) { LogUtils.warn(ex.getMessage()); } } } }); Component mail = new MultiLineActionLabel(TextUtils.getText("docear.reference.duplicate_file.mail")); ((MultiLineActionLabel) mail).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if("open_url".equals(e.getActionCommand())) { try { Controller.getCurrentController().getViewController().openDocument(URI.create("http://www.docear.org/support/user-manual/#bibtex_duplicates_mendeley")); int choice = JOptionPane.showConfirmDialog(UITools.getFrame(), TextUtils.getText("duplicates_quit_docear"), TextUtils.getText("duplicates_quit_docear_title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (choice == JOptionPane.OK_OPTION) { System.exit(0); } } catch (Exception ex) { LogUtils.warn(ex.getMessage()); } } } }); JPanel p = new JPanel(); p.setLayout(new BorderLayout()); // p.add(new JLabel(TextUtils.format("docear.reference.duplicate_file.message", this.fileName)), BorderLayout.NORTH); p.add(message, BorderLayout.NORTH); p.add(mail, BorderLayout.SOUTH); add(p, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); scrollPane.setViewportView(table); } private AbstractTableModel getTableModel() { final JabrefWrapper wrapper = ReferencesController.getController().getJabrefWrapper(); AbstractTableModel model = new AbstractTableModel() { /** * */ private static final long serialVersionUID = 1L; final static int columns = 5; final String[] columnNames = { wrapper.getLocalizedColumnName("key"), wrapper.getLocalizedColumnName("author"), wrapper.getLocalizedColumnName("title"), wrapper.getLocalizedColumnName("year"), wrapper.getLocalizedColumnName("journal") }; Object[][] rowData = new Object[entries.size()][columns]; public String getColumnName(int col) { return columnNames[col]; } public boolean isCellEditable(int row, int col) { return false; } public void setValueAt(Object value, int row, int col) { rowData[row][col] = value; fireTableCellUpdated(row, col); } public Object getValueAt(int row, int col) { return rowData[row][col]; } public int getRowCount() { return this.rowData.length; } public int getColumnCount() { return columns; } }; Iterator<BibtexEntry> iter = entries.iterator(); for (int i = 0; iter.hasNext(); i++) { BibtexEntry entry = iter.next(); model.setValueAt(entry.getCiteKey(), i, 0); model.setValueAt(entry.getField("author"), i, 1); model.setValueAt(entry.getField("title"), i, 2); model.setValueAt(entry.getField("year"), i, 3); model.setValueAt(entry.getField("journal"), i, 4); } return model; } public BibtexEntry getSelectedEntry() { int index = table.getSelectedRow(); return entries.get(index); } }