ref #6694 Extract composite and Listeners from FeatureTreeEditor
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / featuretree / e4 / FeatureTreeEditor.java
1 /**
2 * Copyright (C) 2007 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
10 package eu.etaxonomy.taxeditor.featuretree.e4;
11
12 import java.util.Collection;
13
14 import javax.annotation.PostConstruct;
15 import javax.inject.Inject;
16 import javax.inject.Named;
17
18 import org.eclipse.core.runtime.IStatus;
19 import org.eclipse.e4.ui.di.Focus;
20 import org.eclipse.e4.ui.di.Persist;
21 import org.eclipse.e4.ui.model.application.ui.MDirtyable;
22 import org.eclipse.e4.ui.services.IServiceConstants;
23 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
24 import org.eclipse.jface.viewers.ISelectionChangedListener;
25 import org.eclipse.jface.viewers.IStructuredSelection;
26 import org.eclipse.jface.viewers.SelectionChangedEvent;
27 import org.eclipse.jface.wizard.WizardDialog;
28 import org.eclipse.swt.SWT;
29 import org.eclipse.swt.events.ModifyEvent;
30 import org.eclipse.swt.events.ModifyListener;
31 import org.eclipse.swt.events.SelectionAdapter;
32 import org.eclipse.swt.events.SelectionEvent;
33 import org.eclipse.swt.widgets.Composite;
34 import org.eclipse.swt.widgets.Shell;
35
36 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
37 import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
38 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
39 import eu.etaxonomy.cdm.api.service.config.FeatureNodeDeletionConfigurator;
40 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
41 import eu.etaxonomy.cdm.model.description.Feature;
42 import eu.etaxonomy.cdm.model.description.FeatureNode;
43 import eu.etaxonomy.cdm.model.description.FeatureTree;
44 import eu.etaxonomy.taxeditor.featuretree.AvailableFeaturesWizard;
45 import eu.etaxonomy.taxeditor.store.CdmStore;
46 import eu.etaxonomy.taxeditor.ui.dialog.selection.FeatureTreeSelectionDialog;
47
48 /**
49 *
50 * @author pplitzner
51 * @date 06.06.2017
52 *
53 */
54 public class FeatureTreeEditor implements
55 ModifyListener, ISelectionChangedListener {
56
57 private ConversationHolder conversation;
58
59 @Inject
60 private ESelectionService selService;
61
62 @Inject
63 private MDirtyable dirty;
64
65 private Shell shell;
66
67 private FeatureTree featureTree;
68
69 private FeatureTreeEditorComposite composite;
70
71 @Inject
72 public FeatureTreeEditor(@Named(IServiceConstants.ACTIVE_SHELL)Shell shell) {
73 this.shell = shell;
74 if(conversation==null){
75 conversation = CdmStore.createConversation();
76 }
77 }
78
79 /** {@inheritDoc} */
80 @PostConstruct
81 public void createControl(Composite parent, @Named(IServiceConstants.ACTIVE_SHELL)Shell shell) {
82 composite = new FeatureTreeEditorComposite(parent, SWT.NULL);
83 composite.init(new FeatureNodeDragListener(composite.getViewer()), new FeatureNodeDropAdapter(this, composite.getViewer()), this, new SelectionAdapter() {
84 @Override
85 public void widgetSelected(SelectionEvent e) {
86 FeatureTree tree = FeatureTreeSelectionDialog.select(shell, conversation, null);
87 if(tree!=null){
88 setSelectedTree(tree);
89 }
90 }
91 }, new AddButtonListener(), new RemoveSelectionListener());
92 }
93
94 public void setDirty(boolean isDirty){
95 this.dirty.setDirty(isDirty);
96 }
97
98 public void setSelectedTree(FeatureTree featureTree) {
99 this.featureTree = HibernateProxyHelper.deproxy(featureTree, FeatureTree.class);
100 this.featureTree.setRoot(HibernateProxyHelper.deproxy(featureTree.getRoot(), FeatureNode.class));
101 composite.getViewer().setInput(featureTree);
102
103 composite.getText_title().removeModifyListener(this);
104 composite.getText_title().setText(featureTree.getTitleCache());
105 composite.getText_title().addModifyListener(this);
106 }
107
108 /** {@inheritDoc} */
109 @Override
110 public void modifyText(ModifyEvent e) {
111 featureTree.setTitleCache(composite.getText_title().getText(), true);
112 setDirty(true);
113 }
114
115 /** {@inheritDoc} */
116 @Override
117 public void selectionChanged(SelectionChangedEvent event) {
118 IStructuredSelection selection = (IStructuredSelection) event
119 .getSelection();
120
121 composite.getButton_add().setEnabled(selection.size() <= 1);
122 composite.getButton_remove().setEnabled(selection.size() > 0);
123 //propagate selection
124 IStructuredSelection isel = (IStructuredSelection) event.getSelection();
125 selService.setSelection((isel.size() == 1 ? isel.getFirstElement() : isel.toArray()));
126 }
127
128 @Focus
129 public void focus(){
130 composite.getViewer().getControl().setFocus();
131 if(conversation!=null && !conversation.isBound()){
132 conversation.bind();
133 }
134 }
135
136 @Persist
137 public void save(){
138 CdmStore.getService(IFeatureTreeService.class).saveOrUpdate(featureTree);
139 setDirty(false);
140 }
141
142 private class AddButtonListener extends SelectionAdapter {
143 @Override
144 public void widgetSelected(SelectionEvent e) {
145 AvailableFeaturesWizard wizard = new AvailableFeaturesWizard(
146 featureTree);
147 WizardDialog dialog = new WizardDialog(shell, wizard);
148
149 if (dialog.open() == IStatus.OK) {
150 IStructuredSelection selection = (IStructuredSelection) composite.getViewer()
151 .getSelection();
152 FeatureNode parent = (FeatureNode) (selection.getFirstElement() != null ? selection
153 .getFirstElement() : ((FeatureTree) composite.getViewer().getInput())
154 .getRoot());
155 Collection<Feature> additionalFeatures = wizard
156 .getAdditionalFeatures();
157 for (Feature feature : additionalFeatures) {
158 FeatureNode child = FeatureNode.NewInstance(feature);
159 CdmStore.getService(IFeatureNodeService.class).merge(child, true);
160
161 parent.addChild(child);
162 }
163 setDirty(true);
164 composite.getViewer().refresh();
165 }
166 }
167
168 }
169
170 private class RemoveSelectionListener extends SelectionAdapter {
171 @Override
172 public void widgetSelected(SelectionEvent e) {
173 IStructuredSelection selection = (IStructuredSelection) composite.getViewer()
174 .getSelection();
175
176 for (Object selectedObject : selection.toArray()) {
177 FeatureNode featureNode = (FeatureNode) selectedObject;
178 FeatureNode parent = featureNode.getParent();
179 parent.removeChild(featureNode);
180
181 CdmStore.getService(IFeatureNodeService.class).deleteFeatureNode(featureNode.getUuid(), new FeatureNodeDeletionConfigurator());
182
183 }
184 setDirty(true);
185 composite.getViewer().refresh();
186 }
187 }
188 }