<html>
  <head>
    <meta name="copyright" content="Copyright Technical University Berlin and others 2004, 2010. This page is made available under the Eclipse Public License v1.0. For full details see http://www.eclipse.org/legal/epl-v10.html" />
	<link rel=stylesheet type="text/css" href="../css/book.css">
	<link rel=stylesheet type="text/css" href="otguide.css">
    <title>Object Teams Package Explorer</title>
    <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  </head>
  <body>
    <h1>Object Teams Package Explorer</h1>
    <p>
    The <b>Object Teams package explorer</b> provides the following features
    (in addition to the features of the standard JDT
    <a href="PLUGINS_ROOT/org.eclipse.jdt.doc.user/reference/views/ref-view-package-explorer.htm">
    package explorer view</a>):<br>
    <ul>
	  <li>Showing the <b>Object Teams element hierarchy</b> of the Object Teams projects in the
	  workbench including
	  <ul>
	  <li><span class="underline">specific classes:</span><br />
	    	&ndash; <b>team</b> class (<img src="../images/team_obj.gif">).<br>
	    	&ndash; <b>role</b> class (<img src="../images/role_obj.png">).<br>
	  	  	&ndash; a <b>nested team</b> (<img src="../images/team_role_obj.gif">) is a role as well as a team.
	  	  	</li>
	  <li><span class="underline">role class decorations:</span><br>
	  		&ndash; <b>bound role</b> class (<span><img style="position:relative;left:0px;" src="../images/role_obj.png"><img style="position:relative;left:-2px;top:-4px;" src="../images/boundrole_co.gif"></span>)
	  		&mdash; <em>has a <code class="keyword">playedBy</code> declaration.</em>
	  		<br>
	  		&ndash; <b>overriding role</b> class (<span><img style="position:relative;left:0px;" src="../images/role_obj.png"><img style="position:relative;left:-2px;top:4px;" src="../images/over_co_ovr16.gif"></span>)
	  		&mdash; <em>overrides a role from the super team</em><br>
	  <li><span class="underline">methods:</span><br />
	  	    &ndash; <b>callin</b> methods are marked with a decoration <img src="../images/callinmethod_co.gif">.
	  	    </li>
	  <li><span class="underline">method bindings:</span><br />
	  		&ndash; <b>callin</b>: before(<img src="../images/callinbindingbefore_obj.gif">), 
	  		after (<img src="../images/callinbindingafter_obj.gif">), replace (<img src="../images/callinbindingreplace_obj.gif">)
	  		<br />
	  		&ndash; <b>callout</b>: (<img src="../images/calloutbinding_obj.gif">)
	  		</li>
	  <li><span class="underline">guard predicates:</span><br>
	  		&ndash; <b>regular guard</b> (<img src="../images/guard_obj.gif">)<br>
	  		&ndash; <b>base guard</b> (<img src="../images/baseguard_obj.gif">)<br>
   	  </ul>
   	  <li>Displaying <b>Role Files</b> physically/logically (<img src="../images/external_roles.gif">):
   	  	<ul>
		<li><b>Physical</b> display uses the file and directory structure, i.e., 
   	     role files will appear in a special folder/package representing the enclosing team.</li>
   	    <li><b>Logical</b> display presents role files and inline roles uniformly as direct
   	     children of their enclosing team.</li>
   	    </ul>
   	  <li><b>Overlay icons</b> for <b>compilations units</b> (team or role file) 
   	     and <b>packages</b> (team package) can be enabled by checking
		 <span class="ui">Preferences-&gt;General-&gt;Appearance-&gt;Label Decorations-&gt;Java Type Indicator</span>.
		 <ul>
		 <li><span class="underline">compilation unit:</span><br>
		 	&ndash; holding a team class (<span><img style="position:relative;left:0px;" src="../images/jcu_obj.gif"><img style="position:relative;left:-7px;top:-5px;" src="../images/team_ovr.gif"></span>)<br>
		 	&ndash; holding a role class (<span><img style="position:relative;left:0px;" src="../images/jcu_obj.gif"><img style="position:relative;left:-7px;top:-5px;" src="../images/role_ovr.png"></span> or 
		 	<span><img style="position:relative;left:0px;" src="../images/jcu_obj.gif"><img style="position:relative;left:-7px;top:-5px;" src="../images/team_role_ovr.gif"></span>)</li>
		 <li><span class="underline">package:</span><br>
		 	&ndash; team package  (<span><img style="position:relative;left:0px;" src="../images/package.gif"><img style="position:relative;left:-7px;top:-5px;" src="../images/team_ovr.gif"></span>)
		 </ul>
   	</ul>
    <table>
    <tr><td>
    	<p><span class="underline"><b>Physical view:</b></span><br>
    		role file <code>FlightBonusDialog</code> is displayed as
    		a child of its team package.
    	</p>
    	  <img src="images/screenshots/packageExplorer.png"
	  	   alt="Object Teams package explorer view">
    </td><td><span style="width=20px;">&nbsp;</span></td><td>
		<p><span class="underline"><b>Logical view:</b></span><br>
			role <code>FlightBonusDialog</code> is displayed as
			a child of its enclosing team class.
		</p>
		  <img src="images/screenshots/packageExplorer_logical.png"
	  	 	alt="Object Teams package explorer logical view">
   
	</td></tr></table>
	<h2>Aspect bindings in Object Teams Plug-in projects</h2>
	<p>
	If an Object Teams Plug-in project has 
	<a href="../reference/extension-points/org_eclipse_objectteams_otequinox_aspectBindings.html">aspect bindings</a> 
	these will be displayed in the package explorer directly under the project's root:
	</p><p>
		<img src="images/screenshots/AspectBindingsInPackageExplorer.png" title="Package explorer showing aspect bindings"/>
	</p><p>
	Below the node called <span class="ui">OT/Equinox Aspect Bindings</span> you will find the list of all <img src="../images/plugin_obj.gif"/> <strong>base plug-ins</strong>
	adapted by the given OT plug-in. Each base plug-in in turn lists all <img src="../images/team_obj.gif"/> <strong>teams</strong> that implement this adaptation.<br/>
	Base plug-ins to which <strong>forced exports</strong> are applied are decorated with a little up-and-left arrow:
	</p><p>
		<img alt="Decoration for base plug-in with forced export" src="images/screenshots/ForcedExports.png">
	</p><p>
	Double clicking a base plugin or a team shows the corresponding element in an editor:
	<ul>
	<li>a base plugin as sub-element of an aspectBinding extension in the PDE's extension editor.</li>
	<li>a team class in the source code editor</li>
	</ul>
	</p>
	
  </body>
</html>
