Merge branch 'develop' into derivateView
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / editor / definedterm / DefinedTermEditor.java
1 /**
2 * Copyright (C) 2009 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.editor.definedterm;
10
11 import org.eclipse.core.runtime.IProgressMonitor;
12 import org.eclipse.jface.action.GroupMarker;
13 import org.eclipse.jface.action.MenuManager;
14 import org.eclipse.jface.viewers.ISelection;
15 import org.eclipse.jface.viewers.StructuredSelection;
16 import org.eclipse.jface.viewers.TreeViewer;
17 import org.eclipse.jface.viewers.Viewer;
18 import org.eclipse.jface.viewers.ViewerSorter;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.dnd.DND;
21 import org.eclipse.swt.dnd.Transfer;
22 import org.eclipse.swt.layout.FillLayout;
23 import org.eclipse.swt.widgets.Composite;
24 import org.eclipse.swt.widgets.Control;
25 import org.eclipse.swt.widgets.Menu;
26 import org.eclipse.ui.IEditorInput;
27 import org.eclipse.ui.IEditorSite;
28 import org.eclipse.ui.ISelectionListener;
29 import org.eclipse.ui.ISelectionService;
30 import org.eclipse.ui.IWorkbenchActionConstants;
31 import org.eclipse.ui.IWorkbenchPart;
32 import org.eclipse.ui.PartInitException;
33 import org.eclipse.ui.part.EditorPart;
34
35 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
36 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
37 import eu.etaxonomy.cdm.model.common.CdmBase;
38 import eu.etaxonomy.cdm.model.common.OrderedTermBase;
39 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
40 import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
41 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
42 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
43 import eu.etaxonomy.taxeditor.store.CdmStore;
44 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
45
46 /**
47 * @author l.morris
48 * @date 3 Jan 2012
49 *
50 */
51 public class DefinedTermEditor extends EditorPart implements IConversationEnabled, ISelectionListener, IDirtyMarkable, IPostOperationEnabled {
52
53 public static final String ID = "eu.etaxonomy.taxeditor.editor.definedTerm";
54
55 public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
56
57 protected TreeViewer viewer;
58 protected ConversationHolder conversation;
59 private ISelectionService selectionService;
60 private boolean dirty;
61
62
63 private final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
64 /**
65 *
66 */
67 public DefinedTermEditor() {
68 super();
69 conversation = CdmStore.createConversation();
70 }
71
72 @Override
73 public void createPartControl(Composite parent) {
74
75 // parent.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
76
77 FillLayout layout = new FillLayout();
78 layout.marginHeight = 0;
79 layout.marginWidth = 0;
80 layout.type = SWT.VERTICAL;
81
82 parent.setLayout(layout);
83 viewer = new TreeViewer(parent);
84 viewer.getControl().setLayoutData(LayoutConstants.FILL());
85 viewer.setContentProvider(new TermContentProvider());
86 viewer.setLabelProvider(new TermLabelProvider());
87 viewer.setSorter(new DefinedTermSorter());
88
89 Transfer[] transfers = new Transfer[] { TermTransfer.getInstance() };
90 viewer.addDragSupport(dndOperations, transfers, new DefinedTermDragListener(viewer));
91 viewer.addDropSupport(dndOperations, transfers, new DefinedTermDropAdapter(this));
92
93 getDefinedTermEditorInput().initialiseVocabularies();
94 viewer.setInput(getDefinedTermEditorInput().getVocabularies());
95
96 getSite().setSelectionProvider(viewer);
97
98 selectionService = getSite().getWorkbenchWindow().getSelectionService();
99 selectionService.addSelectionListener(this);
100
101 setPartName(getEditorInput().getName());
102 createMenu();
103 }
104
105
106
107
108 /**
109 *
110 */
111 public TermEditorInput getDefinedTermEditorInput() {
112 return (TermEditorInput) getEditorInput();
113 }
114
115 /* (non-Javadoc)
116 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
117 */
118 @Override
119 public boolean postOperation(CdmBase objectAffectedByOperation) {
120
121
122 viewer.refresh();
123
124 if(objectAffectedByOperation != null){
125 viewer.setSelection(new StructuredSelection(objectAffectedByOperation));
126 }
127 setDirty(true);
128
129 return true;
130 }
131
132 private void createMenu() {
133 // register context menu
134 MenuManager menuManager = new MenuManager();
135 menuManager
136 .add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
137 getSite().registerContextMenu(ID, menuManager, viewer);
138
139 Control control = viewer.getControl();
140 Menu menu = menuManager.createContextMenu(control);
141 menuManager.setRemoveAllWhenShown(true);
142 control.setMenu(menu);
143 }
144
145
146
147
148 @Override
149 public void doSave(IProgressMonitor monitor) {
150 getConversationHolder().commit();
151 getDefinedTermEditorInput().merge();
152 setDirty(false);
153 getDefinedTermEditorInput().initialiseVocabularies();
154 viewer.refresh();
155 }
156
157
158 @Override
159 public void doSaveAs() {}
160
161 @Override
162 public void init(IEditorSite site, IEditorInput input) throws PartInitException {
163 setSite(site);
164 setInput(input);
165
166 }
167
168 @Override
169 public boolean isDirty() {
170 return dirty;
171 }
172
173 @Override
174 public boolean isSaveAsAllowed() {
175 return false;
176 }
177
178 @Override
179 public void setFocus() {
180 viewer.getControl().setFocus();
181 getConversationHolder().bind();
182 getDefinedTermEditorInput().bind();
183 }
184
185 @Override
186 public void update(CdmDataChangeMap changeEvents) {
187 // TODO Auto-generated method stub
188
189 }
190
191 @Override
192 public ConversationHolder getConversationHolder() {
193 return conversation;
194 }
195
196 @Override
197 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
198 // TODO Auto-generated method stub
199
200 }
201
202 @Override
203 public void changed(Object element) {
204 dirty = true;
205 setDirty(true);
206 viewer.update(element, null);
207 }
208
209 /* (non-Javadoc)
210 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
211 */
212 @Override
213 public void forceDirty() {
214 changed(null);
215 }
216
217 /**
218 * @param dirty the dirty to set
219 */
220 public void setDirty(boolean dirty) {
221 this.dirty = dirty;
222 firePropertyChange(PROP_DIRTY);
223 }
224
225 @Override
226 public boolean onComplete() {
227 // TODO Auto-generated method stub
228 return false;
229 }
230
231 /**
232 *
233 */
234 public TreeViewer getViewer() {
235 return viewer;
236 }
237
238 private class DefinedTermSorter extends ViewerSorter {
239
240 @Override
241 public int compare(Viewer viewer, Object e1, Object e2) {
242 // the comparison value in this method determines the
243 // location <-> add term method used in the MoveDefinedTermOperation
244 // execute call
245 if(e1 instanceof OrderedTermBase && e2 instanceof OrderedTermBase) {
246 OrderedTermBase otbe1 = (OrderedTermBase)e1;
247 OrderedTermBase otbe2 = (OrderedTermBase)e2;
248 if(otbe1.getOrderIndex() == otbe2.getOrderIndex()) {
249 return 0;
250 } else if (otbe1.getOrderIndex() < otbe2.getOrderIndex()){
251 return -1;
252 } else{
253 return 1;
254 }
255 } else {
256 return super.compare(viewer, e1, e2);
257 }
258 }
259 }
260
261 @Override
262 public void dispose() {
263 getDefinedTermEditorInput().dispose();
264 super.dispose();
265 }
266 }