11bea5cfb7573b68bc2063613dac4034cdbfd511
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / editor / definedterm / DefinedTermEditor.java
1 // $Id$
2 /**
3 * Copyright (C) 2009 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
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.
9 */
10 package eu.etaxonomy.taxeditor.editor.definedterm;
11
12 import org.eclipse.core.runtime.IProgressMonitor;
13 import org.eclipse.jface.action.GroupMarker;
14 import org.eclipse.jface.action.MenuManager;
15 import org.eclipse.jface.viewers.ISelection;
16 import org.eclipse.jface.viewers.StructuredSelection;
17 import org.eclipse.jface.viewers.TreeViewer;
18 import org.eclipse.jface.viewers.Viewer;
19 import org.eclipse.jface.viewers.ViewerSorter;
20 import org.eclipse.swt.SWT;
21 import org.eclipse.swt.dnd.DND;
22 import org.eclipse.swt.dnd.Transfer;
23 import org.eclipse.swt.layout.FillLayout;
24 import org.eclipse.swt.widgets.Composite;
25 import org.eclipse.swt.widgets.Control;
26 import org.eclipse.swt.widgets.Menu;
27 import org.eclipse.ui.IEditorInput;
28 import org.eclipse.ui.IEditorSite;
29 import org.eclipse.ui.ISelectionListener;
30 import org.eclipse.ui.ISelectionService;
31 import org.eclipse.ui.IWorkbenchActionConstants;
32 import org.eclipse.ui.IWorkbenchPart;
33 import org.eclipse.ui.PartInitException;
34 import org.eclipse.ui.part.EditorPart;
35
36 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
37 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
38 import eu.etaxonomy.cdm.model.common.CdmBase;
39 import eu.etaxonomy.cdm.model.common.OrderedTermBase;
40 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
41 import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
42 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
43 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
44 import eu.etaxonomy.taxeditor.store.CdmStore;
45 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
46
47 /**
48 * @author l.morris
49 * @date 3 Jan 2012
50 *
51 */
52 public class DefinedTermEditor extends EditorPart implements IConversationEnabled, ISelectionListener, IDirtyMarkable, IPostOperationEnabled {
53
54 public static final String ID = "eu.etaxonomy.taxeditor.editor.definedTerm";
55
56 public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
57
58 protected TreeViewer viewer;
59 protected ConversationHolder conversation;
60 private ISelectionService selectionService;
61 private boolean dirty;
62
63
64 private final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
65 /**
66 *
67 */
68 public DefinedTermEditor() {
69 super();
70 conversation = CdmStore.createConversation();
71 }
72
73 @Override
74 public void createPartControl(Composite parent) {
75
76 // parent.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
77
78 FillLayout layout = new FillLayout();
79 layout.marginHeight = 0;
80 layout.marginWidth = 0;
81 layout.type = SWT.VERTICAL;
82
83 parent.setLayout(layout);
84 viewer = new TreeViewer(parent);
85 viewer.getControl().setLayoutData(LayoutConstants.FILL());
86 viewer.setContentProvider(new TermContentProvider());
87 viewer.setLabelProvider(new TermLabelProvider());
88 viewer.setSorter(new DefinedTermSorter());
89
90 Transfer[] transfers = new Transfer[] { TermTransfer.getInstance() };
91 viewer.addDragSupport(dndOperations, transfers, new DefinedTermDragListener(viewer));
92 viewer.addDropSupport(dndOperations, transfers, new DefinedTermDropAdapter(this));
93
94 getDefinedTermEditorInput().initialiseVocabularies();
95 viewer.setInput(getDefinedTermEditorInput().getVocabularies());
96
97 getSite().setSelectionProvider(viewer);
98
99 selectionService = getSite().getWorkbenchWindow().getSelectionService();
100 selectionService.addSelectionListener(this);
101
102 setPartName(getEditorInput().getName());
103 createMenu();
104 }
105
106
107
108
109 /**
110 *
111 */
112 public TermEditorInput getDefinedTermEditorInput() {
113 return (TermEditorInput) getEditorInput();
114 }
115
116 /* (non-Javadoc)
117 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
118 */
119 @Override
120 public boolean postOperation(CdmBase objectAffectedByOperation) {
121
122
123 viewer.refresh();
124
125 if(objectAffectedByOperation != null){
126 viewer.setSelection(new StructuredSelection(objectAffectedByOperation));
127 }
128 setDirty(true);
129
130 return true;
131 }
132
133 private void createMenu() {
134 // register context menu
135 MenuManager menuManager = new MenuManager();
136 menuManager
137 .add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
138 getSite().registerContextMenu(ID, menuManager, viewer);
139
140 Control control = viewer.getControl();
141 Menu menu = menuManager.createContextMenu(control);
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.isHigher(otbe2)) {
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 }