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