0a913f84cd178aadd321c932fe1369df3ee12f8b
[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.session.ICdmEntitySession;
48 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
49 import eu.etaxonomy.taxeditor.store.CdmStore;
50 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
51
52 /**
53 * @author n.hoffmann
54 *
55 */
56 public class PolytomousKeyViewPart extends ViewPart implements
57 IConversationEnabled, ICdmEntitySessionEnabled, IPostOperationEnabled {
58
59 private class FilterModifyListener implements ModifyListener{
60 @Override
61 public void modifyText(ModifyEvent e) {
62 ViewerFilter filter = new ViewerFilter(){
63
64 @Override
65 public boolean select(Viewer viewer, Object parentElement,
66 Object element) {
67
68 if(element instanceof PolytomousKey){
69 PolytomousKey key = (PolytomousKey) element;
70 if(key.getTitleCache().contains(text_filter.getText())){
71 return true;
72 }
73 }
74
75 return false;
76 }
77
78 };
79
80 viewer.setFilters(new ViewerFilter[]{filter});
81 }
82 }
83
84
85 public static final String ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.polytomousKeyViewPart";
86
87 public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.editNodes";
88
89 private class ContextListener extends ContextListenerAdapter{
90 /* (non-Javadoc)
91 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
92 */
93 @Override
94 public void contextStop(IMemento memento, IProgressMonitor monitor) {
95 monitor.subTask("Shutting down Polytomous Key Viewer");
96 if(!viewer.getControl().isDisposed()){
97 viewer.setInput(null);
98 }
99 }
100
101 /* (non-Javadoc)
102 * @see eu.etaxonomy.taxeditor.model.ContextListenerAdapter#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
103 */
104 @Override
105 public void contextStart(IMemento memento, IProgressMonitor monitor) {
106 monitor.subTask("Initiating Polytomous Key Viewer");
107 setInput();
108 }
109 }
110
111 private ListViewer viewer;
112 private ConversationHolder conversation;
113 private IContextListener contextListener;
114 private final CdmFormFactory formFactory;
115 private Text text_filter;
116
117 private PolytomousKeyViewPartDataChangeBehavior dataChangeBehavior;
118
119 public PolytomousKeyViewPart(){
120 formFactory = new CdmFormFactory(Display.getDefault());
121 }
122
123 /* (non-Javadoc)
124 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
125 */
126 @Override
127 public void createPartControl(Composite parent) {
128
129 Composite container = new Composite(parent, SWT.NONE);
130 container.setLayout(new GridLayout());
131
132 contextListener = new ContextListener();
133 CdmStore.getContextManager().addContextListener(contextListener);
134
135 text_filter = formFactory.createText(container, "");
136 text_filter.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
137 text_filter.addModifyListener(new FilterModifyListener());
138
139 viewer = new ListViewer(container, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
140 viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
141
142 viewer.setContentProvider(new PolytomousKeyContentProvider());
143 viewer.setLabelProvider(new PolytomousKeyLabelProvider());
144
145 viewer.addDoubleClickListener(new IDoubleClickListener() {
146
147 @Override
148 public void doubleClick(DoubleClickEvent event) {
149 openSelectedKeyNodes();
150 }
151 });
152
153
154 getSite().setSelectionProvider(viewer);
155
156 createMenu();
157
158 if(CdmStore.isActive()){
159 setInput();
160 }
161 }
162
163 public void openSelectedKeyNodes() {
164 ICommandService commandService = (ICommandService)getSite().getService(ICommandService.class);
165
166 Command command = commandService.getCommand(OPEN_COMMAND_ID);
167 if(command.isEnabled()) {
168 IHandlerService handlerService = (IHandlerService)getSite().getService(IHandlerService.class);
169 try {
170 handlerService.executeCommand(OPEN_COMMAND_ID, null);
171 } catch (NotDefinedException e) {
172 throw new RuntimeException("Could not find open command: " + OPEN_COMMAND_ID);
173 } catch (Exception e) {
174 MessagingUtils.error(getClass(), "An exception occured while trying to open a selection", e);
175 }
176 }
177 }
178
179 public void setViewerSelection(ISelection selection, boolean reveal) {
180 getSite().setSelectionProvider(viewer);
181 viewer.setSelection(selection,reveal);
182 viewer.getList().notifyListeners(SWT.Selection,new Event());
183 }
184
185 private void createMenu(){
186 MenuManager menuManager = new MenuManager();
187 menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
188
189 getSite().registerContextMenu(menuManager, viewer);
190
191 Control control = viewer.getControl();
192 Menu menu = menuManager.createContextMenu(control);
193
194 control.setMenu(menu);
195 }
196
197 private void setInput() {
198 conversation = CdmStore.createConversation();
199 conversation.registerForDataStoreChanges(this);
200 List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
201 if(!viewer.getControl().isDisposed()){
202 viewer.setInput(input);
203 }
204 }
205
206 /* (non-Javadoc)
207 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
208 */
209 @Override
210 public void setFocus() {
211 viewer.getControl().setFocus();
212 }
213
214 /* (non-Javadoc)
215 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
216 */
217 @Override
218 public void update(CdmDataChangeMap changeEvents) {
219 if (dataChangeBehavior == null) {
220 dataChangeBehavior = new PolytomousKeyViewPartDataChangeBehavior(this);
221 }
222
223 DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
224 }
225
226 /* (non-Javadoc)
227 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
228 */
229 @Override
230 public ConversationHolder getConversationHolder() {
231 return conversation;
232 }
233
234 /* (non-Javadoc)
235 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
236 */
237 @Override
238 public void dispose() {
239 if(conversation!=null){
240 conversation.unregisterForDataStoreChanges(this);
241 conversation.close();
242 CdmStore.getContextManager().removeContextListener(contextListener);
243 }
244 super.dispose();
245 }
246
247 /* (non-Javadoc)
248 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
249 */
250 @Override
251 public boolean postOperation(CdmBase objectAffectedByOperation) {
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 /* (non-Javadoc)
282 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
283 */
284 @Override
285 public ICdmEntitySession getCdmEntitySession() {
286 // TODO Auto-generated method stub
287 return null;
288 }
289
290 /* (non-Javadoc)
291 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
292 */
293 @Override
294 public <T extends CdmBase> List<T> getRootEntities() {
295 // TODO Auto-generated method stub
296 return null;
297 }
298
299 }