Project

General

Profile

Download (3.84 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(12-12/17)