Merge branch 'release/4.4.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.navigation / src / main / java / eu / etaxonomy / taxeditor / navigation / key / polytomous / PolytomousKeyViewPart.java
1 /**
2 *
3 */
4 package eu.etaxonomy.taxeditor.navigation.key.polytomous;
5
6 import java.util.List;
7 import java.util.Map;
8
9 import org.eclipse.core.commands.Command;
10 import org.eclipse.core.commands.common.NotDefinedException;
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.ColumnLabelProvider;
15 import org.eclipse.jface.viewers.DoubleClickEvent;
16 import org.eclipse.jface.viewers.IDoubleClickListener;
17 import org.eclipse.jface.viewers.ISelection;
18 import org.eclipse.jface.viewers.ListViewer;
19 import org.eclipse.jface.viewers.Viewer;
20 import org.eclipse.jface.viewers.ViewerFilter;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.events.ModifyEvent;
23 import org.eclipse.swt.events.ModifyListener;
24 import org.eclipse.swt.layout.GridData;
25 import org.eclipse.swt.layout.GridLayout;
26 import org.eclipse.swt.widgets.Composite;
27 import org.eclipse.swt.widgets.Control;
28 import org.eclipse.swt.widgets.Display;
29 import org.eclipse.swt.widgets.Event;
30 import org.eclipse.swt.widgets.Menu;
31 import org.eclipse.swt.widgets.Text;
32 import org.eclipse.ui.IMemento;
33 import org.eclipse.ui.IWorkbenchActionConstants;
34 import org.eclipse.ui.commands.ICommandService;
35 import org.eclipse.ui.handlers.IHandlerService;
36 import org.eclipse.ui.part.ViewPart;
37
38 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
39 import eu.etaxonomy.cdm.api.application.CdmChangeEvent;
40 import eu.etaxonomy.cdm.api.application.CdmChangeEvent.Action;
41 import eu.etaxonomy.cdm.api.application.ICdmChangeListener;
42 import eu.etaxonomy.cdm.api.application.ICdmDataChangeService;
43 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
44 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
45 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
46 import eu.etaxonomy.cdm.model.common.CdmBase;
47 import eu.etaxonomy.cdm.model.description.PolytomousKey;
48 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
49 import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
50 import eu.etaxonomy.taxeditor.model.DataChangeBridge;
51 import eu.etaxonomy.taxeditor.model.IContextListener;
52 import eu.etaxonomy.taxeditor.model.MessagingUtils;
53 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
54 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
55 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
56 import eu.etaxonomy.taxeditor.store.CdmStore;
57 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
58
59 /**
60 * @author n.hoffmann
61 *
62 */
63 public class PolytomousKeyViewPart extends ViewPart implements
64 IConversationEnabled, ICdmEntitySessionEnabled, IPostOperationEnabled,
65 ICdmChangeListener {
66
67 private class FilterModifyListener implements ModifyListener{
68 @Override
69 public void modifyText(ModifyEvent e) {
70 ViewerFilter filter = new ViewerFilter(){
71
72 @Override
73 public boolean select(Viewer viewer, Object parentElement,
74 Object element) {
75
76 if(element instanceof PolytomousKey){
77 PolytomousKey key = (PolytomousKey) element;
78 if(key.getTitleCache().contains(text_filter.getText())){
79 return true;
80 }
81 }
82
83 return false;
84 }
85
86 };
87
88 viewer.setFilters(new ViewerFilter[]{filter});
89 }
90 }
91
92
93 public static final String ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.polytomousKeyViewPart";
94
95 public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.editNodes";
96
97 private class ContextListener extends ContextListenerAdapter{
98 /* (non-Javadoc)
99 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
100 */
101 @Override
102 public void contextStop(IMemento memento, IProgressMonitor monitor) {
103 monitor.subTask("Shutting down Polytomous Key Viewer");
104 if(!viewer.getControl().isDisposed()){
105 viewer.setInput(null);
106 }
107 }
108
109 /* (non-Javadoc)
110 * @see eu.etaxonomy.taxeditor.model.ContextListenerAdapter#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
111 */
112 @Override
113 public void contextStart(IMemento memento, IProgressMonitor monitor) {
114 monitor.subTask("Initiating Polytomous Key Viewer");
115 setInput();
116 }
117 }
118
119 private ListViewer viewer;
120 private ConversationHolder conversation;
121 private IContextListener contextListener;
122 private final CdmFormFactory formFactory;
123 private Text text_filter;
124 private ICdmEntitySession cdmEntitySession;
125
126 private PolytomousKeyViewPartDataChangeBehavior dataChangeBehavior;
127
128 public PolytomousKeyViewPart(){
129 formFactory = new CdmFormFactory(Display.getDefault());
130 }
131
132 /* (non-Javadoc)
133 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
134 */
135 @Override
136 public void createPartControl(Composite parent) {
137
138 Composite container = new Composite(parent, SWT.NONE);
139 container.setLayout(new GridLayout());
140
141 contextListener = new ContextListener();
142 CdmStore.getContextManager().addContextListener(contextListener);
143
144 text_filter = formFactory.createText(container, "");
145 text_filter.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
146 text_filter.addModifyListener(new FilterModifyListener());
147
148 viewer = new ListViewer(container, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
149 viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
150
151 viewer.setContentProvider(new PolytomousKeyContentProvider());
152 viewer.setLabelProvider(new ColumnLabelProvider());
153
154 viewer.addDoubleClickListener(new IDoubleClickListener() {
155
156 @Override
157 public void doubleClick(DoubleClickEvent event) {
158 openSelectedKeyNodes();
159 }
160 });
161
162
163 getSite().setSelectionProvider(viewer);
164
165 createMenu();
166
167 if(CdmStore.isActive()){
168 setInput();
169 }
170 }
171
172 public void openSelectedKeyNodes() {
173 ICommandService commandService = (ICommandService)getSite().getService(ICommandService.class);
174
175 Command command = commandService.getCommand(OPEN_COMMAND_ID);
176 if(command.isEnabled()) {
177 IHandlerService handlerService = (IHandlerService)getSite().getService(IHandlerService.class);
178 try {
179 handlerService.executeCommand(OPEN_COMMAND_ID, null);
180 } catch (NotDefinedException e) {
181 throw new RuntimeException("Could not find open command: " + OPEN_COMMAND_ID);
182 } catch (Exception e) {
183 MessagingUtils.error(getClass(), "An exception occured while trying to open a selection", e);
184 }
185 }
186 }
187
188 public void setViewerSelection(ISelection selection, boolean reveal) {
189 getSite().setSelectionProvider(viewer);
190 viewer.setSelection(selection,reveal);
191 viewer.getList().notifyListeners(SWT.Selection,new Event());
192 }
193
194 private void createMenu(){
195 MenuManager menuManager = new MenuManager();
196 menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
197
198 getSite().registerContextMenu(menuManager, viewer);
199
200 Control control = viewer.getControl();
201 Menu menu = menuManager.createContextMenu(control);
202 menuManager.setRemoveAllWhenShown(true);
203
204 control.setMenu(menu);
205 }
206
207 private void setInput() {
208 conversation = CdmStore.createConversation();
209 conversation.registerForDataStoreChanges(this);
210 cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
211 CdmApplicationState.getCurrentDataChangeService().register(this);
212
213 List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
214 if(!viewer.getControl().isDisposed()){
215 viewer.setInput(input);
216 }
217 }
218
219 /* (non-Javadoc)
220 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
221 */
222 @Override
223 public void setFocus() {
224 if(cdmEntitySession != null) {
225 cdmEntitySession.bind();
226 }
227 viewer.getControl().setFocus();
228 }
229
230 /* (non-Javadoc)
231 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
232 */
233 @Override
234 public void update(CdmDataChangeMap changeEvents) {
235 if (dataChangeBehavior == null) {
236 dataChangeBehavior = new PolytomousKeyViewPartDataChangeBehavior(this);
237 }
238
239 DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
240 }
241
242 /* (non-Javadoc)
243 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
244 */
245 @Override
246 public ConversationHolder getConversationHolder() {
247 return conversation;
248 }
249
250 /* (non-Javadoc)
251 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
252 */
253 @Override
254 public void dispose() {
255 if(conversation!=null){
256 conversation.unregisterForDataStoreChanges(this);
257 conversation.close();
258 CdmStore.getContextManager().removeContextListener(contextListener);
259 }
260 if(cdmEntitySession != null) {
261 cdmEntitySession.dispose();
262 }
263 ICdmDataChangeService currentDataChangeService = CdmApplicationState.getCurrentDataChangeService();
264 if(currentDataChangeService!=null){
265 currentDataChangeService.unregister(this);
266 }
267 super.dispose();
268 }
269
270 /* (non-Javadoc)
271 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
272 */
273 @Override
274 public boolean postOperation(CdmBase objectAffectedByOperation) {
275 getConversationHolder().bind();
276 getConversationHolder().commit(true);
277 viewer.refresh();
278 return true;
279 }
280
281 /* (non-Javadoc)
282 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
283 */
284 @Override
285 public boolean onComplete() {
286 return true;
287 }
288
289 /**
290 *
291 */
292 public void refresh() {
293 getConversationHolder().bind();
294 //FIXME : Need to make sure this is a stable fix (ticket 3822)
295 getConversationHolder().commit();
296 List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
297 if(!viewer.getControl().isDisposed()){
298 viewer.setInput(input);
299 }
300 }
301
302 public List<PolytomousKey> getKeys() {
303 return (List<PolytomousKey>)viewer.getInput();
304 }
305
306 /* (non-Javadoc)
307 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
308 */
309 @Override
310 public ICdmEntitySession getCdmEntitySession() {
311 return cdmEntitySession;
312 }
313
314 /* (non-Javadoc)
315 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
316 */
317 @Override
318 public List<PolytomousKey> getRootEntities() {
319 return getKeys();
320 }
321
322 /* (non-Javadoc)
323 * @see eu.etaxonomy.cdm.api.application.ICdmChangeListener#onChange(eu.etaxonomy.cdm.api.application.CdmChangeEvent)
324 */
325 @Override
326 public void onChange(CdmChangeEvent event) {
327 if(event.getAction() == Action.Delete && PolytomousKey.class.equals(event.getEntityType())) {
328 refresh();
329 }
330
331 }
332
333 /* (non-Javadoc)
334 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
335 */
336 @Override
337 public Map<Object, List<String>> getPropertyPathsMap() {
338 // TODO Auto-generated method stub
339 return null;
340 }
341
342 }