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