package org.docear.plugin.bibtex.actions;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.SwingUtilities;
import net.sf.jabref.BasePanel;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.search.SearchMatcher;
import org.docear.plugin.bibtex.JabRefProjectExtension;
import org.docear.plugin.bibtex.ReferencesController;
import org.docear.plugin.bibtex.jabref.JabRefCommons;
import org.docear.plugin.bibtex.jabref.JabrefWrapper;
import org.freeplane.core.ui.EnabledAction;
import org.freeplane.core.ui.components.OneTouchCollapseResizer;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.actions.AWorkspaceAction;
import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
import org.freeplane.plugin.workspace.features.WorkspaceMapModelExtension;
import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
@CheckEnableOnPopup
@EnabledAction(checkOnNodeChange=true)
public class SelectInReferenceManagerAction extends AWorkspaceAction {
private static final long serialVersionUID = 1L;
public static final String KEY = "SelectInRefManagerAction";
public SelectInReferenceManagerAction() {
super(KEY);
}
public void setEnabled() {
Collection<NodeModel> selection = Controller.getCurrentModeController().getMapController().getSelectedNodes();
for (NodeModel node : selection) {
AWorkspaceProject project = WorkspaceController.getMapProject(node.getMap());
if(project != null && project.isLoaded()) {
final String bibtexKey = ReferencesController.getController().getJabRefAttributes().getBibtexKey(node);
if (bibtexKey != null && bibtexKey.length()>0) {
setEnabled(true);
return;
}
}
}
setEnabled(false);
// NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
// if (node == null) {
// setEnabled(false);
// return;
// }
// AWorkspaceProject project = WorkspaceController.getMapProject(node.getMap());
// if(project == null || !project.isLoaded()) {
// setEnabled(false);
// }
// else {
// final String bibtexKey = ReferencesController.getController().getJabRefAttributes().getBibtexKey(node);
//
// if (bibtexKey != null && bibtexKey.length()>0) {
// setEnabled(true);
// }
// else {
// setEnabled(false);
// }
// }
}
public void actionPerformed(ActionEvent e) {
Collection<NodeModel> selection = Controller.getCurrentModeController().getMapController().getSelectedNodes();
BasePanel panel = ReferencesController.getController().getJabrefWrapper().getBasePanel();
panel.getMainTable().clearSelection();
if(panel != null) {
List<BibtexEntry> entries = new ArrayList<BibtexEntry>();
for (NodeModel node : selection) {
BibtexEntry entry = selectReference(node, true);
if(entry != null) {
entries.add(entry);
}
}
}
//filterEntries(entries);
//NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
}
public void filterEntries(Collection<BibtexEntry> entries) {
BasePanel panel = ReferencesController.getController().getJabrefWrapper().getBasePanel();
if(panel != null) {
Thread t = new Thread() {
public void run() {
JabRefCommons.clearSearchFilter();
}
};
// do this after the button action is over
SwingUtilities.invokeLater(t);
panel.getMainTable().clearSelection();
List<BibtexEntry> list = panel.getMainTable().getTableRows();
for (BibtexEntry entry : list) {
entry.setSearchHit(entries.contains(entry));
}
//panel.setSearchMatcher(SearchMatcher.INSTANCE);
panel.mainTable.showFloatSearch(SearchMatcher.INSTANCE);
}
}
public BibtexEntry selectReference(NodeModel node, boolean keepPreviousSelection) {
if (node == null) {
return null;
}
BibtexEntry entry = null;
WorkspaceMapModelExtension modelExt = WorkspaceController.getMapModelExtension(node.getMap(), false);
if(modelExt != null) {
AWorkspaceProject project = modelExt.getProject();
JabRefProjectExtension ext = (JabRefProjectExtension) project.getExtensions(JabRefProjectExtension.class);
ext.selectBasePanel();
}
//if(ReferencesController.getController().getJabrefWrapper().getBasePanel().getSelectedEntries().length <= 1) {
final String bibtexKey = ReferencesController.getController().getJabRefAttributes().getBibtexKey(node);
JabrefWrapper wrapper = ReferencesController.getController().getJabrefWrapper();
OneTouchCollapseResizer resizer = wrapper.getResizer();
if(resizer != null && !resizer.isExpanded()) {
resizer.setExpanded(true);
}
entry = JabRefCommons.showInReferenceManager(bibtexKey, keepPreviousSelection);
//}
return entry;
}
}