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.field;
35
36 import com.vaadin.ui.Button;
37 import com.vaadin.ui.ComboBox;
38 import com.vaadin.ui.Component;
39 import com.vaadin.ui.CustomField;
40 import com.vaadin.ui.HorizontalLayout;
41 import com.vaadin.ui.NativeButton;
42 import com.vaadin.ui.VerticalLayout;
43
44
45
46
47
48 public class LinkField<T> extends CustomField<T> {
49
50 private final VerticalLayout rootLayout = new VerticalLayout();
51 private final HorizontalLayout linkLayout = new HorizontalLayout();
52 private final Button selectButton = new NativeButton();
53 private final ComboBox<T> itemSelectField;
54
55 private boolean editable;
56 private Component contentPreview;
57 private String buttonCaptionNew;
58 private String buttonCaptionOther;
59 private T value;
60
61 public LinkField(ComboBox<T> innerComponent) {
62 this.itemSelectField = (ComboBox<T>) innerComponent;
63 }
64
65 @Override
66 protected Component initContent() {
67 addStyleName("linkfield");
68
69 rootLayout.setSizeFull();
70 rootLayout.setSpacing(true);
71
72 itemSelectField.setWidth(100, Unit.PERCENTAGE);
73 itemSelectField.addValueChangeListener(event -> {
74
75 setValue(event.getValue());
76 });
77
78 linkLayout.setSizeFull();
79 linkLayout.addComponent(itemSelectField);
80 linkLayout.setExpandRatio(itemSelectField, 1);
81 linkLayout.setSpacing(false);
82
83 if (!isReadOnly()) {
84 selectButton.addStyleName("magnoliabutton");
85 linkLayout.addComponent(selectButton);
86 linkLayout.setExpandRatio(selectButton, 0);
87 }
88
89 rootLayout.addComponent(linkLayout);
90
91 addValueChangeListener(event -> updateComponents());
92 updateComponents();
93
94 return rootLayout;
95 }
96
97 @Override
98 protected void doSetValue(T value) {
99 this.value = value;
100 this.itemSelectField.setValue(value);
101 }
102
103 @Override
104 public T getValue() {
105 return value;
106 }
107
108 @Override
109 public boolean isEmpty() {
110 return getValue() == null;
111 }
112
113 public boolean isEditable() {
114 return editable;
115 }
116
117 public void setEditable(boolean editable) {
118 this.editable = editable;
119 }
120
121 public void setButtonCaptionNew(String buttonCaptionNew) {
122 this.buttonCaptionNew = buttonCaptionNew;
123 }
124
125 public void setButtonCaptionOther(String buttonCaptionOther) {
126 this.buttonCaptionOther = buttonCaptionOther;
127 }
128
129 public void setDisableOnClick(boolean disable) {
130 selectButton.setDisableOnClick(disable);
131 }
132
133 public void addClickListener(Button.ClickListener buttonClickListener) {
134 selectButton.addClickListener(buttonClickListener);
135 }
136
137 @Override
138 public void setEnabled(boolean enabled) {
139 super.setEnabled(enabled);
140 itemSelectField.setEnabled(enabled);
141 selectButton.setEnabled(enabled);
142 }
143
144 public void setContentPreview(Component contentPreviewComponent) {
145 if (contentPreview != null) {
146 rootLayout.removeComponent(contentPreview);
147 }
148 rootLayout.addComponentAsFirst(contentPreviewComponent);
149 contentPreview = contentPreviewComponent;
150 }
151
152
153
154
155 private void updateComponents() {
156 if (!isEditable() && !isEmpty()) {
157 itemSelectField.setReadOnly(true);
158 if (linkLayout.getComponentIndex(selectButton) != -1) {
159 linkLayout.removeComponent(selectButton);
160 }
161 } else {
162 setButtonCaptionAndDescription();
163
164 }
165 }
166
167 private void setButtonCaptionAndDescription() {
168 final String caption = isEmpty() ? buttonCaptionNew : buttonCaptionOther;
169 selectButton.setCaption(caption);
170 selectButton.setDescription(caption);
171 }
172 }