Jump to: navigation, search

Difference between revisions of "EMFIncQuery/UserDocumentation/IncQuery Viewers"

(Ecore visualization)
Line 97: Line 97:
  
 
== Ecore visualization ==
 
== Ecore visualization ==
 +
 +
=== Specification ===
 +
<source lang="java">
 +
@Edge(
 +
source = p,
 +
target = ec,
 +
label = "classIn"
 +
)
 +
pattern classesInPackage(p : EPackage, ec: EClass) {
 +
EPackage.eClassifiers(p,ec);
 +
}
 +
 +
@Edge(
 +
source = p,
 +
target = sp,
 +
label = "sub"
 +
)
 +
pattern subPackage(p: EPackage, sp: EPackage)
 +
{
 +
EPackage.eSubpackages(p,sp);
 +
}
 +
 +
@Edge(
 +
source = rootP,
 +
target = containedClass,
 +
label = "classIn+"
 +
)
 +
pattern classesInPackageHierarchy(rootP: EPackage, containedClass: EClass)
 +
{
 +
find classesInPackage(rootP,containedClass);
 +
} or {
 +
find subPackage+(rootP,somePackage);
 +
find classesInPackage(somePackage,containedClass);
 +
}
 +
 +
@Item(
 +
item = p,
 +
label = "P: $p.name$"
 +
)
 +
pattern ePackage(p : EPackage) {
 +
EPackage(p);
 +
}
 +
 +
@Item(
 +
item = ec,
 +
label = "EC: $ec.name$"
 +
)
 +
pattern eClass(ec : EClass) {
 +
EClass(ec);
 +
}
 +
</source>
  
 
TODO
 
TODO

Revision as of 01:30, 15 April 2013

Using IncQuery Viewers

The goal of the IncQuery Viewers component is to help developing model-driven user interfaces by filling and updating model viewer results with the results of model queries. The implementation relies on (and is modeled after) the JFace Data binding and JFace Viewers libraries.

The IncQuery Viewers component can bind the results of queries to various JFace Viewers: JFace ListViewer and TreeViewers are currently supported, while TableViewer support is planned (see [403325] for current state). Additionally, by installing extra features for the extra update site Zest GraphViewers (based on GEF4 Zest) are also supported.

To select which patterns are used to determine the model elements to bind, several annotations are used by the framework. These annotations also allow to add labels and formatting to the viewers.

Using Viewer Annotations for Specifying the View Model

The IncQuery Viewers component uses four different annotations to bind query results to various viewers. As the different viewers have vastly different capabilities, all annotations are designed to be ignored if an unsupported annotation (or annotation parameter) is detected. Multiple patterns can have the same annotation type, in this case the Viewers component adds all the corresponding results to the viewer.

  1. The Item annotation is used on patterns whose results will be the main elements to display in the viewers. E.g., in case of JFace Viewers the ContentProvider should return all the items.
  2. The ContainsItem annotation is used on patterns whose results describe the the containment references between Items. E.g., in case of JFace TreeViewers the ContentProvider has to return these as child references.
  3. The Edge annotation is used on patterns whose results describe a generic edge reference between Items. E.g., in case of Zest GraphViewers the ContentProvider will return these results as graph edges.
  4. The Format annotation is used to define additional formatting. It is expected to be added next to Item and/or Edge annotations.

Binding Results to Viewers

Viewers Sandbox

  1. Open the Query Explorer and Viewers Sandbox views.
  2. Add your instance model and query definitions to the Query Explorer.
  3. Select the Initialize IncQuery Viewers from a query definition in the popup menu over any selected element in the main area.
    • Warning: the IncQuery Sandbox does not update itself in case of pattern changes (as opposed to the Query Explorer).
    • The Initialize command uses the actual filter settings, but the Sandbox does not update itself if the filters are updated.

Programmatic Binding

  1. Add a dependency to org.eclipse.incquery.viewers.runtime (and org.eclipse.incquery.viewers.runtime.zest if necessary) to your plug-in.
  2. Create a ViewerModel from a group of patterns.
  3. Use the corresponding bind methods from IncQueryViewers or IncQueryGraphViewers classes on a manually created Viewer together with the ViewerModel and your instance model.
    • The ViewerModel instance can be re-used between different bindings.
    • If the filters added to the ViewerModel are changed, the bindings will become obsolete, and have to be redone.

Examples

UML visualization

To illustrate the approach, a simple example was prepared in the [repository of the EMF-IncQuery project] based on UML class diagrams. The examples are relying on the notion of example classes: UML classes that do not have operations or properties (neither in their parent classes).

To present most features of the framework, four specific patterns are used (for the entire implementations visit the git repository):

  1. pattern emptyClass (cl : Class) - for listing all empty classes in the model
  2. pattern nonEmptyClass(cl : Class) - for listing all classes in the model, that are not empty
  3. pattern superClass(sub : Class, sup : Class) - for listing all direct superclass relations between classes
  4. pattern transitiveSuperClass(sub : Class, sup : Class) - for listing all indirect superclass relations between classes (but not the direct ones)

JFace List Viewer example

@Item(item = cl, label="Empty class $cl$")
pattern emptyClass(cl : Class) {
...
}
 
@Item(item = cl, label = "Class $cl$")
pattern nonEmptyClass(cl : Class) {
...
}

Binding contents to a JFace Tree Viewer

@ContainsItem(container = sup, item = sub)
pattern superClass(sub : Class, sup : Class) {
...
}
 
@Item(item = cl, label="Empty class $cl$")
pattern emptyClass(cl : Class) {
...
}
 
@Item(item = cl, label = "Class $cl$")
pattern nonEmptyClass(cl : Class) {
...
}

Zest Graph Viewer example

@Edge(source = sup, target = sub, label = "direct")
@Format(color = "#7f004b", lineWidth = 2)
pattern superClass(sub : Class, sup : Class) {
...
}
 
@Edge(source = sup, target = sub)
pattern transitiveSuperClass(sub : Class, sup : Class) {
...
}
 
@Item(item = cl, label="Empty class $cl$")
@Format(color="#3770d7", textColor = "#ffffff")
pattern emptyClass(cl : Class) {
...
}
 
@Item(item = cl, label = "Class $cl$")
pattern nonEmptyClass(cl : Class) {
...
}


Ecore visualization

Specification

@Edge(
	source = p,
	target = ec,
	label = "classIn"
)
pattern classesInPackage(p : EPackage, ec: EClass) {
	EPackage.eClassifiers(p,ec);
}
 
@Edge(
	source = p,
	target = sp,
	label = "sub"
)
pattern subPackage(p: EPackage, sp: EPackage)
{
	EPackage.eSubpackages(p,sp);
}
 
@Edge(
	source = rootP,
	target = containedClass,
	label = "classIn+"
)
pattern classesInPackageHierarchy(rootP: EPackage, containedClass: EClass)
{
	find classesInPackage(rootP,containedClass);
} or {
	find subPackage+(rootP,somePackage);
	find classesInPackage(somePackage,containedClass);
}
 
@Item(
	item = p,
	label = "P: $p.name$"
)
pattern ePackage(p : EPackage) {
	EPackage(p);
}
 
@Item(
	item = ec,
	label = "EC: $ec.name$"
)
pattern eClass(ec : EClass) {
	EClass(ec);
}

TODO