]> git.argeo.org Git - gpl/argeo-suite.git/blob - swt/terms/SingleTermPart.java
Prepare next development cycle
[gpl/argeo-suite.git] / swt / terms / SingleTermPart.java
1 package org.argeo.app.swt.terms;
2
3 import java.util.List;
4
5 import org.argeo.api.acr.Content;
6 import org.argeo.app.api.Term;
7 import org.argeo.app.api.TermsManager;
8 import org.argeo.app.ux.SuiteStyle;
9 import org.argeo.cms.swt.CmsSwtUtils;
10 import org.argeo.cms.swt.MouseDoubleClick;
11 import org.argeo.cms.swt.MouseDown;
12 import org.argeo.cms.swt.Selected;
13 import org.argeo.cms.swt.SwtEditablePart;
14 import org.argeo.cms.swt.widgets.ContextOverlay;
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.events.FocusEvent;
17 import org.eclipse.swt.events.FocusListener;
18 import org.eclipse.swt.layout.GridLayout;
19 import org.eclipse.swt.widgets.Composite;
20 import org.eclipse.swt.widgets.Control;
21 import org.eclipse.swt.widgets.Text;
22 import org.eclipse.swt.widgets.ToolBar;
23 import org.eclipse.swt.widgets.ToolItem;
24
25 /** {@link SwtEditablePart} for terms. */
26 public class SingleTermPart extends AbstractTermsPart {
27 private static final long serialVersionUID = -4961135649177920808L;
28
29 public SingleTermPart(Composite parent, int style, Content item, TermsManager termsManager, String typology) {
30 super(parent, style, item, termsManager, typology);
31 }
32
33 @Override
34 protected Control createControl(Composite box, String style) {
35 if (isEditing()) {
36 Composite block = new Composite(box, SWT.NONE);
37 block.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
38
39 createHighlight(block);
40
41 Text txt = new Text(block, SWT.SINGLE);
42 CmsSwtUtils.style(txt, style == null ? SuiteStyle.simpleInput.style() : style);
43
44 ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
45 if (isCanDelete()) {
46 ToolItem deleteItem = new ToolItem(toolBar, SWT.PUSH);
47 styleDelete(deleteItem);
48 deleteItem.addSelectionListener((Selected) (e) -> {
49 setValue(null);
50 stopEditing();
51 });
52 }
53 ToolItem cancelItem = new ToolItem(toolBar, SWT.PUSH);
54 styleCancel(cancelItem);
55 cancelItem.addSelectionListener((Selected) (e) -> {
56 stopEditing();
57 });
58
59 ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) {
60 private static final long serialVersionUID = -7980078594405384874L;
61
62 @Override
63 protected void onHide() {
64 stopEditing();
65 }
66 };
67 contextOverlay.setLayout(new GridLayout());
68 // filter
69 txt.addModifyListener((e) -> {
70 String filter = txt.getText().toLowerCase();
71 if ("".equals(filter.trim()))
72 filter = null;
73 refresh(contextOverlay, filter, txt);
74 });
75 txt.addFocusListener(new FocusListener() {
76 private static final long serialVersionUID = -6024501573409619949L;
77
78 @Override
79 public void focusLost(FocusEvent event) {
80 // if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
81 // getDisplay().asyncExec(() -> stopEditing());
82 }
83
84 @Override
85 public void focusGained(FocusEvent event) {
86 // txt.setText("");
87 if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible())
88 refresh(contextOverlay, null, txt);
89 }
90 });
91 layout(new Control[] { block });
92 getDisplay().asyncExec(() -> txt.setFocus());
93 return block;
94 } else {
95 Composite block = new Composite(box, SWT.NONE);
96 block.setLayout(CmsSwtUtils.noSpaceGridLayout(2));
97 Term currentValue = getValue();
98 if (currentValue != null) {
99 Text lbl = new Text(block, SWT.SINGLE);
100 lbl.setEditable(false);
101 String display = getTermLabel(currentValue);
102 lbl.setText(display);
103 CmsSwtUtils.style(lbl, style == null ? SuiteStyle.simpleInput.style() : style);
104 processTermListLabel(currentValue, lbl);
105 if (isEditable()) {
106 lbl.addMouseListener((MouseDoubleClick) (e) -> {
107 startEditing();
108 });
109 }
110 } else {
111 if (isEditable()) {
112
113 ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
114 ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
115 styleAdd(addItem);
116 addItem.addSelectionListener((Selected) (e) -> {
117 startEditing();
118 });
119 }
120 // add dummy text so that height wont's move afterwards
121 Text lbl = new Text(block, SWT.SINGLE);
122 lbl.setEditable(false);
123 if (!isEditable()) {// empty, non editable
124 if (getMessage() != null)
125 lbl.setMessage(getMessage());
126 }
127 }
128 return block;
129 }
130 }
131
132 @Override
133 protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
134 CmsSwtUtils.clear(contextArea);
135 List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
136 terms: for (Term term : terms) {
137 String display = getTermLabel(term);
138 if (filter != null && !display.toLowerCase().contains(filter))
139 continue terms;
140 Text termL = new Text(contextArea, SWT.WRAP);
141 termL.setEditable(false);
142 termL.setText(display);
143 processTermListLabel(term, termL);
144 if (isTermSelectable(term))
145 termL.addMouseListener((MouseDown) (e) -> {
146 setValue(term);
147 contextArea.hide();
148 stopEditing();
149 });
150 }
151 contextArea.show();
152 // txt.setFocus();
153 }
154
155 protected Term getValue() {
156 String property = typology.getId();
157 String id = getContent().attr(property);
158 Term term = termsManager.getTerm(id);
159
160 return term;
161 }
162
163 protected void setValue(Term value) {
164 String property = typology.getId();
165 if (value == null)
166 getContent().remove(property);
167 else
168 getContent().put(property, value.getId());
169 // Jcr.set(getNode(), property, value != null ? value.getId() : null);
170 // Jcr.save(getNode());
171 }
172 }