fix potential NPE
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / SimpleSelectionProvider.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.taxeditor.editor;
11
12 import java.util.HashSet;
13 import java.util.Set;
14
15 import org.eclipse.core.runtime.IProgressMonitor;
16 import org.eclipse.core.runtime.IStatus;
17 import org.eclipse.core.runtime.Status;
18 import org.eclipse.core.runtime.jobs.Job;
19 import org.eclipse.jface.util.SafeRunnable;
20 import org.eclipse.jface.viewers.ISelection;
21 import org.eclipse.jface.viewers.ISelectionChangedListener;
22 import org.eclipse.jface.viewers.ISelectionProvider;
23 import org.eclipse.jface.viewers.SelectionChangedEvent;
24 import org.eclipse.jface.viewers.StructuredSelection;
25 import org.eclipse.swt.widgets.Display;
26
27 import eu.etaxonomy.taxeditor.editor.l10n.Messages;
28
29 /**
30 * <p>SimpleSelectionProvider class.</p>
31 *
32 * @author p.ciardelli
33 * @author n.hoffmann
34 * @created 16.05.2008
35 * @version 1.0
36 */
37 public class SimpleSelectionProvider implements ISelectionProvider {
38
39 private static final String SETTING_SELECTION = Messages.SimpleSelectionProvider_SETTING_SELECTION;
40 private Set<ISelectionChangedListener> selectionChangedListeners = new HashSet<ISelectionChangedListener>();
41 private ISelection selection;
42 private Job job;
43
44 /*
45 * (non-Javadoc)
46 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
47 */
48 /** {@inheritDoc} */
49 @Override
50 public void addSelectionChangedListener(
51 ISelectionChangedListener listener) {
52 selectionChangedListeners.add(listener);
53 }
54
55 /*
56 * (non-Javadoc)
57 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
58 */
59 /**
60 * <p>Getter for the field <code>selection</code>.</p>
61 *
62 * @return a {@link org.eclipse.jface.viewers.ISelection} object.
63 */
64 @Override
65 public ISelection getSelection() {
66 if (selection != null){
67 return selection;
68 }
69 // TODO we have to return an empty selection to avoid NPE
70 // I don't really understand why this was not the case before
71 return new StructuredSelection();
72 }
73
74 /*
75 * (non-Javadoc)
76 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
77 */
78 /** {@inheritDoc} */
79 @Override
80 public void removeSelectionChangedListener(
81 ISelectionChangedListener listener) {
82 selectionChangedListeners.remove(listener);
83 }
84
85 /*
86 * (non-Javadoc)
87 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
88 */
89 /** {@inheritDoc} */
90 @Override
91 public void setSelection(ISelection selection) {
92 this.selection = selection;
93
94 // cancel previous selection setting
95 if(job != null){
96 if(job.getState() != Job.NONE){
97 job.cancel();
98 }
99 job = null;
100 }
101
102 if(job == null){
103 final SelectionChangedEvent selectionChangedEvent = new SelectionChangedEvent(this, selection);
104 final Display display = Display.getCurrent();
105 job = new Job(SETTING_SELECTION){
106
107 @Override
108 protected IStatus run(IProgressMonitor monitor) {
109 monitor.beginTask(SETTING_SELECTION, 10);
110
111 if(!monitor.isCanceled()){
112 display.asyncExec(new Runnable() {
113
114 @Override
115 public void run() {
116 SimpleSelectionProvider.this.fireSelectionChanged(selectionChangedEvent);
117 }
118 });
119 }
120
121 return Status.OK_STATUS;
122 }
123
124 };
125
126 job.setPriority(Job.DECORATE);
127 job.schedule();
128 }
129
130 }
131
132 private void fireSelectionChanged(final SelectionChangedEvent event) {
133
134 for (final ISelectionChangedListener listener : selectionChangedListeners) {
135 SafeRunnable.run(new SafeRunnable() {
136 @Override
137 public void run() {
138 listener.selectionChanged(event);
139 }
140 });
141 }
142 }
143 }