Project

General

Profile

Download (10.6 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.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
}
(4-4/5)