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