/**
* author: Marcel Genzmehr
* 18.08.2011
*/
package org.docear.plugin.core.workspace.node;
import java.awt.Component;
import java.io.File;
import java.net.URI;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultTreeCellRenderer;
import org.docear.plugin.core.DocearController;
import org.docear.plugin.core.ILibraryRepository;
import org.docear.plugin.core.event.DocearEvent;
import org.docear.plugin.core.event.DocearEventType;
import org.docear.plugin.core.event.IDocearEventListener;
import org.freeplane.core.util.LogUtils;
import org.freeplane.core.util.TextUtils;
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.dnd.IWorkspaceTransferableCreator;
import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
import org.freeplane.plugin.workspace.nodes.AFolderNode;
import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
public class FolderTypeLibraryNode extends AFolderNode implements ILibraryRepository, IDocearEventListener, IWorkspaceNodeActionListener, IWorkspaceTransferableCreator, TreeModelListener {
private static final Icon DEFAULT_ICON = new ImageIcon(FolderTypeLibraryNode.class.getResource("/images/folder-database.png"));
private static final long serialVersionUID = 1L;
public static final String TYPE = "library";
private final Set<URI> mindmapIndex = new HashSet<URI>();
private static WorkspacePopupMenu popupMenu = null;
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
public FolderTypeLibraryNode() {
this(TYPE);
}
public FolderTypeLibraryNode(String type) {
super(type);
DocearController.getController().getEventQueue().addEventListener(this);
WorkspaceController.getCurrentModel().addTreeModelListener(this);
}
/***********************************************************************************
* METHODS
**********************************************************************************/
public void initializePopup() {
if (popupMenu == null) {
popupMenu = new WorkspacePopupMenu();
WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
WorkspacePopupMenuBuilder.createSubMenu(TextUtils.getRawText("workspace.action.new.label")),
"workspace.action.node.new.folder",
"workspace.action.node.new.link",
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.library.new.mindmap",
WorkspacePopupMenuBuilder.endSubMenu(),
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.node.open.location",
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.node.cut",
"workspace.action.node.copy",
"workspace.action.node.paste",
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.node.remove",
"workspace.action.file.delete",
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.node.refresh"
});
}
}
public boolean setIcons(DefaultTreeCellRenderer renderer) {
renderer.setOpenIcon(DEFAULT_ICON);
renderer.setClosedIcon(DEFAULT_ICON);
renderer.setLeafIcon(DEFAULT_ICON);
return true;
}
protected AWorkspaceTreeNode clone(FolderTypeLibraryNode node) {
for(URI uri : mindmapIndex) {
node.addMindmapToIndex(uri);
}
return super.clone(node);
}
public AWorkspaceTreeNode clone() {
FolderTypeLibraryNode node = new FolderTypeLibraryNode(getType());
return clone(node);
}
protected void addMindmapToIndex(URI uri) {
LogUtils.info("DOCEAR: adding mindmap to library: "+ uri);
mindmapIndex.add(uri);
}
@Override
public boolean isSystem() {
return true;
}
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
public void handleEvent(DocearEvent event) {
if(event.getType() == DocearEventType.LIBRARY_NEW_MINDMAP_INDEXING_REQUEST) {
if(event.getEventObject() instanceof URI) {
URI uri = (URI) event.getEventObject();
if(!mindmapIndex.contains(uri)) {
addMindmapToIndex(uri);
}
}
}
else if(event.getType() == DocearEventType.LIBRARY_EMPTY_MINDMAP_INDEX_REQUEST) {
mindmapIndex.clear();
}
}
public void handleAction(WorkspaceActionEvent event) {
if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
showPopup( (Component) event.getBaggage(), event.getX(), event.getY());
}
}
public WorkspaceTransferable getTransferable() {
return null;
}
public WorkspacePopupMenu getContextMenu() {
if (popupMenu == null) {
initializePopup();
}
return popupMenu;
}
public URI getPath() {
// this is a virtual folder, no path is needed
return null;
}
public void treeNodesChanged(TreeModelEvent e) {
}
//WORKSPACE - info
public void treeNodesInserted(TreeModelEvent event) {
if(this.getTreePath().isDescendant(event.getTreePath())) {
for(Object newNode : event.getChildren()) {
URI uri = null;
try {
if(newNode instanceof LinkTypeIncomingNode) {
uri = URIUtils.getAbsoluteURI(((LinkTypeIncomingNode)newNode).getLinkURI());
}
else
if(newNode instanceof LinkTypeLiteratureAnnotationsNode) {
uri = URIUtils.getAbsoluteURI(((LinkTypeLiteratureAnnotationsNode)newNode).getLinkURI());
}
else
if(newNode instanceof LinkTypeMyPublicationsNode) {
uri = URIUtils.getAbsoluteURI(((LinkTypeMyPublicationsNode)newNode).getLinkURI());
}
else
if(newNode instanceof DefaultFileNode) {
uri = ((DefaultFileNode)newNode).getFile().toURI();
}
else
if(newNode instanceof LinkTypeFileNode && ((LinkTypeFileNode)newNode).getLinkURI() != null) {
uri = URIUtils.getAbsoluteURI(((LinkTypeFileNode)newNode).getLinkURI());
}
}
catch (Exception e) {
LogUtils.warn("Exception in "+ this.getClass() +".treeNodesInserted(): "+ e.getMessage() );
}
if(uri != null) {
addToIndex(uri);
}
}
}
}
private void addToIndex(URI uri) {
if((new File(uri)).getName().endsWith(".mm") && !mindmapIndex.contains(uri)) {
LogUtils.info("DOCEAR: adding new mindmap to library: "+ uri);
mindmapIndex.add(uri);
}
}
public void treeNodesRemoved(TreeModelEvent event) {
//TODO: propagate other filetypes
if(this.getTreePath().isDescendant(event.getTreePath())) {
for(Object newNode : event.getChildren()) {
if(newNode instanceof DefaultFileNode) {
URI uri = ((DefaultFileNode)newNode).getFile().toURI();
removeFromIndex(uri);
}
else
if(newNode instanceof LinkTypeFileNode) {
URI uri = URIUtils.getAbsoluteURI(((LinkTypeFileNode)newNode).getLinkURI());
removeFromIndex(uri);
}
}
}
}
private void removeFromIndex(URI uri) {
if((new File(uri)).getName().endsWith(".mm") && mindmapIndex.contains(uri)) {
LogUtils.info("DOCEAR: mindmap removed from library: "+ uri);
mindmapIndex.remove(uri);
}
}
public void treeStructureChanged(TreeModelEvent e) {
// TODO Auto-generated method stub
}
@Override
public Collection<URI> getMaps() {
return mindmapIndex;
}
}