changeset 28:0205c3f41d1d default tip

repackaging (separate textgridlab and dgilib local parts more rigorously
author dwinter
date Fri, 24 Aug 2012 09:42:57 +0200
parents 361d8c89338a
children
files .classpath META-INF/MANIFEST.MF icons/obj16/back.png icons/obj16/bg-round.png icons/obj16/birds-eye.png icons/obj16/brightness.png icons/obj16/calibration.png icons/obj16/cat.png icons/obj16/contrast.png icons/obj16/delmark.png icons/obj16/digilib-logo.png icons/obj16/down.png icons/obj16/down1.png icons/obj16/first.png icons/obj16/fwd.png icons/obj16/info.png icons/obj16/last.png icons/obj16/left.png icons/obj16/left1.png icons/obj16/mark.png icons/obj16/mirror-horizontal.png icons/obj16/mirror-vertical.png icons/obj16/options.png icons/obj16/original-size.png icons/obj16/page.png icons/obj16/pagewidth.png icons/obj16/quality.png icons/obj16/reference.png icons/obj16/reset.png icons/obj16/rgb.png icons/obj16/right.png icons/obj16/right1.png icons/obj16/rotate.png icons/obj16/size-bigger.png icons/obj16/size-smaller.png icons/obj16/up.png icons/obj16/up1.png icons/obj16/zoom-area.png icons/obj16/zoom-full.png icons/obj16/zoom-in.png icons/obj16/zoom-out.png plugin.xml src/de/mpg/mpiwg/itgroup/digilib/digiImage/DigiImage.java src/de/mpg/mpiwg/itgroup/digilib/plugin/DigilibHandler.java src/de/mpg/mpiwg/itgroup/digilib/plugin/editors/DigilibLinkEditorContributor.java src/de/mpg/mpiwg/itgroup/digilib/plugin/editors/DigilibLinkEditorPart.java
diffstat 46 files changed, 910 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/.classpath	Sat Jun 18 09:53:01 2011 +0200
+++ b/.classpath	Fri Aug 24 09:42:57 2012 +0200
@@ -3,7 +3,6 @@
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="lib" path="libs/commons-lang-2.3.jar"/>
-	<classpathentry kind="lib" path="libs/digilibservice-client-1.0-SNAPSHOT.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/de.mpg.mpiwg.itgroup.digilib.core"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="output" path="bin"/>
--- a/META-INF/MANIFEST.MF	Sat Jun 18 09:53:01 2011 +0200
+++ b/META-INF/MANIFEST.MF	Fri Aug 24 09:42:57 2012 +0200
@@ -11,10 +11,11 @@
  org.eclipse.ui.editors,
  org.eclipse.ui.ide,
  org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.100",
- org.apache.axis2.full;bundle-version="1.4.0",
  de.mpg.mpiwg.itgroup.digilib.core;bundle-version="0.0.1"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ClassPath: libs/commons-lang-2.3.jar,
  .,
  libs/digilibservice-client-1.0-SNAPSHOT.jar
+Import-Package: org.eclipse.core.filesystem,
+ org.jdom;version="1.1.1"
Binary file icons/obj16/back.png has changed
Binary file icons/obj16/bg-round.png has changed
Binary file icons/obj16/birds-eye.png has changed
Binary file icons/obj16/brightness.png has changed
Binary file icons/obj16/calibration.png has changed
Binary file icons/obj16/cat.png has changed
Binary file icons/obj16/contrast.png has changed
Binary file icons/obj16/delmark.png has changed
Binary file icons/obj16/digilib-logo.png has changed
Binary file icons/obj16/down.png has changed
Binary file icons/obj16/down1.png has changed
Binary file icons/obj16/first.png has changed
Binary file icons/obj16/fwd.png has changed
Binary file icons/obj16/info.png has changed
Binary file icons/obj16/last.png has changed
Binary file icons/obj16/left.png has changed
Binary file icons/obj16/left1.png has changed
Binary file icons/obj16/mark.png has changed
Binary file icons/obj16/mirror-horizontal.png has changed
Binary file icons/obj16/mirror-vertical.png has changed
Binary file icons/obj16/options.png has changed
Binary file icons/obj16/original-size.png has changed
Binary file icons/obj16/page.png has changed
Binary file icons/obj16/pagewidth.png has changed
Binary file icons/obj16/quality.png has changed
Binary file icons/obj16/reference.png has changed
Binary file icons/obj16/reset.png has changed
Binary file icons/obj16/rgb.png has changed
Binary file icons/obj16/right.png has changed
Binary file icons/obj16/right1.png has changed
Binary file icons/obj16/rotate.png has changed
Binary file icons/obj16/size-bigger.png has changed
Binary file icons/obj16/size-smaller.png has changed
Binary file icons/obj16/up.png has changed
Binary file icons/obj16/up1.png has changed
Binary file icons/obj16/zoom-area.png has changed
Binary file icons/obj16/zoom-full.png has changed
Binary file icons/obj16/zoom-in.png has changed
Binary file icons/obj16/zoom-out.png has changed
--- a/plugin.xml	Sat Jun 18 09:53:01 2011 +0200
+++ b/plugin.xml	Fri Aug 24 09:42:57 2012 +0200
@@ -46,4 +46,16 @@
       </initializer>
    </extension>
 
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            class="de.mpg.mpiwg.itgroup.digilib.plugin.editors.DigilibLinkEditorPart"
+            contributorClass="de.mpg.mpiwg.itgroup.digilib.plugin.editors.DigilibLinkEditorContributor"
+            default="false"
+            id="de.mpg.mpiwg.itgroup.digilib.plugin.digilibLinkEditor"
+            name="digilib editor">
+      </editor>
+   </extension>
+   
+  
 </plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/de/mpg/mpiwg/itgroup/digilib/digiImage/DigiImage.java	Fri Aug 24 09:42:57 2012 +0200
@@ -0,0 +1,292 @@
+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.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.preference.IPreferenceStore;
+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.ui.internal.Workbench;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+
+import de.mpg.mpiwg.itgroup.digilib.plugin.Activator;
+import de.mpg.mpiwg.itgroup.digilib.digiImage.properties.DigiImageProperties;
+import de.mpg.mpiwg.itgroup.digilib.listener.MoveClickListener;
+import de.mpg.mpiwg.itgroup.digilib.listener.ZoomAreaRectangleListener;
+import de.mpg.mpiwg.itgroup.digilib.plugin.editors.DigilibLinkEditorObservable;
+import de.mpg.mpiwg.itgroup.digilib.plugin.preferences.PluginPreferencePage;
+
+
+
+
+/**
+ * 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{
+	
+	/** 
+	 * 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;
+
+	private String baseUrl;
+	
+	
+	/**
+	 * 
+	 * @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;
+		IPreferenceStore store = Activator.getDefault().getPreferenceStore();
+		this.baseUrl = store.getString(PluginPreferencePage.baseUrl_id);
+		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.
+	 */
+	@SuppressWarnings("rawtypes")
+	public DigiImageProperties 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);
+		
+			
+		}
+		
+	}
+
+
+	@Override
+	public MoveClickListener getMoveClickListener() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	
+	
+}
+
+
--- a/src/de/mpg/mpiwg/itgroup/digilib/plugin/DigilibHandler.java	Sat Jun 18 09:53:01 2011 +0200
+++ b/src/de/mpg/mpiwg/itgroup/digilib/plugin/DigilibHandler.java	Fri Aug 24 09:42:57 2012 +0200
@@ -11,7 +11,7 @@
 import org.eclipse.ui.handlers.HandlerUtil;
 
 import de.mpg.mpiwg.itgroup.digilib.plugin.editors.DigilibLinkEditorInput;
