package org.docear.plugin.core.features;
import org.freeplane.core.extension.IExtension;
import org.freeplane.core.io.IAttributeHandler;
import org.freeplane.core.io.IExtensionAttributeWriter;
import org.freeplane.core.io.ITreeWriter;
import org.freeplane.core.io.ReadManager;
import org.freeplane.core.io.WriteManager;
import org.freeplane.core.util.LogUtils;
import org.freeplane.features.map.MapController;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
public class DocearNodeModifiedExtensionController implements IExtension {
public static void install(ModeController modeController) {
modeController.addExtension(DocearNodeModifiedExtensionController.class, new DocearNodeModifiedExtensionController(modeController));
}
private static DocearNodeModifiedExtensionController getController(ModeController modeController) {
return (DocearNodeModifiedExtensionController) modeController.getExtension(DocearNodeModifiedExtensionController.class);
}
public static DocearNodeModifiedExtensionController getController() {
return getController(Controller.getCurrentModeController());
}
public DocearNodeModifiedExtensionController(final ModeController modeController){
final MapController mapController = Controller.getCurrentModeController().getMapController();
final ReadManager readManager = mapController.getReadManager();
final WriteManager writeManager = mapController.getWriteManager();
//read the last moved time attribute
readManager.addAttributeHandler("node", "MOVED", new IAttributeHandler() {
public void setAttribute(Object node, String value) {
if(node == null || value == null) {
return;
}
try {
getController(modeController).updateMovedTime((NodeModel) node, Long.decode(value).longValue());
}
catch (Exception e) {
LogUtils.warn(e);
}
}
});
//read the last folded time attribute
readManager.addAttributeHandler("node", "LAST_FOLDED", new IAttributeHandler() {
public void setAttribute(Object node, String value) {
if(node == null || value == null) {
return;
}
try {
getController(modeController).updateFoldedTime((NodeModel) node, Long.decode(value).longValue());
}
catch (Exception e) {
LogUtils.warn(e);
}
}
});
//read the last link opened time attribute
readManager.addAttributeHandler("node", "LINK_OPENED", new IAttributeHandler() {
public void setAttribute(Object node, String value) {
if(node == null || value == null) {
return;
}
try {
getController(modeController).updateLinkOpenedTime((NodeModel) node, Long.decode(value).longValue());
}
catch (Exception e) {
LogUtils.warn(e);
}
}
});
writeManager.addExtensionAttributeWriter(DocearNodeModifiedExtension.class, new IExtensionAttributeWriter() {
public void writeAttributes(ITreeWriter writer, Object userObject, IExtension extension) {
try {
final DocearNodeModifiedExtension modelExtension = extension != null ? (DocearNodeModifiedExtension) extension : DocearNodeModifiedExtensionController.getExtension((NodeModel) userObject);
if (modelExtension == null) {
return;
}
if(modelExtension.getLastMovedTime() > -1) {
writer.addAttribute("MOVED", Long.toString(modelExtension.getLastMovedTime()));
}
if(modelExtension.getLastFoldedTime() > -1) {
writer.addAttribute("LAST_FOLDED", Long.toString(modelExtension.getLastFoldedTime()));
}
if(modelExtension.getLastLinkOpenedTime() > -1) {
writer.addAttribute("LINK_OPENED", Long.toString(modelExtension.getLastLinkOpenedTime()));
}
}
catch (Exception e) {
LogUtils.warn(e);
}
}
});
}
public void updateMovedTime(NodeModel node, long timeMillis) {
if(node == null) {
return;
}
DocearNodeModifiedExtension model = getExtension(node);
if(model == null) {
model = new DocearNodeModifiedExtension();
node.addExtension(model);
}
model.setLastMovedTime(timeMillis);
}
public void updateMovedTime(NodeModel node) {
updateMovedTime(node, System.currentTimeMillis());
}
public void updateLinkOpenedTime(NodeModel node, long timeMillis) {
if(node == null) {
return;
}
DocearNodeModifiedExtension model = getExtension(node);
if(model == null) {
model = new DocearNodeModifiedExtension();
node.addExtension(model);
}
model.setLastLinkOpenedTime(timeMillis);
}
public void updateLinkOpenedTime(NodeModel node) {
updateLinkOpenedTime(node, System.currentTimeMillis());
}
public void updateFoldedTime(NodeModel node, long timeMillis) {
if(node == null) {
return;
}
DocearNodeModifiedExtension model = getExtension(node);
if(model == null) {
model = new DocearNodeModifiedExtension();
node.addExtension(model);
}
model.setLastFoldedTime(timeMillis);
}
public void updateFoldedTime(NodeModel node) {
updateFoldedTime(node, System.currentTimeMillis());
}
public static DocearNodeModifiedExtension getExtension(final NodeModel node) {
DocearNodeModifiedExtension docearNodeModel = (DocearNodeModifiedExtension) node.getExtension(DocearNodeModifiedExtension.class);
return docearNodeModel;
}
/**************************
*
* @author mg
*
*/
public class DocearNodeModifiedExtension implements IExtension {
private long lastMoved = -1;
private long lastLinkOpened = -1;
private long lastFolded = -1;
private long movedCount = 0;
private long editedCount = 0;
private long foldedCount = 0;
private long openedCount = 0;
public void setLastMovedTime(long timeMillis) {
this.lastMoved = timeMillis;
}
public void setLastLinkOpenedTime(long timeMillis) {
this.lastLinkOpened = timeMillis;
}
public void setLastFoldedTime(long timeMillis) {
this.lastFolded = timeMillis;
}
public long getLastMovedTime() {
return this.lastMoved;
}
public long getLastLinkOpenedTime() {
return this.lastLinkOpened;
}
public long getLastFoldedTime() {
return this.lastFolded;
}
public void incMovedCount() {
this.movedCount++;
}
public long getMovedCount() {
return this.movedCount;
}
public void incEditedCount() {
this.editedCount++;
}
public long getEditedCount() {
return this.editedCount;
}
public void incOpenedCount() {
this.openedCount++;
}
public long getOpenedCount() {
return this.openedCount;
}
public void incFoldedCount() {
this.foldedCount++;
}
public long getFoldedCount() {
return this.foldedCount;
}
}
}