1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.mediaeditor.field.image;
35
36 import info.magnolia.ui.vaadin.editor.JCropField;
37 import info.magnolia.ui.vaadin.gwt.shared.jcrop.SelectionArea;
38
39 import java.awt.image.BufferedImage;
40 import java.io.ByteArrayInputStream;
41 import java.io.IOException;
42
43 import javax.imageio.ImageIO;
44
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import com.jhlabs.image.CropFilter;
49 import com.vaadin.ui.Component;
50 import com.vaadin.v7.data.Property;
51
52
53
54
55 public class CropField extends ImageMediaField {
56 private static final Logger log = LoggerFactory.getLogger(CropField.class);
57
58 private final static int DEFAULT_CROP_OFFSET = 50;
59
60 private final static int DEFAULT_CROP_DIMENSION = 200;
61
62 private SelectionArea selectedArea = null;
63
64 private JCropField jcropField = new JCropField();
65
66 private BufferedImage image;
67
68 public CropField() {
69 jcropField.addValueChangeListener(new ValueChangeListener() {
70 @Override
71 public void valueChange(Property.ValueChangeEvent event) {
72 selectedArea = (SelectionArea) event.getProperty().getValue();
73 }
74 });
75 }
76
77 @Override
78 protected Component createImage() {
79 return jcropField;
80 }
81
82 @Override
83 public void refreshImageSource() {
84 try {
85 image = ImageIO.read(new ByteArrayInputStream(getValue()));
86 jcropField.setTrueHeight(image.getHeight());
87 jcropField.setTrueWidth(image.getWidth());
88 jcropField.setImageSource(createResourceFromValue());
89 jcropField.select(new SelectionArea(
90 DEFAULT_CROP_OFFSET,
91 DEFAULT_CROP_OFFSET,
92 DEFAULT_CROP_DIMENSION,
93 DEFAULT_CROP_DIMENSION));
94 } catch (IOException e) {
95 log.error("Error reading the image data: " + e.getMessage(), e);
96 }
97 }
98
99 public BufferedImage cropImage(SelectionArea area) throws IOException {
100 final CropFilter cropFilter = new CropFilter();
101 cropFilter.setX(area.getLeft());
102 cropFilter.setY(area.getTop());
103 cropFilter.setWidth(area.getWidth());
104 cropFilter.setHeight(area.getHeight());
105 return cropFilter.filter(image, null);
106 }
107
108 public void setStatusComponent(Component c) {
109 jcropField.setStatusComponent(c);
110 }
111
112 @Override
113 protected BufferedImage executeImageModification() throws IOException {
114 return (selectedArea != null) ? cropImage(selectedArea) : null;
115 }
116 }