/**
* author: Marcel Genzmehr
* 18.08.2011
*/
package org.docear.plugin.core.workspace.node;
import java.awt.Component;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.URI;
import javax.swing.Icon;
import javax.swing.ImageIcon;
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.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.workspace.node.config.NodeAttributeObserver;
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.event.WorkspaceActionEvent;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
/**
*
*/
public class LinkTypeReferencesNode extends LinkTypeFileNode implements IBibtexDatabase, ChangeListener {
private static final String DEFAULT_REFERENCE_TEMPLATE = "/conf/reference_db.bib";
private static final Icon DEFAULT_ICON = new ImageIcon(LinkTypeReferencesNode.class.getResource("/images/text-x-bibtex.png"));
private static final long serialVersionUID = 1L;
private boolean locked = false;
private WorkspacePopupMenu popupMenu = null;
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
public LinkTypeReferencesNode(String type) {
super(type);
CoreConfiguration.referencePathObserver.addChangeListener(this);
}
/***********************************************************************************
* METHODS
**********************************************************************************/
public boolean setIcons(DefaultTreeCellRenderer renderer) {
renderer.setOpenIcon(DEFAULT_ICON);
renderer.setClosedIcon(DEFAULT_ICON);
renderer.setLeafIcon(DEFAULT_ICON);
return true;
}
public void handleAction(WorkspaceActionEvent event) {
if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
showPopup((Component) event.getBaggage(), event.getX(), event.getY());
}
else {
super.handleAction(event);
}
}
public AWorkspaceTreeNode clone() {
LinkTypeReferencesNode node = new LinkTypeReferencesNode(this.getType());
return clone(node);
}
public void disassociateReferences() {
CoreConfiguration.referencePathObserver.removeChangeListener(this);
}
public void setLinkPath(URI uri) {
super.setLinkPath(uri);
if(!locked) {
locked = true;
CoreConfiguration.referencePathObserver.setUri(uri);
locked = false;
}
if (uri != null) {
createIfNeeded(uri);
}
DocearEvent event = new DocearEvent(this, DocearEventType.LIBRARY_NEW_REFERENCES_INDEXING_REQUEST, this);
DocearController.getController().dispatchDocearEvent(event);
}
public void setName(String name) {
super.setName("References");
}
public void initializePopup() {
if (popupMenu == null) {
popupMenu = new WorkspacePopupMenu();
WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
"workspace.action.docear.uri.change",
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.refresh"
});
}
}
public WorkspacePopupMenu getContextMenu() {
if (popupMenu == null) {
initializePopup();
}
return popupMenu;
}
public void refresh() {
//maybe do sth
}
private void createIfNeeded(URI uri) {
try {
File file = WorkspaceUtils.resolveURI(uri);
if(file != null) {
if (!file.getParentFile().exists()) {
if(!file.getParentFile().mkdirs()) {
return;
}
}
if(!file.exists()) {
if(!file.createNewFile()) {
return;
} else {
copyDefaultsTo(file);
}
}
this.setName(file.getName());
}
}
catch (IOException e) {
return;
}
}
private void copyDefaultsTo(File config) throws FileNotFoundException, IOException {
String referenceContent;
referenceContent = getFileContent(DEFAULT_REFERENCE_TEMPLATE);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(config)));
out.write(referenceContent.getBytes());
out.close();
}
private String getFileContent(String filename) throws IOException {
InputStream in = getClass().getResourceAsStream(filename);
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
}
finally {
in.close();
}
return writer.toString();
}
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
public URI getUri() {
return this.getLinkPath();
}
public void stateChanged(ChangeEvent e) {
if(!locked && e.getSource() instanceof NodeAttributeObserver) {
locked = true;
URI uri = ((NodeAttributeObserver) e.getSource()).getUri();
this.setLinkPath(uri);
locked = false;
}
}
}