package org.jabref.gui.actions; import java.util.List; import java.util.stream.Collectors; import org.jabref.JabRefGUI; import org.jabref.gui.ClipBoardManager; import org.jabref.gui.maintable.MainTable; import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.OS; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.FieldName; /** * This class will copy each selected entry's BibTeX key as a hyperlink to its url to the clipboard. * In case an entry doesn't have a BibTeX key it will not be copied. * In case an entry doesn't have an url this will only copy the BibTeX key. */ public class CopyBibTeXKeyAndLinkAction implements BaseAction { private final MainTable mainTable; public CopyBibTeXKeyAndLinkAction(MainTable mainTable) { this.mainTable = mainTable; } @Override public void action() throws Exception { List<BibEntry> entries = mainTable.getSelectedEntries(); if (!entries.isEmpty()) { StringBuilder sb = new StringBuilder(); List<BibEntry> entriesWithKey = entries.stream().filter(BibEntry::hasCiteKey).collect(Collectors.toList()); if (entriesWithKey.isEmpty()) { JabRefGUI.getMainFrame().output(Localization.lang("None of the selected entries have BibTeX keys.")); return; } for (BibEntry entry : entriesWithKey) { String key = entry.getCiteKeyOptional().get(); String url = entry.getField(FieldName.URL).orElse(""); sb.append(url.isEmpty() ? key : String.format("<a href=\"%s\">%s</a>", url, key)); sb.append(OS.NEWLINE); } ClipBoardManager clipboard = new ClipBoardManager(); clipboard.setClipboardContents(sb.toString()); int copied = entriesWithKey.size(); int toCopy = entries.size(); if (copied == toCopy) { // All entries had keys. JabRefGUI.getMainFrame().output((entries.size() > 1 ? Localization.lang("Copied keys") : Localization.lang("Copied key")) + '.'); } else { JabRefGUI.getMainFrame().output(Localization.lang("Warning: %0 out of %1 entries have undefined BibTeX key.", Long.toString(toCopy - copied), Integer.toString(toCopy))); } } } }