Project

General

Profile

« Previous | Next » 

Revision 00069e6b

Added by Patrick Plitzner almost 6 years ago

ref #6913 Remove poly key view

View differences:

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.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.application.ICdmDataChangeService;
42
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
43
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
44
import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
45
import eu.etaxonomy.cdm.model.common.CdmBase;
46
import eu.etaxonomy.cdm.model.description.PolytomousKey;
47
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
48
import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
49
import eu.etaxonomy.taxeditor.model.DataChangeBridge;
50
import eu.etaxonomy.taxeditor.model.IContextListener;
51
import eu.etaxonomy.taxeditor.model.MessagingUtils;
52
import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
53
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
54
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
55
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
56
import eu.etaxonomy.taxeditor.store.CdmStore;
57
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
58

  
59
/**
60
 * @author n.hoffmann
61
 *
62
 */
63
public class PolytomousKeyViewPart extends ViewPart implements
64
		IConversationEnabled, ICdmEntitySessionEnabled, IPostOperationEnabled,
65
		ICdmChangeListener {
66

  
67
	private class FilterModifyListener implements ModifyListener{
68
		@Override
69
		public void modifyText(ModifyEvent e) {
70
			ViewerFilter filter = new ViewerFilter(){
71

  
72
				@Override
73
				public boolean select(Viewer viewer, Object parentElement,
74
						Object element) {
75

  
76
					if(element instanceof PolytomousKey){
77
						PolytomousKey key = (PolytomousKey) element;
78
						if(key.getTitleCache().contains(text_filter.getText())){
79
							return true;
80
						}
81
					}
82

  
83
					return false;
84
				}
85

  
86
			};
87

  
88
			viewer.setFilters(new ViewerFilter[]{filter});
89
		}
90
	}
91

  
92

  
93
	public static final String ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.polytomousKeyViewPart"; //$NON-NLS-1$
94

  
95
	public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.editNodes"; //$NON-NLS-1$
96

  
97
	private class ContextListener extends ContextListenerAdapter{
98
		/* (non-Javadoc)
99
		 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
100
		 */
101
		@Override
102
		public void contextStop(IMemento memento, IProgressMonitor monitor) {
103
			monitor.subTask(Messages.PolytomousKeyViewPart_SHUTDOWN);
104
			if(!viewer.getControl().isDisposed()){
105
			    viewer.setInput(null);
106
			}
107
		}
108

  
109
		/* (non-Javadoc)
110
		 * @see eu.etaxonomy.taxeditor.model.ContextListenerAdapter#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
111
		 */
112
		@Override
113
		public void contextStart(IMemento memento, IProgressMonitor monitor) {
114
			monitor.subTask(Messages.PolytomousKeyViewPart_INIT);
115
			setInput();
116
		}
117
	}
118

  
119
	private ListViewer viewer;
120
	private ConversationHolder conversation;
121
	private IContextListener contextListener;
122
	private CdmFormFactory formFactory;
123
	private Text text_filter;
124
	private ICdmEntitySession cdmEntitySession;
125

  
126
	private PolytomousKeyViewPartDataChangeBehavior dataChangeBehavior;
127

  
128
	public PolytomousKeyViewPart(){
129
//		formFactory = new CdmFormFactory(Display.getDefault());
130
	}
131

  
132
	/* (non-Javadoc)
133
	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
134
	 */
135
	@Override
136
	public void createPartControl(Composite parent) {
137

  
138
		Composite container = new Composite(parent, SWT.NONE);
139
		container.setLayout(new GridLayout());
140

  
141
		contextListener = new ContextListener();
142
		CdmStore.getContextManager().addContextListener(contextListener);
143

  
144
		text_filter = formFactory.createText(container, ""); //$NON-NLS-1$
145
		text_filter.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
146
		text_filter.addModifyListener(new FilterModifyListener());
147

  
148
		viewer = new ListViewer(container, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
149
		viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
150

  
151
		viewer.setContentProvider(new PolytomousKeyContentProvider());
152
		viewer.setLabelProvider(new ColumnLabelProvider());
153

  
154
		viewer.addDoubleClickListener(new IDoubleClickListener() {
155

  
156
			@Override
157
			public void doubleClick(DoubleClickEvent event) {
158
			    openSelectedKeyNodes();
159
			}
160
		});
161

  
162

  
163
		getSite().setSelectionProvider(viewer);
164

  
165
		createMenu();
166

  
167
		if(CdmStore.isActive()){
168
			setInput();
169
		}
170
	}
171

  
172
	public void openSelectedKeyNodes() {
173
        ICommandService commandService = getSite().getService(ICommandService.class);
174

  
175
        Command command = commandService.getCommand(OPEN_COMMAND_ID);
176
        if(command.isEnabled()) {
177
            IHandlerService handlerService = getSite().getService(IHandlerService.class);
178
            try {
179
                handlerService.executeCommand(OPEN_COMMAND_ID, null);
180
            } catch (NotDefinedException e) {
181
                throw new RuntimeException("Could not find open command: " + OPEN_COMMAND_ID); //$NON-NLS-1$
182
            } catch (Exception e) {
183
                MessagingUtils.error(getClass(), Messages.PolytomousKeyViewPart_EXCEPTION, e);
184
            }
185
        }
186
	}
187

  
188
	public void setViewerSelection(ISelection selection, boolean reveal) {
189
	    getSite().setSelectionProvider(viewer);
190
	    viewer.setSelection(selection,reveal);
191
	    viewer.getList().notifyListeners(SWT.Selection,new Event());
192
	}
193

  
194
	private void createMenu(){
195
		MenuManager menuManager = new MenuManager();
196
		menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
197

  
198
		getSite().registerContextMenu(menuManager, viewer);
199

  
200
		Control control = viewer.getControl();
201
		Menu menu = menuManager.createContextMenu(control);
202
		menuManager.setRemoveAllWhenShown(true);
203

  
204
		control.setMenu(menu);
205
	}
206

  
207
	private void setInput() {
208
		conversation = CdmStore.createConversation();
209
		conversation.registerForDataStoreChanges(this);
210
		cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
211
		CdmApplicationState.getCurrentDataChangeService().register(this);
212

  
213
		List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
214
		if(!viewer.getControl().isDisposed()){
215
		    viewer.setInput(input);
216
		}
217
	}
218

  
219
	/* (non-Javadoc)
220
	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
221
	 */
222
	@Override
223
	public void setFocus() {
224
	    if(cdmEntitySession != null) {
225
            cdmEntitySession.bind();
226
        }
227
		viewer.getControl().setFocus();
228
	}
229

  
230
	/* (non-Javadoc)
231
	 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
232
	 */
233
	@Override
234
	public void update(CdmDataChangeMap changeEvents) {
235
		if (dataChangeBehavior == null) {
236
			dataChangeBehavior = new PolytomousKeyViewPartDataChangeBehavior(this);
237
		}
238

  
239
		DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
240
	}
241

  
242
	/* (non-Javadoc)
243
	 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
244
	 */
245
	@Override
246
	public ConversationHolder getConversationHolder() {
247
		return conversation;
248
	}
249

  
250
	/* (non-Javadoc)
251
	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
252
	 */
253
	@Override
254
	public void dispose() {
255
	    if(conversation!=null){
256
	        conversation.unregisterForDataStoreChanges(this);
257
	        conversation.close();
258
	        CdmStore.getContextManager().removeContextListener(contextListener);
259
	    }
260
	    if(cdmEntitySession != null) {
261
	        cdmEntitySession.dispose();
262
	    }
263
	    ICdmDataChangeService currentDataChangeService = CdmApplicationState.getCurrentDataChangeService();
264
	    if(currentDataChangeService!=null){
265
	        currentDataChangeService.unregister(this);
266
	    }
267
		super.dispose();
268
	}
269

  
270
	/* (non-Javadoc)
271
	 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
272
	 */
273
	@Override
274
	public boolean postOperation(CdmBase objectAffectedByOperation) {
275
		getConversationHolder().bind();
276
		getConversationHolder().commit(true);
277
		viewer.refresh();
278
		return true;
279
	}
280

  
281
	/* (non-Javadoc)
282
	 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
283
	 */
284
	@Override
285
	public boolean onComplete() {
286
		return true;
287
	}
288

  
289
	/**
290
	 *
291
	 */
292
	public void refresh() {
293
		getConversationHolder().bind();
294
		//FIXME : Need to make sure this is a stable fix (ticket 3822)
295
		getConversationHolder().commit();
296
		List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
297
		if(!viewer.getControl().isDisposed()){
298
		    viewer.setInput(input);
299
		}
300
	}
301

  
302
	public List<PolytomousKey> getKeys() {
303
		return (List<PolytomousKey>)viewer.getInput();
304
	}
305

  
306
    /* (non-Javadoc)
307
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
308
     */
309
    @Override
310
    public ICdmEntitySession getCdmEntitySession() {
311
        return cdmEntitySession;
312
    }
313

  
314
    /* (non-Javadoc)
315
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
316
     */
317
    @Override
318
    public  List<PolytomousKey> getRootEntities() {
319
        return getKeys();
320
    }
321

  
322
    /* (non-Javadoc)
323
     * @see eu.etaxonomy.cdm.api.application.ICdmChangeListener#onChange(eu.etaxonomy.cdm.api.application.CdmChangeEvent)
324
     */
325
    @Override
326
    public void onChange(CdmChangeEvent event) {
327
        if(event.getAction() == Action.Delete && PolytomousKey.class.equals(event.getEntityType())) {
328
            refresh();
329
        }
330

  
331
    }
332

  
333
    /* (non-Javadoc)
334
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
335
     */
336
    @Override
337
    public Map<Object, List<String>> getPropertyPathsMap() {
338
        // TODO Auto-generated method stub
339
        return null;
340
    }
341

  
342
}
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/key/polytomous/PolytomousKeyViewPartDataChangeBehavior.java
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9

  
10
package eu.etaxonomy.taxeditor.navigation.key.polytomous;
11

  
12
import org.eclipse.core.runtime.IProgressMonitor;
13
import org.eclipse.core.runtime.IStatus;
14
import org.eclipse.core.runtime.Status;
15
import org.eclipse.core.runtime.jobs.Job;
16
import org.eclipse.swt.widgets.Display;
17

  
18
import eu.etaxonomy.cdm.model.common.CdmBase;
19
import eu.etaxonomy.cdm.model.description.PolytomousKey;
20
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
21
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
22
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
23
import eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour;
24
import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
25

  
26
/**
27
 * @author n.hoffmann
28
 * @created May 5, 2011
29
 * @version 1.0
30
 */
31
public class PolytomousKeyViewPartDataChangeBehavior extends
32
		AbstractDataChangeBehaviour {
33

  
34
    private static final String UPDATING_POLYTOMOUS_KEY_VIEWER = Messages.PolytomousKeyViewPartDataChangeBehavior_UPDATE;
35
    private final PolytomousKeyViewPart source;
36

  
37
	/**
38
	 * @param polytomousKeyViewPart
39
	 */
40
	public PolytomousKeyViewPartDataChangeBehavior(
41
			PolytomousKeyViewPart polytomousKeyViewPart) {
42
		source = polytomousKeyViewPart;
43
	}
44

  
45
	/* (non-Javadoc)
46
	 * @see eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour#reactOnDataChange(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
47
	 */
48
	@Override
49
	public void reactOnDataChange(CdmDataChangeMap changeEvents) {
50
		if(isRelevant(changeEvents)){
51
			final Display display = Display.getCurrent();
52
			Job job = new Job(UPDATING_POLYTOMOUS_KEY_VIEWER) {
53

  
54
				@Override
55
				protected IStatus run(IProgressMonitor monitor) {
56
					monitor.beginTask(UPDATING_POLYTOMOUS_KEY_VIEWER, 3);
57
					monitor.worked(1);
58

  
59
					// clear the session completely
60
					monitor.subTask(Messages.PolytomousKeyViewPartDataChangeBehavior_CLEAR);
61
					display.asyncExec(new Runnable() {
62
						 @Override
63
                        public void run() {
64
							 source.getConversationHolder().clear();
65
						 }
66
					});
67
					// FIXME completely clearing the session is a brute force approach.
68
					// It would be much more elegant to clear only those elements that have been changed.
69
					// I could not get that to work but we should consider workin on this because we might
70
					// run into serious performance issues, especially when it comes to large trees
71
					//
72
					// at least, we moved this to a job so it can run in a background thred
73
					// seems to improve the situation but not sure if final solution
74
					monitor.worked(1);
75

  
76
					monitor.subTask(Messages.PolytomousKeyViewPartDataChangeBehavior_REFRESH);
77

  
78
					display.asyncExec(new Runnable() {
79
					    @Override
80
                        public void run() {
81
					    	source.refresh();
82
					    }
83
					});
84

  
85

  
86

  
87
					monitor.worked(1);
88
					monitor.done();
89
					return Status.OK_STATUS;
90
				}
91
			};
92

  
93
			job.setPriority(Job.SHORT);
94
			job.schedule();
95

  
96
		}
97
	}
98

  
99
	/**
100
	 * @return
101
	 */
102
	private boolean isRelevant(CdmDataChangeMap changeEvents) {
103
		for(CdmDataChangeEvent event : changeEvents.getAllEvents()){
104
			EventType eventType = event.getEventType();
105
			CdmBase eventEntity = event.getEntity();
106

  
107
			// all poyltomous key changes are relevant
108
			if((eventType == EventType.INSERT || eventType == EventType.DELETE || eventType == EventType.UPDATE)
109
					&& eventEntity instanceof PolytomousKey){
110
				return true;
111
			}
112
		}
113
		return false;
114
	}
115
}

Also available in: Unified diff