Project

General

Profile

Download (8.43 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2014 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 java.net.URI;
12
import java.util.List;
13
import java.util.Set;
14

    
15
import org.apache.sanselan.ImageReadException;
16
import org.eclipse.swt.SWT;
17
import org.eclipse.swt.widgets.Label;
18

    
19
import eu.etaxonomy.cdm.common.UriUtils;
20
import eu.etaxonomy.cdm.common.media.ImageInfo;
21
import eu.etaxonomy.cdm.model.common.CdmBase;
22
import eu.etaxonomy.cdm.model.media.ImageFile;
23
import eu.etaxonomy.cdm.model.media.Media;
24
import eu.etaxonomy.cdm.model.media.MediaRepresentation;
25
import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
26
import eu.etaxonomy.cdm.model.media.MediaUtils;
27
import eu.etaxonomy.taxeditor.model.MessagingUtils;
28
import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
29
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
30
import eu.etaxonomy.taxeditor.store.StoreUtil;
31
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
32
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
33
import eu.etaxonomy.taxeditor.ui.element.ImageElement;
34
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
35
import eu.etaxonomy.taxeditor.ui.element.UriWithLabelElement;
36
import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
37

    
38
/**
39
 * @author pplitzner
40
 * @date 25.08.2014
41
 *
42
 */
43
public class MediaDetailElement extends AbstractCdmDetailElement<Media>{
44

    
45
    private UriWithLabelElement textUri;
46
    private MediaRepresentationSection section_mediaRepresentation;
47

    
48
    private boolean isAdvancedMediaView;
49
    private MediaRepresentationPart singleMediaRepresentationPart;
50
    private ICdmFormElement parentFormElement;
51
    private int style;
52

    
53
    /**
54
     * Used to store the URI even if it is invalid and thus cannot be stored in CDM
55
     */
56
    private String uriBuffer;
57
    private ImageElement element_image;
58
    private Label lblNoImage;
59

    
60
    public MediaDetailElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
61
        super(formFactory, formElement);
62
    }
63

    
64
    @Override
65
    protected void createControls(ICdmFormElement formElement, Media entity, int style) {
66
        this.parentFormElement = formElement;
67
        this.style = style;
68
    }
69

    
70
    @Override
71
    public void setEntity(Media entity) {
72
        super.setEntity(entity);
73
        if(singleMediaRepresentationPart==null){
74
            singleMediaRepresentationPart = MediaUtils.initFirstMediaRepresentationPart(entity, true);
75
        }
76
        initIsAdvancedMediaView();
77
        showAdvancedView();
78
    }
79

    
80
    @Override
81
    public void handleEvent(Object eventSource){
82
        if(eventSource==textUri){
83
            textUri.setBackground(getPersistentBackground());
84
            URI uri = textUri.parseText();
85
            singleMediaRepresentationPart.setUri(uri);
86
            if(uri==null){
87
                uriBuffer=textUri.getText();
88
            }
89
            else{
90
                createImageElement(uri);
91
            }
92
        }
93
    }
94

    
95
    private void createImageElement(URI uri) {
96
        ImageInfo imageInfo;
97
        try {
98
            if(uri == null){
99
                return;
100
            }
101
            //first check if uri refers to an actual (non-image) file
102
            UriUtils.getInputStream(uri);// will fail with a FileNotFoundException if not
103
            imageInfo = ImageInfo.NewInstance(uri, 10000);//will fail when it is no image file
104
            singleMediaRepresentationPart.setSize((int) imageInfo.getLength());
105
            if(singleMediaRepresentationPart.isInstanceOf(ImageFile.class)){
106
            	ImageFile image = CdmBase.deproxy(singleMediaRepresentationPart, ImageFile.class);
107
                image.setHeight(imageInfo.getHeight());
108
                image.setWidth(imageInfo.getWidth());
109
            }
110
            singleMediaRepresentationPart.getMediaRepresentation().setMimeType(imageInfo.getMimeType());
111
            singleMediaRepresentationPart.getMediaRepresentation().setSuffix(imageInfo.getSuffix());
112
            element_image = formFactory.createImageElement(parentFormElement, uri, style);
113
            element_image.initImageUri(uri);
114
            element_image.loadImage();
115
    		disposeErrorLabel();
116
        } catch (Exception e){
117
        	if(e.getCause()!=null && e.getCause().getClass().equals(ImageReadException.class)){
118
        		disposeErrorLabel();
119
        		handleException(uri, "No preview available for this file type");
120
        	}
121
        	else{
122
        		disposeErrorLabel();
123
        		handleException(uri, "No file found");
124
        	}
125
        }
126
    }
127

    
128
	private void disposeErrorLabel() {
129
		if(lblNoImage!=null){
130
		    lblNoImage.dispose();
131
		}
132
		lblNoImage = null;
133
	}
134

    
135
    public void toggleAdvancedMediaView() {
136
        if (getEntity().getRepresentations() != null
137
                && (getEntity().getRepresentations().size() > 1 ||
138
                        (getEntity().getRepresentations().size() == 1
139
                        && getEntity().getRepresentations().iterator().next().getParts().size() > 1))) {
140
            MessagingUtils.informationDialog("Toggling not possible",
141
                    "Media consists of multiple representations or representatio parts");
142
            // toggling is only possible if there are no more than one
143
            // MediaRepresentation resp. MediaRepresentationParts
144
            return;
145
        }
146
        isAdvancedMediaView = !isAdvancedMediaView;
147
        showAdvancedView();
148
        StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
149
    }
150

    
151
    private void showAdvancedView() {
152
        if(isAdvancedMediaView){
153
            if(textUri!=null){
154
                removeElementsAndControls(textUri);
155
            }
156
            if(element_image!=null){
157
                element_image.dispose();
158
                element_image = null;
159
            }
160
            section_mediaRepresentation = formFactory.createMediaRepresentationSection(getConversationHolder(), parentFormElement, style);
161
            section_mediaRepresentation.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
162
            section_mediaRepresentation.setEntity(getEntity());
163
            //set buffered uri as text if uri had parsing problems in simple view
164
            if(uriBuffer!=null){
165
                section_mediaRepresentation.getLayoutComposite().getChildren();
166
            }
167
        }
168
        else{
169
            if(section_mediaRepresentation!=null){
170
                removeElementsAndControls(section_mediaRepresentation);
171
            }
172
            textUri = formFactory.createUriWithLabelElement(parentFormElement, "Media URI", null, style);
173
            URI uri = singleMediaRepresentationPart.getUri();
174
            textUri.setParsedText(uri);
175
            //set buffered uri as text if uri had parsing problems in advanced view
176
            if(uri==null && uriBuffer!=null){
177
                textUri.setText(uriBuffer);
178
                textUri.parseText();
179
            }
180
            textUri.getLayoutComposite().layout();
181

    
182
            createImageElement(singleMediaRepresentationPart.getUri());
183
        }
184
    }
185

    
186
    private void initIsAdvancedMediaView(){
187
        if(PreferencesUtil.getPreferenceStore().getBoolean(IPreferenceKeys.SHOW_ADVANCED_MEDIA_SECTION)){
188
            isAdvancedMediaView = true;
189
            return;
190
        }
191
        Set<MediaRepresentation> representations = getEntity().getRepresentations();
192
        if(representations.size()>1){
193
            isAdvancedMediaView = true;
194
            return;
195
        }
196
        if(representations.size()==1){
197
            List<MediaRepresentationPart> parts = representations.iterator().next().getParts();
198
            if(parts.size()>1){
199
                isAdvancedMediaView =  true;
200
                return;
201
            }
202
        }
203
        isAdvancedMediaView =  false;
204
    }
205

    
206
    private void handleException(URI uri, String labelText) {
207
        if(element_image!=null){
208
            element_image.unloadImage();
209
            element_image.loadImage();
210
            element_image.dispose();
211
        }
212
        if(lblNoImage==null){
213
			lblNoImage = formFactory.createLabel(getLayoutComposite(), labelText);
214
            lblNoImage.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
215
            lblNoImage.setAlignment(SWT.CENTER);
216
        }
217
    }
218

    
219
    public boolean isAdvancedMediaView() {
220
        return isAdvancedMediaView;
221
    }
222

    
223
    public void setUriBuffer(String uriBuffer) {
224
        this.uriBuffer = uriBuffer;
225
    }
226

    
227
    public String getUriBuffer() {
228
        return uriBuffer;
229
    }
230

    
231
}
(3-3/10)