package org.jabref.pdfimport; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; 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.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.WindowConstants; import org.jabref.Globals; import org.jabref.gui.JabRefDialog; import org.jabref.logic.l10n.Localization; import org.jabref.logic.xmp.XMPUtil; import org.jabref.model.entry.BibEntry; import org.jabref.model.strings.StringUtil; import org.jabref.preferences.JabRefPreferences; import com.jgoodies.forms.builder.ButtonBarBuilder; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.FormLayout; public class ImportDialog extends JabRefDialog { public static final int NOMETA = 0; public static final int XMP = 1; public static final int CONTENT = 2; public static final int ONLYATTACH = 4; private final JCheckBox checkBoxDoNotShowAgain; private final JCheckBox useDefaultPDFImportStyle; private final JRadioButton radioButtonXmp; private final JRadioButton radioButtonPDFcontent; private final JRadioButton radioButtonNoMeta; private final JRadioButton radioButtononlyAttachPDF; private int result; public ImportDialog(boolean targetIsARow, String fileName) { super(ImportDialog.class); Boolean targetIsARow1 = targetIsARow; JPanel contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); setContentPane(contentPane); JPanel panel3 = new JPanel(); panel3.setBackground(new Color(-1643275)); JLabel labelHeadline = new JLabel(Localization.lang("Import metadata from:")); labelHeadline.setFont(new Font(labelHeadline.getFont().getName(), Font.BOLD, 14)); JLabel labelSubHeadline = new JLabel(Localization.lang("Choose the source for the metadata import")); labelSubHeadline.setFont(new Font(labelSubHeadline.getFont().getName(), labelSubHeadline.getFont().getStyle(), 13)); JLabel labelFileName = new JLabel(); labelFileName.setFont(new Font(labelHeadline.getFont().getName(), Font.BOLD, 14)); JPanel headLinePanel = new JPanel(); headLinePanel.add(labelHeadline); headLinePanel.add(labelFileName); headLinePanel.setBackground(new Color(-1643275)); GridLayout gl = new GridLayout(2, 1); gl.setVgap(10); gl.setHgap(10); panel3.setLayout(gl); panel3.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); panel3.add(headLinePanel); panel3.add(labelSubHeadline); radioButtonNoMeta = new JRadioButton(Localization.lang("Create blank entry linking the PDF")); radioButtonXmp = new JRadioButton(Localization.lang("Create entry based on XMP-metadata")); radioButtonPDFcontent = new JRadioButton(Localization.lang("Create entry based on content")); radioButtononlyAttachPDF = new JRadioButton(Localization.lang("Only attach PDF")); JButton buttonOK = new JButton(Localization.lang("OK")); JButton buttonCancel = new JButton(Localization.lang("Cancel")); checkBoxDoNotShowAgain = new JCheckBox(Localization.lang("Do not show this box again for this import")); useDefaultPDFImportStyle = new JCheckBox(Localization.lang("Always use this PDF import style (and do not ask for each import)")); DefaultFormBuilder b = new DefaultFormBuilder(new FormLayout("left:pref, 5dlu, left:pref:grow", "")); List<BibEntry> foundEntries = getEntriesFromXMP(fileName); JPanel entriesPanel = new JPanel(); entriesPanel.setLayout(new BoxLayout(entriesPanel, BoxLayout.Y_AXIS)); foundEntries.forEach(entry -> { JTextArea entryArea = new JTextArea(entry.toString()); entryArea.setEditable(false); entriesPanel.add(entryArea); }); b.appendSeparator(Localization.lang("Create new entry")); b.append(radioButtonNoMeta, 3); b.append(radioButtonXmp, 3); b.append(radioButtonPDFcontent, 3); b.appendSeparator(Localization.lang("Update existing entry")); b.append(radioButtononlyAttachPDF, 3); b.nextLine(); b.append(checkBoxDoNotShowAgain); b.append(useDefaultPDFImportStyle); if (!foundEntries.isEmpty()) { b.appendSeparator(Localization.lang("XMP-metadata")); b.append(entriesPanel, 3); } b.getPanel().setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); ButtonBarBuilder bb = new ButtonBarBuilder(); bb.addGlue(); bb.addButton(buttonOK); bb.addButton(buttonCancel); bb.addGlue(); bb.getPanel().setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); contentPane.add(panel3, BorderLayout.NORTH); contentPane.add(b.getPanel(), BorderLayout.CENTER); contentPane.add(bb.getPanel(), BorderLayout.SOUTH); if (!targetIsARow1) { this.radioButtononlyAttachPDF.setEnabled(false); } String name = new File(fileName).getName(); labelFileName.setText(StringUtil.limitStringLength(name, 34)); this.setTitle(Localization.lang("Import metadata from PDF")); setModal(true); getRootPane().setDefaultButton(buttonOK); // only one of the radio buttons may be selected. ButtonGroup bg = new ButtonGroup(); bg.add(radioButtonNoMeta); bg.add(radioButtonXmp); bg.add(radioButtonPDFcontent); bg.add(radioButtononlyAttachPDF); buttonOK.addActionListener(e -> onOK()); buttonCancel.addActionListener(e -> onCancel()); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onCancel(); } }); contentPane.registerKeyboardAction(e -> onCancel(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); switch (Globals.prefs.getInt(JabRefPreferences.IMPORT_DEFAULT_PDF_IMPORT_STYLE)) { case NOMETA: radioButtonNoMeta.setSelected(true); break; case XMP: radioButtonXmp.setSelected(true); break; case CONTENT: radioButtonPDFcontent.setSelected(true); break; case ONLYATTACH: radioButtononlyAttachPDF.setSelected(true); break; default: // fallback radioButtonPDFcontent.setSelected(true); break; } this.setSize(555, 371); } private List<BibEntry> getEntriesFromXMP(String fileName) { List<BibEntry> foundEntries = new ArrayList<>(); try { foundEntries = XMPUtil.readXMP(fileName, Globals.prefs.getXMPPreferences()); } catch (IOException e) { e.printStackTrace(); } return foundEntries; } private void onOK() { this.result = JOptionPane.OK_OPTION; Globals.prefs.putInt(JabRefPreferences.IMPORT_DEFAULT_PDF_IMPORT_STYLE, this.getChoice()); if (useDefaultPDFImportStyle.isSelected()) { Globals.prefs.putBoolean(JabRefPreferences.IMPORT_ALWAYSUSE, true); } // checkBoxDoNotShowAgain handled by local variable dispose(); } private void onCancel() { this.result = JOptionPane.CANCEL_OPTION; dispose(); } public void showDialog() { this.pack(); this.setVisible(true); } public int getChoice() { if (radioButtonXmp.isSelected()) { return ImportDialog.XMP; } else if (radioButtonPDFcontent.isSelected()) { return ImportDialog.CONTENT; } else if (radioButtonNoMeta.isSelected()) { return ImportDialog.NOMETA; } else if (radioButtononlyAttachPDF.isSelected()) { return ImportDialog.ONLYATTACH; } else { throw new IllegalStateException(); } } public boolean isDoNotShowAgain() { return this.checkBoxDoNotShowAgain.isSelected(); } public int getResult() { return result; } public void disableXMPChoice() { this.radioButtonXmp.setEnabled(false); } }