-import de.mpg.mpiwg.itgroup.digilib.plugin.editors.DigilibLinkEditorPart;
+import de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart;
 
 /**
  * @author dwinter
@@ -44,7 +44,7 @@
 			DigilibLinkEditorInput input = new DigilibLinkEditorInput(file,DigilibLinkEditorInput.INDEX_META);
 			
 		try {
-			DigilibLinkEditorPart dp = (DigilibLinkEditorPart) HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().openEditor(input,"de.mpg.mpiwg.itgroup.digilib.plugin.digilibLinkEditor");
+			IDigilibLinkEditorPart dp = (IDigilibLinkEditorPart) HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().openEditor(input,"de.mpg.mpiwg.itgroup.digilib.plugin.digilibLinkEditor");
 			return dp;
 		} catch (PartInitException e) {
 			// TODO Auto-generated catch block
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/de/mpg/mpiwg/itgroup/digilib/plugin/editors/DigilibLinkEditorContributor.java	Fri Aug 24 09:42:57 2012 +0200
@@ -0,0 +1,103 @@
+package de.mpg.mpiwg.itgroup.digilib.plugin.editors;
+
+import org.eclipse.jface.action.*;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.ide.IDEActionFactory;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+
+/**
+ * Manages the installation/deinstallation of global actions for multi-page editors.
+ * Responsible for the redirection of global actions to the active editor.
+ * Multi-page contributor replaces the contributors for the individual editors in the multi-page editor.
+ */
+public class DigilibLinkEditorContributor extends MultiPageEditorActionBarContributor {
+	private IEditorPart activeEditorPart;
+	//private Action sampleAction;
+	/**
+	 * Creates a multi-page contributor.
+	 */
+	public DigilibLinkEditorContributor() {
+		super();
+		//createActions();
+	}
+	/**
+	 * Returns the action registed with the given text editor.
+	 * @return IAction or null if editor is null.
+	 */
+	protected IAction getAction(ITextEditor editor, String actionID) {
+		return (editor == null ? null : editor.getAction(actionID));
+	}
+	/* (non-JavaDoc)
+	 * Method declared in AbstractMultiPageEditorActionBarContributor.
+	 */
+
+	public void setActivePage(IEditorPart part) {
+		if (activeEditorPart == part)
+			return;
+
+		activeEditorPart = part;
+
+		IActionBars actionBars = getActionBars();
+		if (actionBars != null) {
+
+			ITextEditor editor = (part instanceof ITextEditor) ? (ITextEditor) part : null;
+
+			actionBars.setGlobalActionHandler(
+				ActionFactory.DELETE.getId(),
+				getAction(editor, ITextEditorActionConstants.DELETE));
+			actionBars.setGlobalActionHandler(
+				ActionFactory.UNDO.getId(),
+				getAction(editor, ITextEditorActionConstants.UNDO));
+			actionBars.setGlobalActionHandler(
+				ActionFactory.REDO.getId(),
+				getAction(editor, ITextEditorActionConstants.REDO));
+			actionBars.setGlobalActionHandler(
+				ActionFactory.CUT.getId(),
+				getAction(editor, ITextEditorActionConstants.CUT));
+			actionBars.setGlobalActionHandler(
+				ActionFactory.COPY.getId(),
+				getAction(editor, ITextEditorActionConstants.COPY));
+			actionBars.setGlobalActionHandler(
+				ActionFactory.PASTE.getId(),
+				getAction(editor, ITextEditorActionConstants.PASTE));
+			actionBars.setGlobalActionHandler(
+				ActionFactory.SELECT_ALL.getId(),
+				getAction(editor, ITextEditorActionConstants.SELECT_ALL));
+			actionBars.setGlobalActionHandler(
+				ActionFactory.FIND.getId(),
+				getAction(editor, ITextEditorActionConstants.FIND));
+			actionBars.setGlobalActionHandler(
+				IDEActionFactory.BOOKMARK.getId(),
+				getAction(editor, IDEActionFactory.BOOKMARK.getId()));
+			actionBars.updateActionBars();
+		}
+	}
+	private void createActions() {
+//		sampleAction = new Action() {
+//			public void run() {
+//				MessageDialog.openInformation(null, "digilibClient", "Sample Action Executed");
+//			}
+//		};
+//		sampleAction.setText("Sample Action");
+//		sampleAction.setToolTipText("Sample Action tool tip");
+//		sampleAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
+//				getImageDescriptor(IDE.SharedImages.IMG_OBJS_TASK_TSK));
+		}
+	public void contributeToMenu(IMenuManager manager) {
+//		IMenuManager menu = new MenuManager("Editor &Menu");
+//		manager.prependToGroup(IWorkbenchActionConstants.MB_ADDITIONS, menu);
+//		menu.add(sampleAction);
+	}
+	public void contributeToToolBar(IToolBarManager manager) {
+		//manager.add(new Separator());
+		//manager.add(sampleAction);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/de/mpg/mpiwg/itgroup/digilib/plugin/editors/DigilibLinkEditorPart.java	Fri Aug 24 09:42:57 2012 +0200
@@ -0,0 +1,499 @@
+// TODO:  Navigationselemente sollen nach Eclipserichtlinien in den local (view) toolbar (http://www.eclipse.org/articles/Article-UI-Guidelines/Contents.html)
+
+package de.mpg.mpiwg.itgroup.digilib.plugin.editors;
+
+
+//
+//import info.textgrid.lab.core.model.TGContentType;
+//import info.textgrid.lab.core.model.TextGridObject;
+//import info.textgrid.lab.core.model.TextGridProject;
+//import info.textgrid.lab.core.swtutils.AdapterUtils;
+import de.mpg.mpiwg.itgroup.digilib.digiImage.Messages;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.Observable;
+import java.util.Observer;
+
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.ide.FileStoreEditorInput;
+import org.eclipse.ui.part.EditorPart;
+import org.eclipse.ui.progress.UIJob;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+import org.jdom.JDOMException;
+
+import de.mpg.mpiwg.itgroup.digilib.core.plugin.Activator;
+
+import de.mpg.mpiwg.itgroup.digilib.digiImage.DigiImage;
+import de.mpg.mpiwg.itgroup.digilib.digiImage.DigiImageController;
+import de.mpg.mpiwg.itgroup.digilib.digiImage.DigiImageParameter;
+import de.mpg.mpiwg.itgroup.digilib.digiImage.DigiNav;
+import de.mpg.mpiwg.itgroup.digilib.digiImage.IDigiImage;
+import de.mpg.mpiwg.itgroup.digilib.digiImage.ImageLayout;
+import de.mpg.mpiwg.itgroup.digilib.digiImage.TextGridDigiImage;
+import de.mpg.mpiwg.itgroup.indexMeta.Utils.ParseIndexMeta;
+
+/**
+ * Displays an image with digilib an allows image manipulation on the image.
+ * TODO: textgrid elemente sollten in eine Extraklasse
+ * 
+ * @author dwinter
+ *
+ */
+public class DigilibLinkEditorPart extends EditorPart implements Observer, ITabbedPropertySheetPageContributor, IDigilibLinkEditorPart{
+
+	private static final int SIZE_DH = 1000;
+	private static final int SIZE_DW = 1000;
+	private Composite mainComposite;
+	private ScrolledComposite sc;
+	private TabbedPropertySheetPage tp=null;
+	private DigiImageParameter dp = null;
+	private boolean dirty;
+	private IDigiImage digiImage;
+	//private TextGridProject textGridProject;
+	private Composite imageComposite;
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+	 * 
+	 * Abgespeichert werden die Parameter des Digilib-Objektes als ein JSON object
+	 * FIXME: doSave erkennt nicht richtig den Filenamen wird daher immer zu saveas
+	 */
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	@Override
+	
+	public void doSave(final IProgressMonitor monitor) {
+		if (dp== null)
+			return;
+		
+			final IFile file = getAdapter(getEditorInput(), IFile.class);
+			if (file != null) {
+				final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+				try {
+					dp.save(outputStream);
+					file.setContents(new ByteArrayInputStream(outputStream.toByteArray()), true, true, monitor);
+					setDirty(false);
+				
+				} catch (final CoreException e) {
+					StatusManager.getManager().handle(e, Activator.PLUGIN_ID);
+				}
+			} else if (getEditorInput() instanceof FileStoreEditorInput) {
+				final URI targetURI = ((FileStoreEditorInput) getEditorInput()).getURI();
+				try {
+					final IFileStore store = EFS.getStore(targetURI);
+					final OutputStream outputStream = store.openOutputStream(EFS.NONE, monitor);
+					dp.save(outputStream);
+					outputStream.close();
+					setDirty(false);
+				} catch (final CoreException e) {
+					StatusManager.getManager().handle(e, Activator.PLUGIN_ID);
+				} catch (final IOException e) {
+					StatusManager.getManager().handle(
+							new Status(IStatus.ERROR, Activator.PLUGIN_ID, NLS.bind(
+									"save failed", targetURI,
+									e.getLocalizedMessage()), e), StatusManager.LOG | StatusManager.SHOW);
+				}
+			} else {
+				doSaveAs();
+			}
+		}
+	
+
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#doSaveAs()
+	 */
+	@Override
+	
+	public void doSaveAs() {
+		int selection = new MessageDialog(getSite().getShell(), "save as title", null,
+				Messages.DiglibLinkEditor_Save_As_What, MessageDialog.QUESTION_WITH_CANCEL, new String[] {
+						Messages.DiglibLinkEditor_TextGridRep, Messages.DiglibLinkEditor_Local_File, Messages.DiglibLinkEditor_Cancel }, 1 ).open();
+		switch (selection) {
+		case 0:
+			//saveAsTextGridObject(true);
+			break;
+		case 1:
+			saveAsLocalFile();
+			break;
+		}
+	}
+
+//	public void saveAsTextGridObject(boolean forceNew) {
+//		TextGridObject object = null;
+//		if (getEditorInput() instanceof IFileEditorInput)
+//			object = AdapterUtils.getAdapter(((IFileEditorInput) getEditorInput()).getFile(), TextGridObject.class);
+//		if (object == null || forceNew) {
+//			object = TextGridObject.getNewObjectInstance(textGridProject,
+//					TGContentType.of(Activator.CONTENT_TYPE_ID));
+//			final InputDialog dialog = new InputDialog(
+//					getSite().getShell(),
+//					Messages.DiglibLinkEditor_Save_as_TextGrid_Title,
+//					NLS.bind(
+//							Messages.DiglibLinkEditor_Save_to_Target_Project,
+//							textGridProject), "", new IInputValidator() { //$NON-NLS-1$
+//
+//						@Override
+//						public String isValid(final String newText) {
+//							if (newText == null || newText.trim().isEmpty()) {
+//								return Messages.DigilibLinkEditor_Title_Validation_Warning;
+//							} else
+//								return null;
+//						}
+//					});
+//			if (dialog.open() != Window.CANCEL) {
+//				object.setTitle(dialog.getValue().trim());
+//			} else {
+//				return;
+//			}
+//
+//			final IEditorInput input = AdapterUtils.getAdapter(object, IEditorInput.class);
+//			setInputWithNotify(input);
+//		}
+//		new Job(NLS.bind(Messages.DiglibLinkEditor_Saving_x, object)) {
+//
+//			@Override
+//			protected IStatus run(final IProgressMonitor monitor) {
+//				doSave(monitor);
+//				if (monitor.isCanceled())
+//					return Status.CANCEL_STATUS;
+//				return Status.OK_STATUS;
+//			}
+//		}.schedule();
+//	}
+//
+//	
+
+
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#saveAsLocalFile()
+	 */
+	@Override
+	public void saveAsLocalFile() {
+		final FileDialog fileDialog = new FileDialog(getSite().getShell(), SWT.SAVE);
+		//fileDialog.setFilterExtensions(new String[] { "." //$NON-NLS-1$
+		//		+ TGContentType.getContentType(Activator.CONTENT_TYPE_ID).getExtension() });
+		//fileDialog.setFilterNames(new String[] { TGContentType.getContentType(Activator.CONTENT_TYPE_ID).getDescription() });
+		fileDialog.setText(Messages.DiglibLinkEditor_SaveImportSpecAsTitle);
+		final String fileName = fileDialog.open();
+		if (fileName != null) {
+			final URI fileURI = new File(fileName).toURI();
+			try {
+				final FileStoreEditorInput input = new FileStoreEditorInput(EFS.getStore(fileURI));
+				setPartName(input.getName());
+				setInputWithNotify(input);
+				doSave(new NullProgressMonitor());
+			} catch (final CoreException e) {
+				StatusManager.getManager().handle(e, Activator.PLUGIN_ID);
+			}
+		}
+	}
+
+
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
+	 */
+	
+	@Override
+	public void init(IEditorSite site, IEditorInput input)
+			throws PartInitException {
+		setInput(input);
+		setSite(site);
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#isDirty()
+	 */
+	
+	@Override
+	public boolean isDirty() {
+		return dirty;
+	}
+
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#isSaveAsAllowed()
+	 */
+	@Override
+	
+	public boolean isSaveAsAllowed() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#createPartControl(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	
+	public void createPartControl(Composite frame) {
+	
+		sc = new ScrolledComposite(frame, SWT.H_SCROLL | SWT.V_SCROLL);
+		mainComposite = new Composite(sc,SWT.None);
+		
+		GridLayout imageLayout = new GridLayout(2,false);
+		mainComposite.setLayout(imageLayout);
+		
+		Layout imgLayout = new ImageLayout();
+		imageComposite = new Composite(mainComposite,SWT.None);
+		imageComposite.setLayout(imgLayout);
+		sc.setContent(mainComposite);
+		//sc.setMinSize(400, 400);
+		
+
+
+		DigilibLinkEditorInput input= (DigilibLinkEditorInput) getEditorInput();
+		
+		String path="";
+		
+		sc.layout();
+		Point size = sc.getSize();
+		
+		//this.getViewer().
+        
+       
+		int dh = SIZE_DH;
+		int dw = SIZE_DW;
+		
+		if (input.getType()==DigilibLinkEditorInput.INDEX_META){
+			ParseIndexMeta im;
+			try {
+				im = new ParseIndexMeta(input.getFile());
+			} catch (JDOMException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				return;
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				return;
+			} catch (CoreException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				return;
+			}
+			try {
+				path=im.getImagePath();
+				path=path.replace("/mpiwg/online", "");
+				dp = new DigiImageParameter(path);
+				dp.setType(input.getType());
+				dp.setDh(dh);
+				dp.setDw(dw);
+				//dp.setDh(SIZE_DH);
+				//dp.setDw(SIZE_DW);
+				digiImage = new DigiImage(mainComposite, SWT.BORDER, dp);
+			} catch (JDOMException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				return;
+			}
+			if (path==null)
+				return;
+		} else if (input.getType()==DigilibLinkEditorInput.TEXTGRID){
+			path = input.getUri().toASCIIString();
+			
+			dp = input.getParameter();
+			if (dp==null){
+			dp = new DigiImageParameter(path);
+			}
+			dp.setType(input.getType());
+			dp.setDh(SIZE_DH);
+			dp.setDw(SIZE_DW);
+			digiImage = new TextGridDigiImage(imageComposite, SWT.BORDER, dp,input.getSid());
+			
+		} else {
+			//TODO: issue warning that type cannot be solved.
+			return;
+		}
+		
+		
+	
+		
+
+		
+		DigiImageController digiImageController = new DigiImageController(digiImage);
+		//imageComp.setBackgroundImage(img);		
+		new DigiNav(mainComposite,SWT.NONE,digiImageController);
+		
+		getSite().setSelectionProvider(digiImage);
+		//StructuredSelection strucSel = new StructuredSelection(digiImage);
+		digiImage.setSelection(new StructuredSelection(digiImage));
+		
+		sc.setMinSize(mainComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+		sc.setExpandHorizontal(true);
+	    sc.setExpandVertical(true);
+	    sc.layout();
+		DigilibLinkEditorObservable.INSTANCE.addObserver(this);
+		
+		//setSelection( digiImage);
+	}
+
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#setFocus()
+	 */
+	@Override
+	
+	public void setFocus() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
+	 * Called from the observable
+	 */
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#update(java.util.Observable, java.lang.Object)
+	 */
+	@Override
+	public void update(Observable o, Object arg) {
+		/*
+		 * If the argument ist digiImage then rerender the editor and update the properties
+		 */
+		if (IDigiImage.class.isInstance(arg)){
+			
+			mainComposite.pack();
+			
+			sc.setMinSize(mainComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+			sc.layout();
+			dirty=true;
+			firePropertyChange(PROP_DIRTY);
+	
+			//Object[] ls = getListeners();
+			//System.out.println(ls);
+			
+			if  (tp!=null)
+				tp.refresh();
+			
+		
+		} else if (Integer.class.isInstance(arg)){
+			//if it is in integer then the argument is the status of the cursor
+			int b = (Integer) arg;
+			
+			
+			try {
+				Cursor waitCursor = new Cursor(mainComposite.getDisplay(), b);
+				mainComposite.setCursor(waitCursor);
+			} catch (Exception e) {
+				// TODO: handle exception
+				
+			}
+		
+		}
+		
+	
+	}
+
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#getDigiImage()
+	 */
+	@Override
+	public IDigiImage getDigiImage(){
+		return digiImage;
+		
+		
+		
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId()
+	 */
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#getContributorId()
+	 */
+	@Override
+	public String getContributorId() {
+		String contribId = getSite().getId();
+		return contribId;
+	}
+    	
+	 /* (non-Javadoc)
+	 * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class)
+	 */
+	/* (non-Javadoc)
+	 * @see de.mpg.mpiwg.itgroup.digilib.plugin.editors.IDigilibLinkEditorPart#getAdapter(java.lang.Class)
+	 */
+	@Override
+	@SuppressWarnings("rawtypes")
+	public Object getAdapter(Class adapter) {
+	        if (adapter == IPropertySheetPage.class){
+	           
+	            tp =  new TabbedPropertySheetPage(this);
+	            return tp;
+	        }
+	        return super.getAdapter(adapter);
+	    }
+
+	void setDirty(final boolean dirty) {
+		this.dirty = dirty;
+		UIJob uiJob = new UIJob("Set dirty") { //$NON-NLS-1$
+
+			public IStatus runInUIThread(IProgressMonitor monitor) {
+				firePropertyChange(PROP_DIRTY);
+				return Status.OK_STATUS;
+			}
+		};
+		uiJob.setSystem(true);
+		uiJob.schedule();
+	}
+
+
+	 public static <T> T getAdapter(Object source, Class<T> type) {
+         
+         if (source == null)
+                 return null;
+
+         if (type.isInstance(source))
+                 return (T) source;
+
+         if (source instanceof IAdaptable)
+                 return (T) ((IAdaptable) source).getAdapter(type);
+
+         return (T) Platform.getAdapterManager().getAdapter(source, type);
+ }
+
+
+//	public void setTextGridProject(TextGridProject project) {
+//		this.textGridProject=project;
+//		
+//	}
+
+}