-// $Id$
/**
* Copyright (C) 2007 EDIT
* European Distributed Institute of Taxonomy
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;
/**
* @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 ICdmFormElement parentFormElement;
+ private int style;
public ImageFileElement(CdmFormFactory cdmFormFactory,
AbstractFormSection section, ImageFile element,
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);
- }
- }
-
- 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());
+ e.printStackTrace();
+ handleException();
}
-
-
}
- /** {@inheritDoc} */
@Override
public void handleEvent(Object eventSource) {
if(eventSource == text_uri){
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;
+ }
+ }
}