Merge branch 'release/5.18.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / featuretree / e4 / FeatureTreeDtoEditorComposite.java
1 /**
2 * Copyright (C) 2017 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.taxeditor.featuretree.e4;
10
11 import java.util.HashMap;
12 import java.util.Map;
13 import java.util.UUID;
14
15 import org.eclipse.jface.viewers.ISelectionChangedListener;
16 import org.eclipse.jface.viewers.TreeViewer;
17 import org.eclipse.swt.SWT;
18 import org.eclipse.swt.dnd.DND;
19 import org.eclipse.swt.dnd.DragSourceListener;
20 import org.eclipse.swt.dnd.DropTargetListener;
21 import org.eclipse.swt.dnd.Transfer;
22 import org.eclipse.swt.events.ModifyListener;
23 import org.eclipse.swt.events.SelectionAdapter;
24 import org.eclipse.swt.events.SelectionEvent;
25 import org.eclipse.swt.events.SelectionListener;
26 import org.eclipse.swt.layout.GridData;
27 import org.eclipse.swt.layout.GridLayout;
28 import org.eclipse.swt.widgets.Button;
29 import org.eclipse.swt.widgets.Composite;
30 import org.eclipse.swt.widgets.Label;
31 import org.eclipse.swt.widgets.Text;
32 import org.eclipse.swt.widgets.Tree;
33
34 import eu.etaxonomy.cdm.api.service.ITermTreeService;
35 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
36 import eu.etaxonomy.cdm.model.term.TermTree;
37 import eu.etaxonomy.cdm.model.term.TermType;
38 import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
39 import eu.etaxonomy.cdm.persistence.dto.TermTreeDto;
40 import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
41 import eu.etaxonomy.taxeditor.featuretree.CharacterNodeDtoTransfer;
42 import eu.etaxonomy.taxeditor.featuretree.FeatureTreeContentProvider;
43 import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
44 import eu.etaxonomy.taxeditor.l10n.Messages;
45 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
46 import eu.etaxonomy.taxeditor.model.ImageResources;
47 import eu.etaxonomy.taxeditor.store.CdmStore;
48 import eu.etaxonomy.taxeditor.store.StoreUtil;
49 import eu.etaxonomy.taxeditor.ui.dialog.selection.FeatureTreeSelectionDialog;
50
51 /**
52 * @author pplitzner
53 * @since Jun 19, 2017
54 */
55 public class FeatureTreeDtoEditorComposite <T extends DefinedTermBase> extends Composite{
56
57 private TermTreeDto featureTree;
58
59 private Label label_title;
60 private Text text_title;
61 private Button btnOpenFeatureTree;
62 private TreeViewer viewer;
63
64 private Map<UUID, TermNodeDto> nodeUuidMap = new HashMap<>();
65
66 public FeatureTreeDtoEditorComposite(Composite parent, int style) {
67 super(parent, style);
68 setLayout(new GridLayout(1, false));
69
70 Composite composite_treeTitle = new Composite(this, SWT.NULL);
71 composite_treeTitle.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true,
72 false));
73 GridLayout gl_composite_treeTitle = new GridLayout(3, false);
74 gl_composite_treeTitle.marginWidth = 0;
75 composite_treeTitle.setLayout(gl_composite_treeTitle);
76
77 label_title = new Label(composite_treeTitle, SWT.NULL);
78 label_title.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
79 label_title.setText(Messages.FeatureTreeEditorComposite_FEATURE_TREE);
80
81 text_title = new Text(composite_treeTitle, SWT.BORDER);
82 text_title.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
83 text_title.setEditable(false);
84
85 btnOpenFeatureTree = new Button(composite_treeTitle, SWT.NONE);
86 btnOpenFeatureTree.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1));
87 btnOpenFeatureTree.setToolTipText(Messages.FeatureTreeEditorComposite_OPEN_TREE);
88 btnOpenFeatureTree.setImage(ImageResources.getImage(ImageResources.BROWSE_ICON));
89
90 viewer = new TreeViewer(new Tree(this, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI));
91 Tree tree = viewer.getTree();
92 tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
93 viewer.getControl().setLayoutData(
94 new GridData(SWT.FILL, SWT.FILL, true, true));
95 }
96
97 public void init(String label,
98 DragSourceListener dragSourceListener,
99 DropTargetListener dropTargetListener,
100 ISelectionChangedListener viewerSelectionChangedListener,
101 IDirtyMarkable dirtyMarkable,
102 ModifyListener textModifyListener) {
103 init(label,
104 null,
105 dragSourceListener,
106 dropTargetListener,
107 null,
108 viewerSelectionChangedListener,
109 null,
110 dirtyMarkable,
111 textModifyListener);
112 }
113
114 public void init(String label, TermType termType,
115 DragSourceListener dragSourceListener,
116 DropTargetListener dropTargetListener,
117 ISelectionChangedListener viewerSelectionChangedListener,
118 IDirtyMarkable dirtyMarkable,
119 ModifyListener textModifyListener) {
120 this.init(label,
121 termType,
122 dragSourceListener,
123 dropTargetListener,
124 null,
125 viewerSelectionChangedListener,
126 null,
127 dirtyMarkable,
128 textModifyListener);
129 }
130 public void init(DragSourceListener dragSourceListener,
131 DropTargetListener dropTargetListener,
132 Transfer[] transfers,
133 ISelectionChangedListener viewerSelectionChangedListener,
134 SelectionListener openFeatureTreeSelectionListener,
135 ModifyListener textModifyListener) {
136 init(null,
137 null,
138 dragSourceListener,
139 dropTargetListener,
140 transfers,
141 viewerSelectionChangedListener,
142 openFeatureTreeSelectionListener,
143 null,
144 textModifyListener);
145 }
146 private void init(String label,
147 TermType termType,
148 DragSourceListener dragSourceListener,
149 DropTargetListener dropTargetListener,
150 Transfer[] transfers,
151 ISelectionChangedListener viewerSelectionChangedListener,
152 SelectionListener openFeatureTreeSelectionListener,
153 IDirtyMarkable dirtyMarkable,
154 ModifyListener textModifyListener) {
155 if(label!=null){
156 label_title.setText(label);
157 }
158
159 viewer.setContentProvider(new FeatureTreeContentProvider());
160 viewer.setLabelProvider(new FeatureTreeLabelProvider());
161
162 int ops = DND.DROP_COPY | DND.DROP_MOVE;
163 if(transfers==null){
164 transfers = new Transfer[] {
165 CharacterNodeDtoTransfer.getInstance(),
166 TermTransfer.getInstance(),
167 };
168 }
169 if(dragSourceListener!=null){
170 viewer.addDragSupport(ops, transfers, dragSourceListener);
171 }
172 if(dropTargetListener!=null){
173 viewer.addDropSupport(ops, transfers, dropTargetListener);
174 }
175
176 if(viewerSelectionChangedListener!=null){
177 viewer.addSelectionChangedListener(viewerSelectionChangedListener);
178 }
179
180 if(textModifyListener!=null){
181 text_title.addModifyListener(textModifyListener);
182 }
183
184 //add specific selection listener
185 if(openFeatureTreeSelectionListener!=null){
186 btnOpenFeatureTree.addSelectionListener(openFeatureTreeSelectionListener);
187 }
188 else{
189 //add default selection listener
190 btnOpenFeatureTree.addSelectionListener(new SelectionAdapter(){
191 @Override
192 public void widgetSelected(SelectionEvent e) {
193 TermTree<T> tree = FeatureTreeSelectionDialog.select(getDisplay().getActiveShell(),
194 null, termType);
195 if(tree!=null){
196 setSelectedTree(tree);
197 if(dirtyMarkable!=null){
198 dirtyMarkable.forceDirty();
199 }
200 }
201 }
202 });
203 }
204 }
205
206 public void setSelectedTree(TermTree<T> featureTree) {
207 this.featureTree = CdmStore.getService(ITermTreeService.class).getTermTreeDtoByUuid(featureTree.getUuid());
208 addChildNodesToMap(this.featureTree.getRoot());
209 viewer.setInput(this.featureTree);
210
211 StoreUtil.setTextWithoutModifyListeners(text_title, featureTree!=null?featureTree.getTitleCache():"");
212 }
213
214 private void addChildNodesToMap(TermNodeDto root) {
215 this.nodeUuidMap.put(root.getUuid(), root);
216 if (root.getTerm() != null){
217 this.featureTree.addTerm(root.getTerm());
218 }
219 for (TermNodeDto child: root.getChildren()){
220 addChildNodesToMap(child);
221 }
222
223 }
224
225 public TermTreeDto getFeatureTree() {
226 return featureTree;
227 }
228
229 public Label getLabel_title() {
230 return label_title;
231 }
232
233 public Button getBtnOpenFeatureTree() {
234 return btnOpenFeatureTree;
235 }
236
237 public TreeViewer getViewer() {
238 return viewer;
239 }
240
241 public Map<UUID, TermNodeDto> getNodeUuidMap() {
242 return nodeUuidMap;
243 }
244
245 public void setNodeUuidMap(Map<UUID, TermNodeDto> nodeUuidMap) {
246 this.nodeUuidMap = nodeUuidMap;
247 }
248
249 /**
250 *
251 */
252 public void refresh() {
253 getViewer().setInput(getViewer().getInput());
254 addChildNodesToMap(this.featureTree.getRoot());
255
256 }
257
258
259
260 }