/** * */ package org.freeplane.plugin.script.proxy; import java.io.File; import java.net.URI; import java.net.URL; import org.freeplane.core.util.LogUtils; import org.freeplane.features.map.NodeModel; import org.freeplane.plugin.script.ScriptContext; import org.freeplane.view.swing.features.filepreview.ExternalResource; import org.freeplane.view.swing.features.filepreview.ViewerController; class ExternalObjectProxy extends AbstractProxy<NodeModel> implements Proxy.ExternalObject { ExternalObjectProxy(final NodeModel delegate, final ScriptContext scriptContext) { super(delegate, scriptContext); } private ExternalResource getExternalObjectModel() { return (ExternalResource) getDelegate().getExtension(ExternalResource.class); } public String getUri() { final ExternalResource externalObject = getExternalObjectModel(); final URI uri = externalObject == null ? null : externalObject.getUri(); return uri == null ? null : uri.toString(); } @Deprecated public String getURI() { return getUri(); } private ViewerController getViewerController() { return getModeController().getExtension(ViewerController.class); } public float getZoom() { final ExternalResource externalObject = getExternalObjectModel(); return externalObject == null ? 1f : externalObject.getZoom(); } public void setUri(final String target) { if (!removeIfTargetIsNull(target)) { setUriImpl(convertToUri(target)); } } public void setUri(final Object target) { if (!removeIfTargetIsNull(target)) { setUriImpl(convertToUri(target)); } } public void setFile(final File target) { if (!removeIfTargetIsNull(target)) { setUriImpl(convertToUri(target)); } } private URI convertToUri(Object target) { try { if (target instanceof URI) { return (URI) target; } else if (target instanceof String) { // file names are not usable for displaying images return new URL((String) target).toURI(); } else if (target instanceof File) { return ((File) target).toURI(); } else if (target instanceof URL) { return ((URL) target).toURI(); } else { LogUtils.warn("cannot convert to an uri: " + target); return null; } } catch (Exception e) { LogUtils.warn("cannot convert to an uri: " + target, e); return null; } } private boolean removeIfTargetIsNull(Object target) { if (target == null && getExternalObjectModel() != null) { getViewerController().undoableToggleHook(getDelegate(), null); return true; } return false; } private void setUriImpl(final URI uri) { if (uri != null) getViewerController().paste(uri, getDelegate()); } @Deprecated public void setURI(final String uri) { setUri(uri); } public void setZoom(final float zoom) { final ExternalResource externalObject = getExternalObjectModel(); if (externalObject != null) getViewerController().setZoom(getModeController(), getDelegate().getMap(), externalObject, zoom); } /** make <code>if (node.externalObject) println "has an externalObject"</code> work. */ public boolean asBoolean() { return getExternalObjectModel() != null; } }