Project

General

Profile

Download (4.39 KB) Statistics
| Branch: | Tag: | Revision:
1
/*******************************************************************************
2
 * Copyright (c) 2006, 2007 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 *******************************************************************************/
11

    
12
package org.eclipse.ui.navigator;
13

    
14
import java.util.HashMap;
15
import java.util.LinkedHashSet;
16
import java.util.Map;
17
import java.util.Set;
18

    
19
import org.eclipse.jface.viewers.AbstractTreeViewer;
20

    
21
/**
22
 * 
23
 * A pipelined viewer update should map requests to refresh or update elements
24
 * in the viewer to their correct, modified structure. Clients use
25
 * {@link PipelinedViewerUpdate} as the input and return type from intercept
26
 * methods on {@link IPipelinedTreeContentProvider}.
27
 * 
28
 * <p>
29
 * Clients should use the viewer update to describe how the request from the
30
 * upstream extension (see {@link IPipelinedTreeContentProvider} for more
31
 * information on <i>upstream</i> extensions) should be reshaped when applied
32
 * to the tree. A request from an upstream extension to refresh a given element
33
 * could result in multiple refresh requests from downstream extensions.
34
 * Therefore, the refresh targets are modeled as a set.
35
 * </p>
36
 * <p>
37
 * Initially, this set will contain the original element that was passed to the
38
 * refresh requests. Clients may squash the refresh by clearing the set, change
39
 * the original target by removing the current element and adding a new target,
40
 * or expand the refresh by adding more elements to the set.
41
 * </p>
42
 * <p>
43
 * A pipelined extension may receive a {@link PipelinedViewerUpdate} as the
44
 * result of a call to {@link AbstractTreeViewer#refresh()}-methods or
45
 * {@link AbstractTreeViewer#update(Object, String[])}-methods. The
46
 * <code>properties</code> field is only applicable for <code>update()</code>
47
 * calls and the <code>updateLabels</code> field is only applicable for
48
 * <code>refresh()</code> calls.
49
 * </p>
50
 *  
51
 * @since 3.2
52
 * 
53
 */
54
public final class PipelinedViewerUpdate {
55

    
56
	private static final String[] NO_PROPERTIES = new String[0];
57

    
58
	private final Set refreshTargets = new LinkedHashSet();
59

    
60
	private boolean updateLabels = false;
61

    
62
	private Map properties;
63

    
64
	/**
65
	 * Properties allow optimization for <code>update</code> calls.
66
	 * 
67
	 * @param aTarget
68
	 *            The target which may have specific properties associated with
69
	 *            it for an optimized refresh.
70
	 * 
71
	 * @return Returns the properties for the given target. If no properties are
72
	 *         specified, then an empty array is returned. <b>null</b> will
73
	 *         never be returned.
74
	 */
75
	public final String[] getProperties(Object aTarget) {
76
		if (properties != null && properties.containsKey(aTarget)) {
77
			String[] props = (String[]) properties.get(aTarget);
78
			return props != null ? props : NO_PROPERTIES;
79
		}
80
		return NO_PROPERTIES;
81
	}
82

    
83
	/**
84
	 * 
85
	 * Properties allow optimization for <code>update</code> calls.
86
	 * 
87
	 * @param aTarget
88
	 *            The target of the properties.
89
	 * @param theProperties
90
	 *            The properties to pass along to the <code>update</code>
91
	 *            call.
92
	 * @see AbstractTreeViewer#update(Object, String[])
93
	 */
94
	public final void setProperties(Object aTarget, String[] theProperties) {
95
		if (theProperties != null && theProperties.length > 0) {
96
			if (properties == null) {
97
				properties = new HashMap();
98
			}
99
			properties.put(aTarget, theProperties);
100

    
101
		} else {
102
			properties.remove(aTarget);
103
		}
104

    
105
		if (properties.size() == 0) {
106
			properties = null;
107
		}
108

    
109
	}
110

    
111
	/**
112
	 * @return Returns the current set of refresh targets. Clients may add or
113
	 *         remove directly to or from this set.
114
	 */
115
	public final Set getRefreshTargets() {
116
		return refreshTargets;
117
	}
118

    
119
	/**
120
	 * @return Returns the true if the labels should also be updated during the
121
	 *         <code>refresh</code>.
122
	 */
123
	public final boolean isUpdateLabels() {
124
		return updateLabels;
125
	}
126

    
127
	/**
128
	 * @param toUpdateLabels
129
	 *            True indicates that calls to <code>refresh</code> should
130
	 *            force the update of the labels in addition to refreshing the
131
	 *            structure.
132
	 */
133
	public final void setUpdateLabels(boolean toUpdateLabels) {
134
		updateLabels = toUpdateLabels;
135
	}
136

    
137
}
(45-45/49)