Project

General

Profile

Download (8.66 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.store.CdmStore;
48
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
49

    
50
/**
51
 * @author n.hoffmann
52
 *
53
 */
54
public class PolytomousKeyViewPart extends ViewPart implements
55
		IConversationEnabled, IPostOperationEnabled {
56

    
57
	private class FilterModifyListener implements ModifyListener{
58
		@Override
59
		public void modifyText(ModifyEvent e) {
60
			ViewerFilter filter = new ViewerFilter(){
61

    
62
				@Override
63
				public boolean select(Viewer viewer, Object parentElement,
64
						Object element) {
65

    
66
					if(element instanceof PolytomousKey){
67
						PolytomousKey key = (PolytomousKey) element;
68
						if(key.getTitleCache().contains(text_filter.getText())){
69
							return true;
70
						}
71
					}
72

    
73
					return false;
74
				}
75

    
76
			};
77

    
78
			viewer.setFilters(new ViewerFilter[]{filter});
79
		}
80
	}
81

    
82

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

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

    
87
	private class ContextListener extends ContextListenerAdapter{
88
		/* (non-Javadoc)
89
		 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
90
		 */
91
		@Override
92
		public void contextStop(IMemento memento, IProgressMonitor monitor) {
93
			monitor.subTask("Shutting down Polytomous Key Viewer");
94
			if(!viewer.getControl().isDisposed()){
95
			    viewer.setInput(null);
96
			}
97
		}
98

    
99
		/* (non-Javadoc)
100
		 * @see eu.etaxonomy.taxeditor.model.ContextListenerAdapter#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
101
		 */
102
		@Override
103
		public void contextStart(IMemento memento, IProgressMonitor monitor) {
104
			monitor.subTask("Initiating Polytomous Key Viewer");
105
			setInput();
106
		}
107
	}
108

    
109
	private ListViewer viewer;
110
	private ConversationHolder conversation;
111
	private IContextListener contextListener;
112
	private final CdmFormFactory formFactory;
113
	private Text text_filter;
114

    
115
	private PolytomousKeyViewPartDataChangeBehavior dataChangeBehavior;
116

    
117
	public PolytomousKeyViewPart(){
118
		formFactory = new CdmFormFactory(Display.getDefault());
119
	}
120

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

    
127
		Composite container = new Composite(parent, SWT.NONE);
128
		container.setLayout(new GridLayout());
129

    
130
		contextListener = new ContextListener();
131
		CdmStore.getContextManager().addContextListener(contextListener);
132

    
133
		text_filter = formFactory.createText(container, "");
134
		text_filter.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
135
		text_filter.addModifyListener(new FilterModifyListener());
136

    
137
		viewer = new ListViewer(container, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
138
		viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
139

    
140
		viewer.setContentProvider(new PolytomousKeyContentProvider());
141
		viewer.setLabelProvider(new PolytomousKeyLabelProvider());
142

    
143
		viewer.addDoubleClickListener(new IDoubleClickListener() {
144

    
145
			@Override
146
			public void doubleClick(DoubleClickEvent event) {
147
			    openSelectedKeyNodes();
148
			}
149
		});
150

    
151

    
152
		getSite().setSelectionProvider(viewer);
153

    
154
		createMenu();
155

    
156
		if(CdmStore.isActive()){
157
			setInput();
158
		}
159
	}
160

    
161
	public void openSelectedKeyNodes() {
162
        ICommandService commandService = (ICommandService)getSite().getService(ICommandService.class);
163

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

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

    
183
	private void createMenu(){
184
		MenuManager menuManager = new MenuManager();
185
		menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
186

    
187
		getSite().registerContextMenu(menuManager, viewer);
188

    
189
		Control control = viewer.getControl();
190
		Menu menu = menuManager.createContextMenu(control);
191

    
192
		control.setMenu(menu);
193
	}
194

    
195
	private void setInput() {
196
		conversation = CdmStore.createConversation();
197
		conversation.registerForDataStoreChanges(this);
198
		List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
199
		if(!viewer.getControl().isDisposed()){
200
		    viewer.setInput(input);
201
		}
202
	}
203

    
204
	/* (non-Javadoc)
205
	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
206
	 */
207
	@Override
208
	public void setFocus() {
209
		viewer.getControl().setFocus();
210
	}
211

    
212
	/* (non-Javadoc)
213
	 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
214
	 */
215
	@Override
216
	public void update(CdmDataChangeMap changeEvents) {
217
		if (dataChangeBehavior == null) {
218
			dataChangeBehavior = new PolytomousKeyViewPartDataChangeBehavior(this);
219
		}
220

    
221
		DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
222
	}
223

    
224
	/* (non-Javadoc)
225
	 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
226
	 */
227
	@Override
228
	public ConversationHolder getConversationHolder() {
229
		return conversation;
230
	}
231

    
232
	/* (non-Javadoc)
233
	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
234
	 */
235
	@Override
236
	public void dispose() {
237
	    if(conversation!=null){
238
	        conversation.unregisterForDataStoreChanges(this);
239
	        conversation.close();
240
	        CdmStore.getContextManager().removeContextListener(contextListener);
241
	    }
242
		super.dispose();
243
	}
244

    
245
	/* (non-Javadoc)
246
	 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
247
	 */
248
	@Override
249
	public boolean postOperation(CdmBase objectAffectedByOperation) {
250
		viewer.refresh();
251
		return true;
252
	}
253

    
254
	/* (non-Javadoc)
255
	 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
256
	 */
257
	@Override
258
	public boolean onComplete() {
259
		return true;
260
	}
261

    
262
	/**
263
	 *
264
	 */
265
	public void refresh() {
266
		getConversationHolder().bind();
267
		//FIXME : Need to make sure this is a stable fix (ticket 3822)
268
		getConversationHolder().commit();
269
		List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
270
		if(!viewer.getControl().isDisposed()){
271
		    viewer.setInput(input);
272
		}
273
	}
274

    
275
	public List<PolytomousKey> getKeys() {
276
		return (List<PolytomousKey>)viewer.getInput();
277
	}
278

    
279
}
(3-3/4)