Merge branch 'release/5.8.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / media / ImageFileElement.java
index 098620fd70d003c00b96a7bc129492c53277f732..24ea2910350a5b0beea9847016643c3f901c572f 100644 (file)
@@ -1,21 +1,21 @@
-// $Id$
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* European Distributed Institute of Taxonomy
 * http://www.e-taxonomy.eu
-* 
+*
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * See LICENSE.TXT at the top of this package for the full license terms.
 */
 
 package eu.etaxonomy.taxeditor.ui.section.media;
 
-import java.io.IOException;
 import java.net.URI;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.swt.events.SelectionListener;
 
 import eu.etaxonomy.cdm.common.media.ImageInfo;
@@ -30,136 +30,138 @@ import eu.etaxonomy.taxeditor.ui.element.KeyValueViewerElement;
 import eu.etaxonomy.taxeditor.ui.element.NumberWithLabelElement;
 
 /**
- * <p>ImageFileElement class.</p>
- *
  * @author n.hoffmann
  * @created Mar 26, 2010
- * @version 1.0
  */
 public class ImageFileElement extends MediaRepresentationPartElement<ImageFile> {
 
+    private final class LoadImageJob extends Job{
+
+        private URI uri;
+        private boolean updateDimensions;
+
+        public LoadImageJob(URI uri, boolean updateDimensions) {
+            super("Load image");
+            this.uri = uri;
+            this.updateDimensions = updateDimensions;
+        }
+
+        @Override
+        protected IStatus run(IProgressMonitor monitor) {
+            try{
+                ImageInfo imageInfo = ImageInfo.NewInstanceWithMetaData(uri, 10000);
+                ImageFileElement.this.getLayoutComposite().getDisplay().asyncExec(()->{
+                    element_keyValue.setInput(imageInfo.getMetaData());
+                    try {
+                        disposeImage();
+                        element_image = formFactory.createImageElement(parentFormElement, uri, style);
+                        element_image.initImageUri(uri);
+                    } catch (Exception e) {
+                        handleException();
+                    }
+                    element_image.loadImage();
+                    if(uri == null){
+                        return;
+                    }
+                    if(updateDimensions){
+                        text_size.setText(FileUtils.byteCountToDisplaySize(imageInfo.getLength()));
+                        // KLUDGE this is not save for very large files, because of the int cast.
+                        // But then, I don't think we will handle such large files in the near future
+                        getEntity().setSize((int) imageInfo.getLength());
+
+                        text_height.setNumber(imageInfo.getHeight());
+                        getEntity().setHeight(imageInfo.getHeight());
+
+                        text_width.setNumber(imageInfo.getWidth());
+                        getEntity().setWidth(imageInfo.getWidth());
+                    }
+                    StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
+                });
+            }
+            catch (Exception e) {
+                handleException();
+            }
+            return Status.OK_STATUS;
+        }
+
+    }
+
        private NumberWithLabelElement text_height;
        private NumberWithLabelElement text_width;
        private KeyValueViewerElement element_keyValue;
        private ImageElement element_image;
-       
-       
-       private Runnable postRunnable = new Runnable(){
-               public void run() {
-                       StoreUtil.reflowDetailsViewer();
-                       StoreUtil.reflowSupplementalViewer();
-               }
-       };
-       
-       
-       /**
-        * <p>Constructor for ImageFileElement.</p>
-        *
-        * @param cdmFormFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
-        * @param section a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection} object.
-        * @param element a {@link eu.etaxonomy.cdm.model.media.ImageFile} object.
-        * @param removeListener a {@link org.eclipse.swt.events.SelectionListener} object.
-        * @param style a int.
-        */
+    private ICdmFormElement parentFormElement;
+    private int style;
+
        public ImageFileElement(CdmFormFactory cdmFormFactory,
                        AbstractFormSection section, ImageFile element,
                        SelectionListener removeListener, int style) {
                super(cdmFormFactory, section, element, removeListener, style);
        }
-       
-       /** {@inheritDoc} */
+
        @Override
        public void createControls(ICdmFormElement formElement, int style) {
                super.createControls(formElement, style);
-               
+
+        this.parentFormElement = formElement;
+        this.style = style;
+
                text_height = formFactory.createNumberTextWithLabelElement(formElement, "Height", null, style);
                text_height.setEnabled(false);
                text_width = formFactory.createNumberTextWithLabelElement(formElement, "Width", null, style);
                text_width.setEnabled(false);
-               element_image = formFactory.createImageElement(formElement, null, style);
                element_keyValue = formFactory.createKeyValueViewerElement(formElement, "Key", "Value", null);
        }
-       
-       /** {@inheritDoc} */
+
        @Override
        public void setEntity(ImageFile entity) {
                super.setEntity(entity);
                text_height.setNumber(entity.getHeight());
                text_width.setNumber(entity.getWidth());
                try {
-                       loadImage(entity.getUri(), false);              
+            new LoadImageJob(getEntity().getUri(), true).schedule();
                } catch (Exception e) {
-                       handleException(e);
+                   e.printStackTrace();
+                       handleException();
                }
        }
-       
-       private void loadImage(URI uri, boolean updateDimensions) throws IOException, HttpException{
-               element_image.initImageUri(uri);
-               
-               element_image.loadImage(postRunnable );
-               
-               
-               if(uri == null){
-                       return;
-               }
-               
-               ImageInfo imageInfo = ImageInfo.NewInstanceWithMetaData(uri, 10000);
-                               
-               element_keyValue.setInput(imageInfo.getMetaData());
-               
-               if(updateDimensions){
-                       text_size.setText(FileUtils.byteCountToDisplaySize(imageInfo.getLength()));
-                       // KLUDGE this is not save for very large files, because of the int cast. 
-                       // But then, I don't think we will handle such large files in the near future
-                       getEntity().setSize((int) imageInfo.getLength());
-                       
-                       text_height.setNumber(imageInfo.getHeight());
-                       getEntity().setHeight(imageInfo.getHeight());
-                               
-                       text_width.setNumber(imageInfo.getWidth());
-                       getEntity().setWidth(imageInfo.getWidth());
-               }
-               
-               
-               element_messages.setText("");
-       }
 
-       /*
-        * (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.section.AbstractEntityCollectionElement#handleEvent(java.lang.Object)
-        */
-       /** {@inheritDoc} */
        @Override
        public void handleEvent(Object eventSource) {
                if(eventSource == text_uri){
                        try {
-                               String uriString = text_uri.getText();
-                               URI uri = StringUtils.isNotEmpty(uriString) ? new URI(uriString) : null;
+                           URI uri = text_uri.parseText();
                                getEntity().setUri(uri);
-                               
-                               
-                               loadImage(getEntity().getUri(), true);
-                               
+                               if(uri==null){
+                                   //buffer URI if parsing error occurred
+                                   MediaDetailElement parentMediaDetailElement = getParentMediaDetailElement();
+                                   if(parentMediaDetailElement!=null){
+                                       parentMediaDetailElement.setUriBuffer(text_uri.getText());
+                                   }
+                               }
+                               new LoadImageJob(getEntity().getUri(), true).schedule();
                                firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
                        } catch (Exception e) {
-                               handleException(e);
-                       } finally {                             
+                               handleException();
+                       } finally {
                                firePropertyChangeEvent(this);
                        }
                }
        }
 
-       protected void handleException(Exception e) {
-               super.handleException(e);
-               element_image.unloadImage(postRunnable);
-               text_height.setNumber(0);
-               text_width.setNumber(0);
-               
-               element_image.loadImage(new Runnable(){
-                       public void run() {
-                               StoreUtil.reflowDetailsViewer();
-                               StoreUtil.reflowSupplementalViewer();
-                       }
-               });
+       protected void handleException() {
+           if(!getLayoutComposite().isDisposed()){
+               getLayoutComposite().getDisplay().asyncExec(()->{
+                   disposeImage();
+                   StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
+               });
+           }
        }
+
+    private void disposeImage(){
+        if(element_image!=null){
+            element_image.dispose();
+            element_image = null;
+        }
+    }
 }