package spl.gui;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import net.sf.jabref.Globals;
import net.sf.jabref.MetaData;
import net.sf.jabref.Util;
import org.sciplore.beans.Document;
import spl.DocumentsWrapper;
import spl.SplWebClient;
import spl.listener.LabelLinkListener;
import spl.localization.LocalizationSupport;
import com.jgoodies.forms.builder.ButtonBarBuilder;
public class MetaDataListDialog extends JDialog {
private JPanel contentPane;
private JTable tableMetadata;
private JButton buttonOK;
private JButton buttonCancel;
private JScrollPane scrollPane;
private JPanel panelWait;
private JLabel labelFetch;
private JLabel iconLabel;
private JButton blankButton;
private JLabel labelLogo;
private JButton moreInformationButton;
private JPanel panelMetadata;
private DefaultTableModel tableModel;
private int result;
private Document xmlDocuments;
private String fileName;
private SplWebClient.WebServiceStatus webserviceStatus;
private Component thisDialog;
private boolean showBlankButton;
private CardLayout cardLayou = new CardLayout();
public MetaDataListDialog(String fileName, boolean showBlankButton) {
$$$setupUI$$$();
this.showBlankButton = showBlankButton;
this.thisDialog = this;
this.fileName = fileName;
this.labelLogo.addMouseListener(new LabelLinkListener(this.labelLogo, "www.mr-dlib.org"));
this.setTitle(LocalizationSupport.message("Mr._dLib_Metadata_Entries_Associated_With_PDF_File"));
this.tableMetadata.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setContentPane(contentPane);
pack();
setModal(true);
getRootPane().setDefaultButton(buttonOK);
buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onOK();
}
});
buttonCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onCancel();
}
});
blankButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onBlank();
}
});
moreInformationButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onInfo();
}
});
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
onCancel();
}
});
contentPane.registerKeyboardAction(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onCancel();
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
cardLayou.show(panelMetadata, "panelWait");
//this.scrollPane.setVisible(false);
//this.blankButton.setVisible(false);
this.moreInformationButton.setVisible(true);
this.setSize(616, 366);
}
private void onInfo() {
try {
Util.openExternalViewer(new MetaData(), "http://www.mr-dlib.org/docs/jabref_metadata_extraction_alpha.php", "url");
} catch (IOException exc) {
exc.printStackTrace();
}
}
private void onBlank() {
this.result = JOptionPane.NO_OPTION;
dispose();
}
private void onOK() {
this.result = JOptionPane.OK_OPTION;
dispose();
}
private void onCancel() {
this.result = JOptionPane.CANCEL_OPTION;
dispose();
}
public void showDialog() {
SwingWorker worker = new SwingWorker<Void, Void>() {
@Override
public Void doInBackground() {
System.out.println("Starting Webclient...");
//FIXME: DOCEAR: use other classloader
final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
webserviceStatus = SplWebClient.getMetaData(new File(fileName));
//FIXME: DOCEAR: reset classloader
Thread.currentThread().setContextClassLoader(contextClassLoader);
return null;
}
@Override
public void done() {
if (webserviceStatus == SplWebClient.WebServiceStatus.OK) {
xmlDocuments = SplWebClient.metadata;
if (xmlDocuments != null /*&& xmlDocuments.getDocuments() != null && xmlDocuments.getDocuments().size() > 0*/) {
DocumentsWrapper documents = new DocumentsWrapper(xmlDocuments);
List<Vector> vectorList = documents.getDocuments();
for (Vector vector : vectorList) {
tableModel.addRow(vector);
}
tableMetadata.getSelectionModel().setSelectionInterval(0, 0);
cardLayou.show(panelMetadata, "scrollPane");
//panelWait.setVisible(false);
//scrollPane.setVisible(true);
moreInformationButton.setVisible(true);
} else {
iconLabel.setVisible(false);
labelFetch.setText(LocalizationSupport.message("No_metadata_found."));
blankButton.setVisible(showBlankButton);
}
}
if (webserviceStatus == SplWebClient.WebServiceStatus.NO_METADATA) {
iconLabel.setVisible(false);
labelFetch.setText(LocalizationSupport.message("No_metadata_found."));
blankButton.setVisible(showBlankButton);
}
if (webserviceStatus == SplWebClient.WebServiceStatus.UNAVAILABLE) {
iconLabel.setVisible(false);
labelFetch.setText(LocalizationSupport.message("Mr._dLib_web_service_is_temporarily_unavailable."));
blankButton.setVisible(showBlankButton);
}
if (webserviceStatus == SplWebClient.WebServiceStatus.OUTDATED) {
iconLabel.setVisible(false);
labelFetch.setText(LocalizationSupport.message("The_Mr._dLib_web_service_version_you_trying_to_access_is_outdated."));
blankButton.setVisible(showBlankButton);
JOptionPane.showMessageDialog(thisDialog, LocalizationSupport.message("This_JabRef_version_is_trying_to_access_an_old_version_of_Mr._dLib's_webservice_that_is_not_working_any_more.\\nPlease_visit_http://jabref.sourceforge.net_or_http://www.mr-dlib.org_for_more_information_and_updates.\\n\\n\\n"), LocalizationSupport.message("Web_Service_Version_Outdated"), JOptionPane.INFORMATION_MESSAGE);
}
if (webserviceStatus == SplWebClient.WebServiceStatus.WEBSERVICE_DOWN) {
iconLabel.setVisible(false);
labelFetch.setText(LocalizationSupport.message("Mr._dLib_web_service_is_temporarily_down._Please_try_again_later."));
blankButton.setVisible(showBlankButton);
}
if (webserviceStatus == SplWebClient.WebServiceStatus.NO_INTERNET) {
iconLabel.setVisible(false);
labelFetch.setText(LocalizationSupport.message("No_Internet_Connection."));
blankButton.setVisible(showBlankButton);
JOptionPane.showMessageDialog(thisDialog, LocalizationSupport.message("You_are_not_connected_to_the_Internet._To_access_Mr._dLib_web_service_an_internet_connection_is_needed."), LocalizationSupport.message("No_Internet_Connection."), JOptionPane.INFORMATION_MESSAGE);
}
}
};
worker.execute();
this.pack();
this.setVisible(true);
}
public Document getXmlDocuments() {
return xmlDocuments;
}
private void createUIComponents() {
this.tableModel = new MyTableModel();
this.tableModel.addColumn(LocalizationSupport.message("Title"));
this.tableModel.addColumn(LocalizationSupport.message("Author(s)"));
this.tableModel.addColumn(LocalizationSupport.message("Published_Year"));
this.tableMetadata = new JTable(this.tableModel);
}
public JTable getTableMetadata() {
return tableMetadata;
}
public int getResult() {
return result;
}
public JButton getBlankButton() {
return blankButton;
}
private void $$$setupUI$$$() {
createUIComponents();
contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
labelLogo = new JLabel();
labelLogo.setIcon(new ImageIcon(getClass().getResource("/spl/gui/mrdlib header.png")));
labelLogo.setText("");
contentPane.add(labelLogo, BorderLayout.NORTH);
panelMetadata = new JPanel();
panelMetadata.setLayout(cardLayou);
panelMetadata.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), null));
scrollPane = new JScrollPane();
scrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLoweredBevelBorder(), null));
tableMetadata.setAutoCreateRowSorter(false);
tableMetadata.setEnabled(true);
tableMetadata.setFillsViewportHeight(true);
tableMetadata.setShowVerticalLines(true);
scrollPane.setViewportView(tableMetadata);
panelMetadata.add(scrollPane, "scrollPane");
panelWait = new JPanel();
panelWait.setLayout(new BorderLayout());
panelWait.setBackground(new Color(-1));
panelMetadata.add(panelWait, "panelWait");
panelWait.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLoweredBevelBorder(), null));
iconLabel = new JLabel();
iconLabel.setBackground(new Color(-1));
iconLabel.setHorizontalAlignment(0);
iconLabel.setHorizontalTextPosition(11);
iconLabel.setIcon(new ImageIcon(getClass().getResource("/spl/gui/ajax-loader.gif")));
iconLabel.setText("");
panelWait.add(iconLabel, BorderLayout.CENTER);
labelFetch = new JLabel();
labelFetch.setHorizontalAlignment(JLabel.CENTER);
labelFetch.setFont(new Font(labelFetch.getFont().getName(), labelFetch.getFont().getStyle(), 13));
labelFetch.setText(Globals.lang("Fetching Metadata..."));
panelWait.add(labelFetch, BorderLayout.SOUTH);
cardLayou.show(panelMetadata, "panelWait");
panelMetadata.setPreferredSize(new Dimension(400, 200));
contentPane.add(panelMetadata, BorderLayout.CENTER);
buttonOK = new JButton(Globals.lang("Ok"));
buttonCancel = new JButton(Globals.lang("Cancel"));
moreInformationButton = new JButton(Globals.lang("More information"));
ButtonBarBuilder bb = new ButtonBarBuilder();
bb.addGlue();
bb.addGridded(moreInformationButton);
bb.addGridded(buttonOK);
bb.addGridded(buttonCancel);
bb.addGlue();
blankButton = new JButton();
blankButton.setText("");
contentPane.add(bb.getPanel(), BorderLayout.SOUTH);
iconLabel.setLabelFor(scrollPane);
}
/**
* @noinspection ALL
*/
public JComponent $$$getRootComponent$$$() {
return contentPane;
}
public class MyTableModel extends DefaultTableModel {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
}
}