view src/de/mpg/mpiwg/itgroup/digilib/digiImage/DigiImage.java @ 21:643fa1daa70c

minor changes
author dwinter
date Wed, 05 Jan 2011 11:35:45 +0100
parents 2f47c136b8a6
children 7153018334a1
line wrap: on
line source

package de.mpg.mpiwg.itgroup.digilib.digiImage;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;



import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.views.properties.IPropertySource;

import de.mpg.mpiwg.itgroup.digilib.digiImage.properties.DigiImageProperties;
import de.mpg.mpiwg.itgroup.digilib.manipulator.extensions.ZoomAreaRectangleListener;
import de.mpg.mpiwg.itgroup.digilib.plugin.editors.DigilibLinkEditorObservable;




/**
 * Refers to an Digilib-Scaler Object either an image or an folder. The object contains an swt-label object, so that it can be embedded e.g. in Eclipse.
 * @author dwinter
 *
 */
public class DigiImage implements IDigiImage, IAdaptable, ISelectionProvider{
	
	/** 
	 * Implemens a connection to Digilib.
	 */
    
	private List<ISelectionChangedListener> selectionChangeListener = new ArrayList<ISelectionChangedListener>();

	/* some parameters should not occur in the URL constructed by {@link #createUrlFromParameter(DigiImageParameter)} if set to negative values.
	 * 
	 */
	private static String[] omitIfNegativeArray = {"dw","dh","ddpi","ddpix","ddpiy"}; 
	private static List<String> omitIfNegative = Arrays.asList(omitIfNegativeArray);
	
	
	private String baseUrl="http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler";
		
	/**
	 * Get the Url of the digilib scaler, set to http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler, if not changed. 
	 * TODO should be part of a configuration/preference file
	 * @return
	 */
	public String getBaseUrl() {
		return baseUrl;
	}

	/**
	 * Setze die Basis url des Digilib-Scalers
	 * @param baseUrl
	 */
	public void setBaseUrl(String baseUrl) {
		this.baseUrl = baseUrl;
	}

	private Label label;
	
	/* (non-Javadoc)
	 * @see de.mpg.mpiwg.itgroup.digilib.digiImage.IDigiImage#getLabel()
	 */
	public Label getLabel() {
		return label;
	}

	/* (non-Javadoc)
	 * @see de.mpg.mpiwg.itgroup.digilib.digiImage.IDigiImage#setLabel(org.eclipse.swt.widgets.Label)
	 */
	public void setLabel(Label label) {
		this.label = label;
	}

	//private URL url;
	private Composite parent;
	
	private DigiImageParameter dp;
	
	
	/**
	 * 
	 * @param parent Composite where the image should be become a child of.
	 * @param style SWT Style how to display the image as a composite. For more the the style parameter at @see import org.eclipse.swt.widgets.Label
	 * @param dp Set of Parameters which define how the image should be displayed.
	 */
	public DigiImage(Composite parent, int style, DigiImageParameter dp) {
		//super(parent,style);
		label = new Label(parent, style);
		this.parent = parent;
		this.dp=dp;
		try {
			setNewURL(createUrlFromParameter(dp));
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	/**
	 * Sets the complete URL of the manipulated image and changes the image object in the composite.
	 * @param url
	 */
	private void setNewURL(URL url) {
		//this.url = url;
		
	
		InputStream is;
		try {
			is = url.openStream();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return;
		}
		Image img = new Image(parent.getDisplay(),is);
		//Label label = new Label(parent, SWT.None);
		label.setImage(img);
		
		label.setVisible(true);
	}

	
	/* (non-Javadoc)
	 * @see de.mpg.mpiwg.itgroup.digilib.digiImage.IDigiImage#getParent()
	 */
	public Composite getParent() {
		return parent;
	}


	/**
	 * Creates the URL to digilib from the given parameter set. For the documentation @see {@link http://developer.berlios.de/docman/display_doc.php?docid=106&group_id=251}.
	 * @param dp
	 * @return
	 * @throws MalformedURLException
	 */
	private URL createUrlFromParameter(DigiImageParameter dp) throws MalformedURLException{
		
		Map<String, String> qa = dp.createMapFromParameters(omitIfNegative);
		
		List<String> queryArray = new ArrayList<String>();
		for(String key:qa.keySet()){
			queryArray.add(key+"="+qa.get(key));
		}
		String queryString = StringUtils.join(queryArray,"&");
		
		String stringUrl=baseUrl+"?"+queryString;
		return new URL(stringUrl);
	}



	/* (non-Javadoc)
	 * @see de.mpg.mpiwg.itgroup.digilib.digiImage.IDigiImage#getParameter()
	 */
	public DigiImageParameter getParameter() {
		
		return dp;
	}

	/* (non-Javadoc)
	 * @see de.mpg.mpiwg.itgroup.digilib.digiImage.IDigiImage#setParameter(de.mpg.mpiwg.itgroup.digilib.digiImage.DigiImageParameter)
	 */
	public void setParameter(DigiImageParameter dp) {
		this.dp=dp;
		
	}
	
	/* (non-Javadoc)
	 * @see de.mpg.mpiwg.itgroup.digilib.digiImage.IDigiImage#redraw()
	 */
	public void redraw(){
		try {
			setNewURL(createUrlFromParameter(dp));
			setSelection(new StructuredSelection(this));
			DigilibLinkEditorObservable.INSTANCE.imageHasChanged(this);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	private ZoomAreaRectangleListener rectangleListener=null;
	
	/* (non-Javadoc)
	 * @see de.mpg.mpiwg.itgroup.digilib.digiImage.IDigiImage#getRectangleListener()
	 */
	public ZoomAreaRectangleListener getRectangleListener() {
	
		return rectangleListener;
	}

	/* (non-Javadoc)
	 * @see de.mpg.mpiwg.itgroup.digilib.digiImage.IDigiImage#setRectangleListener(de.mpg.mpiwg.itgroup.digilib.manipulator.extensions.RectangleListener)
	 */
	public void setRectangleListener(ZoomAreaRectangleListener rectangleListener) {
		this.rectangleListener = rectangleListener;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
	 * 
	 * Digiimage shows properties if asked to.
	 */
	public Object getAdapter(Class adapter) {
		if (adapter == IPropertySource.class)
			return new DigiImageProperties(this);	
		return null;
		
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
	 * Digiimage registeres selelection changers
	 */
	public void addSelectionChangedListener(ISelectionChangedListener listener) {
		selectionChangeListener.add(listener);
		
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
	 * Selection is the object itself.
	 */
	public ISelection getSelection() {
		
		return new StructuredSelection(this);
	}

	public void removeSelectionChangedListener(
			ISelectionChangedListener listener) {
		selectionChangeListener.remove(listener);
		
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
	 * Informs all listeners that selection has changed.
	 */
	public void setSelection(ISelection selection) {
		
		for  (ISelectionChangedListener sl: selectionChangeListener){
		
			SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
			sl.selectionChanged(event);
		
			
		}
		
	}

	
}