3 * Copyright (C) 2017 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.editor
.workingSet
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Arrays
;
14 import java
.util
.HashMap
;
15 import java
.util
.Iterator
;
16 import java
.util
.List
;
19 import javax
.annotation
.PostConstruct
;
20 import javax
.annotation
.PreDestroy
;
21 import javax
.inject
.Inject
;
23 import org
.eclipse
.e4
.ui
.di
.Focus
;
24 import org
.eclipse
.e4
.ui
.di
.Persist
;
25 import org
.eclipse
.e4
.ui
.model
.application
.ui
.MDirtyable
;
26 import org
.eclipse
.e4
.ui
.services
.EMenuService
;
27 import org
.eclipse
.e4
.ui
.workbench
.modeling
.ESelectionService
;
28 import org
.eclipse
.jface
.viewers
.ISelection
;
29 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
30 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
31 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
32 import org
.eclipse
.jface
.viewers
.TreeSelection
;
33 import org
.eclipse
.swt
.SWT
;
34 import org
.eclipse
.swt
.custom
.SashForm
;
35 import org
.eclipse
.swt
.events
.ModifyEvent
;
36 import org
.eclipse
.swt
.events
.ModifyListener
;
37 import org
.eclipse
.swt
.events
.SelectionAdapter
;
38 import org
.eclipse
.swt
.events
.SelectionEvent
;
39 import org
.eclipse
.swt
.layout
.GridData
;
40 import org
.eclipse
.swt
.layout
.GridLayout
;
41 import org
.eclipse
.swt
.widgets
.Button
;
42 import org
.eclipse
.swt
.widgets
.Composite
;
43 import org
.eclipse
.swt
.widgets
.Display
;
44 import org
.eclipse
.ui
.forms
.widgets
.FormToolkit
;
46 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
47 import eu
.etaxonomy
.cdm
.api
.service
.IFeatureNodeService
;
48 import eu
.etaxonomy
.cdm
.api
.service
.IFeatureTreeService
;
49 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
50 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
51 import eu
.etaxonomy
.cdm
.model
.description
.Character
;
52 import eu
.etaxonomy
.cdm
.model
.description
.FeatureNode
;
53 import eu
.etaxonomy
.cdm
.model
.description
.FeatureTree
;
54 import eu
.etaxonomy
.taxeditor
.featuretree
.e4
.FeatureNodeDragListener
;
55 import eu
.etaxonomy
.taxeditor
.featuretree
.e4
.FeatureNodeDropAdapter
;
56 import eu
.etaxonomy
.taxeditor
.featuretree
.e4
.FeatureTreeEditorComposite
;
57 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
58 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasDetails
;
59 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasSupplementalData
;
60 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
61 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySession
;
62 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySessionEnabled
;
63 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
64 import eu
.etaxonomy
.taxeditor
.ui
.dialog
.selection
.FeatureTreeSelectionDialog
;
65 import eu
.etaxonomy
.taxeditor
.workbench
.part
.IE4ViewerPart
;
72 public class CharacterEditor
73 implements ICdmEntitySessionEnabled
, ISelectionChangedListener
, ModifyListener
, IE4ViewerPart
74 , IPartContentHasDetails
, IPartContentHasSupplementalData
{
76 private FeatureTreeEditorComposite characterTreeEditorComposite
;
77 private FeatureTreeEditorComposite propertiesTreeEditorComposite
;
78 private FeatureTreeEditorComposite structuresTreeEditorComposite
;
79 private final FormToolkit formToolkit
= new FormToolkit(Display
.getDefault());
80 private Button btnAddCharacter
;
83 private ESelectionService selService
;
86 private MDirtyable dirty
;
88 private ConversationHolder conversation
;
90 private ICdmEntitySession cdmEntitySession
;
91 private Composite composite
;
93 public CharacterEditor() {
97 * Create contents of the view part.
100 public void createControls(Composite parent
, EMenuService menuService
) {
101 if (CdmStore
.isActive()){
102 if(conversation
== null){
103 conversation
= CdmStore
.createConversation();
105 if(cdmEntitySession
!=null){
106 cdmEntitySession
= CdmStore
.getCurrentSessionManager().newSession(this, true);
112 parent
.setLayout(new GridLayout(1, false));
114 SashForm sashForm
= new SashForm(parent
, SWT
.NONE
);
115 sashForm
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 1, 1));
116 formToolkit
.adapt(sashForm
);
117 formToolkit
.paintBordersFor(sashForm
);
119 composite
= new Composite(sashForm
, SWT
.NONE
);
120 formToolkit
.adapt(composite
);
121 formToolkit
.paintBordersFor(composite
);
122 GridLayout gl_composite
= new GridLayout(1, false);
123 gl_composite
.marginWidth
= 0;
124 composite
.setLayout(gl_composite
);
126 structuresTreeEditorComposite
= addFeatureTreeEditor(composite
);
127 initFeatureTreeComposite(structuresTreeEditorComposite
, null, null);
128 structuresTreeEditorComposite
.getLabel_title().setText("Structures");
130 Composite composite_1
= new Composite(sashForm
, SWT
.NONE
);
131 formToolkit
.adapt(composite_1
);
132 formToolkit
.paintBordersFor(composite_1
);
133 GridLayout gl_composite_1
= new GridLayout(1, false);
134 gl_composite_1
.marginWidth
= 0;
135 composite_1
.setLayout(gl_composite_1
);
137 propertiesTreeEditorComposite
= addFeatureTreeEditor(composite_1
);
138 initFeatureTreeComposite(propertiesTreeEditorComposite
, null, null);
139 propertiesTreeEditorComposite
.getLabel_title().setText("Properties");
140 //TODO: fix drag and drop
141 // initFeatureTreeComposite(treeViewerProperties, new CharacterDragListener(treeViewerStructures.getViewer(), treeViewerProperties.getViewer()), null);
143 Composite composite_3
= new Composite(sashForm
, SWT
.NONE
);
144 formToolkit
.adapt(composite_3
);
145 formToolkit
.paintBordersFor(composite_3
);
146 GridLayout gl_composite_3
= new GridLayout(2, false);
147 gl_composite_3
.marginWidth
= 0;
148 composite_3
.setLayout(gl_composite_3
);
150 btnAddCharacter
= new Button(composite_3
, SWT
.NONE
);
151 btnAddCharacter
.setText(">>");
152 formToolkit
.adapt(btnAddCharacter
, true, true);
154 characterTreeEditorComposite
= addFeatureTreeEditor(composite_3
);
155 initFeatureTreeComposite(characterTreeEditorComposite
, new FeatureNodeDragListener(characterTreeEditorComposite
.getViewer()), new FeatureNodeDropAdapter(dirty
, characterTreeEditorComposite
.getViewer()));
156 characterTreeEditorComposite
.getLabel_title().setText("Characters");
158 //add context menu to character viewer//create context menu
159 menuService
.registerContextMenu(characterTreeEditorComposite
.getViewer().getControl(), "eu.etaxonomy.taxeditor.editor.popupmenu.characterEditor");
164 private FeatureTreeEditorComposite
addFeatureTreeEditor(Composite composite_3
) {
165 FeatureTreeEditorComposite featureTreeEditorComposite
= new FeatureTreeEditorComposite(composite_3
, SWT
.NONE
);
166 featureTreeEditorComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 1, 1));
167 return featureTreeEditorComposite
;
170 private void initFeatureTreeComposite(FeatureTreeEditorComposite featureTreeEditorComposite
,
171 FeatureNodeDragListener featureNodeDragListener
, FeatureNodeDropAdapter featureNodeDropAdapter
) {
172 featureTreeEditorComposite
.init(featureNodeDragListener
, featureNodeDropAdapter
, this,
173 new FeatureTreeChooserListener(featureTreeEditorComposite
));
178 if(characterTreeEditorComposite
!=null){
179 characterTreeEditorComposite
.getViewer().getControl().setFocus();
181 if(conversation
!=null && !conversation
.isBound()){
184 if(cdmEntitySession
!= null) {
185 cdmEntitySession
.bind();
190 btnAddCharacter
.addSelectionListener(new SelectionAdapter() {
195 public void widgetSelected(SelectionEvent e
) {
196 ISelection structureTreeSelection
= structuresTreeEditorComposite
.getViewer().getSelection();
197 ISelection propertyTreeSelection
= propertiesTreeEditorComposite
.getViewer().getSelection();
198 if(structureTreeSelection
==null || propertyTreeSelection
==null || characterTreeEditorComposite
.getFeatureTree()==null){
199 MessagingUtils
.warningDialog("Cannot perform action", CharacterEditor
.this,
200 "You have to select a structure, a property and a feature tree to perform this action.");
203 //get selected structures and properties
204 Iterator
<FeatureNode
> structureIterator
= ((TreeSelection
)structureTreeSelection
).iterator();
206 //create all combinations of structures and properties
207 while(structureIterator
.hasNext()){
208 FeatureNode structureNode
= structureIterator
.next();
209 Iterator
<FeatureNode
> propertiesIterator
= ((TreeSelection
)propertyTreeSelection
).iterator();
210 while(propertiesIterator
.hasNext()){
211 FeatureNode propertyNode
= propertiesIterator
.next();
212 //create new Character
213 String label
= structureNode
.getFeature().generateTitle()+" "+propertyNode
.getFeature().generateTitle();
214 Character character
= Character
.NewInstance(structureNode
, propertyNode
, "", label
, label
);
215 character
= HibernateProxyHelper
.deproxy(CdmStore
.getService(ITermService
.class).merge(character
), Character
.class);
217 //add new Character to feature tree
218 FeatureNode parent
= ((FeatureTree
) characterTreeEditorComposite
.getViewer().getInput()).getRoot();
219 CdmStore
.getService(IFeatureNodeService
.class).addChildFeatureNode(parent
.getUuid(), character
.getUuid());
224 characterTreeEditorComposite
.getViewer().refresh();
231 if (!conversation
.isBound()) {
235 // commit the conversation and start a new transaction immediately
236 conversation
.commit(true);
238 CdmStore
.getService(IFeatureTreeService
.class).saveOrUpdate(characterTreeEditorComposite
.getFeatureTree());
240 this.setDirty(false);
244 public void dispose(){
245 if(conversation
!=null){
246 conversation
.close();
248 if(cdmEntitySession
!= null) {
249 cdmEntitySession
.dispose();
254 public Map
<Object
, List
<String
>> getPropertyPathsMap() {
255 List
<String
> propertyPaths
= Arrays
.asList(new String
[] {
256 "children", //$NON-NLS-1$
257 "feature", //$NON-NLS-1$
258 "featureTree", //$NON-NLS-1$
260 Map
<Object
, List
<String
>> propertyPathMap
=
261 new HashMap
<Object
, List
<String
>>();
262 propertyPathMap
.put(FeatureNode
.class,propertyPaths
);
263 return propertyPathMap
;
270 public List
<FeatureTree
> getRootEntities() {
271 List
<FeatureTree
> root
= new ArrayList
<>();
272 root
.add(characterTreeEditorComposite
.getFeatureTree());
277 public ICdmEntitySession
getCdmEntitySession() {
278 return cdmEntitySession
;
282 public void setFocus() {
283 if(conversation
!=null && !conversation
.isBound()){
290 public void selectionChanged(SelectionChangedEvent event
) {
291 //propagate selection
292 selService
.setSelection(AbstractUtility
.getElementsFromSelectionChangedEvent(event
));
300 public void modifyText(ModifyEvent e
) {
301 characterTreeEditorComposite
.getFeatureTree().setTitleCache(characterTreeEditorComposite
.getText_title().getText(), true);
306 public void setDirty(boolean isDirty
) {
307 dirty
.setDirty(isDirty
);
314 public IStructuredSelection
getSelection() {
315 return (IStructuredSelection
) characterTreeEditorComposite
.getViewer().getSelection();
319 public void refresh(){
320 structuresTreeEditorComposite
.getViewer().refresh();
321 propertiesTreeEditorComposite
.getViewer().refresh();
322 characterTreeEditorComposite
.getViewer().refresh();
325 private class FeatureTreeChooserListener
extends SelectionAdapter
{
326 FeatureTreeEditorComposite featureTreeEditorComposite
;
328 public FeatureTreeChooserListener(FeatureTreeEditorComposite featureTreeEditorComposite
) {
330 this.featureTreeEditorComposite
= featureTreeEditorComposite
;
334 public void widgetSelected(SelectionEvent e
) {
335 FeatureTree tree
= FeatureTreeSelectionDialog
.select(featureTreeEditorComposite
.getDisplay().getActiveShell(), conversation
, null);
337 featureTreeEditorComposite
.setSelectedTree(tree
, CharacterEditor
.this);
338 featureTreeEditorComposite
.getText_title().setEnabled(false);