package org.docear.plugin.bibtex.actions;
import java.awt.event.ActionEvent;
import java.net.URI;
import java.util.Collection;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import net.sf.jabref.BasePanel;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.BibtexEntryType;
import net.sf.jabref.EntryTypeDialog;
import net.sf.jabref.export.DocearSaveDatabaseAction;
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.AFreeplaneAction;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.link.NodeLinks;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.plugin.workspace.WorkspaceUtils;
public class AddNewReferenceAction extends AFreeplaneAction {
/**
*
*/
private static final long serialVersionUID = 1L;
public AddNewReferenceAction(String key) {
super(key);
}
public void actionPerformed(ActionEvent e) {
Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
if (e.getActionCommand().equals(DocearSaveDatabaseAction.JABREF_DATABASE_SAVE_SUCCESS)) {
addCreatedReference(e);
return;
}
else if (e.getActionCommand().equals(DocearSaveDatabaseAction.JABREF_DATABASE_SAVE_FAILED)) {
return;
}
else {
createNewReference(nodes);
}
}
private void createNewReference(Collection<NodeModel> nodes) {
BibtexEntry entry = null;
URI link = null;
String name = null;
for (NodeModel node : nodes) {
try {
URI tempLink = NodeLinks.getLink(node);
String tempName = WorkspaceUtils.resolveURI(tempLink, node.getMap()).getName();
if (link == null) {
link = tempLink;
name = tempName;
}
if (!tempName.equals(name)) {
JOptionPane.showMessageDialog(UITools.getFrame(), TextUtils.getText("docear.add_new_reference.error.conflicting_pdf_files"), TextUtils.getText("docear.add_new_reference.error.title"),
JOptionPane.WARNING_MESSAGE);
return;
}
}
catch (NullPointerException ex) {
}
}
JabrefWrapper jabrefWrapper = ReferencesController.getController().getJabrefWrapper();
MapModel map = Controller.getCurrentController().getMap();
if (link != null && link.getPath().toLowerCase().endsWith(".pdf")) {
String path = WorkspaceUtils.resolveURI(link, map).getAbsolutePath();
JabRefCommons.addNewRefenceEntry(new String[] { path }, jabrefWrapper.getJabrefFrame(), jabrefWrapper.getJabrefFrame().basePanel());
// PdfImporter pdfImporter = new PdfImporter(jabrefWrapper.getJabrefFrame(), jabrefWrapper.getJabrefFrame().basePanel(), null, 0);
// pdfImporter.importPdfFiles(new String[] { path }, Controller.getCurrentController().getViewController().getFrame(), true);
// entry = pdfImporter.getNewEntry();
}
else {
BasePanel basePanel = jabrefWrapper.getBasePanel();
EntryTypeDialog dialog = new EntryTypeDialog(jabrefWrapper.getJabrefFrame());
dialog.setVisible(true);
BibtexEntryType bet = dialog.getChoice();
if (bet == null) {
return;
}
String thisType = bet.getName();
entry = basePanel.newEntry(BibtexEntryType.getType(thisType));
}
showJabRefTab();
if (entry != null) {
String nodeIds = "";
for (NodeModel node : nodes) {
nodeIds += node.getID()+",";
}
entry.setField("docear_add_to_node", nodeIds);
ReferencesController.getController().setInAdd(map);
}
}
private void addCreatedReference(ActionEvent e) {
BibtexEntry entry;
try {
entry = (BibtexEntry) e.getSource();
String s = entry.getField("docear_add_to_node");
if (s != null) {
String[] nodeIDs = s.split(",");
for (String nodeID : nodeIDs) {
NodeModel node = Controller.getCurrentModeController().getMapController().getNodeFromID(nodeID);
ReferencesController.getController().getJabRefAttributes().setReferenceToNode(entry, node);
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
return;
}
private void showJabRefTab() {
final JComponent toolBar = Controller.getCurrentModeController().getUserInputListenerFactory().getToolBar("/format");
toolBar.setVisible(true);
((JComponent) toolBar.getParent()).revalidate();
final String propertyName = Controller.getCurrentController().getViewController().completeVisiblePropertyKey(toolBar);
Controller.getCurrentController().getResourceController().setProperty(propertyName, true);
JTabbedPane tabbedPane = (JTabbedPane) toolBar.getComponent(1);
tabbedPane.setSelectedComponent(ReferencesController.getController().getJabrefWrapper().getJabrefFrame());
}
}