Project

General

Profile

Download (5.95 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.taxeditor.ui.section.media;
10

    
11
import org.apache.commons.io.FileUtils;
12
import org.eclipse.core.runtime.IProgressMonitor;
13
import org.eclipse.core.runtime.IStatus;
14
import org.eclipse.core.runtime.Status;
15
import org.eclipse.core.runtime.jobs.Job;
16
import org.eclipse.swt.events.SelectionListener;
17

    
18
import eu.etaxonomy.cdm.api.service.media.MediaInfoFileReader;
19
import eu.etaxonomy.cdm.common.URI;
20
import eu.etaxonomy.cdm.common.media.CdmImageInfo;
21
import eu.etaxonomy.cdm.model.media.ImageFile;
22
import eu.etaxonomy.taxeditor.store.StoreUtil;
23
import eu.etaxonomy.taxeditor.ui.element.AbstractFormSection;
24
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
25
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
26
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
27
import eu.etaxonomy.taxeditor.ui.element.ImageElement;
28
import eu.etaxonomy.taxeditor.ui.element.KeyValueViewerElement;
29
import eu.etaxonomy.taxeditor.ui.element.NumberWithLabelElement;
30

    
31
/**
32
 * @author n.hoffmann
33
 * @created Mar 26, 2010
34
 */
35
public class ImageFileElement extends MediaRepresentationPartElement<ImageFile> {
36

    
37
    private final class LoadImageJob extends Job{
38

    
39
        private URI uri;
40
        private boolean updateDimensions;
41

    
42
        public LoadImageJob(URI uri, boolean updateDimensions) {
43
            super("Load image");
44
            this.uri = uri;
45
            this.updateDimensions = updateDimensions;
46
        }
47

    
48
        @Override
49
        protected IStatus run(IProgressMonitor monitor) {
50
            try{
51
                CdmImageInfo imageInfo = MediaInfoFileReader.legacyFactoryMethod(uri).readBaseInfo().readMetaData().getCdmImageInfo();
52
                ImageFileElement.this.getLayoutComposite().getDisplay().asyncExec(()->{
53
                    element_keyValue.setInput(imageInfo.getMetaData());
54
                    try {
55
                        disposeImage();
56
                        element_image = formFactory.createImageElement(parentFormElement, uri, style);
57
                        element_image.initImageUri(uri);
58
                    } catch (Exception e) {
59
                        handleException();
60
                    }
61
                    element_image.loadImage();
62
                    if(uri == null){
63
                        return;
64
                    }
65
                    if(updateDimensions){
66
                        text_size.setText(FileUtils.byteCountToDisplaySize(imageInfo.getLength()));
67
                        // KLUDGE this is not save for very large files, because of the int cast.
68
                        // But then, I don't think we will handle such large files in the near future
69
                        getEntity().setSize((int) imageInfo.getLength());
70

    
71
                        text_height.setNumber(imageInfo.getHeight());
72
                        getEntity().setHeight(imageInfo.getHeight());
73

    
74
                        text_width.setNumber(imageInfo.getWidth());
75
                        getEntity().setWidth(imageInfo.getWidth());
76
                    }
77
                    StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
78
                });
79
            }
80
            catch (Exception e) {
81
                handleException();
82
            }
83
            return Status.OK_STATUS;
84
        }
85
    }
86

    
87
	private NumberWithLabelElement text_height;
88
	private NumberWithLabelElement text_width;
89
	private KeyValueViewerElement element_keyValue;
90
	private ImageElement element_image;
91
    private ICdmFormElement parentFormElement;
92
    private int style;
93

    
94
	public ImageFileElement(CdmFormFactory cdmFormFactory,
95
			AbstractFormSection section, ImageFile element,
96
			SelectionListener removeListener, int style) {
97
		super(cdmFormFactory, section, element, removeListener, style);
98
	}
99

    
100
	@Override
101
	public void createControls(ICdmFormElement formElement, int style) {
102
		super.createControls(formElement, style);
103

    
104
        this.parentFormElement = formElement;
105
        this.style = style;
106

    
107
		text_height = formFactory.createFloatTextWithLabelElement(formElement, "Height", null, style);
108
		text_height.setEnabled(false);
109
		text_width = formFactory.createFloatTextWithLabelElement(formElement, "Width", null, style);
110
		text_width.setEnabled(false);
111
		element_keyValue = formFactory.createKeyValueViewerElement(formElement, "Key", "Value", null);
112
		if (entity != null){
113
			setEntity(entity);
114
		}
115
	}
116

    
117
	@Override
118
	public void setEntity(ImageFile entity) {
119
		super.setEntity(entity);
120
		if (text_height != null){
121
			text_height.setNumber(entity.getHeight());
122
			text_width.setNumber(entity.getWidth());
123
			try {
124
	            new LoadImageJob(getEntity().getUri(), true).schedule();
125
			} catch (Exception e) {
126
			    e.printStackTrace();
127
				handleException();
128
			}
129
		}
130
	}
131

    
132
	@Override
133
	public void handleEvent(Object eventSource) {
134
		if(eventSource == text_uri){
135
			try {
136
			    URI uri = text_uri.parseText();
137
				getEntity().setUri(uri);
138
				if(uri==null){
139
				    //buffer URI if parsing error occurred
140
				    MediaDetailElement parentMediaDetailElement = getParentMediaDetailElement();
141
				    if(parentMediaDetailElement!=null){
142
				        parentMediaDetailElement.setUriBuffer(text_uri.getText());
143
				    }
144
				}
145
				new LoadImageJob(getEntity().getUri(), true).schedule();
146
				firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
147
			} catch (Exception e) {
148
				handleException();
149
			} finally {
150
				firePropertyChangeEvent(this);
151
			}
152
		}
153
	}
154

    
155
	protected void handleException() {
156
	    if(!getLayoutComposite().isDisposed()){
157
	        getLayoutComposite().getDisplay().asyncExec(()->{
158
	            disposeImage();
159
	            StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
160
	        });
161
	    }
162
	}
163

    
164
    private void disposeImage(){
165
        if(element_image!=null){
166
            element_image.dispose();
167
            element_image = null;
168
        }
169
    }
170
}
(2-2/10)