/**
* author: Marcel Genzmehr
* 18.08.2011
*/
package org.docear.plugin.core.workspace.node;
import java.io.File;
import java.net.URI;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.tree.DefaultTreeCellRenderer;
import org.docear.plugin.core.CoreConfiguration;
import org.docear.plugin.core.workspace.node.config.NodeAttributeObserver;
import org.freeplane.core.util.LogUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.plugin.workspace.WorkspaceUtils;
import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
import org.freeplane.plugin.workspace.nodes.FolderLinkNode;
/**
*
*/
public class FolderTypeLiteratureRepositoryNode extends FolderLinkNode implements ChangeListener, IFileSystemRepresentation {
private static final long serialVersionUID = 1L;
private boolean locked;
private WorkspacePopupMenu popupMenu = null;
private static final Icon DEFAULT_ICON = new ImageIcon(FolderTypeLiteratureRepositoryNode.class.getResource("/images/books.png"));
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
public FolderTypeLiteratureRepositoryNode(String type) {
super(type);
CoreConfiguration.repositoryPathObserver.addChangeListener(this);
}
/***********************************************************************************
* METHODS
**********************************************************************************/
public AWorkspaceTreeNode clone() {
FolderTypeLiteratureRepositoryNode node = new FolderTypeLiteratureRepositoryNode(getType());
return clone(node);
}
public void disassociateReferences() {
CoreConfiguration.repositoryPathObserver.removeChangeListener(this);
}
public void setName(String name) {
super.setName("Literature Repository");
}
public void setPath(URI uri) {
super.setPath(uri);
locked = true;
CoreConfiguration.repositoryPathObserver.setUri(uri);
if (uri != null) {
createPathIfNeeded(uri);
}
locked = false;
}
public boolean setIcons(DefaultTreeCellRenderer renderer) {
renderer.setOpenIcon(DEFAULT_ICON);
renderer.setClosedIcon(DEFAULT_ICON);
renderer.setLeafIcon(DEFAULT_ICON);
return true;
}
private void createPathIfNeeded(URI uri) {
File file = WorkspaceUtils.resolveURI(uri);
if (file != null) {
if (!file.exists()) {
if (file.mkdirs()) {
LogUtils.info("New Literature Folder Created: " + file.getAbsolutePath());
}
}
this.setName(file.getName());
}
else {
this.setName("no folder selected!");
}
}
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.file.new.mindmap",
//WorkspacePopupMenuBuilder.SEPARATOR,
//"workspace.action.file.new.file",
WorkspacePopupMenuBuilder.endSubMenu(),
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.docear.uri.change",
"workspace.action.node.open.location",
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.node.cut",
"workspace.action.node.copy",
"workspace.action.node.paste",
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.node.rename",
"workspace.action.node.remove",
"workspace.action.file.delete",
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.node.physical.sort",
WorkspacePopupMenuBuilder.SEPARATOR,
"workspace.action.docear.enable.monitoring",
"workspace.action.node.refresh"
});
}
}
public WorkspacePopupMenu getContextMenu() {
if (popupMenu == null) {
initializePopup();
}
return popupMenu;
}
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
//TODO: replace by new method
public void propertyChanged(String propertyName, final String newValue, String oldValue) {
}
public void stateChanged(ChangeEvent e) {
if(!locked && e.getSource() instanceof NodeAttributeObserver) {
URI uri = ((NodeAttributeObserver) e.getSource()).getUri();
try{
createPathIfNeeded(uri);
}
catch (Exception ex) {
return;
}
this.setPath(uri);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
refresh();
}
});
}
}
public File getFile() {
return WorkspaceUtils.resolveURI(this.getPath());
}
}