2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.taxeditor
.editor
.definedterm
.e4
;
11 import java
.util
.Collection
;
12 import java
.util
.HashSet
;
15 import javax
.annotation
.PostConstruct
;
16 import javax
.annotation
.PreDestroy
;
17 import javax
.inject
.Inject
;
19 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
20 import org
.eclipse
.e4
.core
.contexts
.ContextInjectionFactory
;
21 import org
.eclipse
.e4
.core
.contexts
.IEclipseContext
;
22 import org
.eclipse
.e4
.ui
.di
.Focus
;
23 import org
.eclipse
.e4
.ui
.di
.Persist
;
24 import org
.eclipse
.e4
.ui
.model
.application
.ui
.MDirtyable
;
25 import org
.eclipse
.e4
.ui
.model
.application
.ui
.basic
.MPart
;
26 import org
.eclipse
.e4
.ui
.services
.EMenuService
;
27 import org
.eclipse
.e4
.ui
.workbench
.modeling
.EPartService
;
28 import org
.eclipse
.e4
.ui
.workbench
.modeling
.ESelectionService
;
29 import org
.eclipse
.jface
.util
.LocalSelectionTransfer
;
30 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
31 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
32 import org
.eclipse
.jface
.viewers
.TreeViewer
;
33 import org
.eclipse
.swt
.SWT
;
34 import org
.eclipse
.swt
.dnd
.DND
;
35 import org
.eclipse
.swt
.dnd
.Transfer
;
36 import org
.eclipse
.swt
.layout
.FillLayout
;
37 import org
.eclipse
.swt
.widgets
.Composite
;
38 import org
.eclipse
.swt
.widgets
.Tree
;
39 import org
.eclipse
.ui
.IMemento
;
41 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
42 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
43 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
44 import eu
.etaxonomy
.cdm
.api
.service
.IVocabularyService
;
45 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTermBase
;
46 import eu
.etaxonomy
.cdm
.model
.term
.TermBase
;
47 import eu
.etaxonomy
.cdm
.model
.term
.TermVocabulary
;
48 import eu
.etaxonomy
.cdm
.persistence
.dto
.AbstractTermDto
;
49 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermDto
;
50 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermVocabularyDto
;
51 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
52 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.DefinedTermSorter
;
53 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.TermDtoContentProvider
;
54 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.TermDtoLabelProvider
;
55 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.input
.TermEditorInput
;
56 import eu
.etaxonomy
.taxeditor
.event
.EventUtility
;
57 import eu
.etaxonomy
.taxeditor
.event
.WorkbenchEventConstants
;
58 import eu
.etaxonomy
.taxeditor
.model
.IContextListener
;
59 import eu
.etaxonomy
.taxeditor
.model
.IDirtyMarkable
;
60 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasDetails
;
61 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasSupplementalData
;
62 import eu
.etaxonomy
.taxeditor
.operation
.IPostOperationEnabled
;
63 import eu
.etaxonomy
.taxeditor
.store
.AppModelId
;
64 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
65 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
66 import eu
.etaxonomy
.taxeditor
.workbench
.part
.IE4SavablePart
;
74 public class DefinedTermEditorE4
implements IConversationEnabled
, IDirtyMarkable
, IPostOperationEnabled
,
75 IPartContentHasDetails
, IPartContentHasSupplementalData
, IE4SavablePart
, IContextListener
{
77 public static final String OPEN_COMMAND_ID
= "eu.etaxonomy.taxeditor.store.openDefinedTermEditor"; //$NON-NLS-1$
79 protected TreeViewer viewer
;
81 protected ConversationHolder conversation
;
84 private ESelectionService selService
;
87 private MDirtyable dirty
;
89 private ISelectionChangedListener selectionChangedListener
;
90 private final int dndOperations
= DND
.DROP_COPY
| DND
.DROP_MOVE
;
92 private TermEditorInput input
=null;
95 private MPart thisPart
;
97 private Set
<TermBase
> changedTerms
= new HashSet
<>();
99 private TermDtoContentProvider contentProvider
;
102 public DefinedTermEditorE4() {
103 CdmStore
.getContextManager().addContextListener(this);
107 public void createPartControl(Composite parent
, EMenuService menuService
,
108 IEclipseContext context
) {
109 if (CdmStore
.isActive()){
110 if(conversation
== null){
111 conversation
= CdmStore
.createConversation();
117 FillLayout layout
= new FillLayout();
118 layout
.marginHeight
= 0;
119 layout
.marginWidth
= 0;
120 layout
.type
= SWT
.VERTICAL
;
122 parent
.setLayout(layout
);
123 viewer
= new TreeViewer(new Tree(parent
, SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.MULTI
));
124 viewer
.getControl().setLayoutData(LayoutConstants
.FILL());
125 contentProvider
= new TermDtoContentProvider();
126 viewer
.setContentProvider(contentProvider
);
127 viewer
.setLabelProvider(new TermDtoLabelProvider());
128 viewer
.setComparator(new DefinedTermSorter());
130 Transfer
[] transfers
= new Transfer
[] { LocalSelectionTransfer
.getTransfer() };
131 viewer
.addDragSupport(dndOperations
, transfers
, new DefinedTermDragListenerE4(viewer
));
132 DefinedTermDropAdapterE4 dropListener
= new DefinedTermDropAdapterE4(this);
133 ContextInjectionFactory
.inject(dropListener
, context
);
134 viewer
.addDropSupport(dndOperations
, transfers
, dropListener
);
136 //propagate selection
137 selectionChangedListener
= (event
-> selService
.setSelection(event
.getSelection()));
138 viewer
.addSelectionChangedListener(selectionChangedListener
);
140 //create context menu
141 menuService
.registerContextMenu(viewer
.getControl(), AppModelId
.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_STORE_POPUPMENU_TERMEDITOR
);
146 public boolean postOperation(Object objectAffectedByOperation
) {
147 input
.initialiseVocabularies();
149 Collection
<AbstractTermDto
> itemsToSelect
= new HashSet
<>();
151 if(objectAffectedByOperation
instanceof Collection
){
152 for (Object o
: (Collection
<?
>)objectAffectedByOperation
) {
153 if(o
instanceof TermVocabularyDto
){
154 contentProvider
.removeVocabularyFromCache((TermVocabularyDto
) o
);
156 else if(o
instanceof TermDto
){
157 contentProvider
.removeVocabularyFromCache(((TermDto
) o
).getVocabularyDto());
158 itemsToSelect
.add((TermDto
) o
);
162 if(objectAffectedByOperation
instanceof TermVocabularyDto
){
163 contentProvider
.removeVocabularyFromCache((TermVocabularyDto
) objectAffectedByOperation
);
164 itemsToSelect
.add((AbstractTermDto
) objectAffectedByOperation
);
166 else if(objectAffectedByOperation
instanceof TermDto
){
167 TermDto termDto
= (TermDto
) objectAffectedByOperation
;
168 itemsToSelect
.add(termDto
);
169 contentProvider
.removeVocabularyFromCache(termDto
.getVocabularyDto());
171 if(!itemsToSelect
.isEmpty()){
172 StructuredSelection selection
= new StructuredSelection(itemsToSelect
);
173 viewer
.setSelection(selection
);
174 for (AbstractTermDto termDto
: itemsToSelect
) {
175 viewer
.expandToLevel(termDto
, 1);
182 public void init(TermEditorInput input
){
185 viewer
.setInput(input
.getVocabularies());
186 thisPart
.setLabel(input
.getName());
191 public void save(IProgressMonitor monitor
) {
192 getConversationHolder().commit();
193 for(TermBase term
:changedTerms
){
194 if(term
.isInstanceOf(DefinedTermBase
.class)){
195 DefinedTermBase definedTermBase
= (DefinedTermBase
) term
;
196 CdmStore
.getService(ITermService
.class).merge(definedTermBase
);
198 else if(term
.isInstanceOf(TermVocabulary
.class)){
199 TermVocabulary voc
= (TermVocabulary
) term
;
200 CdmStore
.getService(IVocabularyService
.class).merge(voc
);
204 input
.initialiseVocabularies();
205 changedTerms
.clear();
207 EventUtility
.postEvent(WorkbenchEventConstants
.REFRESH_SUPPLEMENTAL
, true);
211 public boolean isDirty() {
212 return dirty
.isDirty();
216 public void setFocus() {
217 if(viewer
!=null && viewer
.getControl() != null && !viewer
.getControl().isDisposed()){
218 viewer
.getControl().setFocus();
220 if(conversation
!=null){
229 public void update(CdmDataChangeMap changeEvents
) {
233 public ConversationHolder
getConversationHolder() {
238 public void changed(Object element
) {
239 if(element
instanceof DefinedTermBase
){
240 DefinedTermBase definedTermBase
= (DefinedTermBase
) element
;
241 TermDto termDto
= TermDto
.fromTerm(definedTermBase
);
242 viewer
.update(termDto
, null);
243 changedTerms
.add(definedTermBase
);
245 else if(element
instanceof TermVocabulary
){
246 TermVocabulary vocabulary
= (TermVocabulary
)element
;
247 TermVocabularyDto vocabularyDto
= new TermVocabularyDto(vocabulary
.getUuid(), vocabulary
.getRepresentations(), vocabulary
.getTermType());
248 viewer
.update(vocabularyDto
, null);
249 changedTerms
.add(vocabulary
);
252 viewer
.update(element
, null);
256 public void forceDirty() {
260 public void setDirty(boolean dirty
) {
261 this.dirty
.setDirty(dirty
);
265 public boolean onComplete() {
269 public TreeViewer
getViewer() {
274 public void dispose() {
275 if(conversation
!=null){
276 conversation
.unregisterForDataStoreChanges(this);
277 conversation
.close();
283 this.dirty
.setDirty(false);
286 public TermEditorInput
getDefinedTermEditorInput() {
291 public void contextAboutToStop(IMemento memento
, IProgressMonitor monitor
) {
295 public void contextStop(IMemento memento
, IProgressMonitor monitor
) {
296 //close view when workbench closes
298 thisPart
.getContext().get(EPartService
.class).hidePart(thisPart
);
306 public void contextStart(IMemento memento
, IProgressMonitor monitor
) {
310 public void contextRefresh(IProgressMonitor monitor
) {
314 public void workbenchShutdown(IMemento memento
, IProgressMonitor monitor
) {