<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.jdt.debug">
<annotation>
      <appInfo>
         <meta.schema plugin="org.eclipse.jdt.debug" id="javaLogicalStructures" name="Java Logical Structures"/>
      </appInfo>
      <documentation>
         This extension point allows developers to define a logical structure for Java objects of a specified type. The logical value is created by evaluating the provided code snippet.
      </documentation>
   </annotation>

   <element name="extension">
      <complexType>
         <sequence>
            <element ref="javaLogicalStructure" minOccurs="1" maxOccurs="unbounded"/>
         </sequence>
         <attribute name="point" type="string" use="required">
            <annotation>
               <documentation>
                  a fully qualified identifier of the target extension point
               </documentation>
            </annotation>
         </attribute>
         <attribute name="id" type="string">
            <annotation>
               <documentation>
                  an optional identifier of the extension instance
               </documentation>
            </annotation>
         </attribute>
         <attribute name="name" type="string">
            <annotation>
               <documentation>
                  an optional name of the extension instance
               </documentation>
            </annotation>
         </attribute>
      </complexType>
   </element>

   <element name="javaLogicalStructure">
      <complexType>
         <sequence minOccurs="0" maxOccurs="1">
            <element ref="variable" minOccurs="1" maxOccurs="unbounded"/>
         </sequence>
         <attribute name="type" type="string" use="required">
            <annotation>
               <documentation>
                  Fully qualified name of the type.
               </documentation>
            </annotation>
         </attribute>
         <attribute name="subtypes" type="boolean" use="default" value="true">
            <annotation>
               <documentation>
                  specify if this Java logical structure should be used also for the objects of a subtype of the specified type, or only for the objects of the specified type. This attribute is optional, the default value is &lt;code&gt;true&lt;/code&gt;.
               </documentation>
            </annotation>
         </attribute>
         <attribute name="value" type="string">
            <annotation>
               <documentation>
                  The code snippet to evaluate to create the logical value. This attribute is optional, if unspecified, the extension must declare one or more variables.
               </documentation>
            </annotation>
         </attribute>
         <attribute name="description" type="string" use="required">
            <annotation>
               <documentation>
                  a description of this logical structure.
               </documentation>
               <appInfo>
                  <meta.attribute translatable="true"/>
               </appInfo>
            </annotation>
         </attribute>
      </complexType>
   </element>

   <element name="variable">
      <annotation>
         <documentation>
            One variable of the logical value for the object of this type.
         </documentation>
      </annotation>
      <complexType>
         <attribute name="name" type="string" use="required">
            <annotation>
               <documentation>
                  The name of the variable which will be created
               </documentation>
            </annotation>
         </attribute>
         <attribute name="value" type="string" use="required">
            <annotation>
               <documentation>
                  The code snippet which will be evaluated as the value of the variable
               </documentation>
            </annotation>
         </attribute>
      </complexType>
   </element>

   <annotation>
      <appInfo>
         <meta.section type="since"/>
      </appInfo>
      <documentation>
         3.1
      </documentation>
   </annotation>

   <annotation>
      <appInfo>
         <meta.section type="examples"/>
      </appInfo>
      <documentation>
         Following is an example of a Java logical structure extension point with two structures:

&lt;p&gt;
&lt;pre&gt;
&lt;extension point=&quot;org.eclipse.jdt.debug.javaLogicalStructures&quot;&gt;
  &lt;javaLogitalStructure
      subtypes=&quot;true&quot;
      value=&quot;return entrySet().toArray();&quot;
      type=&quot;java.util.Map&quot;/&gt;
  &lt;javaLogitalStructure
      subtypes=&quot;true&quot;
      type=&quot;java.util.Map$Entry&quot;&gt;
    &lt;variable
      value=&quot;return getKey();&quot;
      name=&quot;key&quot;/&gt;
    &lt;variable
      value=&quot;return getValue();&quot;
      name=&quot;value&quot;/&gt;
  &lt;/javaLogitalStructure&gt;
&lt;/extension&gt;
&lt;/pre&gt;
&lt;/p&gt;

In the example above a Map is translated into its entries and a Map$Entry is translated into its key and value.
      </documentation>
   </annotation>

   <annotation>
      <appInfo>
         <meta.section type="apiInfo"/>
      </appInfo>
      <documentation>
         [Enter API information here.]
      </documentation>
   </annotation>

   <annotation>
      <appInfo>
         <meta.section type="implementation"/>
      </appInfo>
      <documentation>
         [Enter information about supplied implementation of this extension point.]
      </documentation>
   </annotation>

   <annotation>
      <appInfo>
         <meta.section type="copyright"/>
      </appInfo>
      <documentation>
         Copyright (c) 2004, 2005 IBM Corporation and others.&lt;br&gt;
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 
&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
      </documentation>
   </annotation>

</schema>
