blob: 22d419d9718e349c800f94d5919f213d6bcac07f [file] [log] [blame]
###############################################################################
# Copyright (c) 2012 Tilera Corporation and others.
#
# This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
# https://www.eclipse.org/legal/epl-2.0/
#
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
# William R. Swanson (Tilera Corporation)
###############################################################################
Visualizer View Framework
=========================
Version: 1.0
Last updated: 1/19/12
Overview
--------
- The Visualizer framework supports the addition of visual (i.e. graphical)
representations of run/debug launches to the Eclipse workbench.
It provides interfaces and default implementations to be used by
integrators in adding their own graphical views to Eclipse.
- The Visualizer framework is an optional feature of CDT.
- The Visualizer framework consists of the following features/plugins:
- org.eclipse.cdt.visualizer-feature:
- org.eclipse.cdt.visualizer.core -- non-UI interface and utilities
- org.eclipse.cdt.visualizer.ui -- UI classes and utilities
- The Visualizer framework has the following goals:
- make it easy to present multiple graphical presentations of
a running/debugging launch, and allow the user to select between them
- provide a pluggable infrastructure that does not limit an integrator
to a specific model, event, or graphic "canvas" in creating such presentations
- provide sufficient default implementations to make creating a new
custom presentation as simple as possible
- The framework consists of the following set of interfaces and classes:
==========================
| VisualizerView |
==========================
| VisualizerViewer |
| |
| -------------------- | ------------------
| | | | | |
| | IVisualizer's | <=== | IVisualizer | ===> (Model Object)
| | graphic | | | implementation |
| | control | | | |
| | | | ------------------
| -------------------- |
| |
==========================
- VisualizerView -- a top-level Eclipse workbench view that
contains and presents a VisualizerViewer
The VisualizerView also provides support for a toolbar and
context menu, which can be populated by IVisualizers when
they are selected.
- VisualierViewer -- a container control that manages one or more
IVisualizers and their corresponding graphic controls.
The VisualizerViewer automatically switches between its available
IVisualizers based on the current workbench selection.
The viewer also mediates between its parent View and child IVisualizers
on things like:
- content selection (workbench selection <==> IVisulizer selection)
- toolbar population and updating
- context menu events and updating
- IVisualizer -- an API for a class that encapsulates:
- a graphic representation of one or more model object types
- a top-level graphic display control (e.g. an SWT canvas, GEF canvas, etc.)
that is used to present this graphic representation in the VisualizerViewer
- the "model" class -- this is not a specific class type,
it's basically any top-level Object that can be selected and
used to obtain the state to be presented by an IVisualizer
(for example, a Launch in the Debug View, or a text selection
in an editor)
- The framework provides default implementations of VisualizerView,
and VisualizerViewer, and base classes that can be used to
create IVisualizer implementations.
- The framework provides an extension point by which IVisualizer implementations
can be registered. This is read by the default VisualizerViewer,
and used to populate its initial set of IVisualizer views
Extension Points:
-----------------
The base class VisualizerViewer checks the following extension point
for plugin contributions of IVisualizer implementations:
- org.eclipse.cdt.visualizer.ui.vizualizer
- id: unique ID of this visualizer type
- class: implementation of IVisualizer interface
Examples:
<!-- Visualizer declarations -->
<extension
point="org.eclipse.cdt.visualizer.ui.visualizer">
<!-- "Grid View" visualizer -->
<visualizer
id="com.tilera.ide.views.grid.visualizer"
class="com.tilera.ide.views.grid.GridViewVisualizer">
</visualizer>
<!-- "Test Canvas" visualizer -->
<visualizer
id="org.eclipse.cdt.visualizer.ui.test.TestCanvasVisualizer"
class="org.eclipse.cdt.visualizer.ui.test.TestCanvasVisualizer">
</visualizer>
</extension>
Package/Class hierarchy:
------------------------
- feature: org.eclipse.cdt.visualizer
- plugin: org.eclipse.cdt.visualizer.core
- org.eclipse.cdt.visualizer.core.plugin
- CDTVisualizerCorePlugin -- plugin activator class (mainly used to access ResourceManager)
- org.eclipse.cdt.visualizer.core
- ResourceManager -- resource manager, handles strings only (see UIResourceManager below)
- Extension -- utility class for dealing with extension points
- ExtensionElement -- utility class for dealing with extension definitions
- plugin: org.eclipse.cdt.visualizer.ui
- org.eclipse.cdt.visualizer.ui.plugin
- CDTVisualizerUIPlugin -- plugin activator class (mainly used for logging and UIResourceManager)
- org.eclipse.cdt.visualizer.ui
- VisualizerView -- base class for top-level Visualizer "view" in Eclipse workbench
- handles:
- display of single IVisualizerViewer
- boilerplate code for workbench views
- IVisualizerViewer -- visualizer "viewer" container interface
- VisualizerViewer -- base class for IVisualizerViewer implementations
- handles:
- loading and managing a list of IVisualizers
- routing of selection
- from workbench into current IVisualizer
- from current IVisualizer back to workbench
- manages viewer toolbar and content menu,
asks current IVisualizer to populate these as needed
- IVisualizer -- interface for visualizer (graphic representation, like Grid View)
- Visualizer -- base class for IVisualizer implementations
- handles:
- creating and painting a graphic component
- management of selection for that component
- populating toolbar and context menu content on demand
- VisualizerAction -- base class for toolbar/menu actions (convenience wrapper for Action class)
- org.eclipse.cdt.visualizer.ui.events
- VisualizerViewerEvent -- event raised by VisualizerViewer (visualizer changed, context menu event)
- IVisualizerViewerListener -- listener interface for VisualizerViewerEvent listeners
- org.eclipse.cdt.visualizer.ui.canvas
- GraphicCanvasVisualizer -- base class for visualizers based on GraphicCanvas component
- GraphicCanvas -- simple canvas that paints a list of GraphicObjects
- IGraphicObject -- interface for objects to be drawn on GraphicCanvas
- GraphicObject -- base class implementation of IGraphicObject
- BufferedCanvas -- base class for GraphicCanvas (or any canvas component with back-buffering)
- org.eclipse.cdt.visualizer.ui.test
- TestCanvasVisualizer -- IVisualizer wrapper for TestCanvas
- TestCanvas -- simple canvas example that displays current selection as text
- org.eclipse.cdt.visualizer.ui.util
- GUIUtils -- assorted UI utility methods
- UIResourceManager -- resource manager, includes strings, images, fonts, colors
- Colors -- SWT color resource manager, used with UIResourceManager
- SelectionUtils -- ISelection manipulation utilities
- SelectionManager -- ISelectionProvider implementation, manages selection for a containing class
- SelectionProviderAdapter -- ISelectionProvider wrapper for classes that don't implement it
- ListenerList -- listener manager class
- Event -- event base class
- MouseMonitor -- mouse event tracking utility class
- RunnableWithResult -- Runnable that returns a result
- Timer -- UI timer class
- Todo -- work tracking utility class
- WorkbenchSelectionAdapter -- manages interaction between workbench selection and a specified IViewPart
Creating a Visualizer
---------------------
This is a summary of the steps to take in developing a visualizer.
(For a specific example of this, see the Multicore Debug Visualizer,
defined in the org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui plugin.)
- Add the VisualizerView to the workbench.
Note: this implicitly creates a VisualizerViewer instance.
NOTE: This is currently done by the Visualizer framework itself,
with the following plugin.xml extension markup:
For example:
<extension
point="org.eclipse.ui.views">
<view
category="org.eclipse.debug.ui"
class="org.eclipse.cdt.visualizer.ui.VisualizerView"
icon="icons/full/view16/visualizer_view.gif"
id="org.eclipse.cdt.visualizer.view"
name="%view.visualizer.name">
</view>
</extension>
- declare your visualizer class via the extension point
(described below under Extension Points)
<extension
point="org.eclipse.cdt.visualizer.ui.visualizer">
<!-- "Multicore View" visualizer -->
<visualizer
id="org.eclipse.cdt.dsf.gdb.multicorevisualizer.visualizer"
class="org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view.MulticoreVisualizer">
</visualizer>
</extension>
- Define your IVisualizer class, either:
- completely from scratch, implementing IVisualizer
- derived from the Visualizer base class
- if you want to use the supplied GraphicCanvas as your control,
use the GraphicCanvasVisualizer base class instead
- Implement the IVisualizer interface:
- implement getName(), getDisplayName(), and getDescription()
to provide a UI-visible name and tooltip for your visualizer
- implement createControl() to return the UI control to be
displayed for your visualizer in the VisualizerView
(if you're using the GraphicCanvasVisualizer base class,
override createCanvas() and initializeCanvas() instead)
- implement handlesSelection() to determine whether your
visualizer can display the current selection
(your visualizer is only selected if it returns a higher
value from this call than any other visualizer)
- implement visualizerSelected()/visualizerDeselected()
to handle any setup/cleanup when your visualizer becomes
active or inactive
- implement workbenchSelectionChanged() to handle changes in
the workbench selection (typically, this means updating the
visualizer's displayed content, and/or mapping the current
selection to selected item(s) in the visualizer display)
- implement the selection-management methods
(getSelection(), setSelection() and add/removeSelectionChangedListener())
to handle exposing the visualizer's selection to the workbench
(typically, these methods can be delegated to an instance of
the SelectionManager utility class, and then your visualizer
just needs to keep the SelectionManager's content up to date)
- when your visualizer's selection changes (i.e. by the user clicking
or dragging on the visualizer's control, update the exposed
selection (i.e. update the SelectionManager instance)
- optionally, to enable toolbar/menu support:
- implement createActions()/updateActions() to create and
update the enabling of your actions
- implement populateToolbar() to add actions to the visualizer toolbar
(note: the toolbar is initially empty each time this is called)
- implement populateMenu() to add actions to the toolbar's menu
- implement populateContextMenu() to add actions to the
VisualizerView's context menu
- whenever the selection changes (workbench or visualizer),
invoke updateActions() to keep your toolbar/menu actions
enabled properly
- If you use the GraphicCanvasVisualizer, here's some additional hints:
- create an internal "model" class for your canvas, if you don't
already have such a model
- when the workbench selection changes update this model
with any needed changes; this allows you to decouple the
canvas repaint step from workbench events,
- have your GraphicCanvas implementation create and update instances
of GraphicObject classes associated with your model objects;
also cache GraphicObjects for model state that doesn't
change on every repaint
- don't repaint your visualizer canvas on every event;
use a Timer instance and "batch up" requests that come in
during the timer interval (for example, start the timer when
the first update request comes in, and when the timer goes off,
display the current state, effectively "rolling up" any update
requests that came in during the timer interval)
- add selection support to your canvas (i.e. let the user click-
and drag-select items in the visualization), and use the
selection-management interface of the IVisualizer class to
expose this to the workbench
- remember that the IVisualizerViewer/IVisualizer API provides
support for a context menu on the visualizer, so you don't need
to provide one for your canvas control
- Remember the goal of the visualizer: to provide a clear, high-level
view of the selected object -- for example, the hierarchy of processes
and threads in a running program. You can provide options or overlays
for additional detail, but keep the basic picture simple.
Current State, Future Plans
---------------------------
- In the initial implementation, the IVisualizer implementation
is required to use the selection to locate the object (i.e. the current launch)
that it is to represent visually, and to construct and maintain
a graphic representation of it.
- In future, the Visualizer framework will want to provide APIs
that factor out and simplify common aspects of interaction with
launches and launch targets. For example:
- a service-based target introspection layer, which can be used by
IPresentation implementations to discover details of the current
launch target in a platform-neutral way