*/
public class ImageElement extends AbstractCdmFormElement implements PaintListener{
+ /**
+ * @author pplitzner
+ * @since Jul 17, 2019
+ *
+ */
+ public class LoadImageJob extends Job {
+ public LoadImageJob(String name) {
+ super(name);
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IRunnableWithProgress runnable = getLoadImageRunnable(postRunnable);
+ try {
+ runnable.run(monitor);
+ } catch (Exception e) {
+ MessagingUtils.messageDialog("Could not load image", getClass(), e.getMessage() + ": " + getImageUri(), e);
+ }
+
+ return Status.OK_STATUS;
+ }
+ }
+
private URI imageUri;
private Image image;
public void loadImage(){
if(getImageUri() != null){
- Job job = new Job("Loading image") {
-
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- IRunnableWithProgress runnable = getLoadImageRunnable(postRunnable);
- try {
- runnable.run(monitor);
- } catch (Exception e) {
- MessagingUtils.messageDialog("Could not load image", getClass(), e.getMessage() + ": " + getImageUri(), e);
- }
-
- return Status.OK_STATUS;
- }
- };
+ Job job = new LoadImageJob("Loading image");
job.schedule();
}
}
- public void unloadImage() {
- Job job = new Job("Unloading image") {
-
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- IRunnableWithProgress runnable = getLoadImageRunnable(postRunnable);
- try {
- runnable.run(monitor);
- } catch (Exception e) {
- MessagingUtils.messageDialog("Could not unload image", getClass(), e.getMessage() + ": " + getImageUri(), e);
- }
-
- return Status.OK_STATUS;
- }
- };
- job.schedule();
-
- }
-
public IRunnableWithProgress getLoadImageRunnable(final Runnable postRunnable){
final Display display = getLayoutComposite().getDisplay();
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;
*/
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 (IOException | HttpException 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 (IOException | HttpException 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) {
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){
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() {
+ getLayoutComposite().getDisplay().asyncExec(()->{
+ disposeImage();
+ StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
+ });
}
+
+ private void disposeImage(){
+ if(element_image!=null){
+ element_image.dispose();
+ element_image = null;
+ }
+ }
}
import java.util.Collection;
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.UriUtils;
// FIXME HACK automatically set the mime type to the first mediaRepresentationPart's mimetype
else if(eventSource == section_mediaRepresentationPart){
firePropertyChangeEvent(this);
+ new Job("Set mime type") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ Collection<MediaRepresentationPart> imageFileElements = section_mediaRepresentationPart.getCollection(section_mediaRepresentationPart.getEntity());
+ if(! imageFileElements.iterator().hasNext()){
+ return Status.CANCEL_STATUS;
+ }
+ MediaRepresentationPart mediaRepresentationPart = imageFileElements.iterator().next();
+ if(mediaRepresentationPart == null || !(mediaRepresentationPart instanceof ImageFile)){
+ return Status.CANCEL_STATUS;
+ }
+ ImageFile imageFile = (ImageFile) mediaRepresentationPart;
- Collection<MediaRepresentationPart> imageFileElements = section_mediaRepresentationPart.getCollection(section_mediaRepresentationPart.getEntity());
-
- if(! imageFileElements.iterator().hasNext()){
- return;
- }
-
- MediaRepresentationPart mediaRepresentationPart = imageFileElements.iterator().next();
- if(mediaRepresentationPart == null || !(mediaRepresentationPart instanceof ImageFile)){
- return;
- }
- ImageFile imageFile = (ImageFile) mediaRepresentationPart;
-
- URI uri = imageFile.getUri();
- if(!UriUtils.isServiceAvailable(uri)){
- return;
- }
- try {
- ImageInfo imageInfo = ImageInfo.NewInstance(uri, 10000);
- String mimeType = imageInfo.getMimeType();
- text_mimeType.setText(mimeType);
- getEntity().setMimeType(mimeType);
- text_suffix.setText(imageInfo.getSuffix());
- getEntity().setSuffix(imageInfo.getSuffix());
- }
- //theses exceptions do not need to be logged
- //especially because this happens with every key stroke
- catch (IOException e) {
-// MessagingUtils.error(getClass(), e);
- }
- catch (HttpException e) {
-// MessagingUtils.error(getClass(), e);
- }
+ URI uri = imageFile.getUri();
+ if(!UriUtils.isServiceAvailable(uri)){
+ return Status.CANCEL_STATUS;
+ }
+ try {
+ ImageInfo imageInfo = ImageInfo.NewInstance(uri, 10000);
+ String mimeType = imageInfo.getMimeType();
+ getEntity().setMimeType(mimeType);
+ getEntity().setSuffix(imageInfo.getSuffix());
+ MediaRepresentationElement.this.getLayoutComposite().getDisplay().asyncExec(()->{
+ text_mimeType.setText(mimeType);
+ text_suffix.setText(imageInfo.getSuffix());
+ });
+ }
+ //theses exceptions do not need to be logged
+ //especially because this happens with every key stroke
+ catch (IOException|HttpException e) {
+ // ignore
+ }
+ return Status.OK_STATUS;
+ }
+ }.schedule();
}
}
}