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