Project

General

Profile

Download (9.57 KB) Statistics
| Branch: | Tag: | Revision:
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
	private ICdmEntitySession cdmEntitySession;
117

    
118
	private PolytomousKeyViewPartDataChangeBehavior dataChangeBehavior;
119

    
120
	public PolytomousKeyViewPart(){
121
		formFactory = new CdmFormFactory(Display.getDefault());
122
	}
123

    
124
	/* (non-Javadoc)
125
	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
126
	 */
127
	@Override
128
	public void createPartControl(Composite parent) {
129

    
130
		Composite container = new Composite(parent, SWT.NONE);
131
		container.setLayout(new GridLayout());
132

    
133
		contextListener = new ContextListener();
134
		CdmStore.getContextManager().addContextListener(contextListener);
135

    
136
		text_filter = formFactory.createText(container, "");
137
		text_filter.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
138
		text_filter.addModifyListener(new FilterModifyListener());
139

    
140
		viewer = new ListViewer(container, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
141
		viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
142

    
143
		viewer.setContentProvider(new PolytomousKeyContentProvider());
144
		viewer.setLabelProvider(new PolytomousKeyLabelProvider());
145

    
146
		viewer.addDoubleClickListener(new IDoubleClickListener() {
147

    
148
			@Override
149
			public void doubleClick(DoubleClickEvent event) {
150
			    openSelectedKeyNodes();
151
			}
152
		});
153

    
154

    
155
		getSite().setSelectionProvider(viewer);
156

    
157
		createMenu();
158

    
159
		if(CdmStore.isActive()){
160
			setInput();
161
		}
162
	}
163

    
164
	public void openSelectedKeyNodes() {
165
        ICommandService commandService = (ICommandService)getSite().getService(ICommandService.class);
166

    
167
        Command command = commandService.getCommand(OPEN_COMMAND_ID);
168
        if(command.isEnabled()) {
169
            IHandlerService handlerService = (IHandlerService)getSite().getService(IHandlerService.class);
170
            try {
171
                handlerService.executeCommand(OPEN_COMMAND_ID, null);
172
            } catch (NotDefinedException e) {
173
                throw new RuntimeException("Could not find open command: " + OPEN_COMMAND_ID);
174
            } catch (Exception e) {
175
                MessagingUtils.error(getClass(), "An exception occured while trying to open a selection", e);
176
            }
177
        }
178
	}
179

    
180
	public void setViewerSelection(ISelection selection, boolean reveal) {
181
	    getSite().setSelectionProvider(viewer);
182
	    viewer.setSelection(selection,reveal);
183
	    viewer.getList().notifyListeners(SWT.Selection,new Event());
184
	}
185

    
186
	private void createMenu(){
187
		MenuManager menuManager = new MenuManager();
188
		menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
189

    
190
		getSite().registerContextMenu(menuManager, viewer);
191

    
192
		Control control = viewer.getControl();
193
		Menu menu = menuManager.createContextMenu(control);
194

    
195
		control.setMenu(menu);
196
	}
197

    
198
	private void setInput() {
199
		conversation = CdmStore.createConversation();
200
		conversation.registerForDataStoreChanges(this);
201
		cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
202
        cdmEntitySession.registerForDataStoreChanges(this);
203
		List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
204
		if(!viewer.getControl().isDisposed()){
205
		    viewer.setInput(input);
206
		}
207
	}
208

    
209
	/* (non-Javadoc)
210
	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
211
	 */
212
	@Override
213
	public void setFocus() {
214
	    if(cdmEntitySession != null) {
215
            cdmEntitySession.bind();
216
        }
217
		viewer.getControl().setFocus();
218
	}
219

    
220
	/* (non-Javadoc)
221
	 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
222
	 */
223
	@Override
224
	public void update(CdmDataChangeMap changeEvents) {
225
		if (dataChangeBehavior == null) {
226
			dataChangeBehavior = new PolytomousKeyViewPartDataChangeBehavior(this);
227
		}
228

    
229
		DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
230
	}
231

    
232
	/* (non-Javadoc)
233
	 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
234
	 */
235
	@Override
236
	public ConversationHolder getConversationHolder() {
237
		return conversation;
238
	}
239

    
240
	/* (non-Javadoc)
241
	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
242
	 */
243
	@Override
244
	public void dispose() {
245
	    if(conversation!=null){
246
	        conversation.unregisterForDataStoreChanges(this);
247
	        conversation.close();
248
	        CdmStore.getContextManager().removeContextListener(contextListener);
249
	    }
250
	    if(cdmEntitySession != null) {
251
	        cdmEntitySession.dispose();
252
	    }
253
		super.dispose();
254
	}
255

    
256
	/* (non-Javadoc)
257
	 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
258
	 */
259
	@Override
260
	public boolean postOperation(CdmBase objectAffectedByOperation) {
261
		viewer.refresh();
262
		return true;
263
	}
264

    
265
	/* (non-Javadoc)
266
	 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
267
	 */
268
	@Override
269
	public boolean onComplete() {
270
		return true;
271
	}
272

    
273
	/**
274
	 *
275
	 */
276
	public void refresh() {
277
		getConversationHolder().bind();
278
		//FIXME : Need to make sure this is a stable fix (ticket 3822)
279
		getConversationHolder().commit();
280
		List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
281
		if(!viewer.getControl().isDisposed()){
282
		    viewer.setInput(input);
283
		}
284
	}
285

    
286
	public List<PolytomousKey> getKeys() {
287
		return (List<PolytomousKey>)viewer.getInput();
288
	}
289

    
290
    /* (non-Javadoc)
291
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
292
     */
293
    @Override
294
    public ICdmEntitySession getCdmEntitySession() {
295
        return cdmEntitySession;
296
    }
297

    
298
    /* (non-Javadoc)
299
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
300
     */
301
    @Override
302
    public  List<PolytomousKey> getRootEntities() {
303
        return getKeys();
304
    }
305

    
306
}
(3-3/4)