1
|
/*******************************************************************************
|
2
|
* Copyright (c) 2003, 2009 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
|
package org.eclipse.ui.navigator;
|
12
|
|
13
|
import java.util.Set;
|
14
|
|
15
|
import org.eclipse.jface.viewers.IContentProvider;
|
16
|
import org.eclipse.jface.viewers.ILabelProvider;
|
17
|
import org.eclipse.jface.viewers.IStructuredContentProvider;
|
18
|
import org.eclipse.jface.viewers.ITreeContentProvider;
|
19
|
import org.eclipse.jface.viewers.ViewerSorter;
|
20
|
import org.eclipse.ui.IMemento;
|
21
|
import org.eclipse.ui.ISaveablesSource;
|
22
|
|
23
|
/**
|
24
|
*
|
25
|
* Manages content extensions for extensible viewers and provides reusable
|
26
|
* services for filters, sorting, the activation of content extensions, and DND.
|
27
|
* The service can locate the appropriate providers (for contents or labels) for
|
28
|
* an element and provide a ready-to-go {@link ITreeContentProvider} and
|
29
|
* {@link ILabelProvider} for viewers that wish to take advantage of the
|
30
|
* <b>org.eclipse.ui.navigator.navigatorContent</b> extensions defined for a
|
31
|
* particular <i>viewerId</i>.
|
32
|
*
|
33
|
* <p>
|
34
|
* Clients can get the instance of this associated with the {@link CommonNavigator} using
|
35
|
* {@link CommonNavigator#getNavigatorContentService()}.
|
36
|
* </p>
|
37
|
*
|
38
|
* <p>
|
39
|
* Clients may contribute logical extensions using
|
40
|
* <b>org.eclipse.ui.navigator.navigatorContent</b>. Each extension has three
|
41
|
* states which determine whether the extension is used by the content service:
|
42
|
* <ul>
|
43
|
* <li><a name="visible"><i>visible</i>: If a content extension id matches a
|
44
|
* <b>viewerContentBinding</b> for the <i>viewerId</i> of this content
|
45
|
* service, then the extension is <i>visible</i>. Visible extensions may only
|
46
|
* be configured through <b>viewerContentBinding</b>s. </li>
|
47
|
*
|
48
|
* <li><a name="active"><i>active</i>: The active state may be set to a default using the
|
49
|
* <i>activeByDefault</i> attribute of <b>navigatorContent</b>. Users may
|
50
|
* toggle the <i>active</i> state through the "Available customizations"
|
51
|
* dialog. Clients may also configure the active extensions using
|
52
|
* {@link INavigatorActivationService#activateExtensions(String[], boolean)} or
|
53
|
* {@link INavigatorActivationService#deactivateExtensions(String[], boolean)}
|
54
|
* from the {@link #getActivationService() Activation Service} </li>
|
55
|
*
|
56
|
* <li><a name="enabled"><i>enabled</i>: An extension is <i>enabled</i> for an element if the
|
57
|
* extension contributed that element or if the element is described in the
|
58
|
* <i>triggerPoints</i> element of the <b>navigatorContent</b> extension. The
|
59
|
* findXXX() methods search for <i>enabled</i> extensions. </li>
|
60
|
* </ul>
|
61
|
* </p>
|
62
|
* <p>
|
63
|
* A new instance of the content service should be created for each viewer.
|
64
|
* Clients should use {@link #createCommonContentProvider()} and
|
65
|
* {@link #createCommonLabelProvider()} for the viewer. Each content service
|
66
|
* tracks the viewer it is attached to. Clients may create the content service
|
67
|
* with a viewer using ({@link NavigatorContentServiceFactory#createContentService(String)}).
|
68
|
* Alternatively, when the content provider is created and set on a viewer,
|
69
|
* {@link IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, Object, Object)}
|
70
|
* will be called and the content provider will update the viewer used by its
|
71
|
* backing content service. Therefore, only each content service has exactly one
|
72
|
* content provider and one label provider.
|
73
|
* </p>
|
74
|
* <p>
|
75
|
* Extensions may also coordinate their behavior through a
|
76
|
* {@link IExtensionStateModel state model}. The state model holds properties
|
77
|
* and supports property change listeners. Actions can toggle the setting of
|
78
|
* properties and the corresponding content/label providers will respond to
|
79
|
* property change event. Each <b>navigatorContent</b> extension has its own
|
80
|
* contained state model keyed off of the content extension id.
|
81
|
* </p>
|
82
|
* <p>
|
83
|
* Clients may respond when content extensions are loaded by attaching a
|
84
|
* {@link INavigatorContentServiceListener} to the content service.
|
85
|
* </p>
|
86
|
* <p>
|
87
|
* Some extensions may provide content or label providers which implement
|
88
|
* {@link IMemento}. Clients must call {@link #restoreState(IMemento)} and
|
89
|
* {@link #saveState(IMemento)} at the appropriate times for these extensions to
|
90
|
* prepare themselves with the memento.
|
91
|
* </p>
|
92
|
*
|
93
|
* @since 3.2
|
94
|
* @noimplement This interface is not intended to be implemented by clients.
|
95
|
* @noextend This interface is not intended to be extended by clients.
|
96
|
*
|
97
|
*/
|
98
|
public interface INavigatorContentService {
|
99
|
|
100
|
/**
|
101
|
* Create a Content Provider which will use an enhanced delegation model to
|
102
|
* locate extension content providers using this content service for each
|
103
|
* element in the tree.
|
104
|
*
|
105
|
* <p>
|
106
|
* The content provider returned will populate the root of the viewer in one
|
107
|
* of two ways.
|
108
|
* <p>
|
109
|
* In the first approach, the content provider will seek out content
|
110
|
* extensions which are bound using a <b>viewerContentBinding</b>. If any
|
111
|
* of the found <b>viewerContentBindings</b> declare the <i>isRoot</i>
|
112
|
* attribute on as true, then that set of extensions will be consulted for
|
113
|
* the root elements of the tree. The input of the viewer will be supplied
|
114
|
* to each of their {@link IStructuredContentProvider#getElements(Object)}
|
115
|
* methods and aggregate the results for the root of the viewer.
|
116
|
* </p>
|
117
|
* <p>
|
118
|
* In the second approach, if no <b>viewerContentBindings</b> declare
|
119
|
* <i>isRoot</i> as true, then all matching extensions are consulted based
|
120
|
* on their <b>triggerPoints</b> expression in the <b>navigatorContent</b>
|
121
|
* extension. Any matching extensions are then consulted via their
|
122
|
* {@link IStructuredContentProvider#getElements(Object)} methods and the
|
123
|
* results are aggregated into the root.
|
124
|
* </p>
|
125
|
* <p>
|
126
|
* After the root is populated, the children of each root element are
|
127
|
* determined by consulting the source extension and all extension which
|
128
|
* describe the element in their <b>triggerPoints</b> expression.
|
129
|
* </p>
|
130
|
* <p>
|
131
|
* If clients wish to use a viewer other than the CommonViewer, then they
|
132
|
* are responsible for creating the content provider, and setting it on
|
133
|
* their viewer.
|
134
|
* </p>
|
135
|
*
|
136
|
* @return An enhanced content provider that will use this content service
|
137
|
* to drive the viewer.
|
138
|
*/
|
139
|
ITreeContentProvider createCommonContentProvider();
|
140
|
|
141
|
/**
|
142
|
* Create a Label Provider which will use an enhanced delegation model to
|
143
|
* locate extension label providers using this content service for each
|
144
|
* element in the tree.
|
145
|
*
|
146
|
* <p>
|
147
|
* The label of each element is determined by consulting the source of the
|
148
|
* element. If the source chooses to return null, then other extensions
|
149
|
* which declare the element in their <b>triggerPoints</b> extension are
|
150
|
* consulted. The first non-null value is used (including the empty label).
|
151
|
* </p>
|
152
|
*
|
153
|
* <p>
|
154
|
* If clients wish to use a viewer other than the CommonViewer, then they
|
155
|
* are responsible for creating the label provider, and setting it on their
|
156
|
* viewer.
|
157
|
* </p>
|
158
|
*
|
159
|
* @return An enhanced label provider that will use this content service to
|
160
|
* drive labels in the viewer.
|
161
|
*/
|
162
|
ILabelProvider createCommonLabelProvider();
|
163
|
|
164
|
/**
|
165
|
*
|
166
|
* @return The description provider for this content service.
|
167
|
*/
|
168
|
IDescriptionProvider createCommonDescriptionProvider();
|
169
|
|
170
|
/**
|
171
|
* The state model stores properties associated with the extension. Each
|
172
|
* content extension has its own contained state model. Components of the
|
173
|
* extension (content provider, label provider, action providers, etc) may
|
174
|
* attach themselves as listeners to the model ({@link IExtensionStateModel#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)})
|
175
|
* and respond to changes to the values of the properties.
|
176
|
*
|
177
|
* @param anExtensionId
|
178
|
* The extension id defined by a <b>navigatorContent</b>
|
179
|
* extension.
|
180
|
* @return The state model for the given extension id.
|
181
|
*/
|
182
|
IExtensionStateModel findStateModel(String anExtensionId);
|
183
|
|
184
|
/**
|
185
|
* The viewer id is used to locate matching <b>viewerContentBindings</b>.
|
186
|
* In general, this would be the id of the view defined by a
|
187
|
* <b>org.eclipse.ui.views</b> extension. However, there is no formal
|
188
|
* requirement that this is the case.
|
189
|
*
|
190
|
* @return The viewerId used to create this content service.
|
191
|
*/
|
192
|
String getViewerId();
|
193
|
|
194
|
/**
|
195
|
* The viewer descriptor provides some basic information about the abstract
|
196
|
* viewer that uses this content service.
|
197
|
*
|
198
|
* @return The viewer descriptor for this content service.
|
199
|
* @see INavigatorViewerDescriptor
|
200
|
*/
|
201
|
INavigatorViewerDescriptor getViewerDescriptor();
|
202
|
|
203
|
/**
|
204
|
* See <a href="#active">above</a> for the definition of <i>active</i>.
|
205
|
*
|
206
|
* @param anExtensionId
|
207
|
* The unqiue identifier from a content extension.
|
208
|
* @return True if and only if the given extension id is <i>active</i> for
|
209
|
* this content service.
|
210
|
* @see INavigatorContentService For more information on what <i>active</i>
|
211
|
* means.
|
212
|
*
|
213
|
*/
|
214
|
boolean isActive(String anExtensionId);
|
215
|
|
216
|
/**
|
217
|
* See <a href="#visible">above</a> for the definition of <i>visible</i>.
|
218
|
*
|
219
|
* @param anExtensionId
|
220
|
* The unqiue identifier from a content extension.
|
221
|
* @return True if and only if the given extension id is <i>visible</i> to
|
222
|
* this content service.
|
223
|
* @see INavigatorContentService For more information on what <i>visible</i>
|
224
|
* means.
|
225
|
*/
|
226
|
boolean isVisible(String anExtensionId);
|
227
|
|
228
|
/**
|
229
|
* Return the set of <i>visible</i> extension ids for this content service,
|
230
|
* which includes those that are bound through <b>viewerContentBinding</b>s
|
231
|
* and those that are bound through
|
232
|
* {@link #bindExtensions(String[], boolean)}.
|
233
|
*
|
234
|
* @return The set of <i>visible</i> extension ids for this content service
|
235
|
*/
|
236
|
String[] getVisibleExtensionIds();
|
237
|
|
238
|
/**
|
239
|
* Return the set of <i>visible</i> content descriptors for this content
|
240
|
* service, which includes those that are bound through
|
241
|
* <b>viewerContentBinding</b>s and those that are bound through
|
242
|
* {@link #bindExtensions(String[], boolean)}.
|
243
|
*
|
244
|
* @return The set of <i>visible</i> content descriptors for this content
|
245
|
* service
|
246
|
*/
|
247
|
INavigatorContentDescriptor[] getVisibleExtensions();
|
248
|
|
249
|
/**
|
250
|
* Bind the set of given extensions to this content service. Programmatic
|
251
|
* bindings allow clients to make extensions <i>visible</i> to an instance
|
252
|
* of the content service by appending to the bindings declared through
|
253
|
* <b>org.eclipse.ui.navigator.viewer</b>. Programmatic bindings are not
|
254
|
* persisted and are not remembered or propagated to other instances of the
|
255
|
* INavigatorContentService in the same session. Programmatic bindings
|
256
|
* cannot be undone for a given instance of the INavigatorContentService and
|
257
|
* do not override declarative bindings.
|
258
|
* <p>
|
259
|
* Once a content extension has been bound to the INavigatorContentService,
|
260
|
* clients may use
|
261
|
* {@link INavigatorActivationService#activateExtensions(String[], boolean) }
|
262
|
* or
|
263
|
* {@link INavigatorActivationService#deactivateExtensions(String[], boolean) }
|
264
|
* to control the <i>activation</i> state of the extension. See
|
265
|
* {@link INavigatorContentService} for more information on the difference
|
266
|
* between <i>visible</i> and <i>active</i>.
|
267
|
* </p>
|
268
|
*
|
269
|
* @param extensionIds
|
270
|
* The list of extensions to make visible.
|
271
|
* @param isRoot
|
272
|
* whether the context provider should be a root content provider
|
273
|
* @return A list of all INavigatorContentDescriptors that correspond to the
|
274
|
* given extensionIds.
|
275
|
*/
|
276
|
INavigatorContentDescriptor[] bindExtensions(String[] extensionIds,
|
277
|
boolean isRoot);
|
278
|
|
279
|
/**
|
280
|
* Restore the state associated with the memento.
|
281
|
*
|
282
|
* @param aMemento
|
283
|
* The memento for extensions to use when restoring previous
|
284
|
* settings.
|
285
|
*/
|
286
|
void restoreState(IMemento aMemento);
|
287
|
|
288
|
/**
|
289
|
* Persist any session-to-session state with the memento.
|
290
|
*
|
291
|
* @param aMemento
|
292
|
* The memento for extensions to use when persisting previous
|
293
|
* settings.
|
294
|
*/
|
295
|
void saveState(IMemento aMemento);
|
296
|
|
297
|
/**
|
298
|
* Add a listener to be notified whenever an extension is loaded.
|
299
|
*
|
300
|
* @param aListener
|
301
|
* A listener to be attached.
|
302
|
*/
|
303
|
void addListener(INavigatorContentServiceListener aListener);
|
304
|
|
305
|
/**
|
306
|
* Remove a listener (by identity) from the set of listeners.
|
307
|
*
|
308
|
* @param aListener
|
309
|
* A listener to be detached.
|
310
|
*/
|
311
|
void removeListener(INavigatorContentServiceListener aListener);
|
312
|
|
313
|
/**
|
314
|
* The root content providers are recalculated by this method. The attached
|
315
|
* viewer is also refreshed as a result of this method.
|
316
|
*
|
317
|
*/
|
318
|
void update();
|
319
|
|
320
|
/**
|
321
|
* Release any acquired resources and instantiated content extensions.
|
322
|
*
|
323
|
*/
|
324
|
void dispose();
|
325
|
|
326
|
/**
|
327
|
* Search for extensions that declare the given element in their
|
328
|
* <b>triggerPoints</b> expression or that indicate they should be bound as
|
329
|
* a root extension.
|
330
|
*
|
331
|
* @param anElement
|
332
|
* The element to use in the query
|
333
|
* @return The set of {@link INavigatorContentExtension}s that are
|
334
|
* <i>visible</i> and <i>active</i> for this content service and
|
335
|
* either declared through a
|
336
|
* <b>org.eclipse.ui.navigator.viewer/viewerContentBinding</b> to
|
337
|
* be a root element or have a <b>triggerPoints</b> expression that
|
338
|
* is <i>enabled</i> for the given element.
|
339
|
*/
|
340
|
Set findRootContentExtensions(Object anElement);
|
341
|
|
342
|
/**
|
343
|
* Search for extensions that declare the given element in their
|
344
|
* <b>triggerPoints</b> expression.
|
345
|
*
|
346
|
* @param anElement
|
347
|
* The element to use in the query
|
348
|
* @return The set of {@link INavigatorContentExtension}s that are
|
349
|
* <i>visible</i> and <i>active</i> for this content service and
|
350
|
* have a <b>triggerPoints</b> expression that is <i>enabled</i>
|
351
|
* for the given element.
|
352
|
*/
|
353
|
Set findContentExtensionsByTriggerPoint(Object anElement);
|
354
|
|
355
|
/**
|
356
|
* Search for extensions that declare the given element in their
|
357
|
* <b>possibleChildren</b> expression.
|
358
|
*
|
359
|
* @param anElement
|
360
|
* The element to use in the query
|
361
|
* @return The set of {@link INavigatorContentExtension}s that are
|
362
|
* <i>visible</i> and <i>active</i> for this content service and
|
363
|
* have a <b>possibleChildren</b> expression that is <i>enabled</i>
|
364
|
* for the given element.
|
365
|
*/
|
366
|
Set findContentExtensionsWithPossibleChild(Object anElement);
|
367
|
|
368
|
/**
|
369
|
* The filter service can provide the available filters for the viewer, and
|
370
|
* manage which filters are <i>active</i>.
|
371
|
*
|
372
|
* @return An {@link INavigatorFilterService} that can provide information
|
373
|
* to a viewer about what filters are <i>visible</i> and <i>active</i>.
|
374
|
*/
|
375
|
INavigatorFilterService getFilterService();
|
376
|
|
377
|
/**
|
378
|
* The sorter service provides the appropriate sorter based on the current
|
379
|
* items being sorted. By default, the CommonViewer uses
|
380
|
* {@link CommonViewerSorter} which delegates to this service. Clients do
|
381
|
* not need to provide their own {@link ViewerSorter} unless they wish to
|
382
|
* override this functionality.
|
383
|
*
|
384
|
* @return An {@link INavigatorSorterService} that can provide
|
385
|
* {@link ViewerSorter} based on the context of the parent.
|
386
|
*/
|
387
|
INavigatorSorterService getSorterService();
|
388
|
|
389
|
/**
|
390
|
* The pipeline service calculates the appropriate viewer modification or
|
391
|
* refresh that should be applied for viewers that wish to take advantage of
|
392
|
* the model pipelining that some extensions use to massage or reshape
|
393
|
* contents in the viewer. Clients that use the {@link CommonViewer} do not
|
394
|
* need to be concerned with this service as the refreshes are automatically
|
395
|
* computed using this service.
|
396
|
*
|
397
|
*
|
398
|
* @return The {@link INavigatorPipelineService} which can determine the
|
399
|
* correct updates to apply to a viewer.
|
400
|
*/
|
401
|
INavigatorPipelineService getPipelineService();
|
402
|
|
403
|
/**
|
404
|
* The DND Service provides instances of {@link CommonDragAdapterAssistant}
|
405
|
* and {@link CommonDropAdapterAssistant} for this content service.
|
406
|
*
|
407
|
* @return The {@link INavigatorDnDService} which can add additional
|
408
|
* TransferTypes for the DragAdapter and setup the data correctly
|
409
|
* for those extended Transfer Types.
|
410
|
*/
|
411
|
INavigatorDnDService getDnDService();
|
412
|
|
413
|
/**
|
414
|
* The activation service is used to toggle whether certain extensions have
|
415
|
* the opportunity to contribute content and/or actions.
|
416
|
*
|
417
|
* @return The {@link INavigatorActivationService} for this content service.
|
418
|
*/
|
419
|
INavigatorActivationService getActivationService();
|
420
|
|
421
|
/**
|
422
|
* The saveable service helps implementing {@link ISaveablesSource}.
|
423
|
*
|
424
|
* @return the {@link INavigatorSaveablesService} for this content service.
|
425
|
*/
|
426
|
INavigatorSaveablesService getSaveablesService();
|
427
|
|
428
|
/**
|
429
|
* Return the content extension for the given id.
|
430
|
*
|
431
|
* @param anExtensionId The id used to define the <b>org.eclipse.ui.navigator.navigatorContent/navigatorContent</b> extension.
|
432
|
* @return An instance of the content extension for the given extension id. May return <b>null</b> if the id is invalid.
|
433
|
*/
|
434
|
public INavigatorContentExtension getContentExtensionById(String anExtensionId);
|
435
|
|
436
|
/**
|
437
|
* Return the content extension for the given id.
|
438
|
*
|
439
|
* @param anExtensionId The id used to define the <b>org.eclipse.ui.navigator.navigatorContent/navigatorContent</b> extension.
|
440
|
* @return An instance of the content extension for the given extension id. May return <b>null</b> if the id is invalid.
|
441
|
* @since 3.3
|
442
|
*/
|
443
|
public INavigatorContentDescriptor getContentDescriptorById(String anExtensionId);
|
444
|
|
445
|
|
446
|
|
447
|
}
|