package org.docear.plugin.bibtex.listeners; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.TreeMap; import javax.swing.SwingUtilities; import net.sf.jabref.BibtexDatabase; import net.sf.jabref.BibtexEntry; import net.sf.jabref.export.DocearReferenceUpdateController; import org.docear.plugin.bibtex.ReferencesController; import org.docear.plugin.bibtex.jabref.ResolveDuplicateEntryAbortedException; import org.freeplane.features.map.INodeSelectionListener; import org.freeplane.features.map.MapModel; import org.freeplane.features.map.NodeModel; public class MapViewListener implements MouseListener, INodeSelectionListener { private void handleEvent() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ReferencesController referencesController = ReferencesController.getController(); if (referencesController.getInChange() != null) { referencesController.setInChange(null); ReferencesController.getController().getJabrefWrapper().getBasePanel().runCommand("save"); } if (referencesController.getInAdd() != null) { BibtexEntry addedEntry = ReferencesController.getController().getAddedEntry(); try { if (addedEntry != null) { ReferencesController.getController().setAddedEntry(null); generateKeyIfNeeded(addedEntry); //JabRefAttributes jabRefAttributes = ReferencesController.getController().getJabRefAttributes(); //jabRefAttributes.resolveDuplicateLinks(addedEntry); } addToNodes(referencesController.getInAdd()); } // catch (InterruptedException ex) { // System.out.println("MApViewListener interrupted"); // return; // } finally { referencesController.setInAdd(null); ReferencesController.getController().getJabrefWrapper().getBasePanel().runCommand("save"); } } BibtexEntry[] selectedEntries = ReferencesController.getController().getJabrefWrapper().getBasePanel().getSelectedEntries(); if (selectedEntries != null && selectedEntries.length == 1) { BibtexEntry entry = selectedEntries[0]; generateKeyIfNeeded(entry); } } }); } private void generateKeyIfNeeded(BibtexEntry entry) { if (entry.getCiteKey() != null && entry.getCiteKey().trim().length() > 0) { return; } ReferencesController.getController().getJabRefAttributes().generateBibtexEntry(entry); } private void addToNodes(MapModel mapModel) { if (DocearReferenceUpdateController.isLocked()) { return; } DocearReferenceUpdateController.lock(); try { BibtexDatabase database = ReferencesController.getController().getJabrefWrapper().getDatabase(); TreeMap<String, BibtexEntry> entryNodeTuples = new TreeMap<String, BibtexEntry>(); for (BibtexEntry entry : database.getEntries()) { String s = entry.getField("docear_add_to_node"); if (s != null) { String[] nodeIds = s.split(","); for (String nodeId : nodeIds) { entryNodeTuples.put(nodeId, entry); NodeModel node = mapModel.getNodeForID(nodeId); if (node != null) { try { ReferencesController.getController().getJabRefAttributes().setReferenceToNode(entry, node); } catch (ResolveDuplicateEntryAbortedException e) { } } } } entry.setField("docear_add_to_node", null); } } finally { DocearReferenceUpdateController.unlock(); } } public void mouseClicked(MouseEvent e) { handleEvent(); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void onDeselect(NodeModel node) { } public void onSelect(NodeModel node) { handleEvent(); } }