package org.freeplane.view.swing.features.filepreview;
import java.awt.Dimension;
import java.net.MalformedURLException;
import java.net.URI;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import org.freeplane.core.extension.IExtension;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.url.UrlManager;
import org.freeplane.view.swing.map.MapView;
import org.freeplane.view.swing.map.NodeView;
public class ExternalResource implements IExtension {
final private Set<NodeView> viewers;
public ExternalResource(URI uri) {
if(uri == null)
throw new NullPointerException();
viewers = new HashSet<NodeView>();
this.uri = uri;
}
void removeViewers() {
for (final NodeView nodeView : viewers) {
nodeView.removeContent(ViewerController.VIEWER_POSITION);
}
viewers.clear();
}
public Set<NodeView> getViewers() {
return viewers;
}
public URI getUri() {
return uri;
}
public URI getAbsoluteUri(final MapModel map) {
try {
final UrlManager urlManager = (UrlManager) Controller.getCurrentModeController().getExtension(UrlManager.class);
final URI absoluteUri = urlManager.getAbsoluteUri(map, uri);
return absoluteUri;
}
catch (final MalformedURLException e) {
e.printStackTrace();
}
return null;
}
final private URI uri;
private float zoom = -1f;
public float getZoom() {
return zoom;
}
public void setZoom(final float r) {
zoom = r;
for (final NodeView nodeView : viewers) {
final JComponent viewer = nodeView.getContent(ViewerController.VIEWER_POSITION);
final IViewerFactory factory = (IViewerFactory) viewer.getClientProperty(IViewerFactory.class);
final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, viewer);
final Dimension preferredSize = factory.getOriginalSize(viewer);
preferredSize.width = (int) (preferredSize.width * r);
preferredSize.height = (int) (preferredSize.height * r);
preferredSize.width = mapView.getZoomed(preferredSize.width);
preferredSize.height = mapView.getZoomed(preferredSize.height);
factory.setFinalViewerSize(viewer, preferredSize);
viewer.revalidate();
}
}
public float setZoom(final int originalWidth, final int maximumWidth) {
float zoom;
final float zoomedWidth;
if(originalWidth <= maximumWidth){
zoomedWidth = originalWidth;
zoom = 1;
}
else{
zoomedWidth = maximumWidth;
zoom = zoomedWidth /originalWidth;
}
setZoom(zoom);
return zoom;
}
}