5806912a2d20f6c5d5687d81a98ab423479851e1
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / forms / ImageElement.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 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
11 package eu.etaxonomy.taxeditor.forms;
12
13 import java.io.InputStream;
14 import java.net.URI;
15
16 import org.eclipse.core.runtime.IProgressMonitor;
17 import org.eclipse.core.runtime.IStatus;
18 import org.eclipse.core.runtime.Status;
19 import org.eclipse.core.runtime.jobs.Job;
20 import org.eclipse.swt.events.ControlEvent;
21 import org.eclipse.swt.events.ControlListener;
22 import org.eclipse.swt.events.PaintEvent;
23 import org.eclipse.swt.events.PaintListener;
24 import org.eclipse.swt.graphics.Image;
25 import org.eclipse.swt.graphics.Rectangle;
26 import org.eclipse.swt.widgets.Composite;
27 import org.eclipse.swt.widgets.Display;
28 import org.eclipse.ui.forms.widgets.TableWrapData;
29
30 import eu.etaxonomy.cdm.common.UriUtils;
31 import eu.etaxonomy.taxeditor.editor.EditorUtil;
32
33 /**
34 * <p>ImageElement class.</p>
35 *
36 * @author n.hoffmann
37 * @created Sep 24, 2010
38 * @version 1.0
39 */
40 public class ImageElement extends AbstractCdmFormElement implements PaintListener, ControlListener{
41
42 private URI imageUri;
43 private Image image;
44 private Rectangle imageMaxBounds;
45
46 private Composite container;
47
48 /**
49 * <p>Constructor for ImageElement.</p>
50 *
51 * @param formFactory a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory} object.
52 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
53 * @param imageUri a {@link java.net.URI} object.
54 * @param style a int.
55 */
56 protected ImageElement(CdmFormFactory formFactory, ICdmFormElement parentElement, URI imageUri, int style) {
57 super(formFactory, parentElement);
58
59 setImageUri(imageUri);
60
61 container = new Composite(getLayoutComposite(), style);
62 container.setLayoutData(CdmFormFactory.FILL(2, 1));
63
64 container.addControlListener(this);
65 container.addPaintListener(this);
66 }
67
68
69 /* (non-Javadoc)
70 * @see eu.etaxonomy.taxeditor.forms.ISelectable#setSelected(boolean)
71 */
72 /** {@inheritDoc} */
73 @Override
74 public void setSelected(boolean selected) {
75 // TODO Auto-generated method stub
76
77 }
78
79 /**
80 * <p>Setter for the field <code>imageUri</code>.</p>
81 *
82 * @param uri a {@link java.net.URI} object.
83 */
84 public void setImageUri(URI uri) {
85 this.imageUri = uri;
86
87 if(imageUri != null){
88
89 final Display display = Display.getCurrent();
90 Job job = new Job("Loading image: " + imageUri){
91 @Override
92 protected IStatus run(IProgressMonitor monitor) {
93 try {
94 InputStream imageStream = UriUtils.getInputStream(imageUri);
95
96 image = new Image(Display.getCurrent(), imageStream);
97
98 display.asyncExec(new Runnable(){
99 @Override
100 public void run() {
101 EditorUtil.reflowDetailsViewer();
102 // getLayoutComposite().layout();
103 }
104 });
105 return Status.OK_STATUS;
106 }catch (Exception e) {
107 EditorUtil.errorDialog("Could not load image", getClass(), e.getMessage(), e);
108 }
109 return Status.CANCEL_STATUS;
110 }
111 };
112
113 job.schedule();
114 }
115 }
116
117 private void calculateImageBounds(){
118 Rectangle imageBounds = image.getBounds();
119 Rectangle containerBounds = container.getBounds();
120
121 Integer imgWidth = imageBounds.width;
122 Integer imgHeight = imageBounds.height;
123
124 Float ratio = imgHeight.floatValue()/imgWidth.floatValue();
125 Integer width = containerBounds.width;
126 Float height = width * ratio;
127
128 imageMaxBounds = new Rectangle(containerBounds.x, containerBounds.y, width, height.intValue());
129 }
130
131 /**
132 * <p>Getter for the field <code>imageUri</code>.</p>
133 *
134 * @return the imageUri
135 */
136 public URI getImageUri() {
137 return imageUri;
138 }
139
140 /* (non-Javadoc)
141 * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent)
142 */
143 /** {@inheritDoc} */
144 @Override
145 public void paintControl(PaintEvent e) {
146 if(image != null){
147 calculateImageBounds();
148 Composite composite = (Composite) e.widget;
149 TableWrapData layoutData = CdmFormFactory.FILL(2, 1);
150 layoutData.heightHint = imageMaxBounds.height;
151 composite.setLayoutData(layoutData);
152 e.gc.drawImage(image, 0, 0, image.getBounds().width, image.getBounds().height, 0, 0, imageMaxBounds.width, imageMaxBounds.height);
153 }
154 }
155
156
157 /* (non-Javadoc)
158 * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
159 */
160 /** {@inheritDoc} */
161 @Override
162 public void controlMoved(ControlEvent e) {
163 // TODO Auto-generated method stub
164
165 }
166
167
168 /* (non-Javadoc)
169 * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
170 */
171 /** {@inheritDoc} */
172 @Override
173 public void controlResized(ControlEvent e) {
174 EditorUtil.reflowDetailsViewer();
175 }
176 }