Project

General

Profile

Download (10.7 KB) Statistics
| Branch: | Tag: | Revision:
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.Display;
29
import org.eclipse.swt.widgets.Event;
30
import org.eclipse.swt.widgets.Menu;
31
import org.eclipse.swt.widgets.Text;
32
import org.eclipse.ui.IMemento;
33
import org.eclipse.ui.IWorkbenchActionConstants;
34
import org.eclipse.ui.commands.ICommandService;
35
import org.eclipse.ui.handlers.IHandlerService;
36
import org.eclipse.ui.part.ViewPart;
37

    
38
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
39
import eu.etaxonomy.cdm.api.application.CdmChangeEvent;
40
import eu.etaxonomy.cdm.api.application.CdmChangeEvent.Action;
41
import eu.etaxonomy.cdm.api.application.ICdmChangeListener;
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.operation.IPostOperationEnabled;
53
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
54
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
55
import eu.etaxonomy.taxeditor.store.CdmStore;
56
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
57

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

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

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

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

    
82
					return false;
83
				}
84

    
85
			};
86

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

    
91

    
92
	public static final String ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.polytomousKeyViewPart";
93

    
94
	public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.editNodes";
95

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

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

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

    
125
	private PolytomousKeyViewPartDataChangeBehavior dataChangeBehavior;
126

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

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

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

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

    
143
		text_filter = formFactory.createText(container, "");
144
		text_filter.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
145
		text_filter.addModifyListener(new FilterModifyListener());
146

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

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

    
153
		viewer.addDoubleClickListener(new IDoubleClickListener() {
154

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

    
161

    
162
		getSite().setSelectionProvider(viewer);
163

    
164
		createMenu();
165

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

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

    
174
        Command command = commandService.getCommand(OPEN_COMMAND_ID);
175
        if(command.isEnabled()) {
176
            IHandlerService handlerService = (IHandlerService)getSite().getService(IHandlerService.class);
177
            try {
178
                handlerService.executeCommand(OPEN_COMMAND_ID, null);
179
            } catch (NotDefinedException e) {
180
                throw new RuntimeException("Could not find open command: " + OPEN_COMMAND_ID);
181
            } catch (Exception e) {
182
                MessagingUtils.error(getClass(), "An exception occured while trying to open a selection", e);
183
            }
184
        }
185
	}
186

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

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

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

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

    
203
		control.setMenu(menu);
204
	}
205

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

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

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

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

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

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

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

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

    
277
	/* (non-Javadoc)
278
	 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
279
	 */
280
	@Override
281
	public boolean onComplete() {
282
		return true;
283
	}
284

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

    
298
	public List<PolytomousKey> getKeys() {
299
		return (List<PolytomousKey>)viewer.getInput();
300
	}
301

    
302
    /* (non-Javadoc)
303
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
304
     */
305
    @Override
306
    public ICdmEntitySession getCdmEntitySession() {
307
        return cdmEntitySession;
308
    }
309

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

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

    
327
    }
328

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

    
338
}
(3-3/4)