blob: ed3727a7f5669130fbdbb85870eb5fe225f46227 [file] [log] [blame]
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns:st1="urn:schemas-microsoft-com:office:smarttags"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1" />
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<title>Tutorial: Canonical Containers</title>
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
name="date"/>
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:Zoom>120</w:Zoom>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!--[if !mso]><object
classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]-->
<style>
<!--
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
h1
{mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
mso-outline-level:1;
font-size:24.0pt;
font-family:"Times New Roman";
font-weight:bold;}
h2
{mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
mso-outline-level:2;
font-size:18.0pt;
font-family:"Times New Roman";
font-weight:bold;}
h3
{mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
mso-outline-level:3;
font-size:13.5pt;
font-family:"Times New Roman";
font-weight:bold;
font-style:italic;}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;
text-underline:single;}
p
{mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
pre
{margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:24.0pt;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;
font-size:10.0pt;
font-family:"Courier New";
mso-fareast-font-family:"Times New Roman";}
p.backto, li.backto, div.backto
{mso-style-name:backto;
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:820735517;
mso-list-template-ids:1034076076;}
@list l0:level1
{mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1
{mso-list-id:1570965290;
mso-list-template-ids:-145727390;}
@list l1:level1
{mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1:level2
{mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1:level3
{mso-level-tab-stop:1.5in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1:level4
{mso-level-tab-stop:2.0in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1:level5
{mso-level-tab-stop:2.5in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1:level6
{mso-level-tab-stop:3.0in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1:level7
{mso-level-tab-stop:3.5in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1:level8
{mso-level-tab-stop:4.0in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1:level9
{mso-level-tab-stop:4.5in;
mso-level-number-position:left;
text-indent:-.25in;}
ol
{margin-bottom:0in;}
ul
{margin-bottom:0in;}
-->
</style>
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</head>
<body lang=EN-US link=blue vlink=purple style='tab-interval:.5in'>
<div class=Section1>
<p class=MsoNormal><img id="_x0000_i1025" src="../../logo.gif"></p>
<h1 align=center style='text-align:center'>Tutorial: Canonical Containers</h1>
<table class=MsoNormalTable border=0 cellspacing=8 cellpadding=0
style='mso-cellspacing:6.0pt;margin-left:24.0pt;mso-padding-alt:0in 0in 0in 0in'>
<tr style='mso-yfti-irow:0;mso-yfti-lastrow:yes'>
<td style='padding:.75pt .75pt .75pt .75pt'>
<p class=MsoNormal>Version: 0.1</p>
</td>
<td style='padding:.75pt .75pt .75pt .75pt'>
<p class=MsoNormal>Date: <st1:date Year="2005" Day="16" Month="12">December
16, 2005</st1:date></p>
</td>
</tr>
</table>
<h2>Contents</h2>
<p class=MsoNormal style='margin-left:48.0pt;text-indent:-.25in'><span
style='font-size:10.0pt;font-family:Symbol'>·</span><span style='font-size:
7.0pt'> </span><a
href="#_Overview">Overview</a></p>
<p class=MsoNormal style='margin-left:48.0pt;text-indent:-.25in'><span
style='font-size:10.0pt;font-family:Symbol'>·</span><span style='font-size:
7.0pt'> </span><a
href="#_References">References</a></p>
<p class=MsoNormal style='margin-left:48.0pt;text-indent:-.25in'><span
style='font-size:10.0pt;font-family:Symbol'>·</span><span style='font-size:
7.0pt'> </span><a
href="#_Introduction">Introduction</a></p>
<p class=MsoNormal style='margin-left:48.0pt;text-indent:-.25in'><span
style='font-size:10.0pt;font-family:Symbol'>·</span><span style='font-size:
7.0pt'> </span><a href="#_Installing_canonical_behavior_on_a_">Installing
canonical behavior on a container</a></p>
<p class=MsoNormal style='margin-left:48.0pt;text-indent:-.25in'><span
style='font-size:10.0pt;font-family:Symbol'>·</span><span style='font-size:
7.0pt'> </span><a href="#_Ability_to_toggle_canonical_behavio">Ability to
toggle canonical behavior on or off</a></p>
<p class=MsoNormal style='margin-left:48.0pt;text-indent:-.25in'><span
style='font-size:10.0pt;font-family:Symbol'>·</span><span style='font-size:
7.0pt'> </span><a href="#_Creating_an_EditPart_that_points_di">Creating an EditPart
that points directly to a semantic element</a> </p>
<p class=MsoNormal style='margin-left:48.0pt;text-indent:-.25in'><span
style='font-size:10.0pt;font-family:Symbol'>·</span><span style='font-size:
7.0pt'> </span><a
href="#summary">Summary</a></p>
<div class=MsoNormal align=center style='text-align:center'>
<hr size=2 width="100%" align=center>
</div>
<h2><a name="_Overview"></a>Overview</h2>
<p class=backto><span style='font-size:10.0pt'>[<a href="#top">back to top</a>]</span></p>
<p>This tutorial provides the reader with the steps to on how to support
canonical behavior with-in a container.&nbsp; Canonical is the terminology we
use to describe a container that keeps its view of the semantic data
synchronized with the semantic children.<span style='mso-spacerun:yes'> 
</span>This means there is a complete view of all the semantic data which
typically means a 1-1 relationship between the views and the underlying
semantic objects.<span style='mso-spacerun:yes'>  </span>This behavior is
necessary because in GMF there are two model layers, one for describing the
notation elements on the diagram and another for the semantic model that the
notation elements will reference.&nbsp; Please see the <a
href="../../prog-guide/runtime/index.html">Programmers
guide</a> for more detailed information regarding GMF runtime
architecture.&nbsp; Due to this two tiered model architecture there is need for
management between the two layers if the user wants to see a full view of the
semantic containment without having to manually create notation views for
underlying semantic elements.</p>
<p>This behavior is also optionally installable since sometimes it may be
desirable to see a partial view of the semantic model.&nbsp; If we consider a
UML class diagram, the user will typically only be interested in a subsection
of a system rather then the whole system (or even the whole contents of a
package).&nbsp; In this case, the user will want to selectively create views to
construct their diagram and probably wouldn’t want views being automatically
created on the diagram when added semantically.&nbsp; </p>
<p>On the other hand, if we consider a logic circuit, it doesn’t make sense to
view the semantics partially.&nbsp; All the elements in the circuit play a
critical role in the functionality of the circuit that would be misleading if
some semantic element wasn’t displayed.&nbsp; In this case, we want to ensure
that notation views are synchronized automatically with the semantic elements
to display a full view.</p>
<div class=MsoNormal align=center style='text-align:center'>
<hr size=2 width="100%" align=center>
</div>
<h2><a name="_References"></a>References</h2>
<p class=backto><span style='font-size:10.0pt'>[<a href="#top">back to top</a>]</span></p>
<p style='margin:0in;margin-bottom:.0001pt'>This tutorial references the
following:<br>
<a
href="../../prog-guide/runtime/index.html">Programmers
Guide</a></p>
<p style='margin:0in;margin-bottom:.0001pt'><a
href="../../examples-guide/diagram/logicExample.html">Logic
Example Guide</a><br>
<a
href="containmentOfShapes.html">Containment
of Shapes</a></p>
<p style='margin:0in;margin-bottom:.0001pt'><o:p>&nbsp;</o:p></p>
<div class=MsoNormal align=center style='text-align:center'>
<hr size=2 width="100%" align=center>
</div>
<p class=MsoNormal align=center style='text-align:center'>&nbsp;</p>
<h2><a name="_Introduction"></a>Introduction</h2>
<p class=backto><span style='font-size:10.0pt'>[<a href="#top">back to top</a>]</span></p>
<p>In this tutorial, we will use the Logic Diagram Example to illustrate how to
install a canonical edit policy on a circuit shape that can contain other logic
elements (i.e. LED, And Gate etc.). To gain familiarity with the Logic Diagram
Example, refer to the <a
href="../../examples-guide/diagram/logicExample.html">Logic
Example Guide</a>. </p>
<div class=MsoNormal align=center style='text-align:center'>
<hr size=2 width="100%" align=center>
</div>
<p class=MsoNormal align=center style='text-align:center'>&nbsp;</p>
<h2><a name="_Step1"></a><a name="_Toc104273255"></a><a
name="_Installing_canonical_behavior_on_a_"></a>Installing canonical behavior
on a container</h2>
<p class=backto><a name="_Toc104273256"><span style='font-size:10.0pt'>[</span></a><a
href="#top"><span style='font-size:10.0pt'>back to top</span></a><span
style='font-size:10.0pt'>]</span></p>
<p>The first way of instrumenting the canonical behavior is to install an
EditPolicy that manages the behavior on the EditPart container.&nbsp; There are
two main classes in the Canonical EditPolicy hierarchy that can be used as a
base class.&nbsp; The CanonicalEditPolicy is the root class, but can be
subclassed by clients if they are not interested in synchronizing
relationships.&nbsp; If nodes and edges need to be synchronized, then the
CanonicalConnectionEditPolicy should be used as a base class.</p>
<p class=MsoNormal><i>Canonical EditPolicy usage:</i></p>
<p class=MsoNormal><img border=0 width=459 height=537 id="_x0000_i1030"
src=canonicalEditPolicy.gif></p>
<p class=MsoNormal>&nbsp;</p>
<p class=MsoNormal>For the purposes of this tutorial we will consider a
container that needs to synchronize both the semantic elements and
relationships.&nbsp; In the logic example, the CircuitEditPart has a shape
compartment that needs to keep it’s view contents in sync with the semantic
logic elements.&nbsp; Since both logic elements and wires are displayed we will
subclass from the CanonicalConnectionEditPolicy to accomplish this.</p>
<p class=MsoNormal>&nbsp;</p>
<p>Example: Circuit Shape displaying containment<br>
<img border=0 width=237 height=275 id="_x0000_i1031" src=circuitContainer.gif></p>
<p class=MsoNormal><b>Step 1:</b> Create new CanonicalConnectionEditPolicy
subclass.&nbsp; Upon creation of the class you’ll notice that there are 4
abstract methods that need to be filled in.</p>
<p class=MsoNormal><o:p>&nbsp;</o:p></p>
<div style='border:solid windowtext 1.0pt;mso-border-alt:solid windowtext .75pt;
padding:4.0pt 0in 4.0pt 0in;margin-left:.5in;margin-right:34.0pt'><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><o:p>&nbsp;</o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>protected List getSemanticChildrenList() {<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// return the list of semantic elements that are to be synchronized with the <span style='mso-spacerun:yes'> </span><span style='mso-spacerun:yes'>     </span><o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// notation node children of the container.<span
style='mso-tab-count:1'>    </span><o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><span
style='mso-tab-count:1'>  </span>…<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>}<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><o:p>&nbsp;</o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>protected List getSemanticConnectionsList() {<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// return the list of relationships or semantic elements that are to be<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// synchronized with the notation edges associated with the container<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><span
style='mso-tab-count:1'>  </span>…<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>}<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><o:p>&nbsp;</o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>protected EObject getTargetElement(EObject relationship) {<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// given a semantic element that is to be represented as a notation edge<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// in the container, return the target element that this semantic element<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// is attached to.<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><span
style='mso-tab-count:1'>  </span>…<span style='mso-tab-count:1'>       </span><o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>}<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><span
style='mso-tab-count:1'>  </span><o:p></o:p></span></pre><pre style='margin-left:
0in;border:none;mso-border-alt:solid windowtext .75pt;padding:0in;mso-padding-alt:
4.0pt 0in 4.0pt 0in'><span style='color:navy'>protected EObject getSourceElement(EObject relationship) {<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// given a semantic element that is to be represented as a notation edge<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// in the container, return the source element that this semantic element<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// is attached to.<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><span
style='mso-tab-count:1'>  </span>…<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>}<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><o:p>&nbsp;</o:p></pre></div>
<p class=MsoNormal><o:p>&nbsp;</o:p></p>
<p class=MsoNormal>After overriding these 4 methods, the EditPolicy is ready to
be installed.&nbsp; For more custom behavior, you may wish to override the
CanonicalEditPolicy#shouldDeleteView method which determines if a particular
view should be deleted if it has an element that doesn’t meet the canonical
criteria.&nbsp; This method is called, when the CanonicalEditPolicy determines
that the view is an “orphan”, meaning it has no semantic element, it is a
duplicate of another view, or the reference semantic element is not found in
the CanonicalEditPolicy#getSemanticChildrenList.</p>
<p class=MsoNormal>&nbsp;</p>
<p class=MsoNormal><b>Step 2:</b>&nbsp; Add any listeners to your semantic
model if needed.&nbsp; By default, the edit policy is listening to the semantic
element who owns the view which has the edit policy installed on it.&nbsp; If
you container is more complex you may need to add additional listeners to
ensure that synchronization occurs at the right time.&nbsp; The listeners
should be added in the EditPolicy#activate method, and removed in the
corresponding EditPolicy#deactivate method.&nbsp; Refer to the following
methods for adding / removing listeners: CanonicalEditPolicy#addListenerFilter
and CanonicalEditPolicy#removeListenerFilter</p>
<p class=MsoNormal>&nbsp;</p>
<p class=MsoNormal><b>Step 3:</b> To activate your EditPolicy you need to
install it on your EditPart container against the
EditPolicyRoles.CANONICAL_ROLE.&nbsp;</p>
<p class=MsoNormal>&nbsp;</p>
<p class=MsoNormal><o:p>&nbsp;</o:p></p>
<div style='border:solid windowtext 1.0pt;mso-border-alt:solid windowtext .75pt;
padding:4.0pt 0in 4.0pt 0in;margin-left:.5in;margin-right:34.0pt'><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// install the custom EditPolicy for the CANONICAL_ROLE<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><o:p>&nbsp;</o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='font-size:9.0pt'>protected void createDefaultEditPolicies() {<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='font-size:9.0pt'><span
style='mso-tab-count:2'>           </span>super.createDefaultEditPolicies();<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='font-size:9.0pt'><span
style='mso-tab-count:2'>           </span>installEditPolicy(EditPolicyRoles.CANONICAL_ROLE, new CircuitCompartmentCanonicalEditPolicy());<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='font-size:9.0pt'>}<o:p></o:p></span></pre></div>
<p class=MsoNormal><o:p>&nbsp;</o:p></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:"Courier New"'>&nbsp;</span></p>
<div class=MsoNormal align=center style='text-align:center'>
<hr size=2 width="100%" align=center>
</div>
<p class=MsoNormal align=center style='text-align:center'>&nbsp;</p>
<h2><a name="_Ability_to_toggle_canonical_behavio"></a>Ability to toggle
canonical behavior on or off</h2>
<p class=backto><span style='font-size:10.0pt'>[</span><a href="#top"><span
style='font-size:10.0pt'>back to top</span></a><span style='font-size:10.0pt'>]</span></p>
<p>It could be that the container needs to optionally support the canonical
synchronization.&nbsp; In this case the edit policy described above needs to be
disabled or deactivated.&nbsp; This capability is built into the
infrastructure, but requires the client to install a style that is a trigger
for turning on / off the canonical behavior.</p>
<p>The CanonicalStyle is a style on a view that indicates whether or not the<br>
Canonical editpolicy behavior is active or not.&nbsp; If the style property is<br>
turned off, then the CanonicalEditPolicy listens and automatically will no<br>
longer synchronize the semantic model and create / delete notation views<br>
accordingly.</p>
<p>To install the CanonicalStyle on your notation view that is to support the
canonical behavior, you need to override the AbstractViewFactory#createStyles
method in your View factory class.</p>
<p class=MsoNormal><o:p>&nbsp;</o:p></p>
<div style='border:solid windowtext 1.0pt;mso-border-alt:solid windowtext .75pt;
padding:4.0pt 0in 4.0pt 0in;margin-left:.5in;margin-right:34.0pt'><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// create the canonical style and add it the view on creation<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><o:p>&nbsp;</o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='font-size:9.0pt'>protected List createStyles(View view) {<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='font-size:9.0pt'><span
style='mso-tab-count:2'>           </span>List styles = super.createStyles(view);<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='font-size:9.0pt'><span
style='mso-tab-count:2'>           </span>Styles.add(NotationFactory.eINSTANCE.createCanonicalStyle());<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='font-size:9.0pt'><span
style='mso-tab-count:2'>           </span>Return styles;<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='font-size:9.0pt'>}<o:p></o:p></span></pre></div>
<p style='margin:0in;margin-bottom:.0001pt'><o:p>&nbsp;</o:p></p>
<p class=MsoNormal>After the style is installed, it is exposed in the UI
through the advanced tab where the user can toggle the capability on or off and
the CanonicalEditPolicy that is installed on the shape responds accordingly.</p>
<p class=MsoNormal>&nbsp;</p>
<div class=MsoNormal align=center style='text-align:center'><a
name="_Toc104273261"></a>
<hr size=2 width="100%" align=center>
</div>
<h2><a name="_Creating_an_EditPart_that_points_di"></a>Creating an EditPart
that points directly to a semantic element</h2>
<p class=backto><span style='font-size:10.0pt'>[<a href="#top">back to top</a>]</span></p>
<p>Another way to instrument the canonical behavior is less flexible but
performs better in terms of memory usage and synchronization time.&nbsp; This
method in effect bypasses the synchronization between semantic and notation
because there are no notation elements created to display the semantic
elements.&nbsp; The EditParts in the container point directly to the underlying
semantic elements.&nbsp; This technique is useful if the elements being
displayed in the container aren’t user configurable in terms of display.&nbsp;
Or perhaps they inherit their display capabilities from the parent.&nbsp; </p>
<p>An ideal usage of this technique is for list compartments that display a
list of elements.&nbsp; The list of elements most often have a derived position
in the container and are displayed is a consistent manner (i.e. no list item
looks different then any other list item except for its contents).&nbsp; This
is where the SemanticListCompartment is best utilized.</p>
<i><span style='font-size:11.0pt;font-family:Arial;mso-fareast-font-family:
"Times New Roman";mso-ansi-language:EN-US;mso-fareast-language:EN-US;
mso-bidi-language:AR-SA'><br clear=all style='page-break-before:always'>
</span></i>
<p><i><span style='font-size:11.0pt'>Semantic List Compartment usage:</span></i></p>
<p><i><span style='font-size:11.0pt;font-family:Arial'><img border=0 width=575
height=206 id="_x0000_i1034" src=semanticListCompartment.gif></span></i></p>
<p><b style='mso-bidi-font-weight:normal'>Step 1:</b> Create a new
ListItemEditPart subclass that overrides the GraphicalEditPart#hasNotationView
method to return false.&nbsp; This new EditPart subclass will point to the
semantic element directly instead of pointing to a notation view.</p>
<p><b style='mso-bidi-font-weight:normal'>Step 2:</b> Create a new subclass
from SemanticListCompartmentEditPart and implement the abstract methods.</p>
<p class=MsoNormal><o:p>&nbsp;</o:p></p>
<div style='border:solid windowtext 1.0pt;mso-border-alt:solid windowtext .75pt;
padding:4.0pt 0in 4.0pt 0in;margin-left:.5in;margin-right:34.0pt'><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><o:p>&nbsp;</o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// This method lets clients directly hook in their EditPart instead of <o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// delegating to the EditPartService.<span style='mso-spacerun:yes'>  </span>The implementation is expected to <o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// instantiate the ListItemEditPart subclass from step (1.) and insert it <o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// into the list.<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><span
style='mso-tab-count:1'>  </span> <o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>protected void semanticChildAdded(EObject child,int index) {<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><span
style='mso-tab-count:1'>  </span>…<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>}<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><o:p>&nbsp;</o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// Returns a list of all semantic children inside this editpart's model<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// Same method signature and client contract of the <o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// CanonicalEditPolicy#getSemanticChildrenList.<span style='mso-spacerun:yes'>  </span><o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>// Returns the list of semantic elements that are to be displayed inside the // container.<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><o:p>&nbsp;</o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>protected List getSemanticChildrenList() {<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'><span
style='mso-tab-count:1'>  </span>…<o:p></o:p></span></pre><pre
style='margin-left:0in;border:none;mso-border-alt:solid windowtext .75pt;
padding:0in;mso-padding-alt:4.0pt 0in 4.0pt 0in'><span style='color:navy'>}<o:p></o:p></span></pre></div>
<p class=MsoNormal><o:p>&nbsp;</o:p></p>
<p class=MsoNormal><o:p>&nbsp;</o:p></p>
<div class=MsoNormal align=center style='text-align:center'>
<hr size=2 width="100%" align=center>
</div>
<h2><a name=summary><span style='font-size:12.0pt'>Summary</span></a><span
style='font-size:12.0pt'><o:p></o:p></span></h2>
<p class=backto>[<a href="#top">back to top</a>]</p>
<p>In this tutorial, we did the following:</p>
<ol style='margin-top:0in' start=1 type=1>
<li class=MsoNormal style='mso-list:l1 level1 lfo3;tab-stops:list .5in'>Created
a container that has its notation views synchronized with the underlying
semantic elements by using the CanonicalEditPolicy hierarchy.</li>
<li class=MsoNormal style='mso-list:l1 level1 lfo3;tab-stops:list .5in'>Learned
how to make the canonical behavior installed by the CanonicalEditPolicy as
optional </li>
<li class=MsoNormal style='mso-list:l1 level1 lfo3;tab-stops:list .5in'>Learned
how to create a container that contains EditParts that point directly to
the semantic elements.</li>
</ol>
<br/>
<br/>
<hr/>
<P><a href="http://www.eclipse.org/legal/epl-v10.html">
Copyright (c) 2000,2005 IBM Corporation and others. All Rights Reserved.</a></P>
<p class=MsoNormal>&nbsp;</p>
</div>
</body>
</html>