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
.HashSet
;
14 import javax
.annotation
.PostConstruct
;
15 import javax
.annotation
.PreDestroy
;
16 import javax
.inject
.Inject
;
18 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
19 import org
.eclipse
.e4
.core
.contexts
.ContextInjectionFactory
;
20 import org
.eclipse
.e4
.core
.contexts
.IEclipseContext
;
21 import org
.eclipse
.e4
.ui
.di
.Focus
;
22 import org
.eclipse
.e4
.ui
.di
.Persist
;
23 import org
.eclipse
.e4
.ui
.model
.application
.ui
.MDirtyable
;
24 import org
.eclipse
.e4
.ui
.model
.application
.ui
.basic
.MPart
;
25 import org
.eclipse
.e4
.ui
.services
.EMenuService
;
26 import org
.eclipse
.e4
.ui
.workbench
.modeling
.EPartService
;
27 import org
.eclipse
.e4
.ui
.workbench
.modeling
.ESelectionService
;
28 import org
.eclipse
.jface
.util
.LocalSelectionTransfer
;
29 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
30 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
31 import org
.eclipse
.jface
.viewers
.TreeViewer
;
32 import org
.eclipse
.swt
.SWT
;
33 import org
.eclipse
.swt
.dnd
.DND
;
34 import org
.eclipse
.swt
.dnd
.Transfer
;
35 import org
.eclipse
.swt
.layout
.FillLayout
;
36 import org
.eclipse
.swt
.widgets
.Composite
;
37 import org
.eclipse
.swt
.widgets
.Tree
;
38 import org
.eclipse
.ui
.IMemento
;
40 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
41 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
42 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
43 import eu
.etaxonomy
.cdm
.api
.service
.IVocabularyService
;
44 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTermBase
;
45 import eu
.etaxonomy
.cdm
.model
.term
.TermBase
;
46 import eu
.etaxonomy
.cdm
.model
.term
.TermVocabulary
;
47 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermDto
;
48 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermVocabularyDto
;
49 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
50 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.DefinedTermSorter
;
51 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.TermDtoContentProvider
;
52 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.TermDtoLabelProvider
;
53 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.input
.TermEditorInput
;
54 import eu
.etaxonomy
.taxeditor
.event
.EventUtility
;
55 import eu
.etaxonomy
.taxeditor
.event
.WorkbenchEventConstants
;
56 import eu
.etaxonomy
.taxeditor
.model
.IContextListener
;
57 import eu
.etaxonomy
.taxeditor
.model
.IDirtyMarkable
;
58 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasDetails
;
59 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasSupplementalData
;
60 import eu
.etaxonomy
.taxeditor
.operation
.IPostOperationEnabled
;
61 import eu
.etaxonomy
.taxeditor
.store
.AppModelId
;
62 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
63 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
64 import eu
.etaxonomy
.taxeditor
.workbench
.part
.IE4SavablePart
;
72 public class DefinedTermEditorE4
implements IConversationEnabled
, IDirtyMarkable
, IPostOperationEnabled
,
73 IPartContentHasDetails
, IPartContentHasSupplementalData
, IE4SavablePart
, IContextListener
{
75 public static final String OPEN_COMMAND_ID
= "eu.etaxonomy.taxeditor.store.openDefinedTermEditor"; //$NON-NLS-1$
77 protected TreeViewer viewer
;
79 protected ConversationHolder conversation
;
82 private ESelectionService selService
;
85 private MDirtyable dirty
;
87 private ISelectionChangedListener selectionChangedListener
;
88 private final int dndOperations
= DND
.DROP_COPY
| DND
.DROP_MOVE
;
90 private TermEditorInput input
=null;
93 private MPart thisPart
;
95 private Set
<TermBase
> changedTerms
= new HashSet
<>();
98 public DefinedTermEditorE4() {
99 CdmStore
.getContextManager().addContextListener(this);
103 public void createPartControl(Composite parent
, EMenuService menuService
,
104 IEclipseContext context
) {
105 if (CdmStore
.isActive()){
106 if(conversation
== null){
107 conversation
= CdmStore
.createConversation();
113 FillLayout layout
= new FillLayout();
114 layout
.marginHeight
= 0;
115 layout
.marginWidth
= 0;
116 layout
.type
= SWT
.VERTICAL
;
118 parent
.setLayout(layout
);
119 viewer
= new TreeViewer(new Tree(parent
, SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.MULTI
));
120 viewer
.getControl().setLayoutData(LayoutConstants
.FILL());
121 viewer
.setContentProvider(new TermDtoContentProvider());
122 viewer
.setLabelProvider(new TermDtoLabelProvider());
123 viewer
.setComparator(new DefinedTermSorter());
125 Transfer
[] transfers
= new Transfer
[] { LocalSelectionTransfer
.getTransfer() };
126 viewer
.addDragSupport(dndOperations
, transfers
, new DefinedTermDragListenerE4(viewer
));
127 DefinedTermDropAdapterE4 dropListener
= new DefinedTermDropAdapterE4(this);
128 ContextInjectionFactory
.inject(dropListener
, context
);
129 viewer
.addDropSupport(dndOperations
, transfers
, dropListener
);
131 //propagate selection
132 selectionChangedListener
= (event
-> selService
.setSelection(event
.getSelection()));
133 viewer
.addSelectionChangedListener(selectionChangedListener
);
135 //create context menu
136 menuService
.registerContextMenu(viewer
.getControl(), AppModelId
.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_STORE_POPUPMENU_TERMEDITOR
);
141 public boolean postOperation(Object objectAffectedByOperation
) {
142 if(objectAffectedByOperation
instanceof TermVocabularyDto
143 || objectAffectedByOperation
instanceof TermVocabulary
){
144 input
.initialiseVocabularies();
146 if(objectAffectedByOperation
instanceof TermDto
){
147 viewer
.refresh(((TermDto
) objectAffectedByOperation
).getVocabularyDto());
150 viewer
.refresh(objectAffectedByOperation
);
152 if(objectAffectedByOperation
!= null){
153 StructuredSelection selection
= new StructuredSelection(objectAffectedByOperation
);
154 viewer
.setSelection(selection
);
155 viewer
.expandToLevel(objectAffectedByOperation
, 1);
160 public void init(TermEditorInput input
){
163 viewer
.setInput(input
.getVocabularies());
164 thisPart
.setLabel(input
.getName());
169 public void save(IProgressMonitor monitor
) {
170 getConversationHolder().commit();
171 for(TermBase term
:changedTerms
){
172 if(term
.isInstanceOf(DefinedTermBase
.class)){
173 CdmStore
.getService(ITermService
.class).merge((DefinedTermBase
) term
);
175 else if(term
.isInstanceOf(TermVocabulary
.class)){
176 CdmStore
.getService(IVocabularyService
.class).merge((TermVocabulary
) term
);
180 input
.initialiseVocabularies();
182 changedTerms
.clear();
183 EventUtility
.postEvent(WorkbenchEventConstants
.REFRESH_SUPPLEMENTAL
, true);
187 public boolean isDirty() {
188 return dirty
.isDirty();
192 public void setFocus() {
193 if(viewer
!=null && viewer
.getControl() != null && !viewer
.getControl().isDisposed()){
194 viewer
.getControl().setFocus();
196 if(conversation
!=null){
205 public void update(CdmDataChangeMap changeEvents
) {
209 public ConversationHolder
getConversationHolder() {
214 public void changed(Object element
) {
215 if(element
instanceof DefinedTermBase
){
216 DefinedTermBase definedTermBase
= (DefinedTermBase
) element
;
217 TermDto termDto
= TermDto
.fromTerm(definedTermBase
);
218 viewer
.update(termDto
, null);
219 changedTerms
.add(definedTermBase
);
221 else if(element
instanceof TermVocabulary
){
222 TermVocabulary vocabulary
= (TermVocabulary
)element
;
223 TermVocabularyDto vocabularyDto
= new TermVocabularyDto(vocabulary
.getUuid(), vocabulary
.getRepresentations(), vocabulary
.getTermType());
224 viewer
.update(vocabularyDto
, null);
225 changedTerms
.add(vocabulary
);
228 viewer
.update(element
, null);
232 public void forceDirty() {
236 public void setDirty(boolean dirty
) {
237 this.dirty
.setDirty(dirty
);
241 public boolean onComplete() {
245 public TreeViewer
getViewer() {
250 public void dispose() {
251 if(conversation
!=null){
252 conversation
.unregisterForDataStoreChanges(this);
253 conversation
.close();
259 this.dirty
.setDirty(false);
262 public TermEditorInput
getDefinedTermEditorInput() {
267 public void contextAboutToStop(IMemento memento
, IProgressMonitor monitor
) {
271 public void contextStop(IMemento memento
, IProgressMonitor monitor
) {
272 //close view when workbench closes
274 thisPart
.getContext().get(EPartService
.class).hidePart(thisPart
);
282 public void contextStart(IMemento memento
, IProgressMonitor monitor
) {
286 public void contextRefresh(IProgressMonitor monitor
) {
290 public void workbenchShutdown(IMemento memento
, IProgressMonitor monitor
) {