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