view src/de/mpg/mpiwg/itgroup/digilib/plugin/editors/DigilibLinkEditorPart.java @ 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
children
line wrap: on
line source

// 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;
//		
//	}

}