Merge branch 'develop' into remoting-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.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
201 control.setMenu(menu);
202 }
203
204 private void setInput() {
205 conversation = CdmStore.createConversation();
206 conversation.registerForDataStoreChanges(this);
207 cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
208 CdmApplicationState.getCurrentDataChangeService().register(this);
209
210 List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
211 if(!viewer.getControl().isDisposed()){
212 viewer.setInput(input);
213 }
214 }
215
216 /* (non-Javadoc)
217 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
218 */
219 @Override
220 public void setFocus() {
221 if(cdmEntitySession != null) {
222 cdmEntitySession.bind();
223 }
224 viewer.getControl().setFocus();
225 }
226
227 /* (non-Javadoc)
228 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
229 */
230 @Override
231 public void update(CdmDataChangeMap changeEvents) {
232 if (dataChangeBehavior == null) {
233 dataChangeBehavior = new PolytomousKeyViewPartDataChangeBehavior(this);
234 }
235
236 DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
237 }
238
239 /* (non-Javadoc)
240 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
241 */
242 @Override
243 public ConversationHolder getConversationHolder() {
244 return conversation;
245 }
246
247 /* (non-Javadoc)
248 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
249 */
250 @Override
251 public void dispose() {
252 if(conversation!=null){
253 conversation.unregisterForDataStoreChanges(this);
254 conversation.close();
255 CdmStore.getContextManager().removeContextListener(contextListener);
256 }
257 if(cdmEntitySession != null) {
258 cdmEntitySession.dispose();
259 }
260 CdmApplicationState.getCurrentDataChangeService().unregister(this);
261 super.dispose();
262 }
263
264 /* (non-Javadoc)
265 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
266 */
267 @Override
268 public boolean postOperation(CdmBase objectAffectedByOperation) {
269 getConversationHolder().bind();
270 getConversationHolder().commit(true);
271 viewer.refresh();
272 return true;
273 }
274
275 /* (non-Javadoc)
276 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
277 */
278 @Override
279 public boolean onComplete() {
280 return true;
281 }
282
283 /**
284 *
285 */
286 public void refresh() {
287 getConversationHolder().bind();
288 //FIXME : Need to make sure this is a stable fix (ticket 3822)
289 getConversationHolder().commit();
290 List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
291 if(!viewer.getControl().isDisposed()){
292 viewer.setInput(input);
293 }
294 }
295
296 public List<PolytomousKey> getKeys() {
297 return (List<PolytomousKey>)viewer.getInput();
298 }
299
300 /* (non-Javadoc)
301 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
302 */
303 @Override
304 public ICdmEntitySession getCdmEntitySession() {
305 return cdmEntitySession;
306 }
307
308 /* (non-Javadoc)
309 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
310 */
311 @Override
312 public List<PolytomousKey> getRootEntities() {
313 return getKeys();
314 }
315
316 /* (non-Javadoc)
317 * @see eu.etaxonomy.cdm.api.application.ICdmChangeListener#onChange(eu.etaxonomy.cdm.api.application.CdmChangeEvent)
318 */
319 @Override
320 public void onChange(CdmChangeEvent event) {
321 if(event.getAction() == Action.Delete && PolytomousKey.class.equals(event.getEntityType())) {
322 refresh();
323 }
324
325 }
326
327 /* (non-Javadoc)
328 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
329 */
330 @Override
331 public Map<Object, List<String>> getPropertyPathsMap() {
332 // TODO Auto-generated method stub
333 return null;
334 }
335
336 }