package net.sf.jabref.export; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.Transferable; import java.io.*; import java.util.HashSet; import java.util.Map; import javax.swing.BorderFactory; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.ListSelectionModel; import net.sf.jabref.*; /** * Created by IntelliJ IDEA. * User: alver * Date: Dec 12, 2006 * Time: 6:22:25 PM * To change this template use File | Settings | File Templates. */ public class ExportToClipboardAction extends AbstractWorker { String message = null; private JabRefFrame frame; private BibtexDatabase database; public ExportToClipboardAction(JabRefFrame frame, BibtexDatabase database) { this.frame = frame; this.database = database; } public void run() { BasePanel panel = frame.basePanel(); if (panel == null) return; if (panel.getSelectedEntries().length == 0) { message = Globals.lang("No entries selected") + "."; getCallBack().update(); return; } Map<String, IExportFormat> m = ExportFormats.getExportFormats(); IExportFormat[] formats = new ExportFormat[m.size()]; String[] array = new String[formats.length]; int piv = 0; for (IExportFormat format : m.values()) { formats[piv] = format; array[piv] = format.getDisplayName(); piv++; } JList list = new JList(array); list.setBorder(BorderFactory.createEtchedBorder()); list.setSelectionInterval(0, 0); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); int answer = JOptionPane.showOptionDialog(frame, list, Globals.lang("Select format"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[]{Globals.lang("Ok"), Globals.lang("Cancel")}, Globals.lang("Ok")); if (answer == JOptionPane.NO_OPTION) return; IExportFormat format = formats[list.getSelectedIndex()]; // Set the global variable for this database's file directory before exporting, // so formatters can resolve linked files correctly. // (This is an ugly hack!) Globals.prefs.fileDirForDatabase = frame.basePanel().metaData() .getFileDirectory(GUIGlobals.FILE_FIELD); /*final boolean custom = (list.getSelectedIndex() >= Globals.STANDARD_EXPORT_COUNT); String dir = null; if (custom) { int index = list.getSelectedIndex() - Globals.STANDARD_EXPORT_COUNT; dir = (String) (Globals.prefs.customExports.getElementAt(index)[1]); File f = new File(dir); lfName = f.getName(); lfName = lfName.substring(0, lfName.indexOf(".")); // Remove file name - we want the directory only. dir = f.getParent() + System.getProperty("file.separator"); } final String format = lfName, directory = dir; */ File tmp = null; Reader reader = null; try { // To simplify the exporter API we simply do a normal export to a temporary // file, and read the contents afterwards: tmp = File.createTempFile("jabrefCb", ".tmp"); tmp.deleteOnExit(); BibtexEntry[] bes = panel.getSelectedEntries(); HashSet<String> entries = new HashSet<String>(bes.length); for (BibtexEntry be : bes) entries.add(be.getId()); // Write to file: format.performExport(database, panel.metaData(), tmp.getPath(), panel.getEncoding(), entries); // Read the file and put the contents on the clipboard: StringBuffer sb = new StringBuffer(); reader = new InputStreamReader(new FileInputStream(tmp), panel.getEncoding()); int s; while ((s = reader.read()) != -1) { sb.append((char)s); } ClipboardOwner owner = new ClipboardOwner() { public void lostOwnership(Clipboard clipboard, Transferable content) { } }; //StringSelection ss = new StringSelection(sw.toString()); RtfSelection rs = new RtfSelection(sb.toString()); Toolkit.getDefaultToolkit().getSystemClipboard() .setContents(rs, owner); message = Globals.lang("Entries exported to clipboard") + ": " + bes.length; } catch (Exception e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. message = Globals.lang("Error exporting to clipboard"); return; } finally { // Clean up: if (tmp != null) tmp.delete(); if (reader != null) try { reader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } public void update() { frame.output(message); } }