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.BasePanel;
import net.sf.jabref.BibtexDatabase;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.export.DocearReferenceUpdateController;
import org.docear.plugin.bibtex.JabRefProjectExtension;
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;
import org.freeplane.features.mode.Controller;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.features.WorkspaceMapModelExtension;
import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
public class MapViewListener implements MouseListener, INodeSelectionListener {
private void handleEvent() {
if(ReferencesController.getController().getJabrefWrapper().getBasePanel() != null) {
BasePanel bp = ReferencesController.getController().getJabrefWrapper().getBasePanel();
WorkspaceMapModelExtension ext = WorkspaceController.getMapModelExtension(Controller.getCurrentController().getMap());
if(ext != null) {
AWorkspaceProject project = ext.getProject();
if(project != null && project.isLoaded()) {
JabRefProjectExtension jpe = (JabRefProjectExtension) project.getExtensions(JabRefProjectExtension.class);
if(jpe != null && !jpe.getBaseHandle().getBasePanel().equals(bp)) {
jpe.selectBasePanel();
}
}
}
}
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");
}
}
if(ReferencesController.getController().getJabrefWrapper().getBasePanel() != null) {
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 {
WorkspaceMapModelExtension mapExt = WorkspaceController.getMapModelExtension(mapModel);
if(mapExt == null || mapExt.getProject() == null || !mapExt.getProject().isLoaded()) {
//DOCEAR - todo: what to do?
}
else {
JabRefProjectExtension prjExt = (JabRefProjectExtension) mapExt.getProject().getExtensions(JabRefProjectExtension.class);
ReferencesController.getController().getJabrefWrapper().getJabrefFrame().showBasePanel(prjExt.getBaseHandle().getBasePanel());
}
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();
}
}