]> git.argeo.org Git - gpl/argeo-suite.git/blob - core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/MultiTermsPart.java
Use " instead of ' in map.
[gpl/argeo-suite.git] / core / org.argeo.entity.ui / src / org / argeo / entity / ui / forms / MultiTermsPart.java
1 package org.argeo.entity.ui.forms;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.jcr.Item;
7
8 import org.apache.commons.logging.Log;
9 import org.apache.commons.logging.LogFactory;
10 import org.argeo.cms.ui.forms.FormStyle;
11 import org.argeo.cms.ui.util.CmsUiUtils;
12 import org.argeo.cms.ui.viewers.EditablePart;
13 import org.argeo.cms.ui.widgets.ContextOverlay;
14 import org.argeo.eclipse.ui.MouseDoubleClick;
15 import org.argeo.eclipse.ui.MouseDown;
16 import org.argeo.eclipse.ui.Selected;
17 import org.argeo.entity.Term;
18 import org.argeo.entity.TermsManager;
19 import org.argeo.jcr.Jcr;
20 import org.eclipse.swt.SWT;
21 import org.eclipse.swt.events.FocusEvent;
22 import org.eclipse.swt.events.FocusListener;
23 import org.eclipse.swt.layout.GridLayout;
24 import org.eclipse.swt.layout.RowLayout;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Control;
27 import org.eclipse.swt.widgets.Label;
28 import org.eclipse.swt.widgets.Text;
29 import org.eclipse.swt.widgets.ToolBar;
30 import org.eclipse.swt.widgets.ToolItem;
31
32 /** {@link EditablePart} for multiple terms. */
33 public class MultiTermsPart extends AbstractTermsPart {
34 private static final long serialVersionUID = -4961135649177920808L;
35 private final static Log log = LogFactory.getLog(MultiTermsPart.class);
36
37 public MultiTermsPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
38 super(parent, style, item, termsManager, typology);
39 }
40
41 @Override
42 protected Control createControl(Composite box, String style) {
43 Composite placeholder = new Composite(box, SWT.NONE);
44
45 boolean vertical = SWT.VERTICAL == (getStyle() & SWT.VERTICAL);
46 RowLayout rl = new RowLayout(vertical ? SWT.VERTICAL : SWT.HORIZONTAL);
47 rl = CmsUiUtils.noMarginsRowLayout(rl);
48 // rl.wrap = true;
49 // rl.justify = true;
50 placeholder.setLayout(rl);
51 List<Term> currentValue = getValue();
52 if (currentValue != null && !currentValue.isEmpty()) {
53 for (Term value : currentValue) {
54 Composite block = new Composite(placeholder, SWT.NONE);
55 block.setLayout(CmsUiUtils.noSpaceGridLayout(3));
56 Label lbl = new Label(block, SWT.NONE);
57 String display = getTermLabel(value);
58 lbl.setText(display);
59 CmsUiUtils.style(lbl, style == null ? FormStyle.propertyText.style() : style);
60 processTermListLabel(value, lbl);
61 if (isEditable())
62 lbl.addMouseListener((MouseDoubleClick) (e) -> {
63 startEditing();
64 });
65 if (isEditing()) {
66 ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
67 ToolItem deleteItem = new ToolItem(toolBar, SWT.FLAT);
68 styleDelete(deleteItem);
69 deleteItem.addSelectionListener((Selected) (e) -> {
70 // we retrieve them again here because they may have changed
71 List<Term> curr = getValue();
72 List<Term> newValue = new ArrayList<>();
73 for (Term v : curr) {
74 if (!v.equals(value))
75 newValue.add(v);
76 }
77 setValue(newValue);
78 block.dispose();
79 layout(true, true);
80 });
81
82 }
83 }
84 } else {// empty
85 if (isEditable() && !isEditing()) {
86 ToolBar toolBar = new ToolBar(placeholder, SWT.HORIZONTAL);
87 ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
88 styleAdd(addItem);
89 addItem.addSelectionListener((Selected) (e) -> {
90 startEditing();
91 });
92 }
93 }
94
95 if (isEditing()) {
96 Composite block = new Composite(placeholder, SWT.NONE);
97 block.setLayout(CmsUiUtils.noSpaceGridLayout(3));
98
99 createHighlight(block);
100
101 Text txt = new Text(block, SWT.SINGLE | SWT.BORDER);
102 txt.setLayoutData(CmsUiUtils.fillWidth());
103 // txt.setMessage("[new]");
104
105 CmsUiUtils.style(txt, style == null ? FormStyle.propertyText.style() : style);
106
107 ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
108 ToolItem cancelItem = new ToolItem(toolBar, SWT.FLAT);
109 styleCancel(cancelItem);
110 cancelItem.addSelectionListener((Selected) (e) -> {
111 stopEditing();
112 });
113
114 ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) {
115 private static final long serialVersionUID = -7980078594405384874L;
116
117 @Override
118 protected void onHide() {
119 stopEditing();
120 }
121 };
122 contextOverlay.setLayout(new GridLayout());
123 // filter
124 txt.addModifyListener((e) -> {
125 String filter = txt.getText().toLowerCase();
126 if ("".equals(filter.trim()))
127 filter = null;
128 refresh(contextOverlay, filter, txt);
129 });
130 txt.addFocusListener(new FocusListener() {
131 private static final long serialVersionUID = -6024501573409619949L;
132
133 @Override
134 public void focusLost(FocusEvent event) {
135 // if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
136 // getDisplay().asyncExec(() -> stopEditing());
137 }
138
139 @Override
140 public void focusGained(FocusEvent event) {
141 // txt.setText("");
142 if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible())
143 refresh(contextOverlay, null, txt);
144 }
145 });
146 layout(new Control[] { txt });
147 // getDisplay().asyncExec(() -> txt.setFocus());
148 }
149 return placeholder;
150 }
151
152 @Override
153 protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
154 CmsUiUtils.clear(contextArea);
155 List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
156 List<Term> currentValue = getValue();
157 terms: for (Term term : terms) {
158 if (currentValue != null && currentValue.contains(term))
159 continue terms;
160 String display = getTermLabel(term);
161 if (filter != null && !display.toLowerCase().contains(filter))
162 continue terms;
163 Label termL = new Label(contextArea, SWT.WRAP);
164 termL.setText(display);
165 processTermListLabel(term, termL);
166 if (isTermSelectable(term))
167 termL.addMouseListener((MouseDown) (e) -> {
168 List<Term> newValue = new ArrayList<>();
169 List<Term> curr = getValue();
170 if (currentValue != null)
171 newValue.addAll(curr);
172 newValue.add(term);
173 setValue(newValue);
174 contextArea.hide();
175 stopEditing();
176 });
177 }
178 contextArea.show();
179 }
180
181 protected List<Term> getValue() {
182 String property = typology.getId();
183 List<String> curr = Jcr.getMultiple(getNode(), property);
184 List<Term> res = new ArrayList<>();
185 if (curr != null)
186 terms: for (String str : curr) {
187 Term term = termsManager.getTerm(str);
188 if (term == null) {
189 log.warn("Ignoring term " + str + " for " + getNode() + ", as it was not found.");
190 continue terms;
191 }
192 res.add(term);
193 }
194 return res;
195 }
196
197 protected void setValue(List<Term> value) {
198 String property = typology.getId();
199 List<String> ids = new ArrayList<>();
200 for (Term term : value) {
201 ids.add(term.getId());
202 }
203 Jcr.set(getNode(), property, ids);
204 Jcr.save(getNode());
205 }
206
207 }