Merge branch 'release/5.8.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / media / ImageFileElement.java
index d54ca130adc9720895452bf2de86d59025b71238..24ea2910350a5b0beea9847016643c3f901c572f 100644 (file)
@@ -9,15 +9,18 @@
 
 package eu.etaxonomy.taxeditor.ui.section.media;
 
-import java.io.IOException;
 import java.net.URI;
 
 import org.apache.commons.io.FileUtils;
-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;
 import eu.etaxonomy.cdm.model.media.ImageFile;
+import eu.etaxonomy.taxeditor.store.StoreUtil;
 import eu.etaxonomy.taxeditor.ui.element.AbstractFormSection;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
@@ -32,10 +35,63 @@ import eu.etaxonomy.taxeditor.ui.element.NumberWithLabelElement;
  */
 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 ICdmFormElement parentFormElement;
+    private int style;
 
        public ImageFileElement(CdmFormFactory cdmFormFactory,
                        AbstractFormSection section, ImageFile element,
@@ -43,64 +99,33 @@ public class ImageFileElement extends MediaRepresentationPartElement<ImageFile>
                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) {
                    e.printStackTrace();
-                       handleException(e);
-               }
-       }
-
-       private void loadImage(URI uri, boolean updateDimensions) throws IOException, HttpException{
-               element_image.initImageUri(uri);
-
-               element_image.loadImage();
-
-
-               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());
+                       handleException();
                }
-
-
        }
 
-       /** {@inheritDoc} */
        @Override
        public void handleEvent(Object eventSource) {
                if(eventSource == text_uri){
@@ -114,24 +139,29 @@ public class ImageFileElement extends MediaRepresentationPartElement<ImageFile>
                                        parentMediaDetailElement.setUriBuffer(text_uri.getText());
                                    }
                                }
-
-                               loadImage(getEntity().getUri(), true);
-
+                               new LoadImageJob(getEntity().getUri(), true).schedule();
                                firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
                        } catch (Exception e) {
-                               handleException(e);
+                               handleException();
                        } finally {
                                firePropertyChangeEvent(this);
                        }
                }
        }
 
-       protected void handleException(Exception e) {
-               element_image.unloadImage();
-//             text_height.setNumber(0);
-//             text_width.setNumber(0);
-//             text_size.setNumber(0);
-
-               element_image.loadImage();
+       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;
+        }
+    }
 }