2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.taxeditor
.ui
.section
.media
;
11 import java
.io
.IOException
;
12 import java
.util
.List
;
15 import org
.apache
.commons
.imaging
.ImageReadException
;
16 import org
.apache
.http
.HttpException
;
17 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
18 import org
.eclipse
.core
.runtime
.IStatus
;
19 import org
.eclipse
.core
.runtime
.Status
;
20 import org
.eclipse
.core
.runtime
.jobs
.Job
;
21 import org
.eclipse
.swt
.SWT
;
22 import org
.eclipse
.swt
.events
.SelectionAdapter
;
23 import org
.eclipse
.swt
.events
.SelectionEvent
;
24 import org
.eclipse
.swt
.widgets
.Button
;
25 import org
.eclipse
.swt
.widgets
.Label
;
27 import eu
.etaxonomy
.cdm
.common
.URI
;
28 import eu
.etaxonomy
.cdm
.common
.UriUtils
;
29 import eu
.etaxonomy
.cdm
.common
.media
.CdmImageInfo
;
30 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
31 import eu
.etaxonomy
.cdm
.model
.media
.ImageFile
;
32 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
33 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentation
;
34 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentationPart
;
35 import eu
.etaxonomy
.cdm
.model
.media
.MediaUtils
;
36 import eu
.etaxonomy
.taxeditor
.l10n
.Messages
;
37 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
38 import eu
.etaxonomy
.taxeditor
.preference
.IPreferenceKeys
;
39 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
40 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
41 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
42 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
43 import eu
.etaxonomy
.taxeditor
.ui
.element
.ImageElement
;
44 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
45 import eu
.etaxonomy
.taxeditor
.ui
.element
.UriWithLabelElement
;
46 import eu
.etaxonomy
.taxeditor
.ui
.section
.AbstractCdmDetailElement
;
47 import eu
.etaxonomy
.taxeditor
.ui
.section
.description
.MediaDetailsSection
;
53 public class MediaDetailElement
extends AbstractCdmDetailElement
<Media
>{
55 private static final String LOAD_IMAGE
= Messages
.MediaDetailElement_LOAD_IMAGE
;
57 private boolean isShowImage
= true;
63 private final class LoadImageJob
extends Job
{
65 private LoadImageJob(URI uri
, String name
) {
71 protected IStatus
run(IProgressMonitor monitor
) {
73 //first check if uri refers to an actual (non-image) file
75 UriUtils
.getInputStream(uri
);// will fail with a FileNotFoundException if not
77 CdmImageInfo imageInfo
= CdmImageInfo
.NewInstance(uri
, 10000);//will fail when it is no image file
78 MediaDetailElement
.this.getLayoutComposite().getDisplay().asyncExec(()->{
79 singleMediaRepresentationPart
.setSize((int) imageInfo
.getLength());
80 if(singleMediaRepresentationPart
.isInstanceOf(ImageFile
.class)){
81 ImageFile image
= CdmBase
.deproxy(singleMediaRepresentationPart
, ImageFile
.class);
82 image
.setHeight(imageInfo
.getHeight());
83 image
.setWidth(imageInfo
.getWidth());
85 if(singleMediaRepresentationPart
.getMediaRepresentation()!=null){
86 singleMediaRepresentationPart
.getMediaRepresentation().setMimeType(imageInfo
.getMimeType());
87 singleMediaRepresentationPart
.getMediaRepresentation().setSuffix(imageInfo
.getSuffix());
90 if (!parentFormElement
.getLayoutComposite().isDisposed()) {
91 element_image
= formFactory
.createImageElement(parentFormElement
, uri
, style
);
92 // StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
94 element_image
.initImageUri(uri
);
95 } catch (IOException
| HttpException e
) {
98 element_image
.loadImage();
101 StoreUtil
.reflowParentScrolledForm(getLayoutComposite(), true);
106 } catch (Exception e
){
109 return Status
.OK_STATUS
;
113 private UriWithLabelElement textUri
;
114 private MediaRepresentationSection section_mediaRepresentation
;
116 private boolean isAdvancedMediaView
;
117 private MediaRepresentationPart singleMediaRepresentationPart
;
118 private ICdmFormElement parentFormElement
;
122 * Used to store the URI even if it is invalid and thus cannot be stored in CDM
124 private String uriBuffer
;
125 private ImageElement element_image
;
126 private Label lblNoImage
;
128 public MediaDetailElement(CdmFormFactory formFactory
, ICdmFormElement formElement
) {
129 super(formFactory
, formElement
);
133 protected void createControls(ICdmFormElement formElement
, Media entity
, int style
) {
134 this.parentFormElement
= formElement
;
139 public void setEntity(Media entity
) {
140 super.setEntity(entity
);
141 if(singleMediaRepresentationPart
==null){
142 singleMediaRepresentationPart
= MediaUtils
.initFirstMediaRepresentationPart(entity
, true);
144 initIsAdvancedMediaView();
148 public boolean isShowImage() {
152 public void setShowImage(boolean isShowImage
) {
153 this.isShowImage
= isShowImage
;
157 public void handleEvent(Object eventSource
){
158 if(eventSource
==textUri
){
159 textUri
.setBackground(getPersistentBackground());
160 URI uri
= textUri
.parseText();
161 singleMediaRepresentationPart
.setUri(uri
);
163 uriBuffer
=textUri
.getText();
167 LoadImageJob job
= new LoadImageJob(uri
, LOAD_IMAGE
);
171 if (this.getParentElement() != null && this.getParentElement() instanceof MediaMetaElement
){
172 MediaMetaElement metaElement
= (MediaMetaElement
)this.getParentElement();
173 if (metaElement
.getParentElement() != null && metaElement
.getParentElement() instanceof MediaDetailsSection
){
174 MediaDetailsSection sec
= (MediaDetailsSection
)metaElement
.getParentElement();
175 // sec.setMediaSectionTitle();
176 metaElement
.createTitle();
177 sec
.setMediaSectionTitle();
183 private void exception(Exception e
){
184 if(!getLayoutComposite().isDisposed()){
185 getLayoutComposite().getDisplay().asyncExec(()->{
186 String exceptionString
;
187 if(e
.getCause()!=null && e
.getCause().getClass().equals(ImageReadException
.class)){
189 exceptionString
= Messages
.MediaDetailElement_NO_PREVIEW
;
193 exceptionString
= Messages
.MediaDetailElement_NO_FILE_FOUND
;
196 if(lblNoImage
==null){
197 lblNoImage
= formFactory
.createLabel(getLayoutComposite(), exceptionString
);
198 lblNoImage
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY(2, 1));
199 lblNoImage
.setAlignment(SWT
.CENTER
);
201 StoreUtil
.reflowParentScrolledForm(getLayoutComposite(), true);
206 private void disposeImage(){
207 if(element_image
!=null){
208 element_image
.dispose();
209 element_image
= null;
213 private void disposeErrorLabel() {
214 if(lblNoImage
!=null){
215 lblNoImage
.dispose();
220 public void toggleAdvancedMediaView() {
221 if (getEntity().getRepresentations() != null
222 && (getEntity().getRepresentations().size() > 1 ||
223 (getEntity().getRepresentations().size() == 1
224 && getEntity().getRepresentations().iterator().next().getParts().size() > 1))) {
225 MessagingUtils
.informationDialog(Messages
.MediaDetailElement_TOGGLE_NOT_POSSIBLE_TITLE
,
226 Messages
.MediaDetailElement_TOGGLE_NOT_POSSIBLE_MESSAGE
);
227 // toggling is only possible if there are no more than one
228 // MediaRepresentation resp. MediaRepresentationParts
231 isAdvancedMediaView
= !isAdvancedMediaView
;
233 StoreUtil
.reflowParentScrolledForm(getLayoutComposite(), true);
236 private void showAdvancedView() {
238 if(isAdvancedMediaView
){
240 removeElementsAndControls(textUri
);
243 section_mediaRepresentation
= formFactory
.createMediaRepresentationSection(getConversationHolder(), parentFormElement
, StoreUtil
.getSectionStyle(MediaRepresentationSection
.class, getEntity().getClass().getCanonicalName()));
244 section_mediaRepresentation
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY(2, 1));
245 section_mediaRepresentation
.setEntity(getEntity());
246 //set buffered uri as text if uri had parsing problems in simple view
248 section_mediaRepresentation
.getLayoutComposite().getChildren();
252 if(section_mediaRepresentation
!=null){
253 removeElementsAndControls(section_mediaRepresentation
);
255 textUri
= formFactory
.createUriWithLabelElement(parentFormElement
, Messages
.MediaDetailElement_Media_URI
, null, style
);
256 URI uri
= singleMediaRepresentationPart
.getUri();
257 textUri
.setParsedText(uri
);
258 //set buffered uri as text if uri had parsing problems in advanced view
259 if(uri
==null && uriBuffer
!=null){
260 textUri
.setText(uriBuffer
);
263 textUri
.getLayoutComposite().layout();
265 LoadImageJob job
= new LoadImageJob(singleMediaRepresentationPart
.getUri(), LOAD_IMAGE
);
268 Button button_showImage
= formFactory
.createButton(getLayoutComposite(), Messages
.MediaDetailElement_SHOW_IMAGE
, SWT
.PUSH
);
269 button_showImage
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY(2, 1));
270 button_showImage
.addSelectionListener(new SelectionAdapter() {
272 public void widgetSelected(SelectionEvent e
) {
273 LoadImageJob job
= new LoadImageJob(singleMediaRepresentationPart
.getUri(), Messages
.MediaDetailElement_LOAD_IMAGE
);
275 button_showImage
.setText(Messages
.MediaDetailElement_RELOAD_IMAGE
);
282 private void initIsAdvancedMediaView(){
283 if(PreferencesUtil
.getBooleanValue(IPreferenceKeys
.SHOW_ADVANCED_MEDIA_SECTION
)){
284 isAdvancedMediaView
= true;
287 Set
<MediaRepresentation
> representations
= getEntity().getRepresentations();
288 if(representations
.size()>1){
289 isAdvancedMediaView
= true;
292 if(representations
.size()==1){
293 List
<MediaRepresentationPart
> parts
= representations
.iterator().next().getParts();
295 isAdvancedMediaView
= true;
299 isAdvancedMediaView
= false;
302 public boolean isAdvancedMediaView() {
303 return isAdvancedMediaView
;
306 public void setUriBuffer(String uriBuffer
) {
307 this.uriBuffer
= uriBuffer
;
310 public String
getUriBuffer() {