Project

General

Profile

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

    
12
import java.net.URI;
13
import java.util.List;
14
import java.util.Set;
15

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

    
20
import eu.etaxonomy.cdm.common.UriUtils;
21
import eu.etaxonomy.cdm.common.media.ImageInfo;
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.ui.element.CdmFormFactory;
31
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
32
import eu.etaxonomy.taxeditor.ui.element.ImageElement;
33
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
34
import eu.etaxonomy.taxeditor.ui.element.UriWithLabelElement;
35
import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
36

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

    
44
    private UriWithLabelElement textUri;
45
    private MediaRepresentationSection section_mediaRepresentation;
46

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

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

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

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

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

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

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

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

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

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

    
180
            createImageElement(singleMediaRepresentationPart.getUri());
181
        }
182
    }
183

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

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

    
217
    public boolean isAdvancedMediaView() {
218
        return isAdvancedMediaView;
219
    }
220

    
221
    public void setUriBuffer(String uriBuffer) {
222
        this.uriBuffer = uriBuffer;
223
    }
224

    
225
    public String getUriBuffer() {
226
        return uriBuffer;
227
    }
228

    
229
}
(3-3/10)