package org.docear.plugin.core.features;
import java.util.Date;
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.NodeChangeEvent;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
public class DocearNodePrivacyExtensionController implements IExtension {
public enum DocearPrivacyLevel {
PUBLIC, DEMO, PRIVATE
}
public static void install(ModeController modeController) {
modeController.addExtension(DocearNodePrivacyExtensionController.class, new DocearNodePrivacyExtensionController(modeController));
}
private static DocearNodePrivacyExtensionController getController(ModeController modeController) {
return (DocearNodePrivacyExtensionController) modeController.getExtension(DocearNodePrivacyExtensionController.class);
}
public static DocearNodePrivacyExtensionController getController() {
return getController(Controller.getCurrentModeController());
}
public static DocearNodePrivacyExtension getExtension(final NodeModel node) {
DocearNodePrivacyExtension extension = (DocearNodePrivacyExtension) node.getExtension(DocearNodePrivacyExtension.class);
return extension;
}
public DocearNodePrivacyExtensionController(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", "DCR_PRIVACY_LEVEL", new IAttributeHandler() {
public void setAttribute(Object node, String value) {
if(node == null || value == null) {
return;
}
try {
getController(modeController).setPrivacyLevel((NodeModel) node, DocearPrivacyLevel.valueOf(value));
}
catch (Exception e) {
LogUtils.warn(e);
}
}
});
writeManager.addExtensionAttributeWriter(DocearNodePrivacyExtension.class, new IExtensionAttributeWriter() {
public void writeAttributes(ITreeWriter writer, Object userObject, IExtension extension) {
try {
final DocearNodePrivacyExtension modelExtension = extension != null ? (DocearNodePrivacyExtension) extension : DocearNodePrivacyExtensionController.getExtension((NodeModel) userObject);
if (modelExtension == null) {
return;
}
if(!modelExtension.getPrivacyLevel().equals(DocearPrivacyLevel.PUBLIC)) {
writer.addAttribute("DCR_PRIVACY_LEVEL", modelExtension.getPrivacyLevel().toString());
}
}
catch (Exception e) {
LogUtils.warn(e);
}
}
});
}
public void setPrivacyLevel(NodeModel node, DocearPrivacyLevel level) {
if(node == null) {
return;
}
DocearNodePrivacyExtension extension = getExtension(node);
DocearPrivacyLevel oldValue = null;
if(extension == null) {
extension = new DocearNodePrivacyExtension();
node.addExtension(extension);
}
else {
oldValue = extension.getPrivacyLevel();
}
extension.setPrivacyLevel(level);
// update modification time
node.getHistoryInformation().setLastModifiedAt(new Date());
node.fireNodeChanged(new NodeChangeEvent(node, "DOCEAR_PRIVACY_LEVEL", oldValue, level));
}
/***************************************************
* @author mg
*
*/
public class DocearNodePrivacyExtension implements IExtension {
private DocearPrivacyLevel privacyLevel = DocearPrivacyLevel.PUBLIC;
public void setPrivacyLevel(DocearPrivacyLevel level) {
if(level == null) {
level = DocearPrivacyLevel.PUBLIC;
}
this.privacyLevel = level;
}
public DocearPrivacyLevel getPrivacyLevel() {
return this.privacyLevel;
}
}
}