package org.docear.plugin.bibtex;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.dnd.DropTarget;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.event.TreeModelEvent;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.GUIGlobals;
import net.sf.jabref.JabRefPreferences;
import net.sf.jabref.export.DocearReferenceUpdateController;
import org.docear.plugin.bibtex.actions.AddExistingReferenceAction;
import org.docear.plugin.bibtex.actions.AddNewReferenceAction;
import org.docear.plugin.bibtex.actions.AddOrUpdateReferenceEntryWorkspaceAction;
import org.docear.plugin.bibtex.actions.AddRecommendedDocumentAction;
import org.docear.plugin.bibtex.actions.ChangeBibtexDatabaseAction;
import org.docear.plugin.bibtex.actions.CopyBibtexToClipboard;
import org.docear.plugin.bibtex.actions.CopyCiteKeyToClipboard;
import org.docear.plugin.bibtex.actions.ReferenceQuitAction;
import org.docear.plugin.bibtex.actions.RemoveReferenceAction;
import org.docear.plugin.bibtex.actions.SelectInReferenceManagerAction;
import org.docear.plugin.bibtex.actions.ShowJabrefPreferencesAction;
import org.docear.plugin.bibtex.actions.UpdateReferencesAllMapsAction;
import org.docear.plugin.bibtex.actions.UpdateReferencesAllOpenMapsAction;
import org.docear.plugin.bibtex.actions.UpdateReferencesCurrentMapAction;
import org.docear.plugin.bibtex.actions.UpdateReferencesInLibrary;
import org.docear.plugin.bibtex.jabref.JabRefAttributes;
import org.docear.plugin.bibtex.jabref.JabRefBaseHandle;
import org.docear.plugin.bibtex.jabref.JabrefWrapper;
import org.docear.plugin.bibtex.jabref.labelPattern.ILabelPattern;
import org.docear.plugin.bibtex.listeners.BibtexNodeDropListener;
import org.docear.plugin.bibtex.listeners.JabRefChangeListener;
import org.docear.plugin.bibtex.listeners.MapChangeListenerAdapter;
import org.docear.plugin.bibtex.listeners.NodeAttributeListener;
import org.docear.plugin.bibtex.listeners.NodeSelectionListener;
import org.docear.plugin.bibtex.listeners.SplmmMapsConvertListener;
import org.docear.plugin.core.ALanguageController;
import org.docear.plugin.core.DocearController;
import org.docear.plugin.core.IBibtexDatabase;
import org.docear.plugin.core.event.DocearEvent;
import org.docear.plugin.core.event.DocearEventType;
import org.docear.plugin.core.event.IDocearEventListener;
import org.docear.plugin.core.features.DocearMaximizeMapHandler;
import org.docear.plugin.core.logging.DocearLogger;
import org.docear.plugin.core.workspace.model.DocearProjectChangedEvent;
import org.docear.plugin.core.workspace.model.DocearWorkspaceProject;
import org.docear.plugin.core.workspace.model.IDocearProjectListener;
import org.docear.plugin.pdfutilities.PdfUtilitiesController;
import org.docear.plugin.pdfutilities.map.MapConverter;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.ui.AFreeplaneAction;
import org.freeplane.core.ui.IKeyStrokeProcessor;
import org.freeplane.core.ui.IMenuContributor;
import org.freeplane.core.ui.KeyBindingProcessor;
import org.freeplane.core.ui.MenuBuilder;
import org.freeplane.core.ui.components.MultipleImage;
import org.freeplane.core.ui.components.OneTouchCollapseResizer;
import org.freeplane.core.ui.ribbon.ARibbonContributor;
import org.freeplane.core.ui.ribbon.IRibbonContributorFactory;
import org.freeplane.core.ui.ribbon.RibbonActionContributorFactory;
import org.freeplane.core.ui.ribbon.RibbonBuildContext;
import org.freeplane.core.util.Compat;
import org.freeplane.core.util.LogUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.attribute.AttributeController;
import org.freeplane.features.icon.IStateIconProvider;
import org.freeplane.features.icon.IconController;
import org.freeplane.features.icon.UIIcon;
import org.freeplane.features.map.INodeView;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
import org.freeplane.features.styles.MapStyle;
import org.freeplane.features.ui.INodeViewLifeCycleListener;
import org.freeplane.plugin.workspace.URIUtils;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
import org.freeplane.plugin.workspace.features.AWorkspaceModeExtension;
import org.freeplane.plugin.workspace.features.ProjectURLHandler;
import org.freeplane.plugin.workspace.features.WorkspaceMapModelExtension;
import org.freeplane.plugin.workspace.model.WorkspaceModelEvent;
import org.freeplane.plugin.workspace.model.WorkspaceModelEvent.WorkspaceModelEventType;
import org.freeplane.plugin.workspace.model.WorkspaceModelListener;
import org.freeplane.plugin.workspace.model.project.IProjectModelListener;
import org.freeplane.plugin.workspace.model.project.IProjectSelectionListener;
import org.freeplane.plugin.workspace.model.project.ProjectSelectionEvent;
import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
import org.freeplane.view.swing.map.MainView;
import org.freeplane.view.swing.map.NodeView;
import org.pushingpixels.flamingo.api.common.JCommandButton;
import org.pushingpixels.flamingo.api.ribbon.RibbonElementPriority;
public class ReferencesController extends ALanguageController implements IDocearEventListener {
private PropertyChangeListener iconChangeListener;
private static final Icon attributesIcon = new ImageIcon(ReferencesController.class.getResource("/images/references_small.png"));
//mapModel with reference which is currently changed
private MapModel inChange = null;
//MapModel with reference which is currently added
private MapModel inAdd = null;
private BibtexEntry addedEntry = null;
private final static JabRefChangeListener jabRefChangeListener = new JabRefChangeListener();
private static ReferencesController referencesController = null;
JabrefWrapper jabrefWrapper;
private JabRefAttributes jabRefAttributes;
private SplmmAttributes splmmAttributes;
private final NodeAttributeListener attributeListener = new NodeAttributeListener();
private final SplmmMapsConvertListener splmmMapsConvertedListener = new SplmmMapsConvertListener();
public static final String MENU_BAR = "/menu_bar"; //$NON-NLS-1$
public static final String NODE_POPUP_MENU = "/node_popup"; //$NON-NLS-1$
public static final String NODE_FEATURES_MENU = "/node_features"; //$NON-NLS-1$
public static final String TOOLS_MENU = "/extras"; //$NON-NLS-1$
public static final String REFERENCE_MANAGEMENT_MENU = "/reference_management";
public static final String UPDATE_REFERENCES_MENU = "/update_references";
public static final String REFERENCE_MANAGEMENT_MENU_LANG_KEY = "menu_reference_management";
public static final String UPDATE_REFERENCES_MENU_LANG_KEY = "menu_update_references";
// private static final String CONVERT_SPLMM_REFERENCES_LANG_KEY = "menu_update_splmm_references_current_map";
private ModeController modeController;
private AFreeplaneAction updateReferencesCurrentMap = new UpdateReferencesCurrentMapAction();
private AFreeplaneAction updateReferencesAllOpenMaps = new UpdateReferencesAllOpenMapsAction();
private AFreeplaneAction updateReferencesInLibrary = new UpdateReferencesInLibrary();
private AFreeplaneAction updateReferencesAllMaps = new UpdateReferencesAllMapsAction();
private AFreeplaneAction addExistingReference = new AddExistingReferenceAction();
private AFreeplaneAction changeBibtexDatabase = new ChangeBibtexDatabaseAction();
private AFreeplaneAction removeReference = new RemoveReferenceAction();
private AFreeplaneAction addNewReference = new AddNewReferenceAction();
private AFreeplaneAction showJabrefPreferences = new ShowJabrefPreferencesAction();
private AFreeplaneAction copyBibtex = new CopyBibtexToClipboard();
private AFreeplaneAction copyCiteKey = new CopyCiteKeyToClipboard();
private IDocearProjectListener projectListener;
private IProjectSelectionListener projectSelectionListener;
private Runnable runOnce;
private IProjectModelListener prjModelListener;
//private AWorkspaceAction renameByMetaData = new RenameByMetaData();
public ReferencesController(ModeController modeController) {
super();
new ReferencesPreferences(modeController);
setReferencesController(this);
setPreferencesForDocear();
this.modeController = modeController;
LogUtils.info("starting DocearReferencesController(ModeController)");
this.addPluginDefaults();
this.addMenuEntries();
this.registerListeners();
this.initJabref();
}
private void setPreferencesForDocear() {
JabRefPreferences.getInstance(JabrefWrapper.class).put("groupAutoShow", "false");
JabRefPreferences.getInstance(JabrefWrapper.class).put("searchPanelVisible", "false");
JabRefPreferences.getInstance(JabrefWrapper.class).setLabelPatternSavePackage(ILabelPattern.class);
}
private void adjustDefaultAttributesIcon(NodeModel node) {
for (INodeView view : node.getViewers()) {
if(view instanceof NodeView) {
if (jabRefAttributes.getBibtexKey(node) != null) {
// Icon attributesIcon = new ImageIcon(ReferencesController.class.getResource("/images/references_small.png"));
((NodeView)view).getMainView().addPropertyChangeListener("icon", getIconChangeListener());
}
}
}
}
private PropertyChangeListener getIconChangeListener() {
if(iconChangeListener == null) {
iconChangeListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getSource() instanceof MainView) {
final MainView view = (MainView)evt.getSource();
final String showAttributeIcon = MapStyle.getController(modeController).getPropertySetDefault(view.getNodeView().getMap().getModel(), AttributeController.SHOW_ICON_FOR_ATTRIBUTES);
final boolean showIcon = Boolean.parseBoolean(showAttributeIcon);
if(showIcon) {
MultipleImage icon = (MultipleImage) view.getIcon();
if(icon != null) {
if(attributesIcon != null /*&& AttributeController.attributeIcon != null/**/) {
icon.addOrReplaceIcon(AttributeController.attributeIcon.getIcon(), attributesIcon);
}
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
view.removePropertyChangeListener("icon", iconChangeListener);
view.repaint();
}
});
}
}
}
};
}
return iconChangeListener;
}
private void registerListeners() {
IconController.getController(modeController).addStateIconProvider(new IStateIconProvider() {
public UIIcon getStateIcon(NodeModel node) {
adjustDefaultAttributesIcon(node);
return null;
}
});
MapConverter.addMapsConvertedListener(splmmMapsConvertedListener);
this.modeController.addINodeViewLifeCycleListener(new INodeViewLifeCycleListener() {
public void onViewCreated(Container nodeView) {
NodeView node = (NodeView) nodeView;
final DropTarget dropTarget = new DropTarget(node.getMainView(), new BibtexNodeDropListener());
dropTarget.setActive(true);
}
public void onViewRemoved(Container nodeView) {
}
});
MapChangeListenerAdapter changeListenerAdapter = new MapChangeListenerAdapter();
this.modeController.getMapController().addNodeChangeListener(changeListenerAdapter);
this.modeController.getMapController().addMapChangeListener(changeListenerAdapter);
DocearController.getController().getLifeCycleObserver().addMapLifeCycleListener(changeListenerAdapter);
DocearController.getController().getEventQueue().addEventListener(this);
Controller.getCurrentController().addAction(new AddRecommendedDocumentAction());
}
private IProjectModelListener getProjectModelListener() {
if(prjModelListener == null) {
prjModelListener = new IProjectModelListener() {
public void treeNodesChanged(WorkspaceModelEvent event) {
if(event.getType() == WorkspaceModelEventType.RENAMED){
if(event.getTreePath().getLastPathComponent() instanceof DefaultFileNode) {
try {
DefaultFileNode target = (DefaultFileNode) event.getTreePath().getLastPathComponent();
File parent = target.getFile().getParentFile();
File oldFile = new File(parent, (String) event.getOldValue());
File newFile = new File(parent, (String) event.getNewValue());
updateJabref((DocearWorkspaceProject) event.getProject(), newFile, oldFile, true);
}
catch (Exception e) {
DocearLogger.warn(e);
}
}
}
}
public void treeNodesInserted(WorkspaceModelEvent event) {
}
public void treeNodesRemoved(WorkspaceModelEvent event) {
}
public void treeStructureChanged(WorkspaceModelEvent event) {
if(event.getTreePath().getLastPathComponent() instanceof DefaultFileNode || event.getTreePath().getLastPathComponent() instanceof LinkTypeFileNode){
File oldFile = null;
File newFile = null;
if(event.getType() == WorkspaceModelEventType.RENAMED) {
DefaultFileNode target = (DefaultFileNode) event.getTreePath().getLastPathComponent();
File parent = target.getFile().getParentFile();
oldFile = new File(parent, (String) event.getOldValue());
newFile = new File(parent, (String) event.getNewValue());
}
else if(event.getType() == WorkspaceModelEventType.MOVED) {
newFile = (File) event.getNewValue();
oldFile = (File) event.getOldValue();
}
if(newFile != null && oldFile != null) {
try {
updateJabref((DocearWorkspaceProject) event.getProject(), newFile, oldFile, (event.getType() == WorkspaceModelEventType.RENAMED));
}
catch (Exception e) {
DocearLogger.warn(e);
}
}
}
}
};
}
return prjModelListener;
}
private void updateJabref(DocearWorkspaceProject project, final File newFile, final File oldFile, boolean renamed) {
if(oldFile == null) {
return;
}
//we don't look at pathes
if(!renamed) {
return;
}
final JabRefProjectExtension ext = (JabRefProjectExtension) project.getExtensions(JabRefProjectExtension.class);
if(ext != null) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ReferencesController contr = ReferencesController.getController();
final JabrefWrapper wrapper = contr.getJabrefWrapper();
wrapper.getJabrefFrame().showBasePanel(ext.getBaseHandle().getBasePanel());
DocearController.getController().getEventQueue().invoke(new Runnable() {
@Override
public void run() {
DocearReferenceUpdateController.lock();
try {
String nodeFileName = oldFile.getName();
for (BibtexEntry entry : wrapper.getDatabase().getEntries()) {
String jabrefFiles = entry.getField(GUIGlobals.FILE_FIELD);
if (jabrefFiles != null) {
// path linked in jabref
for (String jabrefFile : JabRefAttributes.parsePathNames(entry, jabrefFiles)) {
if (jabrefFile.endsWith(nodeFileName)) {
entry.setField(GUIGlobals.FILE_FIELD, jabrefFiles.replace(nodeFileName, newFile.getName()));
return;
}
}
}
}
}
finally {
DocearReferenceUpdateController.unlock();
}
}
});
}
});
}
}
public static ReferencesController getController() {
return referencesController;
}
public static void setReferencesController(ReferencesController referencesController) {
ReferencesController.referencesController = referencesController;
}
private void createOptionPanel(JPanel comp) {
try {
final JTabbedPane tabs = (JTabbedPane) modeController.getUserInputListenerFactory().getToolBar("/format").getComponent(1);
Dimension fixSize = new Dimension(tabs.getComponent(0).getWidth(), 32000);
comp.setPreferredSize(fixSize);
tabs.add(TextUtils.getText("jabref"), comp);
tabs.setSelectedComponent(comp);
EventQueue.invokeLater(new Runnable() {
public void run() {
OneTouchCollapseResizer resizer = jabrefWrapper.getResizer();
if(resizer == null) {
EventQueue.invokeLater(this);
return;
}
DocearMaximizeMapHandler.getModeHandler(modeController).addCollapsableResizer(resizer);
}
});
}
catch (Exception e) {
LogUtils.severe(e);
}
}
private void initJabref() {
this.jabRefAttributes = new JabRefAttributes();
this.splmmAttributes = new SplmmAttributes();
final ClassLoader classLoader = getClass().getClassLoader();
try {
SwingUtilities.invokeAndWait( new Runnable() {
public void run() {
ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(classLoader);
jabrefWrapper = new JabrefWrapper(Controller.getCurrentController().getViewController().getJFrame());
modeController.getExtension(KeyBindingProcessor.class).addKeyStrokeProcessor(new KeyBindInterceptor());
createOptionPanel(jabrefWrapper.getJabrefFrame());
WorkspaceController.getModeExtension(modeController).getView().addProjectSelectionListener(getProjectSelectionListener());
}
finally {
Thread.currentThread().setContextClassLoader(oldLoader);
}
}
});
}
catch (Throwable e) {
LogUtils.severe(e);
}
Controller.getCurrentController().addAction(showJabrefPreferences);
NodeSelectionListener nodeSelectionListener = new NodeSelectionListener();
nodeSelectionListener.init();
runOnce = new Runnable() {
public void run() {
//removeSelf();
WorkspacePopupMenu popupMenu = new DefaultFileNode("temp", new File("temp.tmp")).getContextMenu();
WorkspacePopupMenuBuilder.insertAction(popupMenu, "workspace.action.addOrUpdateReferenceEntry", 0);
WorkspacePopupMenuBuilder.insertAction(popupMenu, WorkspacePopupMenuBuilder.SEPARATOR, 1);
//WorkspacePopupMenuBuilder.insertAction(popupMenu, "workspace.action.renameByMetaData", 7);
// popupMenu = new LinkTypeFileNode().getContextMenu();
// WorkspacePopupMenuBuilder.insertAction(popupMenu, "workspace.action.addOrUpdateReferenceEntry", 0);
// WorkspacePopupMenuBuilder.insertAction(popupMenu, WorkspacePopupMenuBuilder.SEPARATOR, 1);
}
};
WorkspaceController.getModeExtension(modeController).getModel().addWorldModelListener(new WorkspaceModelListener() {
public void treeStructureChanged(TreeModelEvent arg0) {}
@Override
public void treeNodesRemoved(TreeModelEvent arg0) {}
@Override
public void treeNodesInserted(TreeModelEvent arg0) {}
@Override
public void treeNodesChanged(TreeModelEvent arg0) {}
@Override
public void projectRemoved(WorkspaceModelEvent event) {
if(DocearWorkspaceProject.isCompatible(event.getProject())) {
event.getProject().getModel().removeProjectModelListener(getProjectModelListener());
try {
final File file = URIUtils.getFile(ProjectURLHandler.resolve(event.getProject(), ((DocearWorkspaceProject)event.getProject()).getBibtexDatabase().toURL()).toURI());
if(file == null) {
return;
}
addOrUpdateProjectExtension((DocearWorkspaceProject) event.getProject(), null);
} catch (Exception e) {
LogUtils.warn(e);
}
}
}
@Override
public void projectAdded(WorkspaceModelEvent event) {
if(event.getProject() instanceof DocearWorkspaceProject) {
event.getProject().getModel().addProjectModelListener(getProjectModelListener());
((DocearWorkspaceProject) event.getProject()).addProjectListener(getProjectListener());
}
initContextMenusOnce();
}
});
}
protected void initContextMenusOnce() {
//insert some extra actions to file nodes
synchronized(this) {
if(runOnce != null) {
SwingUtilities.invokeLater(runOnce);
runOnce = null;
}
}
}
private void addOrUpdateProjectExtension(DocearWorkspaceProject project, JabRefBaseHandle handle) {
JabRefProjectExtension ext = (JabRefProjectExtension) project.getExtensions(JabRefProjectExtension.class);
if(handle == null) {
project.removeExtension(JabRefProjectExtension.class);
if(ext != null) {
final JabRefBaseHandle extHandle = ext.getBaseHandle();
extHandle.removeProjectConnection(project);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ReferencesController contr = ReferencesController.getController();
JabrefWrapper wrapper = contr.getJabrefWrapper();
extHandle.getBasePanel().getSaveAction().run();
wrapper.closeDatabase(extHandle);
}
});
}
return;
}
if(ext == null) {
ext = new JabRefProjectExtension(handle);
project.addExtension(JabRefProjectExtension.class, ext);
}
else {
ext.setBaseHandle(handle);
}
handle.addProjectConnection(project);
}
private void showBasePanel(DocearWorkspaceProject project) {
final JabRefProjectExtension ext = (JabRefProjectExtension) project.getExtensions(JabRefProjectExtension.class);
if(ext != null) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ReferencesController contr = ReferencesController.getController();
JabrefWrapper wrapper = contr.getJabrefWrapper();
wrapper.getJabrefFrame().showBasePanel(ext.getBaseHandle().getBasePanel());
}
});
}
}
private IDocearProjectListener getProjectListener() {
if(projectListener == null) {
projectListener = new IDocearProjectListener() {
@Override
public void changed(DocearProjectChangedEvent event) {
if(DocearEventType.LIBRARY_CHANGED.equals(event.getDescriptor()) && event.getObject() instanceof IBibtexDatabase) {
addOrUpdateProjectExtension((DocearWorkspaceProject) event.getSource(), null);
loadDatabase(event.getSource());
}
}
};
}
return projectListener;
}
private void loadDatabase(final DocearWorkspaceProject project) {
final File file = URIUtils.getAbsoluteFile(project.getBibtexDatabase());
if(file == null) {
return;
}
SwingUtilities.invokeLater(new Runnable() {
private int count = 0;
public void run() {
ClassLoader old = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(ResourceController.class.getClassLoader());
try {
ReferencesController contr = ReferencesController.getController();
JabrefWrapper wrapper = contr.getJabrefWrapper();
JabRefBaseHandle handle = wrapper.openDatabase(file, true);
addOrUpdateProjectExtension(project, handle);
}
catch (Throwable e) {
if(count < 5) {
count++;
try {
Thread.sleep(200);
}
catch (InterruptedException e1) {
}
SwingUtilities.invokeLater(this);
System.out.println(count+": "+file);
LogUtils.warn(e.getClass()+": "+e.getCause());
}
else {
throw new RuntimeException(e);
}
}
finally {
Thread.currentThread().setContextClassLoader(old);
}
}
});
}
private IProjectSelectionListener getProjectSelectionListener() {
if(this.projectSelectionListener == null) {
this.projectSelectionListener = new IProjectSelectionListener() {
public void selectionChanged(ProjectSelectionEvent event) {
if(event.getSelectedProject() instanceof DocearWorkspaceProject) {
showBasePanel((DocearWorkspaceProject) event.getSelectedProject());
}
}
};
}
return this.projectSelectionListener;
}
public JabRefAttributes getJabRefAttributes() {
return jabRefAttributes;
}
public SplmmAttributes getSplmmAttributes() {
return splmmAttributes;
}
public JabrefWrapper getJabrefWrapper() {
return jabrefWrapper;
}
public void setJabrefWrapper(JabrefWrapper jabrefWrapper) {
this.jabrefWrapper = jabrefWrapper;
}
private void addPluginDefaults() {
final URL defaults = this.getClass().getResource(ResourceController.PLUGIN_DEFAULTS_RESOURCE);
if (defaults == null)
throw new RuntimeException("cannot open " + ResourceController.PLUGIN_DEFAULTS_RESOURCE); //$NON-NLS-1$
ResourceController res = ResourceController.getResourceController();
res.addDefaults(defaults);
res.setDefaultProperty(ChangeBibtexDatabaseAction.KEY+".icon", "/images/docear/project/Project-ChangeReferenceDB.png");
res.setDefaultProperty(AddExistingReferenceAction.KEY+".icon", "/images/docear/references/References-AddExisting.png");
res.setDefaultProperty(RemoveReferenceAction.KEY+".icon", "/images/docear/references/References-Remove.png");
res.setDefaultProperty(CopyBibtexToClipboard.KEY+".icon", "/images/docear/references/References-CopyReferenceKeys.png");
res.setDefaultProperty(CopyCiteKeyToClipboard.KEY+".icon", "/images/docear/references/References-CopyReferenceKeysLaTeX.png");
res.setDefaultProperty(AddOrUpdateReferenceEntryWorkspaceAction.KEY+".icon", "/images/docear/references/References-CreateOrUpdate.png");
res.setDefaultProperty(AddNewReferenceAction.KEY+".icon", "/images/docear/references/References-CreateOrUpdate.png");
res.setDefaultProperty(UpdateReferencesCurrentMapAction.KEY+".icon", "/images/docear/references/References-RefreshInCurrentMap.png");
res.setDefaultProperty(SelectInReferenceManagerAction.KEY+".icon", "/images/docear/references/References-ShowInReferenceManager.png");
res.setDefaultProperty("ShowAllAttributesAction.icon", "/images/docear/references/ReferencesSettings-ShowAllAttributes.png");
res.setDefaultProperty("HideAllAttributesAction.icon", "/images/docear/references/ReferencesSettings-HideAllAttributes.png");
final URL url = res.getResource("/images/docear/tools/tools-PreferencesReferences.png");
if (url != null) {
final ImageIcon icon = new ImageIcon(url);
showJabrefPreferences.putValue(AbstractAction.SMALL_ICON, icon);
}
}
private void addMenuEntries() {
final SelectInReferenceManagerAction showRefAction = new SelectInReferenceManagerAction();
WorkspaceController.addAction(changeBibtexDatabase);
WorkspaceController.addAction(addExistingReference);
WorkspaceController.addAction(removeReference);
WorkspaceController.addAction(copyBibtex);
WorkspaceController.addAction(copyCiteKey);
WorkspaceController.addAction(addNewReference);
WorkspaceController.addAction(addExistingReference);
WorkspaceController.addAction(showRefAction);
WorkspaceController.addAction(updateReferencesAllMaps);
WorkspaceController.addAction(updateReferencesAllOpenMaps);
WorkspaceController.addAction(updateReferencesCurrentMap);
// WorkspaceController.addAction(updateReferencesInLibrary);
WorkspaceController.addAction(new AddOrUpdateReferenceEntryWorkspaceAction());
//WorkspaceController.addAction(renameByMetaData);
this.modeController.addMenuContributor(new IMenuContributor() {
public void updateMenus(ModeController modeController, MenuBuilder builder) {
String referencesCategory = PdfUtilitiesController.getParentCategory(builder, PdfUtilitiesController.REFERENCE_CATEGORY);
//RIBBONS builder.addMenuItem
builder.addMenuItem(MENU_BAR + TOOLS_MENU, new JMenu(TextUtils.getText(REFERENCE_MANAGEMENT_MENU_LANG_KEY)),
MENU_BAR + REFERENCE_MANAGEMENT_MENU, MenuBuilder.BEFORE);
builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU, showRefAction, MenuBuilder.AS_CHILD);
builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU, copyBibtex, MenuBuilder.AS_CHILD);
builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU, copyCiteKey, MenuBuilder.AS_CHILD);
builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU, addNewReference, MenuBuilder.AS_CHILD);
// builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU, new ImportMetadateForNodeLink(), MenuBuilder.AS_CHILD);
builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU, addExistingReference, MenuBuilder.AS_CHILD);
builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU, removeReference, MenuBuilder.AS_CHILD);
JMenu updRefMenuBar = new JMenu(TextUtils.getText(UPDATE_REFERENCES_MENU_LANG_KEY));
updRefMenuBar.getPopupMenu().addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
updateReferencesInLibrary.setEnabled();
updateReferencesAllOpenMaps.setEnabled();
updateReferencesAllMaps.setEnabled();
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {}
});
builder.addMenuItem(MENU_BAR + REFERENCE_MANAGEMENT_MENU,
updRefMenuBar, MENU_BAR + REFERENCE_MANAGEMENT_MENU
+ UPDATE_REFERENCES_MENU, MenuBuilder.AS_CHILD);
builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU, updateReferencesCurrentMap,
MenuBuilder.AS_CHILD);
builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU, updateReferencesAllOpenMaps,
MenuBuilder.AS_CHILD);
// builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU, updateReferencesInLibrary,
// MenuBuilder.AS_CHILD);
builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU, updateReferencesAllMaps,
MenuBuilder.AS_CHILD);
// builder.addAction(MENU_BAR + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU, ConvertSplmmReferences,
// MenuBuilder.AS_CHILD);
JMenu refMenu = new JMenu(TextUtils.getText(REFERENCE_MANAGEMENT_MENU_LANG_KEY));
builder.addMenuItem(referencesCategory, refMenu , referencesCategory + REFERENCE_MANAGEMENT_MENU, MenuBuilder.AS_CHILD);
builder.addSeparator(referencesCategory + REFERENCE_MANAGEMENT_MENU, MenuBuilder.AFTER);
builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU, showRefAction, MenuBuilder.AS_CHILD);
builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU, copyBibtex, MenuBuilder.AS_CHILD);
builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU, copyCiteKey, MenuBuilder.AS_CHILD);
builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU, addNewReference, MenuBuilder.AS_CHILD);
// builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU, new ImportMetadateForNodeLink(), MenuBuilder.AS_CHILD);
builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU, addExistingReference, MenuBuilder.AS_CHILD);
builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU, removeReference, MenuBuilder.AS_CHILD);
//builder.addAction(pdfCategory + PdfUtilitiesController.PDF_MANAGEMENT_MENU, renameByMetaData, MenuBuilder.AS_CHILD);
//modeController.addAction(renameByMetaData);
final JMenu updRefMenu = new JMenu(TextUtils.getText(UPDATE_REFERENCES_MENU_LANG_KEY));
builder.addMenuItem(referencesCategory + REFERENCE_MANAGEMENT_MENU, updRefMenu, referencesCategory + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU, MenuBuilder.AS_CHILD);
builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU,
updateReferencesCurrentMap, MenuBuilder.AS_CHILD);
builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU,
updateReferencesAllOpenMaps, MenuBuilder.AS_CHILD);
// builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU,
// updateReferencesInLibrary, MenuBuilder.AS_CHILD);
builder.addAction(referencesCategory + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU,
updateReferencesAllMaps, MenuBuilder.AS_CHILD);
// builder.addAction(parentMenu + REFERENCE_MANAGEMENT_MENU + UPDATE_REFERENCES_MENU,
// ConvertSplmmReferences, MenuBuilder.AS_CHILD);
// builder.addAction(MENU_BAR + TOOLS_MENU, ShowJabrefPreferences, MenuBuilder.AS_CHILD);
updRefMenu.getPopupMenu().addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
updateReferencesInLibrary.setEnabled();
updateReferencesAllOpenMaps.setEnabled();
updateReferencesAllMaps.setEnabled();
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {}
});
refMenu.getPopupMenu().addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
showRefAction.setEnabled();
try {
NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
WorkspaceMapModelExtension modelExt = WorkspaceController.getMapModelExtension(node.getMap(), false);
updRefMenu.setEnabled(modelExt.getProject() != null && modelExt.getProject().isLoaded());
}
catch (Exception cause) {
updRefMenu.setEnabled(false);
}
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {}
});
}
});
modeController.getUserInputListenerFactory().getRibbonBuilder().registerContributorFactory("UpdateReferencesAllMapsAction", new UpdateReferencesAllMapsActionContributorFactory(WorkspaceController.getModeExtension(modeController)));
modeController.getUserInputListenerFactory().getRibbonBuilder().registerContributorFactory("ChangeBibtexDatabaseAction", new ChangeBibtexDatabaseActionContributorFactory(WorkspaceController.getModeExtension(modeController)));
File file = new File(Compat.getApplicationUserDirectory(), "docear_references_ribbon.xml");
if (file.exists()) {
LogUtils.info("using alternative ribbon configuration file: "+file.getAbsolutePath());
try {
modeController.getUserInputListenerFactory().getRibbonBuilder().updateRibbon(file.toURI().toURL());
}
catch (MalformedURLException e) {
LogUtils.severe("MModeControllerFactory.createStandardControllers(): "+e.getMessage());
}
}
else {
modeController.getUserInputListenerFactory().getRibbonBuilder().updateRibbon(ReferencesController.class.getResource("/xml/ribbons.xml"));
}
}
public void handleEvent(DocearEvent event) {
// if(event.getType() == DocearEventType.LIBRARY_NEW_REFERENCES_INDEXING_REQUEST && event.getEventObject() instanceof LinkTypeReferencesNode) {
// final File file = URIUtils.getAbsoluteFile(((LinkTypeReferencesNode)event.getEventObject()).getUri());
// SwingUtilities.invokeLater(new Runnable() {
// public void run() {
// ReferencesController contr = ReferencesController.getController();
// JabrefWrapper wrapper = contr.getJabrefWrapper();
// wrapper.replaceDatabase(file, true);
// }
// });
// } else
if(event.getType() == DocearEventType.APPLICATION_CLOSING) {
new ReferenceQuitAction().actionPerformed(null);
}
}
public NodeAttributeListener getAttributeListener() {
return attributeListener;
}
public static JabRefChangeListener getJabRefChangeListener() {
return jabRefChangeListener;
}
public MapModel getInChange() {
return inChange;
}
public void setInChange(MapModel inChange) {
this.inChange = inChange;
}
public MapModel getInAdd() {
return inAdd;
}
public void setInAdd(MapModel inAdd) {
this.inAdd = inAdd;
}
public void setAddedEntry(BibtexEntry entry) {
this.addedEntry = entry;
}
public BibtexEntry getAddedEntry() {
return this.addedEntry;
}
private class KeyBindInterceptor implements IKeyStrokeProcessor {
public boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed, boolean consumed) {
Object source = e.getSource();
if(hasPackageNameOrAncestor(source, "net.sf.jabref")) {
if(jabrefWrapper.getJabrefFrame().getMenuBar().processKeyBinding(ks, e, JComponent.WHEN_IN_FOCUSED_WINDOW, pressed)) {
e.consume();
}
return true;
}
return false;
}
private boolean hasPackageNameOrAncestor(Object obj, String packageName) {
if(obj == null || packageName == null) {
return false;
}
String str = obj.getClass().getPackage().getName();
if(str.startsWith(packageName)) {
return true;
}
else {
if(obj instanceof Component) {
return hasPackageNameOrAncestor(((Component) obj).getParent(), packageName);
}
}
return false;
}
}
private class UpdateReferencesAllMapsActionContributorFactory implements IRibbonContributorFactory {
private JCommandButton button;
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
public UpdateReferencesAllMapsActionContributorFactory(AWorkspaceModeExtension workspaceModeExtension) {
workspaceModeExtension.getView().addProjectSelectionListener(new IProjectSelectionListener() {
public void selectionChanged(ProjectSelectionEvent event) {
boolean enabled = (event.getSelectedProject() != null);
if(button != null) {
button.setEnabled(enabled);
}
}
});
}
/***********************************************************************************
* METHODS
**********************************************************************************/
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
@Override
public ARibbonContributor getContributor(final Properties attributes) {
return new ARibbonContributor() {
public String getKey() {
return attributes.getProperty("name");
}
@Override
public void contribute(RibbonBuildContext context, ARibbonContributor parent) {
button = RibbonActionContributorFactory.createCommandButton(updateReferencesAllMaps);
RibbonActionContributorFactory.updateRichTooltip(button, updateReferencesAllMaps, context.getBuilder().getAcceleratorManager().getAccelerator(updateReferencesAllMaps.getKey()));
updateReferencesAllMaps.setEnabled();
button.setEnabled(updateReferencesAllMaps.isEnabled());
ChildProperties childProps = new ChildProperties(parseOrderSettings(attributes.getProperty("orderPriority", "")));
childProps.set(RibbonElementPriority.class, RibbonActionContributorFactory.getPriority(attributes.getProperty("priority", "")));
parent.addChild(button, childProps);
}
@Override
public void addChild(Object child, ChildProperties properties) {
}
};
}
}
private class ChangeBibtexDatabaseActionContributorFactory implements IRibbonContributorFactory {
private JCommandButton button;
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
public ChangeBibtexDatabaseActionContributorFactory(AWorkspaceModeExtension workspaceModeExtension) {
workspaceModeExtension.getView().addProjectSelectionListener(new IProjectSelectionListener() {
public void selectionChanged(ProjectSelectionEvent event) {
boolean enabled = (event.getSelectedProject() != null);
if(button != null) {
button.setEnabled(enabled);
}
}
});
}
/***********************************************************************************
* METHODS
**********************************************************************************/
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
@Override
public ARibbonContributor getContributor(final Properties attributes) {
return new ARibbonContributor() {
public String getKey() {
return attributes.getProperty("name");
}
@Override
public void contribute(RibbonBuildContext context, ARibbonContributor parent) {
button = RibbonActionContributorFactory.createCommandButton(changeBibtexDatabase);
RibbonActionContributorFactory.updateRichTooltip(button, changeBibtexDatabase, context.getBuilder().getAcceleratorManager().getAccelerator(updateReferencesAllMaps.getKey()));
changeBibtexDatabase.setEnabled();
button.setEnabled(changeBibtexDatabase.isEnabled());
ChildProperties childProps = new ChildProperties(parseOrderSettings(attributes.getProperty("orderPriority", "")));
childProps.set(RibbonElementPriority.class, RibbonActionContributorFactory.getPriority(attributes.getProperty("priority", "")));
parent.addChild(button, childProps);
}
@Override
public void addChild(Object child, ChildProperties properties) {
}
};
}
}
}