1 package org
.argeo
.app
.swt
.terms
;
3 import java
.util
.ArrayList
;
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
;
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);
34 public MultiTermsPart(Composite parent
, int style
, Content item
, TermsManager termsManager
, String typology
) {
35 super(parent
, style
, item
, termsManager
, typology
);
39 protected Control
createControl(Composite box
, String style
) {
40 Composite placeholder
= new Composite(box
, SWT
.NONE
);
42 boolean vertical
= SWT
.VERTICAL
== (getStyle() & SWT
.VERTICAL
);
43 RowLayout rl
= new RowLayout(vertical ? SWT
.VERTICAL
: SWT
.HORIZONTAL
);
44 rl
= CmsSwtUtils
.noMarginsRowLayout(rl
);
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
);
57 CmsSwtUtils
.style(lbl
, style
== null ? SuiteStyle
.simpleInput
.style() : style
);
58 processTermListLabel(value
, lbl
);
60 lbl
.addMouseListener((MouseDoubleClick
) (e
) -> {
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
<>();
83 if (isEditable() && !isEditing()) {
84 ToolBar toolBar
= new ToolBar(placeholder
, SWT
.HORIZONTAL
);
85 ToolItem addItem
= new ToolItem(toolBar
, SWT
.FLAT
);
87 addItem
.addSelectionListener((Selected
) (e
) -> {
94 Composite block
= new Composite(placeholder
, SWT
.NONE
);
95 block
.setLayout(CmsSwtUtils
.noSpaceGridLayout(3));
97 createHighlight(block
);
99 Text txt
= new Text(block
, SWT
.SINGLE
| SWT
.BORDER
);
100 txt
.setLayoutData(CmsSwtUtils
.fillWidth());
101 // txt.setMessage("[new]");
103 CmsSwtUtils
.style(txt
, style
== null ? SuiteStyle
.simpleInput
.style() : style
);
105 ToolBar toolBar
= new ToolBar(block
, SWT
.HORIZONTAL
);
106 ToolItem cancelItem
= new ToolItem(toolBar
, SWT
.FLAT
);
107 styleCancel(cancelItem
);
108 cancelItem
.addSelectionListener((Selected
) (e
) -> {
112 ContextOverlay contextOverlay
= new ContextOverlay(txt
, SWT
.NONE
) {
113 private static final long serialVersionUID
= -7980078594405384874L;
116 protected void onHide() {
120 contextOverlay
.setLayout(new GridLayout());
122 txt
.addModifyListener((e
) -> {
123 String filter
= txt
.getText().toLowerCase();
124 if ("".equals(filter
.trim()))
126 refresh(contextOverlay
, filter
, txt
);
128 txt
.addFocusListener(new FocusListener() {
129 private static final long serialVersionUID
= -6024501573409619949L;
132 public void focusLost(FocusEvent event
) {
133 // if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
134 // getDisplay().asyncExec(() -> stopEditing());
138 public void focusGained(FocusEvent event
) {
140 if (!contextOverlay
.isDisposed() && !contextOverlay
.isShellVisible())
141 refresh(contextOverlay
, null, txt
);
144 layout(new Control
[] { txt
});
145 // getDisplay().asyncExec(() -> txt.setFocus());
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
))
158 String display
= getTermLabel(term
);
159 if (filter
!= null && !display
.toLowerCase().contains(filter
))
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
);
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
<>();
186 terms
: for (String str
: curr
) {
187 Term term
= termsManager
.getTerm(str
);
189 log
.warn("Ignoring term " + str
+ " for " + getContent() + ", as it was not found.");
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());
203 getContent().put(property
, ids
);
204 // Jcr.set(getNode(), property, ids);
205 // Jcr.save(getNode());