package org.jabref.gui.push; import java.awt.event.ActionEvent; import java.util.List; import java.util.Optional; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import org.jabref.JabRefExecutorService; import org.jabref.gui.BasePanel; import org.jabref.gui.JabRefFrame; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; /** * An Action class representing the process of invoking a PushToApplication operation. */ class PushToApplicationAction extends AbstractAction implements Runnable { private final PushToApplication operation; private final JabRefFrame frame; private BasePanel panel; private List<BibEntry> entries; public PushToApplicationAction(JabRefFrame frame, PushToApplication operation) { this.frame = frame; putValue(Action.SMALL_ICON, operation.getIcon()); putValue(Action.NAME, operation.getName()); putValue(Action.SHORT_DESCRIPTION, operation.getTooltip()); this.operation = operation; } @Override public void actionPerformed(ActionEvent e) { panel = frame.getCurrentBasePanel(); // Check if a BasePanel exists: if (panel == null) { return; } // Check if any entries are selected: entries = panel.getSelectedEntries(); if (entries.isEmpty()) { JOptionPane.showMessageDialog(frame, Localization.lang("This operation requires one or more entries to be selected."), (String) getValue(Action.NAME), JOptionPane.ERROR_MESSAGE); return; } // If required, check that all entries have BibTeX keys defined: if (operation.requiresBibtexKeys()) { for (BibEntry entry : entries) { if (!(entry.getCiteKeyOptional().isPresent()) || entry.getCiteKeyOptional().get().trim().isEmpty()) { JOptionPane.showMessageDialog(frame, Localization .lang("This operation requires all selected entries to have BibTeX keys defined."), (String) getValue(Action.NAME), JOptionPane.ERROR_MESSAGE); return; } } } // All set, call the operation in a new thread: JabRefExecutorService.INSTANCE.execute(this); } @Override public void run() { // Do the operation: operation.pushEntries(panel.getDatabase(), entries, getKeyString(entries), panel.getBibDatabaseContext().getMetaData()); // Call the operationCompleted() method on the event dispatch thread: SwingUtilities.invokeLater(() -> operation.operationCompleted(panel)); } private static String getKeyString(List<BibEntry> bibentries) { StringBuilder result = new StringBuilder(); Optional<String> citeKey; boolean first = true; for (BibEntry bes : bibentries) { citeKey = bes.getCiteKeyOptional(); // if the key is empty we give a warning and ignore this entry // TODO: Give warning if (!(citeKey.isPresent()) || citeKey.get().isEmpty()) { continue; } if (first) { result.append(citeKey.get()); first = false; } else { result.append(',').append(citeKey.get()); } } return result.toString(); } }