Project

General

Profile

Download (3.79 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
/**
28
 * <p>SimpleSelectionProvider class.</p>
29
 *
30
 * @author p.ciardelli
31
 * @author n.hoffmann
32
 * @created 16.05.2008
33
 * @version 1.0
34
 */
35
public class SimpleSelectionProvider implements ISelectionProvider {
36

    
37
    private static final String SETTING_SELECTION = Messages.SimpleSelectionProvider_SETTING_SELECTION;
38
    private Set<ISelectionChangedListener> selectionChangedListeners = new HashSet<ISelectionChangedListener>();
39
	private ISelection selection;
40
	private Job job;
41

    
42
	/*
43
	 * (non-Javadoc)
44
	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
45
	 */
46
	/** {@inheritDoc} */
47
	@Override
48
    public void addSelectionChangedListener(
49
			ISelectionChangedListener listener) {
50
		selectionChangedListeners.add(listener);
51
	}
52

    
53
	/*
54
	 * (non-Javadoc)
55
	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
56
	 */
57
	/**
58
	 * <p>Getter for the field <code>selection</code>.</p>
59
	 *
60
	 * @return a {@link org.eclipse.jface.viewers.ISelection} object.
61
	 */
62
	@Override
63
    public ISelection getSelection() {
64
		if (selection != null){
65
			return selection;
66
		}
67
		// TODO we have to return an empty selection to avoid NPE
68
		// I don't really understand why this was not the case before
69
		return new StructuredSelection();
70
	}
71

    
72
	/*
73
	 * (non-Javadoc)
74
	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
75
	 */
76
	/** {@inheritDoc} */
77
	@Override
78
    public void removeSelectionChangedListener(
79
			ISelectionChangedListener listener) {
80
		selectionChangedListeners.remove(listener);
81
	}
82

    
83
	/*
84
	 * (non-Javadoc)
85
	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
86
	 */
87
	/** {@inheritDoc} */
88
	@Override
89
    public void setSelection(ISelection selection) {
90
		this.selection = selection;
91

    
92
		// cancel previous selection setting
93
		if(job != null){
94
			if(job.getState() != Job.NONE){
95
				job.cancel();
96
			}
97
			job = null;
98
		}
99

    
100
		if(job == null){
101
			final SelectionChangedEvent selectionChangedEvent = new SelectionChangedEvent(this, selection);
102
			final Display display = Display.getCurrent();
103
			job = new Job(SETTING_SELECTION){
104

    
105
				@Override
106
				protected IStatus run(IProgressMonitor monitor) {
107
					monitor.beginTask(SETTING_SELECTION, 10);
108

    
109
					if(!monitor.isCanceled()){
110
						display.asyncExec(new Runnable() {
111

    
112
							@Override
113
                            public void run() {
114
								SimpleSelectionProvider.this.fireSelectionChanged(selectionChangedEvent);
115
							}
116
						});
117
					}
118

    
119
					return Status.OK_STATUS;
120
				}
121

    
122
			};
123

    
124
			job.setPriority(Job.DECORATE);
125
			job.schedule();
126
		}
127

    
128
	}
129

    
130
	private void fireSelectionChanged(final SelectionChangedEvent event) {
131

    
132
		for (final ISelectionChangedListener listener : selectionChangedListeners) {
133
			SafeRunnable.run(new SafeRunnable() {
134
				@Override
135
                public void run() {
136
					listener.selectionChanged(event);
137
				}
138
			});
139
		}
140
	}
141
}
(13-13/19)