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
		menuManager.setRemoveAllWhenShown(true);
201

    
202
		control.setMenu(menu);
203
	}
204

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
326
    }
327

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

    
337
}
(4-4/5)