Merge branch 'release/4.0.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / media / MediaDetailElement.java
index cf5abd37782ee4ecc6bf02ec3d259da656e7b300..5e033d7802e7907b29282bc2092e1849d8f3e1fd 100644 (file)
@@ -9,18 +9,21 @@
 */
 package eu.etaxonomy.taxeditor.ui.section.media;
 
-import java.io.IOException;
 import java.net.URI;
 import java.util.List;
 import java.util.Set;
 
-import org.apache.http.HttpException;
+import org.apache.sanselan.ImageReadException;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Label;
 
+import eu.etaxonomy.cdm.common.UriUtils;
+import eu.etaxonomy.cdm.common.media.ImageInfo;
+import eu.etaxonomy.cdm.model.media.ImageFile;
 import eu.etaxonomy.cdm.model.media.Media;
 import eu.etaxonomy.cdm.model.media.MediaRepresentation;
 import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
 import eu.etaxonomy.cdm.model.media.MediaUtils;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
@@ -51,14 +54,7 @@ public class MediaDetailElement extends AbstractCdmDetailElement<Media>{
      */
     private String uriBuffer;
     private ImageElement element_image;
-
-    private final Runnable postRunnable = new Runnable(){
-        @Override
-        public void run() {
-            AbstractUtility.reflowDetailsViewer();
-            AbstractUtility.reflowSupplementalViewer();
-        }
-    };
+    private Label lblNoImage;
 
     public MediaDetailElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
         super(formFactory, formElement);
@@ -89,14 +85,51 @@ public class MediaDetailElement extends AbstractCdmDetailElement<Media>{
             if(uri==null){
                 uriBuffer=textUri.getText();
             }
-            try {
-                loadImage(singleMediaRepresentationPart.getUri(), true);
-            } catch (Exception e) {
-                handleException(e);
+            else{
+                createImageElement(uri);
+            }
+        }
+    }
+
+    private void createImageElement(URI uri) {
+        ImageInfo imageInfo;
+        try {
+            if(uri == null){
+                return;
+            }
+            //first check if uri refers to an actual (non-image) file
+            UriUtils.getInputStream(uri);// will fail with a FileNotFoundException if not
+            imageInfo = ImageInfo.NewInstance(uri, 10000);//will fail when it is no image file
+            singleMediaRepresentationPart.setSize((int) imageInfo.getLength());
+            if(singleMediaRepresentationPart instanceof ImageFile){
+                ((ImageFile) singleMediaRepresentationPart).setHeight(imageInfo.getHeight());
+                ((ImageFile) singleMediaRepresentationPart).setWidth(imageInfo.getWidth());
             }
+            singleMediaRepresentationPart.getMediaRepresentation().setMimeType(imageInfo.getMimeType());
+            singleMediaRepresentationPart.getMediaRepresentation().setSuffix(imageInfo.getSuffix());
+            element_image = formFactory.createImageElement(parentFormElement, uri, style);
+            element_image.initImageUri(uri);
+            element_image.loadImage();
+               disposeErrorLabel();
+        } catch (Exception e){
+               if(e.getCause()!=null && e.getCause().getClass().equals(ImageReadException.class)){
+                       disposeErrorLabel();
+                       handleException(uri, "No preview available for this file type");
+               }
+               else{
+                       disposeErrorLabel();
+                       handleException(uri, "No file found");
+               }
         }
     }
 
+       private void disposeErrorLabel() {
+               if(lblNoImage!=null){
+                   lblNoImage.dispose();
+               }
+               lblNoImage = null;
+       }
+
     public void toggleAdvancedMediaView() {
         if (getEntity().getRepresentations() != null
                 && (getEntity().getRepresentations().size() > 1 ||
@@ -144,12 +177,7 @@ public class MediaDetailElement extends AbstractCdmDetailElement<Media>{
             }
             textUri.getLayoutComposite().layout();
 
-            element_image = formFactory.createImageElement(parentFormElement, null, style);
-            try {
-                loadImage(singleMediaRepresentationPart.getUri(), false);
-            } catch (Exception e) {
-                handleException(e);
-            }
+            createImageElement(singleMediaRepresentationPart.getUri());
         }
     }
 
@@ -173,24 +201,19 @@ public class MediaDetailElement extends AbstractCdmDetailElement<Media>{
         isAdvancedMediaView =  false;
     }
 
-    private void loadImage(URI uri, boolean updateDimensions) throws IOException, HttpException{
-        element_image.initImageUri(uri);
-        element_image.loadImage(postRunnable);
-        if(uri == null){
-            return;
+    private void handleException(URI uri, String labelText) {
+        if(element_image!=null){
+            element_image.unloadImage();
+            element_image.loadImage();
+            element_image.dispose();
+        }
+        if(lblNoImage==null){
+                       lblNoImage = formFactory.createLabel(getLayoutComposite(), labelText);
+            lblNoImage.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
+            lblNoImage.setAlignment(SWT.CENTER);
         }
     }
 
-    private void handleException(Exception e) {
-        element_image.unloadImage(postRunnable);
-        element_image.loadImage(new Runnable(){
-            @Override
-            public void run() {
-                AbstractUtility.reflowDetailsViewer();
-                AbstractUtility.reflowSupplementalViewer();
-            }
-        });
-    }
     public boolean isAdvancedMediaView() {
         return isAdvancedMediaView;
     }