]> git.argeo.org Git - gpl/argeo-suite.git/blob - terms/MultiTermsPart.java
Prepare next development cycle
[gpl/argeo-suite.git] / terms / MultiTermsPart.java
1 package org.argeo.app.swt.terms;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.argeo.api.acr.Content;
7 import org.argeo.api.acr.NamespaceUtils;
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.app.ux.SuiteStyle;
12 import org.argeo.cms.swt.CmsSwtUtils;
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.SwtEditablePart;
17 import org.argeo.cms.swt.widgets.ContextOverlay;
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.events.FocusEvent;
20 import org.eclipse.swt.events.FocusListener;
21 import org.eclipse.swt.layout.GridLayout;
22 import org.eclipse.swt.layout.RowLayout;
23 import org.eclipse.swt.widgets.Composite;
24 import org.eclipse.swt.widgets.Control;
25 import org.eclipse.swt.widgets.Text;
26 import org.eclipse.swt.widgets.ToolBar;
27 import org.eclipse.swt.widgets.ToolItem;
28
29 /** {@link SwtEditablePart} for multiple terms. */
30 public class MultiTermsPart extends AbstractTermsPart {
31 private static final long serialVersionUID = -4961135649177920808L;
32 private final static CmsLog log = CmsLog.getLog(MultiTermsPart.class);
33
34 public MultiTermsPart(Composite parent, int style, Content item, TermsManager termsManager, String typology) {
35 super(parent, style, item, termsManager, typology);
36 }
37
38 @Override
39 protected Control createControl(Composite box, String style) {
40 Composite placeholder = new Composite(box, SWT.NONE);
41
42 boolean vertical = SWT.VERTICAL == (getStyle() & SWT.VERTICAL);
43 RowLayout rl = new RowLayout(vertical ? SWT.VERTICAL : SWT.HORIZONTAL);
44 rl = CmsSwtUtils.noMarginsRowLayout(rl);
45 // rl.wrap = true;
46 // rl.justify = true;
47 placeholder.setLayout(rl);
48 List<Term> currentValue = getValue();
49 if (currentValue != null && !currentValue.isEmpty()) {
50 for (Term value : currentValue) {
51 Composite block = new Composite(placeholder, SWT.NONE);
52 block.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
53 Text lbl = new Text(block, SWT.NONE);
54 lbl.setEditable(false);
55 String display = getTermLabel(value);
56 lbl.setText(display);
57 CmsSwtUtils.style(lbl, style == null ? SuiteStyle.simpleInput.style() : style);
58 processTermListLabel(value, lbl);
59 if (isEditable())
60 lbl.addMouseListener((MouseDoubleClick) (e) -> {
61 startEditing();
62 });
63 if (isEditing()) {
64 ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
65 ToolItem deleteItem = new ToolItem(toolBar, SWT.FLAT);
66 styleDelete(deleteItem);
67 deleteItem.addSelectionListener((Selected) (e) -> {
68 // we retrieve them again here because they may have changed
69 List<Term> curr = getValue();
70 List<Term> newValue = new ArrayList<>();
71 for (Term v : curr) {
72 if (!v.equals(value))
73 newValue.add(v);
74 }
75 setValue(newValue);
76 block.dispose();
77 layout(true, true);
78 });
79
80 }
81 }
82 } else {// empty
83 if (isEditable() && !isEditing()) {
84 ToolBar toolBar = new ToolBar(placeholder, SWT.HORIZONTAL);
85 ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
86 styleAdd(addItem);
87 addItem.addSelectionListener((Selected) (e) -> {
88 startEditing();
89 });
90 }
91 }
92
93 if (isEditing()) {
94 Composite block = new Composite(placeholder, SWT.NONE);
95 block.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
96
97 createHighlight(block);
98
99 Text txt = new Text(block, SWT.SINGLE | SWT.BORDER);
100 txt.setLayoutData(CmsSwtUtils.fillWidth());
101 // txt.setMessage("[new]");
102
103 CmsSwtUtils.style(txt, style == null ? SuiteStyle.simpleInput.style() : style);
104
105 ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
106 ToolItem cancelItem = new ToolItem(toolBar, SWT.FLAT);
107 styleCancel(cancelItem);
108 cancelItem.addSelectionListener((Selected) (e) -> {
109 stopEditing();
110 });
111
112 ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) {
113 private static final long serialVersionUID = -7980078594405384874L;
114
115 @Override
116 protected void onHide() {
117 stopEditing();
118 }
119 };
120 contextOverlay.setLayout(new GridLayout());
121 // filter
122 txt.addModifyListener((e) -> {
123 String filter = txt.getText().toLowerCase();
124 if ("".equals(filter.trim()))
125 filter = null;
126 refresh(contextOverlay, filter, txt);
127 });
128 txt.addFocusListener(new FocusListener() {
129 private static final long serialVersionUID = -6024501573409619949L;
130
131 @Override
132 public void focusLost(FocusEvent event) {
133 // if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
134 // getDisplay().asyncExec(() -> stopEditing());
135 }
136
137 @Override
138 public void focusGained(FocusEvent event) {
139 // txt.setText("");
140 if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible())
141 refresh(contextOverlay, null, txt);
142 }
143 });
144 layout(new Control[] { txt });
145 // getDisplay().asyncExec(() -> txt.setFocus());
146 }
147 return placeholder;
148 }
149
150 @Override
151 protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
152 CmsSwtUtils.clear(contextArea);
153 List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
154 List<Term> currentValue = getValue();
155 terms: for (Term term : terms) {
156 if (currentValue != null && currentValue.contains(term))
157 continue terms;
158 String display = getTermLabel(term);
159 if (filter != null && !display.toLowerCase().contains(filter))
160 continue terms;
161 Text termL = new Text(contextArea, SWT.WRAP);
162 termL.setEditable(false);
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 = getContent().getMultiple(NamespaceUtils.unqualified(property));
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 " + getContent() + ", 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 getContent().put(property, ids);
204 // Jcr.set(getNode(), property, ids);
205 // Jcr.save(getNode());
206 }
207
208 }