| <?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop' |
| /******************************************************************************* |
| * Copyright (c) 2010, 2012 |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Stephan Herrmann |
| *******************************************************************************/ |
| |
| $pageTitle = "Object Teams - Features of the OTDT"; |
| $App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/objectteams/css/style.css"/>'); |
| |
| $html = <<<EOHTML |
| <div id="widecolumn"> |
| <div style="position:relative;top:0px;left:0px;"> <!-- parent for absolute-positioned contentbox --> |
| |
| <h1>$pageTitle</h1> |
| |
| The release 2.4 is based on Eclipse SDK 4.5. |
| <p> |
| The OTDT contains a modified version of the JDT core<br/> |
| and several added plugins. |
| </p> |
| <div style="margin-top:30px;"> |
| <span style="text-decoration:underline;">See also:</span> |
| <div class="indent"> |
| <a href="http://help.eclipse.org/topic/org.eclipse.objectteams.otdt.doc/ot.html"><img alt=">>" src="images/arrow-right-trans.png"/>The OTDT user guide </a><br/> |
| (this is also bundled with the OTDT as <a href="#help">online help</a>) |
| </div> |
| </div> |
| |
| <div id="contentbox"> |
| <div id="contentinner"> |
| <b>Contents:</b> |
| <ul style="margin-top:2px;margin-bottom:0px;"> |
| <li><a href="#compiler">Compiler</a></li> |
| <li><a href="#wizards">Wizards</a></li> |
| <li><a href="#editor">Editor</a></li> |
| <li><a href="#bindingEditor">Binding Editor</a></li> |
| <li><a href="#refactoring">Refactoring</a></li> |
| <li><a href="#structureViewers">Structure Viewers</a></li> |
| <li><a href="#search">Search</a></li> |
| <li><a href="#execution">Execution Environment</a></li> |
| <li><a href="#otequinox">OT/Equinox</a></li> |
| <li><a href="#debugging">Debugging</a></li> |
| <li><a href="#help">Help and additional Information</a></li> |
| </ul> |
| </div> |
| </div> |
| |
| |
| <h2 id="compiler" style="margin-top:150px;">Compiler</h2> |
| |
| The Object Teams Compiler is an incremental compiler, based on the Eclipse Compiler for Java. |
| <dl> |
| <dt><strong>Language Definition</strong></dt> |
| <dd>The compiler implements the language as defined in the OT/J |
| <a href="http://www.objectteams.org/def/1.3.1/index.html" target=_blank>language definition</a> version 1.3.1 (OTJLD). |
| The language definition has continuously been revised to precisely specify the language |
| including various corner cases and combinations of features. |
| </dd> |
| <dt><strong>Language Implementation</strong></dt> |
| <dd> |
| The compiler supports all features of OT/J according to the |
| <a href="http://www.objectteams.org/def/1.3.1/index.html" target=_blank><img alt="otjld" src="images/otdt/ot_paragraph.png"/> OTJLD v1.3.1</a> |
| §§1-7,9. |
| Support for the join point sub-language (<a href="http://www.objectteams.org/def/0.9/joinpoints.html" target=_blank><img alt="otjld" src="images/otdt/ot_paragraph.png"/> OTJLD § 8</a>) is not included. |
| <p></p> |
| The compiler can be <strong>configured</strong> using global <code>Preferences</code> or project |
| specific <code>Properties</code>. |
| <ul> |
| <li>Configure OT/J-specific compiler diagnostics as "ignore", "warning" or "error".<br/> |
| Any warnings configured on this property sheet can also be suppressed in the |
| source code using the <code>@SuppressWarnings</code> annotation.</li> |
| <li>Scoped keywords <a href="http://www.objectteams.org/def/stable/sA.html#sA.0.1" target=_blank><img alt="otjld" src="images/otdt/ot_paragraph.png"/> OTJLD § A.0.1</a> can be disabled (default is enabled). |
| </li> |
| </ul> |
| </dd> |
| <!--dt><strong>Status of the Compiler</strong></dt> |
| <dd> |
| The OTDT is continuously tested using two growing test suites: |
| <table class="default"> |
| <tr><th>Name</th><th>Software under Test</th><th>Kind</th><th>Number of tests</th></tr> |
| <tr class="z1"><td><b>Jacks</b></td><td>compiler and runtime environment</td><td>black box</td><td> >2000 (test programs)</td></tr> |
| <tr class="z2"><td><b>JUnit</b></td><td>all of the OTDT</td> <td>white box</td><td> >40000 tests.</td> </tr> |
| </table> |
| |
| Feel free to have a look at the <a href="otdt.html#testresults">test status</a> and remaining <a href="http://trac.objectteams.org/ot/wiki/JUnitFailures">known problems</a>. |
| </dd--> |
| </dl> |
| |
| <h2 id="wizards">Wizards</h2> |
| <ul> |
| |
| <li>The first step to developing with Object Teams in Eclipse is creating an |
| <img class="inline" alt="" src="images/otdt/newprj_wiz.gif"/><code> Object Teams Project</code>. |
| A wizard will guide you through that process. |
| It will also add the Object Teams Runtime Environment (<tt>otre.jar</tt>) to your project's classpath. |
| </li> |
| |
| <li> |
| |
| Having done that, you can start adding classes — be it regular classes, |
| or <img class="inline" alt="" src="images/otdt/team_obj.gif"/> team |
| or <img class="inline" alt="" src="images/otdt/role_obj.png"/> role classes — |
| wizards will assist you in creating the classes properly. |
| </li> |
| </ul> |
| |
| |
| <h2 id="editor">Editor</h2> |
| <ul> |
| |
| <li>Editing Object Teams source code is supported by an outline view, showing the structure of the edited source file. |
| This includes the Object Teams specific constructs, |
| <em>teams</em> (<img class="inline" alt="" src="images/otdt/team_obj.gif"/>), |
| <em>roles</em> (<img class="inline" alt="" src="images/otdt/role_obj.png"/>), |
| and <em>method bindings</em> (<img class="inline" alt="" src="images/otdt/callinbindingbefore_obj.gif"/>, |
| <img class="inline" alt="" src="images/otdt/callinbindingreplace_obj.gif"/>, |
| <img class="inline" alt="" src="images/otdt/callinbindingafter_obj.gif"/>, |
| <img class="inline" alt="" src="images/otdt/calloutbinding_obj.gif"/>).</li> |
| |
| <li>The editor highlights the Object Teams keywords like "<code class="keyword">team</code>" the same way standard Java keywords are highlighted.</li> |
| <li>All constructs referencing other code elements are navigable. E.g. you can navigate <tt>super()</tt>, <tt>tsuper()</tt>, <tt>base()</tt> calls, as well as <em>callin</em> and <em>callout bindings</em>. |
| The name in a <code class="keyword">team package</code> declaration lets you navigate from a role file |
| (<a href="http://www.objectteams.org/def/stable/s1.html#s1.2.5" target=_blank><img alt="otjld" src="images/otdt/ot_paragraph.png"/> OTJLD § 1.2.5</a>) to its enclosing team.</li> |
| |
| <li>Classes to which one or more roles are bound using <code class="keyword">playedBy</code> are |
| annotated with a marker (<img class="inline" alt="" src="images/otdt/playedBy_obj.gif"/>), |
| that allows navigating to the role declaration(s). |
| Similarly, methods in a base class that are bound with a <em>callin binding</em> are |
| annotated with a marker (<img class="inline" alt="" src="images/otdt/callinbinding_obj.gif"/>), |
| that allows navigating to the method binding declaration(s). |
| |
| <br/> |
| Because this feature may be resource-consuming in a large workspace the global Object Teams preferences page allows to completely disable the generation of callin markers.</li> |
| |
| <li>Semantic highlighting (checkbox "mark occurrences") is fully supported.</li> |
| <li>Code completion (Ctrl-space) is widely supported. It is, e.g., possible to use completion in order to create a callout binding.</li> |
| <li>Content assist provides quick-fixes (Ctrl-1) for a number of OT/J specific errors and warnings. |
| Also a few templates for specific OT/J language constructs — |
| namely <code>with{}</code> and <code>within (<em>Expression</em>){}</code> — are available.</li> |
| </ul> |
| |
| <h2 id="bindingEditor">Binding Editor</h2> |
| <ul> |
| <li>Supports easy creation of connector definitions using a table based graphical user interface. In this context, a <b>connector</b> is meant to be a team that inherits structure |
| (roles) and functionality (methods) from its super-team, and its main purpose is to bind |
| the inherited structure and functionality using <code class="keyword">playedBy</code> |
| declarations and callin/callout method bindings.</li> |
| <li>Type bindings (<code class="keyword">playedBy</code>) can be defined by choosing a provided role type and the desired base type with a type selection dialog.</li> |
| <li>Method bindings (either callin or callout) can be established by choosing a role method and a base method from the provided role and base method list respectively. |
| <ul> |
| <li>Only appropriate binding kinds are selectable in the corresponding context (callin or callout).</li> |
| <li>Besides the provided role methods, a new role method can be implemented by selecting a provided base method, thus creating a callout binding.</li> |
| </ul> |
| </li> |
| <li>Parameter and result mappings are definable by typing in an expression in the corresponding text field of the parameter mapping configuration tab.</li> |
| </ul> |
| The binding editor can be opened either from the new team wizard or using the package explore's context menu (<code><img class="inline" alt="" src="images/otdt/calloutbinding_obj.gif"/> Open Binding Editor</code>). |
| <p></p> |
| |
| <h2 id="refactoring">Refactoring</h2> |
| <p></p> |
| Significant work has been put into supporting the automated refactoring of OT/J code. |
| The following refactorings take into account the Object Teams-specific |
| relationships (implicit role inheritance, team nesting, role-base bindings and method |
| bindings). |
| <ul> |
| <li><b>Extract Method</b></li> |
| <li><b>Move Method</b></li> |
| <li><b>Pull Up</b> applicable to method or field</li> |
| <li><b>Push Down</b> applicable to method or field</li> |
| <li><b>Rename</b> applicable to: project, source folder, package, type, method, field.<br/> |
| <i>When trying to rename a team package you'll be asked to rename the team class instead.</i></li> |
| </ul> |
| Additionally, specific refactorings for OT/J are being developed. Currently these are implemented: |
| <ul> |
| <li><b>Extract Callin</b></li> |
| <li><b>Inline Callin</b></li> |
| <li><b>Move to Role File</b></li> |
| </ul> |
| <p></p> |
| |
| |
| <h2 id="structureViewers">Structure Viewers</h2> |
| <dl> |
| <dt><strong>The Package Explorer</strong></dt> |
| <dd> |
| <ul> |
| <li> |
| provides access to all project artifacts and their structure, i.e. source files, used libraries (<em>jar</em>-files), and other documents. Note that team and role classes are annotated with distinct icons (<img class="inline" alt="" src="images/otdt/team_obj.gif"/> for teams and <img class="inline" alt="" src="images/otdt/role_obj.png"/> for roles). (The same icons are used throughout the IDE, whenever a team or role is visible.) |
| </li> |
| <li> |
| If "Java Type Indicators" is enabled under general preferences/label decorations, OT-specific decorations will also be applied to compilation units (files) and team packages. |
| </li> |
| <li> |
| By opening the tree-branches, you can peek at the structure of e.g. classes. |
| </li> |
| <li>For team classes, there is special support for <b>role files</b> (<a href="http://www.objectteams.org/def/stable/s1.html#s1.2.5" target=_blank><img alt="" src="images/otdt/ot_paragraph.png"/> OTJLD § 1.2.5</a>):<br/> |
| Role files are separate files and can be shown either |
| <em>physically</em> (<img class="inline" alt="" src="images/otdt/team_package.gif"/>) as (separate) files in the team package or |
| <em>logically</em> (<img class="inline" alt="" src="images/otdt/external_roles.gif"/>) as member types of the enclosing team. |
| </li> |
| <li> |
| Furthermore, the Package Explorer provides the current context for other operations. The Team- and Role-Wizards, for example, have a pre-set source folder, package and enclosing class when a team is selected in the Package Explorer. |
| </li> |
| </ul></dd> |
| <dt><strong>The Hierarchy View</strong></dt> |
| <dd><ul> |
| <li>Object Teams intruduce a new type hierarchy. Besides the normal ("<code>extends</code>") inheritance, there is an additional "<em>implicit</em>" role inheritance, established by role name equality in a team hierarchy. In conjunction with team nesting roles support a controlled form of multiple inheritance. |
| </li> |
| <li> |
| The new implicit inheritance has been integrated completely into the standard JDT |
| <em>Hierarchy View</em>. |
| </li> |
| </ul></dd> |
| <dt><strong>Java Structure Compare</strong></dt> |
| <dd><ul> |
| <li>When comparing versions of an OT/J file, the Java Structure Compare will correctly render |
| Object Teams elements, too.</li> |
| <li>When selecting a callin replace binding, an action "Compare With > Bound Base Method" is available via the context menu, |
| which easily let's you compare the method implementations of role and base.</li> |
| </ul></dd> |
| </dl> |
| |
| |
| <h2 id="Search">Search</h2> |
| <p></p> |
| <dl> |
| <dt><strong>Search references</strong></dt> |
| <dd><ul><li>The Java Search functionality has been extended to include search results of |
| Object Teams code, that is, callin and callout bindings, and |
| playedBy-relationships.</li></ul></dd> |
| <dt><strong>Call hierarchy</strong></dt> |
| <dd><ul><li>Also the call hierarchy has been extended for browsing control flows passing |
| through method bindings (callin and callout).</li> |
| <li>The OTDT introduced support for call hierarchies regarding field accesses (read, write, any) and class instantiations. As of version 3.4 this functionality has been adopted by Eclipse.</li> |
| <li>OT/J constructs that may cause role creation due to lifting are considered by the call hierarchy as calling the role's lifting constructor.</li> |
| </ul> |
| </dd> |
| </dl> |
| <p></p> |
| |
| <h2 id="execution">Execution Environment</h2> |
| <dl> |
| <dt><strong>Aspect weaving</strong></dt><dd> |
| <ul><li> |
| All aspect oriented languages have some kind of <em>weaving process</em>, where the aspect code is combined with the other (<em>base</em>) code. |
| </li> |
| <li> |
| Object Teams programs perform the weaving at application <em>startup time</em>, i.e. at the moment, the program is launched. In order to do this, there is the so-called <em>Object Teams Runtime Environment (OTRE)</em>, that hooks into the class-loading process. |
| </li> |
| <li> |
| All this is handled transparently using the standard Eclipse "Run" feature. |
| Running any main class of an Object Teams project automatically includes |
| the OTRE (This feature has been <a href="new_in_1.3.html#launch">changed in the OTDT 1.2.2</a>). |
| </li> |
| </ul></dd> |
| <dt id="weaving_scheme"><strong>Weaving schemes</strong></dt> |
| <dd><ul> |
| <li>Since version 2.3, the OTDT ships with two distinct weavers with the properties mentioned below. |
| Since the OT/J compiler performs some preparation for the respective weaver, |
| it has to generate different byte code formats, depending on the targeted weaving scheme. |
| As a result, switching from one weaving scheme to the other requires a full recompilation of all OT/J code involved. |
| <ul> |
| <li><strong>OTRE</strong>: This is the traditional <strong>load-time</strong> weaver. |
| This weaver has <strong>matured</strong> over many years, |
| but unfortunately, the underlying library <strong>BCEL</strong> is no longer maintained |
| and thus cannot handle class files from recent Java versions. |
| Up-to Java 7 this could be worked around, |
| but Java 8 class files contain several elements that this BCEL-based weaver cannot handle.</li> |
| <li><strong>OTDRE</strong>: |
| The newer Object Teams Dynamic Runtime Environment has been developed to enable even <strong>runtime weaving</strong>. |
| To work around limitations of the JVM this weaver has to insert a few general hooks into every weavable class. |
| This weaver is also interesting for weaving into <strong>Java 8</strong> class files, |
| as it is based on the library <strong>ASM</strong>, for which a Java-8-enabled version already exists. |
| It should be noted, however, that the OTDRE is not as mature as the OTRE, |
| both in terms of complete coverage of all combinations of language features |
| as well as in terms of performance measurement (we simply have no large-scale experience with the OTDRE, yet).</li> |
| </ul> |
| </li> |
| </ul></dd> |
| <dt><strong>Aspect deployment/activation</strong></dt> |
| <dd><ul> |
| <li>A new "Team Activation" tab in the "Run-Configuration" allows to instantiate and activate teams without modifying the program's source code. |
| </li> |
| <li> |
| Teams that cause aspect code to be woven into an application can be added to a program |
| <ul> |
| <li> by explicit reference within the program source code or</li> |
| <li> by a configuration file which is mentioned as a parameter to the VM or</li> |
| <li> by adding them via the aforementioned "Team Activation" tab.</li> |
| </ul> |
| No such configuration is needed for compilation. |
| </li> |
| </ul> |
| </dd> |
| <dt><strong>Technology used</strong></dt> |
| <dd><ul> |
| <li id="JPLIS">Integrating the weaver into the JVM leverages the Java-agent concept of Java 5 |
| (<a href="http://java.sun.com/developer/technicalArticles/releases/j2se15/index.html">JPLIS</a>). |
| (<i>The original implementation using the JMangler framework is no longer maintained</i>).<br/> |
| </li> |
| </ul></dd> |
| </dl> |
| <p></p> |
| |
| <h2 id="otequinox">OT/Equinox</h2> |
| <p></p> |
| Starting with the OTDT version 0.9.9 (2006) it is possible to develop Eclipse plugins using |
| OT/J as the implementation language. |
| <ul> |
| <li>Using the plugin <code>org.eclipse.objectteams.otequinox</code>, a plugin ("aspect plugin") |
| may declare that it adapts classes from a specified other plugin ("base plugin").</li> |
| <li>By an integration of the Object Teams Runtime Environment with hooks in the |
| Equinox implementation a <code class="keyword">team</code> class from an <em>aspect plugin</em> |
| can trigger byte-code aspect weaving into its <em>base plugin</em> at load-time. |
| As a result an aspect plugin can indeed adapt the behaviour of another plugin. |
| These bindings are declared using the extension point <code>aspectBindings</code> from |
| the mentioned plugin <code>org.eclipse.objectteams.otequinox</code>.</li> |
| <li>The initial client of the OT/Equinox technology is a tiny plugin which extends Eclipse's |
| "about plugins" dialog by additionally displaying which plugins are being adapted by |
| which aspect plugins. This information is found in the version column of the mentioned dialog. |
| This way a user of the OTDT can always check whether a given plugin performs as shipped, |
| or whether it has been adapted by another plugin.</li> |
| <li>The OTDT uses the capabilities of OT/Equinox for its own implementation. |
| The technology is mainly used for making the JDT-UI aware of Object Teams without having |
| to copy source code or modifying source code of the JDT-UI in place.</li> |
| <li>A new project nature <img class="inline" alt="" src="images/otdt/newpprj_wiz.gif"/> |
| <code>Object Teams Plugin Project</code> is provided, supporting the |
| development of plugins written in OT/J.</li> |
| <li>Support for OT/Equinox is added to the run/debug dialogs for all Equinox related launches.</li> |
| <li>If desired the load-time weaver can be disabled by adding the following |
| line to the file <code>eclipse.ini</code> after a <code>-vmargs</code> line: |
| <div class="ttindent">-Dot.equinox=false</div>.</li> |
| </ul> |
| <p></p> |
| |
| <h2 id="debugging">Debugging</h2> |
| <p></p> |
| The debugger has been enhanced to support debugging of OT/J programs at the |
| source code level. It is possible to set breakpoints and step through Object Teams code. |
| |
| <dl> |
| <dt><b>Stepping through Code</b></dt> |
| <dd>The following language features produce byte codes for which a standard Java debugger |
| is not able to display appropriate source locations: |
| <ul> |
| <li>Role files (<a href="http://www.objectteams.org/def/stable/s1.html#s1.2.5" target=_blank><img alt="" src="images/otdt/ot_paragraph.png"/> OTJLD § 1.2.5</a>)</li> |
| <li>Implicit inheritance (<a href="http://www.objectteams.org/def/stable/s1.html#s1.3.1" target=_blank><img alt="" src="images/otdt/ot_paragraph.png"/> OTJLD § 1.3.1</a>)</li> |
| <li>Callout bindings (<a href="http://www.objectteams.org/def/stable/s3.html" target=_blank><img alt="" src="images/otdt/ot_paragraph.png"/> OTJLD § 3</a>) |
| (including callout override (<a href="http://www.objectteams.org/def/stable/s3.html#s3.1.e" target=_blank><img alt="" src="images/otdt/ot_paragraph.png"/> OTJLD § 3.1(e)</a>))</li> |
| <li>Callin bindings (<a href="http://www.objectteams.org/def/stable/s4.html" target=_blank><img alt="" src="images/otdt/ot_paragraph.png"/> OTJLD § 4</a>)</li> |
| </ul> |
| The OTDT-Debugger re-maps the byte codes produced by all this constructs to the |
| appropriate source locations. |
| As a result stepping through these sections of a program completely hides |
| the internal translations from the user.<p></p> |
| The following features are not yet fully supported by the debugger: |
| <ul> |
| <li>Role constructors (see <a href="http://www.objectteams.org/def/stable/s2.html#s2.4" target=_blank><img alt="" src="images/otdt/ot_paragraph.png"/> OTJLD § 2.4</a>)</li> |
| <li>Parameters with declared lifting (<a href="http://www.objectteams.org/def/stable/s2.html#s2.3.2" target=_blank><img alt="" src="images/otdt/ot_paragraph.png"/> |
| OTJLD § 2.3.2</a> — code for lifting is not filtered out yet)</li> |
| </ul></dd> |
| <dt><b>Setting Breakpoints</b></dt> |
| <dd>Use double click on ruler or context menu <code>Toggle Breakpoint</code> to set |
| breakpoints in OT/J-Code. Setting breakpoint in role files is supported, too.</dd> |
| <dt id="team_monitor"><b>New View: "Team Monitor"</b></dt> |
| <dd>The team monitor (<img src="images/otdt/tm.gif" alt="" class="inline"/>) |
| view helps to debug issues related to team activation |
| (<a href="http://www.objectteams.org/def/stable/s5.html#s5" target=_blank><img alt="" src="images/otdt/ot_paragraph.png"/> OTJLD § 5</a>). |
| For this purpose it displays all known team instances and shows their activation status as one of |
| <ul> |
| <li>inactive <img src="images/otdt/team_inact.gif" alt="" class="inline"/>,</li> |
| <li>active <img src="images/otdt/team_act.gif" alt="" class="inline"/> |
| (either globally or for the thread selected in the debug view), or</li> |
| <li>implicitly active |
| <img src="images/otdt/team_act_implicit.gif" alt="" class="inline"/> |
| (temporarily active because the team or one of its roles is currently executing code). |
| </li></ul> |
| Also, a selected team can be (de)activated interactively via the context menu.</dd> |
| <dt id="variables_filter"><b>Filtering variables</b></dt> |
| <dd>The OT/J compiler and the loadtime weaver both add some internal variables to the code. |
| By default such internal variables are hidden within the Team Monitor as well |
| as in the standard variables view. Both views can be configured to also show these internal |
| variables if so desired.</dd> |
| <dt><b>Known Issues and Limitations</b></dt> |
| <dd><ul> |
| <li>Dynamic code evaluation is not supported yet, |
| make sure to clear the Expression view.</li> |
| </ul></dd> |
| </dl> |
| |
| <h2 id="help">Help and additional Information</h2> |
| <p></p> |
| The following sources for help and for further information are bundled with the release: |
| <ul> |
| <li>A Tutorial (available via the welcome page) guiding through the first steps of using the OTDT.</li> |
| <li>Example programs demonstrating key features of Object Teams (also via the welcome page).</li> |
| <li>A detailed <a href="http://help.eclipse.org/topic/org.eclipse.objectteams.otdt.doc/ot.html">guide</a> on using the OTDT via the Help Index, including a link to the |
| language definition (which is also bundled).</li> |
| <li>Problems that are listed in the problem view are linked (when possible) to a corresponding explanatory entry in the language definition. |
| (Context menu -> <img alt="" src="images/otdt/ot_paragraph.png"/><code> Go to Language Definition</code>).</li> |
| </ul> |
| </div> <!-- parent for absolute-positioned contentbox --> |
| </div> <!-- witecolumn --> |
| |
| EOHTML; |
| # Generate the web page |
| $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html); |
| ?> |