Mercurial > hg > de.mpg.mpiwg.itgroup.digilib.plugin
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; // // } }