You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by fe...@apache.org on 2007/11/05 18:01:46 UTC

svn commit: r592087 [7/16] - in /directory/sandbox/felixk/studio-ldapbrowser-ui: ./ META-INF/ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/directory/ src/main/java/org/apache/directory/studio/ src/...

Added: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionDetailsPage.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionDetailsPage.java?rev=592087&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionDetailsPage.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionDetailsPage.java Mon Nov  5 09:01:21 2007
@@ -0,0 +1,325 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.ui.editors.schemabrowser;
+
+
+import org.apache.directory.studio.ldapbrowser.core.model.schema.AttributeTypeDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.LdapSyntaxDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.MatchingRuleDescription;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+
+/**
+ * The MatchingRuleDescriptionDetailsPage displays the details of an
+ * matching rule description.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class MatchingRuleDescriptionDetailsPage extends SchemaDetailsPage
+{
+
+    /** The main section, contains oid, names and desc */
+    private Section mainSection;
+
+    /** The numeric oid field */
+    private Text numericOidText;
+
+    /** The names field */
+    private Text namesText;
+
+    /** The description field */
+    private Text descText;
+
+    /** The flag section, contains obsolete */
+    private Section flagSection;
+
+    /** The obsolete field */
+    private Label isObsoleteText;
+
+    /** The syntax section, contains syntax description and a link to the syntax */
+    private Section syntaxSection;
+
+    /** The syntax description field */
+    private Text syntaxDescText;
+
+    /** The link to the syntax */
+    private Hyperlink syntaxLink;
+
+    /** The used from section, contains links to attribute types */
+    private Section usedFromSection;
+
+    /** The links to attribute types using the matching rule */
+    private Hyperlink[] usedFromLinks;
+
+
+    /**
+     * Creates a new instance of MatchingRuleDescriptionDetailsPage.
+     *
+     * @param schemaPage the master schema page
+     * @param toolkit the toolkit used to create controls
+     */
+    public MatchingRuleDescriptionDetailsPage( SchemaPage scheamPage, FormToolkit toolkit )
+    {
+        super( scheamPage, toolkit );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void createContents( final ScrolledForm detailForm )
+    {
+        this.detailForm = detailForm;
+        detailForm.getBody().setLayout( new GridLayout() );
+
+        // create main section
+        mainSection = toolkit.createSection( detailForm.getBody(), SWT.NONE );
+        mainSection.setText( "Details" );
+        mainSection.marginWidth = 0;
+        mainSection.marginHeight = 0;
+        mainSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( mainSection );
+
+        // create flag section
+        flagSection = toolkit.createSection( detailForm.getBody(), SWT.NONE );
+        flagSection.setText( "Flags" );
+        flagSection.marginWidth = 0;
+        flagSection.marginHeight = 0;
+        flagSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( flagSection );
+
+        // create flag content
+        Composite flagClient = toolkit.createComposite( flagSection, SWT.WRAP );
+        GridLayout flagLayout = new GridLayout();
+        flagLayout.numColumns = 1;
+        flagLayout.marginWidth = 0;
+        flagLayout.marginHeight = 0;
+        flagClient.setLayout( flagLayout );
+        flagSection.setClient( flagClient );
+
+        isObsoleteText = toolkit.createLabel( flagClient, "Obsolete", SWT.CHECK );
+        isObsoleteText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        isObsoleteText.setEnabled( false );
+
+        // create syntax section
+        syntaxSection = toolkit.createSection( detailForm.getBody(), SWT.NONE );
+        syntaxSection.setText( "Syntax" );
+        syntaxSection.marginWidth = 0;
+        syntaxSection.marginHeight = 0;
+        syntaxSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( syntaxSection );
+
+        // create syntax content
+        Composite syntaxClient = toolkit.createComposite( syntaxSection, SWT.WRAP );
+        GridLayout syntaxLayout = new GridLayout();
+        syntaxLayout.numColumns = 2;
+        syntaxLayout.marginWidth = 0;
+        syntaxLayout.marginHeight = 0;
+        syntaxClient.setLayout( syntaxLayout );
+        syntaxSection.setClient( syntaxClient );
+
+        toolkit.createLabel( syntaxClient, "Syntax OID:", SWT.NONE );
+        syntaxLink = toolkit.createHyperlink( syntaxClient, "", SWT.WRAP );
+        syntaxLink.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        syntaxLink.addHyperlinkListener( this );
+
+        toolkit.createLabel( syntaxClient, "Syntax Description:", SWT.NONE );
+        syntaxDescText = toolkit.createText( syntaxClient, "", SWT.NONE );
+        syntaxDescText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        syntaxDescText.setEditable( false );
+
+        // create used from section
+        usedFromSection = toolkit.createSection( detailForm.getBody(), Section.TWISTIE );
+        usedFromSection.setText( "Used from" );
+        usedFromSection.marginWidth = 0;
+        usedFromSection.marginHeight = 0;
+        usedFromSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( usedFromSection );
+        usedFromSection.addExpansionListener( new ExpansionAdapter()
+        {
+            public void expansionStateChanged( ExpansionEvent e )
+            {
+                detailForm.reflow( true );
+            }
+        } );
+
+        // create raw section
+        createRawSection();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setInput( Object input )
+    {
+        MatchingRuleDescription mrd = null;
+        if ( input instanceof MatchingRuleDescription )
+        {
+            mrd = ( MatchingRuleDescription ) input;
+        }
+
+        // create main content
+        createMainContent( mrd );
+
+        // set flag
+        isObsoleteText.setEnabled( mrd != null && mrd.isObsolete() );
+
+        // set syntax content
+        String lsdOid = null;
+        LdapSyntaxDescription lsd = null;
+        if ( mrd != null )
+        {
+            lsdOid = mrd.getSyntaxDescriptionNumericOID();
+            if ( lsdOid != null && mrd.getSchema().hasLdapSyntaxDescription( lsdOid ) )
+            {
+                lsd = mrd.getSchema().getLdapSyntaxDescription( lsdOid );
+            }
+        }
+        syntaxLink.setText( getNonNullString( lsd != null ? lsd.getNumericOID() : lsdOid ) );
+        syntaxLink.setHref( lsd );
+        syntaxLink.setUnderlined( lsd != null );
+        syntaxLink.setEnabled( lsd != null );
+        syntaxDescText.setText( getNonNullString( lsd != null ? lsd.getDesc() : null ) );
+        syntaxSection.layout();
+
+        // create contents of dynamic sections
+        createUsedFromContents( mrd );
+        createRawContents( mrd );
+
+        detailForm.reflow( true );
+    }
+
+
+    /**
+     * Creates the content of the main section. It is newly created
+     * on every input change to ensure a proper layout of 
+     * multilined descriptions. 
+     *
+     * @param mrd the matching rule description
+     */
+    private void createMainContent( MatchingRuleDescription mrd )
+    {
+        // dispose old content
+        if ( mainSection.getClient() != null )
+        {
+            mainSection.getClient().dispose();
+        }
+
+        // create new client
+        Composite mainClient = toolkit.createComposite( mainSection, SWT.WRAP );
+        GridLayout mainLayout = new GridLayout( 2, false );
+        mainClient.setLayout( mainLayout );
+        mainSection.setClient( mainClient );
+
+        // create new content
+        if ( mrd != null )
+        {
+            toolkit.createLabel( mainClient, "Numeric OID:", SWT.NONE );
+            numericOidText = toolkit.createText( mainClient, getNonNullString( mrd.getNumericOID() ), SWT.NONE );
+            numericOidText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+            numericOidText.setEditable( false );
+
+            toolkit.createLabel( mainClient, "Matching rule names:", SWT.NONE );
+            namesText = toolkit.createText( mainClient, getNonNullString( mrd.toString() ), SWT.NONE );
+            namesText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+            namesText.setEditable( false );
+
+            toolkit.createLabel( mainClient, "Descripton:", SWT.NONE );
+            descText = toolkit.createText( mainClient, getNonNullString( mrd.getDesc() ), SWT.WRAP | SWT.MULTI );
+            GridData gd = new GridData( GridData.FILL_HORIZONTAL );
+            gd.widthHint = detailForm.getForm().getSize().x - 100 - 60;
+            descText.setLayoutData( gd );
+            descText.setEditable( false );
+        }
+
+        mainSection.layout();
+    }
+
+
+    /**
+     * Creates the content of the used from section. 
+     * It is newly created on every input change because the content
+     * of this section is dynamic.
+     *
+     * @param mrd the matching rule description
+     */
+    private void createUsedFromContents( MatchingRuleDescription mrd )
+    {
+        // dispose old content
+        if ( usedFromSection.getClient() != null )
+        {
+            usedFromSection.getClient().dispose();
+        }
+
+        // create new client
+        Composite usedFromClient = toolkit.createComposite( usedFromSection, SWT.WRAP );
+        usedFromClient.setLayout( new GridLayout() );
+        usedFromSection.setClient( usedFromClient );
+
+        // create new content
+        if ( mrd != null )
+        {
+            AttributeTypeDescription[] usedFromATDs = mrd.getUsedFromAttributeTypeDescriptions();
+            if ( usedFromATDs != null && usedFromATDs.length > 0 )
+            {
+                usedFromSection.setText( "Used from (" + usedFromATDs.length + ")" );
+                usedFromLinks = new Hyperlink[usedFromATDs.length];
+                for ( int i = 0; i < usedFromATDs.length; i++ )
+                {
+                    usedFromLinks[i] = toolkit.createHyperlink( usedFromClient, usedFromATDs[i].toString(), SWT.WRAP );
+                    usedFromLinks[i].setHref( usedFromATDs[i] );
+                    usedFromLinks[i].setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                    usedFromLinks[i].setUnderlined( true );
+                    usedFromLinks[i].setEnabled( true );
+                    usedFromLinks[i].addHyperlinkListener( this );
+                }
+            }
+            else
+            {
+                usedFromSection.setText( "Used from (0)" );
+                usedFromLinks = new Hyperlink[0];
+                Text usedFromText = toolkit.createText( usedFromClient, getNonNullString( null ), SWT.NONE );
+                usedFromText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                usedFromText.setEditable( false );
+            }
+        }
+        else
+        {
+            usedFromSection.setText( "Used from" );
+        }
+
+        usedFromSection.layout();
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionDetailsPage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionPage.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionPage.java?rev=592087&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionPage.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionPage.java Mon Nov  5 09:01:21 2007
@@ -0,0 +1,235 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.ui.editors.schemabrowser;
+
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.directory.studio.ldapbrowser.core.model.schema.MatchingRuleDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.graphics.Image;
+
+
+/**
+ * The MatchingRuleDescriptionPage displays a list with all
+ * matching rule descriptions and hosts the detail page.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class MatchingRuleDescriptionPage extends SchemaPage
+{
+
+    /**
+     * Creates a new instance of MatchingRuleDescriptionPage.
+     *
+     * @param schemaBrowser the schema browser
+     */
+    public MatchingRuleDescriptionPage( SchemaBrowser schemaBrowser )
+    {
+        super( schemaBrowser );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected String getTitle()
+    {
+        return "Matching Rules";
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected String getFilterDescription()
+    {
+        return "Please select a matching rule. Enter a filter to restrict the list.";
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected IStructuredContentProvider getContentProvider()
+    {
+        return new MRDContentProvider();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected ITableLabelProvider getLabelProvider()
+    {
+        return new MRDLabelProvider();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected ViewerSorter getSorter()
+    {
+        return new MRDViewerSorter();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected ViewerFilter getFilter()
+    {
+        return new MRDViewerFilter();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected SchemaDetailsPage getDetailsPage()
+    {
+        return new MatchingRuleDescriptionDetailsPage( this, this.toolkit );
+    }
+
+    /**
+     * The content provider used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    private class MRDContentProvider implements IStructuredContentProvider
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public Object[] getElements( Object inputElement )
+        {
+            if ( inputElement instanceof Schema )
+            {
+                Schema schema = ( Schema ) inputElement;
+                if ( schema != null && schema.getMrdMapByName() != null )
+                {
+                    Set<Object> set = new HashSet<Object>( schema.getMrdMapByName().values() );
+                    return set.toArray();
+                }
+            }
+            return new Object[0];
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        public void dispose()
+        {
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        public void inputChanged( Viewer viewer, Object oldInput, Object newInput )
+        {
+        }
+    }
+
+    /**
+     * The label provider used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    private class MRDLabelProvider extends LabelProvider implements ITableLabelProvider
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public String getColumnText( Object obj, int index )
+        {
+            return obj.toString();
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        public Image getColumnImage( Object obj, int index )
+        {
+            return null;
+        }
+    }
+
+    /**
+     * The sorter used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    private class MRDViewerSorter extends ViewerSorter
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public int compare( Viewer viewer, Object e1, Object e2 )
+        {
+            return e1.toString().compareTo( e2.toString() );
+        }
+    }
+
+    /**
+     * The filter used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    private class MRDViewerFilter extends ViewerFilter
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public boolean select( Viewer viewer, Object parentElement, Object element )
+        {
+            if ( element instanceof MatchingRuleDescription )
+            {
+                MatchingRuleDescription mrd = ( MatchingRuleDescription ) element;
+                boolean matched = false;
+
+                if ( !matched )
+                    matched = mrd.toString().toLowerCase().indexOf( filterText.getText().toLowerCase() ) != -1;
+                if ( !matched )
+                    matched = mrd.getNumericOID().toLowerCase().indexOf( filterText.getText().toLowerCase() ) != -1;
+
+                return matched;
+            }
+            return false;
+        }
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleDescriptionPage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionDetailsPage.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionDetailsPage.java?rev=592087&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionDetailsPage.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionDetailsPage.java Mon Nov  5 09:01:21 2007
@@ -0,0 +1,283 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.ui.editors.schemabrowser;
+
+
+import org.apache.directory.studio.ldapbrowser.core.model.schema.AttributeTypeDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.MatchingRuleDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.MatchingRuleUseDescription;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+
+public class MatchingRuleUseDescriptionDetailsPage extends SchemaDetailsPage
+{
+
+    /** The main section, contains oid, names and desc */
+    private Section mainSection;
+
+    /** The numeric oid field */
+    private Text numericOidText;
+    
+    /** The name link */
+    private Hyperlink nameLink;
+    
+    /** The description field */
+    private Text descText;
+
+    /** The flag section, contains obsolete */
+    private Section flagSection;
+
+    /** The obsolete field */
+    private Label isObsoleteText;
+
+    /** The applies section, contains links */
+    private Section appliesSection;
+
+    /** The links to attribute types the matching rule is applicaple to */
+    private Hyperlink[] appliesLinks;
+
+
+    /**
+     * Creates a new instance of MatchingRuleUseDescriptionDetailsPage.
+     *
+     * @param schemaPage the master schema page
+     * @param toolkit the toolkit used to create controls
+     */
+    public MatchingRuleUseDescriptionDetailsPage( SchemaPage schemaPage, FormToolkit toolkit )
+    {
+        super( schemaPage, toolkit );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void createContents( final ScrolledForm detailForm )
+    {
+
+        this.detailForm = detailForm;
+        detailForm.getBody().setLayout( new GridLayout() );
+
+        // create main section
+        mainSection = toolkit.createSection( detailForm.getBody(), SWT.NONE );
+        mainSection.setText( "Details" );
+        mainSection.marginWidth = 0;
+        mainSection.marginHeight = 0;
+        mainSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( mainSection );
+
+        // create flag section
+        flagSection = toolkit.createSection( detailForm.getBody(), SWT.NONE );
+        flagSection.setText( "Flags" );
+        flagSection.marginWidth = 0;
+        flagSection.marginHeight = 0;
+        flagSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( flagSection );
+
+        // create flag content
+        Composite flagClient = toolkit.createComposite( flagSection, SWT.WRAP );
+        GridLayout flagLayout = new GridLayout();
+        flagLayout.numColumns = 1;
+        flagLayout.marginWidth = 0;
+        flagLayout.marginHeight = 0;
+        flagClient.setLayout( flagLayout );
+        flagSection.setClient( flagClient );
+
+        isObsoleteText = toolkit.createLabel( flagClient, "Obsolete", SWT.CHECK );
+        isObsoleteText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        isObsoleteText.setEnabled( false );
+
+        // create applies section
+        appliesSection = toolkit.createSection( detailForm.getBody(), Section.TWISTIE );
+        appliesSection.setText( "Applies" );
+        appliesSection.marginWidth = 0;
+        appliesSection.marginHeight = 0;
+        appliesSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( appliesSection );
+        appliesSection.addExpansionListener( new ExpansionAdapter()
+        {
+            public void expansionStateChanged( ExpansionEvent e )
+            {
+                detailForm.reflow( true );
+            }
+        } );
+
+        // create raw section
+        super.createRawSection();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setInput( Object input )
+    {
+        MatchingRuleUseDescription mrud = null;
+        if ( input instanceof MatchingRuleUseDescription )
+        {
+            mrud = ( MatchingRuleUseDescription ) input;
+        }
+
+        // create main content
+        this.createMainContent( mrud );
+        
+        // set flag
+        isObsoleteText.setEnabled( mrud != null && mrud.isObsolete() );
+        
+        // create contents of dynamic sections
+        this.createAppliesContents( mrud );
+        super.createRawContents( mrud );
+
+        this.detailForm.reflow( true );
+    }
+
+
+    /**
+     * Creates the content of the main section. It is newly created
+     * on every input change to ensure a proper layout of 
+     * multilined descriptions. 
+     *
+     * @param mrud the matching rule use description
+     */
+    private void createMainContent( MatchingRuleUseDescription mrud )
+    {
+        // dispose old content
+        if ( mainSection.getClient() != null )
+        {
+            mainSection.getClient().dispose();
+        }
+
+        // create new client
+        Composite mainClient = toolkit.createComposite( mainSection, SWT.WRAP );
+        GridLayout mainLayout = new GridLayout( 2, false );
+        mainClient.setLayout( mainLayout );
+        mainSection.setClient( mainClient );
+
+        // create new content
+        if ( mrud != null )
+        {
+            toolkit.createLabel( mainClient, "Numeric OID:", SWT.NONE );
+            numericOidText = toolkit.createText( mainClient, getNonNullString( mrud.getNumericOID() ), SWT.NONE );
+            numericOidText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+            numericOidText.setEditable( false );
+
+            toolkit.createLabel( mainClient, "Matching rule names:", SWT.NONE );
+            nameLink = toolkit.createHyperlink( mainClient, "", SWT.WRAP );
+            nameLink.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+            nameLink.addHyperlinkListener( this );
+
+            MatchingRuleDescription mrd = mrud.getSchema().hasMatchingRuleDescription( mrud.getNumericOID() ) ? mrud
+                .getSchema().getMatchingRuleDescription( mrud.getNumericOID() ) : null;
+            nameLink.setText( getNonNullString( mrd != null ? mrd.toString() : mrud.toString() ) );
+            nameLink.setHref( mrd );
+            nameLink.setUnderlined( mrd != null );
+            nameLink.setEnabled( mrd != null );
+
+            toolkit.createLabel( mainClient, "Descripton:", SWT.NONE );
+            descText = toolkit.createText( mainClient, getNonNullString( mrud.getDesc() ), SWT.WRAP | SWT.MULTI );
+            GridData gd = new GridData( GridData.FILL_HORIZONTAL );
+            gd.widthHint = detailForm.getForm().getSize().x - 100 - 60;
+            descText.setLayoutData( gd );
+            descText.setEditable( false );
+        }
+
+        mainSection.layout();
+    }
+
+
+    /**
+     * Creates the content of the applies section. 
+     * It is newly created on every input change because the content
+     * of this section is dynamic.
+     *
+     * @param mrud the matching rule use description
+     */
+    private void createAppliesContents( MatchingRuleUseDescription mrud )
+    {
+        // dispose old content
+        if ( appliesSection.getClient() != null )
+        {
+            appliesSection.getClient().dispose();
+        }
+
+        // create new client
+        Composite appliesClient = toolkit.createComposite( appliesSection, SWT.WRAP );
+        appliesClient.setLayout( new GridLayout() );
+        appliesSection.setClient( appliesClient );
+
+        // create content
+        if ( mrud != null )
+        {
+            String[] names = mrud.getAppliesAttributeTypeDescriptionOIDs();
+            if ( names != null && names.length > 0 )
+            {
+                appliesSection.setText( "Applies (" + names.length + ")" );
+                appliesLinks = new Hyperlink[names.length];
+                for ( int i = 0; i < names.length; i++ )
+                {
+                    if ( mrud.getSchema().hasAttributeTypeDescription( names[i] ) )
+                    {
+                        AttributeTypeDescription appliesAtd = mrud.getSchema().getAttributeTypeDescription( names[i] );
+                        appliesLinks[i] = toolkit.createHyperlink( appliesClient, appliesAtd.toString(), SWT.WRAP );
+                        appliesLinks[i].setHref( appliesAtd );
+                        appliesLinks[i].setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                        appliesLinks[i].setUnderlined( true );
+                        appliesLinks[i].setEnabled( true );
+                        appliesLinks[i].addHyperlinkListener( this );
+                    }
+                    else
+                    {
+                        appliesLinks[i] = toolkit.createHyperlink( appliesClient, names[i], SWT.WRAP );
+                        appliesLinks[i].setHref( null );
+                        appliesLinks[i].setUnderlined( false );
+                        appliesLinks[i].setEnabled( false );
+                    }
+                }
+            }
+            else
+            {
+                appliesSection.setText( "Applies (0)" );
+                appliesLinks = new Hyperlink[0];
+                Text usedFromText = toolkit.createText( appliesClient, getNonNullString( null ), SWT.NONE );
+                usedFromText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                usedFromText.setEditable( false );
+            }
+        }
+        else
+        {
+            appliesSection.setText( "Applies" );
+        }
+
+        appliesSection.layout();
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionDetailsPage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionPage.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionPage.java?rev=592087&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionPage.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionPage.java Mon Nov  5 09:01:21 2007
@@ -0,0 +1,236 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.ui.editors.schemabrowser;
+
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.directory.studio.ldapbrowser.core.model.schema.MatchingRuleUseDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.graphics.Image;
+
+
+/**
+ * The MatchingRuleUseDescriptionPage displays a list with all
+ * matching rule use descriptions and hosts the detail page.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class MatchingRuleUseDescriptionPage extends SchemaPage
+{
+
+    /**
+     * 
+     * Creates a new instance of MatchingRuleUseDescriptionPage.
+     *
+     * @param schemaBrowser the schema browser
+     */
+    public MatchingRuleUseDescriptionPage( SchemaBrowser schemaBrowser )
+    {
+        super( schemaBrowser );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected String getTitle()
+    {
+        return "Matching Rule Use";
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected String getFilterDescription()
+    {
+        return "Please select a matching rule. Enter a filter to restrict the list.";
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected IStructuredContentProvider getContentProvider()
+    {
+        return new MRUDContentProvider();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected ITableLabelProvider getLabelProvider()
+    {
+        return new MRUDLabelProvider();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected ViewerSorter getSorter()
+    {
+        return new MRUDViewerSorter();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected ViewerFilter getFilter()
+    {
+        return new MRUDViewerFilter();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected SchemaDetailsPage getDetailsPage()
+    {
+        return new MatchingRuleUseDescriptionDetailsPage( this, this.toolkit );
+    }
+
+    /**
+     * The content provider used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    class MRUDContentProvider implements IStructuredContentProvider
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public Object[] getElements( Object inputElement )
+        {
+            if ( inputElement instanceof Schema )
+            {
+                Schema schema = ( Schema ) inputElement;
+                if ( schema != null && schema.getMrudMapByName() != null )
+                {
+                    Set<Object> set = new HashSet<Object>( schema.getMrudMapByName().values() );
+                    return set.toArray();
+                }
+            }
+            return new Object[0];
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        public void dispose()
+        {
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        public void inputChanged( Viewer viewer, Object oldInput, Object newInput )
+        {
+        }
+    }
+
+    /**
+     * The label provider used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    class MRUDLabelProvider extends LabelProvider implements ITableLabelProvider
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public String getColumnText( Object obj, int index )
+        {
+            return obj.toString();
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        public Image getColumnImage( Object obj, int index )
+        {
+            return null;
+        }
+    }
+
+    /**
+     * The sorter used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    class MRUDViewerSorter extends ViewerSorter
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public int compare( Viewer viewer, Object e1, Object e2 )
+        {
+            return e1.toString().compareTo( e2.toString() );
+        }
+    }
+
+    /**
+     * The filter used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    class MRUDViewerFilter extends ViewerFilter
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public boolean select( Viewer viewer, Object parentElement, Object element )
+        {
+            if ( element instanceof MatchingRuleUseDescription )
+            {
+                MatchingRuleUseDescription mrud = ( MatchingRuleUseDescription ) element;
+                boolean matched = false;
+
+                if ( !matched )
+                    matched = mrud.toString().toLowerCase().indexOf( filterText.getText().toLowerCase() ) != -1;
+                if ( !matched )
+                    matched = mrud.getNumericOID().toLowerCase().indexOf( filterText.getText().toLowerCase() ) != -1;
+
+                return matched;
+            }
+            return false;
+        }
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/MatchingRuleUseDescriptionPage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionDetailsPage.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionDetailsPage.java?rev=592087&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionDetailsPage.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionDetailsPage.java Mon Nov  5 09:01:21 2007
@@ -0,0 +1,535 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.ui.editors.schemabrowser;
+
+
+import org.apache.directory.studio.ldapbrowser.core.model.schema.AttributeTypeDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.ObjectClassDescription;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+
+/**
+ * The ObjectClassDescriptionDetailsPage displays the details of an
+ * object class description.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class ObjectClassDescriptionDetailsPage extends SchemaDetailsPage
+{
+
+    /** The main section, contains oid, names, desc and kind */
+    private Section mainSection;
+
+    /** The numeric oid field */
+    private Text numericOidText;
+
+    /** The names field */
+    private Text namesText;
+
+    /** The description field */
+    private Text descText;
+
+    /** The kind field */
+    private Text kindText;
+
+    /** The section with links to superior object classes */
+    private Section superclassesSection;
+
+    /** The links to superior object classes */
+    private Hyperlink[] superLinks;
+
+    /** The section with links to derived object classes */
+    private Section subclassesSection;
+
+    /** The links to derived object classes */
+    private Hyperlink[] subLinks;
+
+    /** The section with links to must attribute types */
+    private Section mustSection;
+
+    /** The links to must attribute types */
+    private Hyperlink[] mustLinks;
+
+    /** The section with links to may attribute types */
+    private Section maySection;
+
+    /** The links to may attribute types */
+    private Hyperlink[] mayLinks;
+
+
+    /**
+     * Creates a new instance of ObjectClassDescriptionDetailsPage.
+     *
+     * @param schemaPage the master schema page
+     * @param toolkit the toolkit used to create controls
+     */
+    public ObjectClassDescriptionDetailsPage( SchemaPage schemaPage, FormToolkit toolkit )
+    {
+        super( schemaPage, toolkit );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void createContents( final ScrolledForm detailForm )
+    {
+        this.detailForm = detailForm;
+        detailForm.getBody().setLayout( new GridLayout() );
+
+        // create main section
+        mainSection = toolkit.createSection( detailForm.getBody(), SWT.NONE );
+        mainSection.setText( "Details" );
+        mainSection.marginWidth = 0;
+        mainSection.marginHeight = 0;
+        mainSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( mainSection );
+
+        // create must section
+        mustSection = toolkit.createSection( detailForm.getBody(), Section.TWISTIE );
+        mustSection.setText( "MUST Attributes" );
+        mustSection.marginWidth = 0;
+        mustSection.marginHeight = 0;
+        mustSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( mustSection );
+        mustSection.addExpansionListener( new ExpansionAdapter()
+        {
+            public void expansionStateChanged( ExpansionEvent e )
+            {
+                detailForm.reflow( true );
+            }
+        } );
+
+        // create may section
+        maySection = toolkit.createSection( detailForm.getBody(), Section.TWISTIE );
+        maySection.setText( "MAY Attributes" );
+        maySection.marginWidth = 0;
+        maySection.marginHeight = 0;
+        maySection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( maySection );
+        maySection.addExpansionListener( new ExpansionAdapter()
+        {
+            public void expansionStateChanged( ExpansionEvent e )
+            {
+                detailForm.reflow( true );
+            }
+        } );
+
+        // create superior section
+        superclassesSection = toolkit.createSection( detailForm.getBody(), Section.TWISTIE );
+        superclassesSection.setText( "Superclasses" );
+        superclassesSection.marginWidth = 0;
+        superclassesSection.marginHeight = 0;
+        superclassesSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( superclassesSection );
+        superclassesSection.addExpansionListener( new ExpansionAdapter()
+        {
+            public void expansionStateChanged( ExpansionEvent e )
+            {
+                detailForm.reflow( true );
+            }
+        } );
+
+        // create subclasses section
+        subclassesSection = toolkit.createSection( detailForm.getBody(), Section.TWISTIE );
+        subclassesSection.setText( "Subclasses" );
+        subclassesSection.marginWidth = 0;
+        subclassesSection.marginHeight = 0;
+        subclassesSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        toolkit.createCompositeSeparator( subclassesSection );
+        subclassesSection.addExpansionListener( new ExpansionAdapter()
+        {
+            public void expansionStateChanged( ExpansionEvent e )
+            {
+                detailForm.reflow( true );
+            }
+        } );
+
+        // create raw section
+        createRawSection();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setInput( Object input )
+    {
+        ObjectClassDescription ocd = null;
+        if ( input instanceof ObjectClassDescription )
+        {
+            ocd = ( ObjectClassDescription ) input;
+        }
+
+        // create main content
+        this.createMainContent( ocd );
+
+        // create contents of dynamic sections
+        this.createSuperclassContents( ocd );
+        this.createSubclassContents( ocd );
+        this.createMustContents( ocd );
+        this.createMayContents( ocd );
+        super.createRawContents( ocd );
+
+        this.detailForm.reflow( true );
+    }
+
+
+    /**
+     * Creates the content of the main section. It is newly created
+     * on every input change to ensure a proper layout of 
+     * multilined descriptions. 
+     *
+     * @param ocd the object class description
+     */
+    private void createMainContent( ObjectClassDescription ocd )
+    {
+        // dispose old content
+        if ( mainSection.getClient() != null )
+        {
+            mainSection.getClient().dispose();
+        }
+
+        // create new client
+        Composite mainClient = toolkit.createComposite( mainSection, SWT.WRAP );
+        GridLayout mainLayout = new GridLayout( 2, false );
+        mainClient.setLayout( mainLayout );
+        mainSection.setClient( mainClient );
+
+        // create new content
+        if ( ocd != null )
+        {
+            toolkit.createLabel( mainClient, "Numeric OID:", SWT.NONE );
+            numericOidText = toolkit.createText( mainClient, getNonNullString( ocd.getNumericOID() ), SWT.NONE );
+            numericOidText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+            numericOidText.setEditable( false );
+
+            toolkit.createLabel( mainClient, "Objectclass names:", SWT.NONE );
+            namesText = toolkit.createText( mainClient, getNonNullString( ocd.toString() ), SWT.NONE );
+            namesText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+            namesText.setEditable( false );
+
+            toolkit.createLabel( mainClient, "Descripton:", SWT.NONE );
+            descText = toolkit.createText( mainClient, getNonNullString( ocd.getDesc() ), SWT.WRAP | SWT.MULTI );
+            GridData gd = new GridData( GridData.FILL_HORIZONTAL );
+            gd.widthHint = detailForm.getForm().getSize().x - 100 - 60;
+            descText.setLayoutData( gd );
+            descText.setEditable( false );
+
+            String kind = "";
+            if ( ocd.isStructural() )
+            {
+                kind = "structural";
+            }
+            else if ( ocd.isAbstract() )
+            {
+                kind = "abstract";
+            }
+            else if ( ocd.isAuxiliary() )
+            {
+                kind = "auxiliary";
+            }
+            if ( ocd.isObsolete() )
+            {
+                kind += " (obsolete)";
+            }
+            toolkit.createLabel( mainClient, "Objectclass kind:", SWT.NONE );
+            kindText = toolkit.createText( mainClient, getNonNullString( kind ), SWT.NONE );
+            kindText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+            kindText.setEditable( false );
+        }
+
+        mainSection.layout();
+    }
+
+
+    /**
+     * Creates the content of the must section. 
+     * It is newly created on every input change because the content
+     * of this section is dynamic.
+     *
+     * @param ocd the object class description
+     */
+    private void createMustContents( ObjectClassDescription ocd )
+    {
+        // dispose old content
+        if ( mustSection.getClient() != null )
+        {
+            mustSection.getClient().dispose();
+        }
+
+        // create new client
+        Composite mustClient = toolkit.createComposite( mustSection, SWT.WRAP );
+        mustClient.setLayout( new GridLayout() );
+        mustSection.setClient( mustClient );
+
+        // create new content
+        if ( ocd != null )
+        {
+            String[] names = ocd.getMustAttributeTypeDescriptionNamesTransitive();
+            if ( names != null && names.length > 0 )
+            {
+                mustSection.setText( "MUST Attributes (" + names.length + ")" );
+                mustLinks = new Hyperlink[names.length];
+                for ( int i = 0; i < names.length; i++ )
+                {
+                    if ( ocd.getSchema().hasAttributeTypeDescription( names[i] ) )
+                    {
+                        AttributeTypeDescription mustAtd = ocd.getSchema().getAttributeTypeDescription( names[i] );
+                        mustLinks[i] = toolkit.createHyperlink( mustClient, mustAtd.toString(), SWT.WRAP );
+                        mustLinks[i].setHref( mustAtd );
+                        mustLinks[i].setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                        mustLinks[i].setUnderlined( true );
+                        mustLinks[i].setEnabled( true );
+                        mustLinks[i].addHyperlinkListener( this );
+                    }
+                    else
+                    {
+                        mustLinks[i] = toolkit.createHyperlink( mustClient, names[i], SWT.WRAP );
+                        mustLinks[i].setHref( null );
+                        mustLinks[i].setUnderlined( false );
+                        mustLinks[i].setEnabled( false );
+                    }
+                }
+            }
+            else
+            {
+                mustSection.setText( "MUST Attributes (0)" );
+                mustLinks = new Hyperlink[0];
+                Text mustText = toolkit.createText( mustClient, getNonNullString( null ), SWT.NONE );
+                mustText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                mustText.setEditable( false );
+            }
+        }
+        else
+        {
+            mustSection.setText( "MUST Attributes" );
+        }
+
+        mustSection.layout();
+    }
+
+
+    /**
+     * Creates the content of the may section. 
+     * It is newly created on every input change because the content
+     * of this section is dynamic.
+     *
+     * @param ocd the object class description
+     */
+    private void createMayContents( ObjectClassDescription ocd )
+    {
+        // dispose old content
+        if ( maySection.getClient() != null )
+        {
+            maySection.getClient().dispose();
+        }
+
+        // create new client
+        Composite mayClient = toolkit.createComposite( maySection, SWT.WRAP );
+        mayClient.setLayout( new GridLayout() );
+        maySection.setClient( mayClient );
+
+        // create new content
+        if ( ocd != null )
+        {
+            String[] names = ocd.getMayAttributeTypeDescriptionNamesTransitive();
+            if ( names != null && names.length > 0 )
+            {
+                maySection.setText( "MAY Attributes (" + names.length + ")" );
+                mayLinks = new Hyperlink[names.length];
+                for ( int i = 0; i < names.length; i++ )
+                {
+                    if ( ocd.getSchema().hasAttributeTypeDescription( names[i] ) )
+                    {
+                        AttributeTypeDescription mayAtd = ocd.getSchema().getAttributeTypeDescription( names[i] );
+                        mayLinks[i] = toolkit.createHyperlink( mayClient, mayAtd.toString(), SWT.WRAP );
+                        mayLinks[i].setHref( mayAtd );
+                        mayLinks[i].setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                        mayLinks[i].setUnderlined( true );
+                        mayLinks[i].setEnabled( true );
+                        mayLinks[i].addHyperlinkListener( this );
+                    }
+                    else
+                    {
+                        mayLinks[i] = toolkit.createHyperlink( mayClient, names[i], SWT.WRAP );
+                        mayLinks[i].setHref( null );
+                        mayLinks[i].setUnderlined( false );
+                        mayLinks[i].setEnabled( false );
+                    }
+                }
+            }
+            else
+            {
+                maySection.setText( "MAY Attributes (0)" );
+                mayLinks = new Hyperlink[0];
+                Text mayText = toolkit.createText( mayClient, getNonNullString( null ), SWT.NONE );
+                mayText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                mayText.setEditable( false );
+            }
+        }
+        else
+        {
+            maySection.setText( "MAY Attributes" );
+        }
+        maySection.layout();
+    }
+
+
+    /**
+     * Creates the content of the must section. 
+     * It is newly created on every input change because the content
+     * of this section is dynamic.
+     *
+     * @param ocd the object class description
+     */
+    private void createSubclassContents( ObjectClassDescription ocd )
+    {
+        // dispose old content
+        if ( subclassesSection.getClient() != null )
+        {
+            subclassesSection.getClient().dispose();
+        }
+
+        // create new client
+        Composite subClient = toolkit.createComposite( subclassesSection, SWT.WRAP );
+        subClient.setLayout( new GridLayout() );
+        subclassesSection.setClient( subClient );
+
+        // create new content
+        if ( ocd != null )
+        {
+            ObjectClassDescription[] subOCDs = ocd.getSubObjectClassDescriptions();
+            if ( subOCDs != null && subOCDs.length > 0 )
+            {
+                subclassesSection.setText( "Subclasses (" + subOCDs.length + ")" );
+                subLinks = new Hyperlink[subOCDs.length];
+                for ( int i = 0; i < subOCDs.length; i++ )
+                {
+                    subLinks[i] = toolkit.createHyperlink( subClient, subOCDs[i].toString(), SWT.WRAP );
+                    subLinks[i].setHref( subOCDs[i] );
+                    subLinks[i].setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                    subLinks[i].setUnderlined( true );
+                    subLinks[i].setEnabled( true );
+                    subLinks[i].addHyperlinkListener( this );
+                }
+            }
+            else
+            {
+                subclassesSection.setText( "Subclasses (0)" );
+                subLinks = new Hyperlink[0];
+                Text derivedText = toolkit.createText( subClient, getNonNullString( null ), SWT.NONE );
+                derivedText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                derivedText.setEditable( false );
+            }
+        }
+        else
+        {
+            subclassesSection.setText( "Subclasses" );
+        }
+
+        subclassesSection.layout();
+    }
+
+
+    /**
+     * Creates the content of the must section. 
+     * It is newly created on every input change because the content
+     * of this section is dynamic.
+     *
+     * @param ocd the object class description
+     */
+    private void createSuperclassContents( ObjectClassDescription ocd )
+    {
+        // dispose old content
+        if ( superclassesSection.getClient() != null )
+        {
+            superclassesSection.getClient().dispose();
+        }
+
+        // create new client
+        Composite superClient = toolkit.createComposite( superclassesSection, SWT.WRAP );
+        superClient.setLayout( new GridLayout() );
+        superclassesSection.setClient( superClient );
+
+        // craete new content
+        if ( ocd != null )
+        {
+            String[] names = ocd.getSuperiorObjectClassDescriptionNames();
+            if ( names != null && names.length > 0 )
+            {
+                superclassesSection.setText( "Superclasses (" + names.length + ")" );
+                Composite supClient = toolkit.createComposite( superClient, SWT.WRAP );
+                GridLayout gl = new GridLayout();
+                gl.marginWidth = 0;
+                gl.marginHeight = 0;
+                supClient.setLayout( gl );
+                superLinks = new Hyperlink[names.length];
+                for ( int i = 0; i < names.length; i++ )
+                {
+                    if ( ocd.getSchema().hasObjectClassDescription( names[i] ) )
+                    {
+                        ObjectClassDescription supOcd = ocd.getSchema().getObjectClassDescription( names[i] );
+                        superLinks[i] = toolkit.createHyperlink( supClient, supOcd.toString(), SWT.WRAP );
+                        superLinks[i].setHref( supOcd );
+                        superLinks[i].setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                        superLinks[i].setUnderlined( true );
+                        superLinks[i].setEnabled( true );
+                        superLinks[i].addHyperlinkListener( this );
+                    }
+                    else
+                    {
+                        superLinks[i] = toolkit.createHyperlink( supClient, names[i], SWT.WRAP );
+                        superLinks[i].setHref( null );
+                        superLinks[i].setUnderlined( false );
+                        superLinks[i].setEnabled( false );
+                    }
+                }
+            }
+            else
+            {
+                superclassesSection.setText( "Superclasses (0)" );
+                superLinks = new Hyperlink[0];
+                Text superText = toolkit.createText( superClient, getNonNullString( null ), SWT.NONE );
+                superText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+                superText.setEditable( false );
+            }
+        }
+        else
+        {
+            superclassesSection.setText( "Superclasses" );
+        }
+
+        superclassesSection.layout();
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionDetailsPage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionPage.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionPage.java?rev=592087&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionPage.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionPage.java Mon Nov  5 09:01:21 2007
@@ -0,0 +1,231 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.ui.editors.schemabrowser;
+
+
+import org.apache.directory.studio.ldapbrowser.core.model.schema.ObjectClassDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.graphics.Image;
+
+
+/**
+ * The ObjectClassDescriptionPage displays a list with all
+ * object class descriptions and hosts the detail page.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class ObjectClassDescriptionPage extends SchemaPage
+{
+
+    /**
+     * Creates a new instance of ObjectClassDescriptionPage.
+     *
+     * @param schemaBrowser the schema browser
+     */
+    public ObjectClassDescriptionPage( SchemaBrowser schemaBrowser )
+    {
+        super( schemaBrowser );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected String getTitle()
+    {
+        return "Object Classes";
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected String getFilterDescription()
+    {
+        return "Please select an object class. Enter a filter to restrict the list.";
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected IStructuredContentProvider getContentProvider()
+    {
+        return new OCDContentProvider();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected ITableLabelProvider getLabelProvider()
+    {
+        return new OCDLabelProvider();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected ViewerSorter getSorter()
+    {
+        return new OCDViewerSorter();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected ViewerFilter getFilter()
+    {
+        return new OCDViewerFilter();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected SchemaDetailsPage getDetailsPage()
+    {
+        return new ObjectClassDescriptionDetailsPage( this, this.toolkit );
+    }
+
+    /**
+     * The content provider used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    class OCDContentProvider implements IStructuredContentProvider
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public Object[] getElements( Object inputElement )
+        {
+            if ( inputElement instanceof Schema )
+            {
+                Schema schema = ( Schema ) inputElement;
+                if ( schema != null )
+                {
+                    return schema.getObjectClassDescriptions();
+                }
+            }
+            return new Object[0];
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        public void dispose()
+        {
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        public void inputChanged( Viewer viewer, Object oldInput, Object newInput )
+        {
+        }
+    }
+
+    /**
+     * The label provider used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    class OCDLabelProvider extends LabelProvider implements ITableLabelProvider
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public String getColumnText( Object obj, int index )
+        {
+            return obj.toString();
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        public Image getColumnImage( Object obj, int index )
+        {
+            return null;
+        }
+    }
+
+    /**
+     * The sorter used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    class OCDViewerSorter extends ViewerSorter
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public int compare( Viewer viewer, Object e1, Object e2 )
+        {
+            return e1.toString().compareTo( e2.toString() );
+        }
+    }
+
+    /**
+     * The filter used by the viewer.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     * @version $Rev$, $Date$
+     */
+    class OCDViewerFilter extends ViewerFilter
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public boolean select( Viewer viewer, Object parentElement, Object element )
+        {
+            if ( element instanceof ObjectClassDescription )
+            {
+                ObjectClassDescription ocd = ( ObjectClassDescription ) element;
+                boolean matched = false;
+
+                if ( !matched )
+                    matched = ocd.toString().toLowerCase().indexOf( filterText.getText().toLowerCase() ) != -1;
+                if ( !matched )
+                    matched = ocd.getNumericOID().toLowerCase().indexOf( filterText.getText().toLowerCase() ) != -1;
+
+                return matched;
+            }
+            return false;
+        }
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ObjectClassDescriptionPage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ReloadSchemaAction.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ReloadSchemaAction.java?rev=592087&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ReloadSchemaAction.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ReloadSchemaAction.java Mon Nov  5 09:01:21 2007
@@ -0,0 +1,91 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.ui.editors.schemabrowser;
+
+
+import org.apache.directory.studio.ldapbrowser.core.jobs.ReloadSchemasJob;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants;
+import org.apache.directory.studio.ldapbrowser.ui.BrowserUIPlugin;
+import org.eclipse.jface.action.Action;
+
+
+/**
+ * This action reloads the schema.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class ReloadSchemaAction extends Action
+{
+
+    /** The schema page */
+    private SchemaPage schemaPage;
+
+
+    /**
+     * Creates a new instance of ReloadSchemaAction.
+     *
+     * @param schemaPage the schema page
+     */
+    public ReloadSchemaAction( SchemaPage schemaPage )
+    {
+        super( "Reload Schema" );
+        super.setToolTipText( "Reload Schema" );
+        super.setImageDescriptor( BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_REFRESH ) );
+        super.setEnabled( true );
+
+        this.schemaPage = schemaPage;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void run()
+    {
+        final IBrowserConnection browserConnection = schemaPage.getConnection();
+        if ( browserConnection != null )
+        {
+            new ReloadSchemasJob( browserConnection ).execute();
+            schemaPage.getSchemaBrowser().refresh();
+        }
+    }
+
+
+    /**
+     * Disposes this action.
+     */
+    public void dispose()
+    {
+        schemaPage = null;
+    }
+
+
+    /**
+     * Updates the enabled state.
+     */
+    public void updateEnabledState()
+    {
+        setEnabled( schemaPage.getConnection() != null && !schemaPage.isShowDefaultSchema() );
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/ReloadSchemaAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/SchemaBrowser.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/SchemaBrowser.java?rev=592087&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/SchemaBrowser.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/SchemaBrowser.java Mon Nov  5 09:01:21 2007
@@ -0,0 +1,354 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.ui.editors.schemabrowser;
+
+
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.AttributeTypeDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.LdapSyntaxDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.MatchingRuleDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.MatchingRuleUseDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.ObjectClassDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.SchemaPart;
+import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants;
+import org.apache.directory.studio.ldapbrowser.ui.BrowserUIPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.INavigationLocation;
+import org.eclipse.ui.INavigationLocationProvider;
+import org.eclipse.ui.IReusableEditor;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.EditorPart;
+
+
+/**
+ * The schema browser editor part.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class SchemaBrowser extends EditorPart implements INavigationLocationProvider, IReusableEditor
+{
+
+    /** The tab folder with all the schema element tabs */
+    private CTabFolder tabFolder;
+
+    /** The object class tab */
+    private CTabItem ocdTab;
+
+    /** The object class page */
+    private ObjectClassDescriptionPage ocdPage;
+
+    /** The attribute type tab */
+    private CTabItem atdTab;
+
+    /** The attribute type page */
+    private AttributeTypeDescriptionPage atdPage;
+
+    /** The matching rule tab */
+    private CTabItem mrdTab;
+
+    /** The matching rule page */
+    private MatchingRuleDescriptionPage mrdPage;
+
+    /** The matching rule use tab */
+    private CTabItem mrudTab;
+
+    /** The matching rule use page */
+    private MatchingRuleUseDescriptionPage mrudPage;
+
+    /** The syntax tab */
+    private CTabItem lsdTab;
+
+    /** The syntax page */
+    private LdapSyntaxDescriptionPage lsdPage;
+
+
+    /**
+     * Gets the ID of the schema browser.
+     *
+     * @return the ID of the schema browser
+     */
+    public static String getId()
+    {
+        return SchemaBrowser.class.getName();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void init( IEditorSite site, IEditorInput input ) throws PartInitException
+    {
+        setSite( site );
+
+        // mark dummy location, necessary because the first marked
+        // location doesn't appear in history
+        setInput( new SchemaBrowserInput( null, null ) );
+        getSite().getPage().getNavigationHistory().markLocation( this );
+
+        // set real input
+        setInput( input );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void dispose()
+    {
+        ocdPage.dispose();
+        atdPage.dispose();
+        mrdPage.dispose();
+        mrudPage.dispose();
+        lsdPage.dispose();
+        tabFolder.dispose();
+        super.dispose();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void createPartControl( Composite parent )
+    {
+        tabFolder = new CTabFolder( parent, SWT.BOTTOM );
+
+        ocdTab = new CTabItem( tabFolder, SWT.NONE );
+        ocdTab.setText( "Object Classes" );
+        ocdTab.setImage( BrowserUIPlugin.getDefault().getImage( BrowserUIConstants.IMG_OCD ) );
+        ocdPage = new ObjectClassDescriptionPage( this );
+        Control ocdPageControl = ocdPage.createControl( tabFolder );
+        ocdTab.setControl( ocdPageControl );
+
+        atdTab = new CTabItem( tabFolder, SWT.NONE );
+        atdTab.setText( "Attribute Types" );
+        atdTab.setImage( BrowserUIPlugin.getDefault().getImage( BrowserUIConstants.IMG_ATD ) );
+        atdPage = new AttributeTypeDescriptionPage( this );
+        Control atdPageControl = atdPage.createControl( tabFolder );
+        atdTab.setControl( atdPageControl );
+
+        mrdTab = new CTabItem( tabFolder, SWT.NONE );
+        mrdTab.setText( "Matching Rules" );
+        mrdTab.setImage( BrowserUIPlugin.getDefault().getImage( BrowserUIConstants.IMG_MRD ) );
+        mrdPage = new MatchingRuleDescriptionPage( this );
+        Control mrdPageControl = mrdPage.createControl( tabFolder );
+        mrdTab.setControl( mrdPageControl );
+
+        mrudTab = new CTabItem( tabFolder, SWT.NONE );
+        mrudTab.setImage( BrowserUIPlugin.getDefault().getImage( BrowserUIConstants.IMG_MRUD ) );
+        mrudTab.setText( "Matching Rule Use" );
+        mrudPage = new MatchingRuleUseDescriptionPage( this );
+        Control mrudPageControl = mrudPage.createControl( tabFolder );
+        mrudTab.setControl( mrudPageControl );
+
+        lsdTab = new CTabItem( tabFolder, SWT.NONE );
+        lsdTab.setImage( BrowserUIPlugin.getDefault().getImage( BrowserUIConstants.IMG_LSD ) );
+        lsdTab.setText( "Syntaxes" );
+        lsdPage = new LdapSyntaxDescriptionPage( this );
+        Control lsdPageControl = lsdPage.createControl( tabFolder );
+        lsdTab.setControl( lsdPageControl );
+
+        // set default selection
+        tabFolder.setSelection( ocdTab );
+
+        // init help context
+        PlatformUI.getWorkbench().getHelpSystem().setHelp( parent,
+            BrowserUIPlugin.PLUGIN_ID + "." + "tools_schema_browser" );
+        PlatformUI.getWorkbench().getHelpSystem().setHelp( tabFolder,
+            BrowserUIPlugin.PLUGIN_ID + "." + "tools_schema_browser" );
+        PlatformUI.getWorkbench().getHelpSystem().setHelp( ocdPageControl,
+            BrowserUIPlugin.PLUGIN_ID + "." + "tools_schema_browser" );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setInput( IEditorInput input )
+    {
+        super.setInput( input );
+
+        if ( input instanceof SchemaBrowserInput && tabFolder != null )
+        {
+            SchemaBrowserInput sbi = ( SchemaBrowserInput ) input;
+
+            // set connection;
+            IBrowserConnection connection = sbi.getConnection();
+            setConnection( connection );
+
+            // set schema element and activate tab
+            SchemaPart schemaElement = sbi.getSchemaElement();
+            if ( schemaElement instanceof ObjectClassDescription )
+            {
+                ocdPage.select( schemaElement );
+                tabFolder.setSelection( ocdTab );
+            }
+            else if ( schemaElement instanceof AttributeTypeDescription )
+            {
+                atdPage.select( schemaElement );
+                tabFolder.setSelection( atdTab );
+            }
+            else if ( schemaElement instanceof MatchingRuleDescription )
+            {
+                mrdPage.select( schemaElement );
+                tabFolder.setSelection( mrdTab );
+            }
+            else if ( schemaElement instanceof MatchingRuleUseDescription )
+            {
+                mrudPage.select( schemaElement );
+                tabFolder.setSelection( mrudTab );
+            }
+            else if ( schemaElement instanceof LdapSyntaxDescription )
+            {
+                lsdPage.select( schemaElement );
+                tabFolder.setSelection( lsdTab );
+            }
+
+            if ( connection != null && schemaElement != null )
+            {
+                // enable one instance hack before fireing the input change event 
+                // otherwise the navigation history is cleared.
+                SchemaBrowserInput.enableOneInstanceHack( true );
+                firePropertyChange( IEditorPart.PROP_INPUT );
+
+                // disable one instance hack for marking the location
+                SchemaBrowserInput.enableOneInstanceHack( false );
+                getSite().getPage().getNavigationHistory().markLocation( this );
+            }
+
+            // finally enable the one instance hack 
+            SchemaBrowserInput.enableOneInstanceHack( true );
+        }
+    }
+
+
+    /**
+     * Refreshes all pages.
+     */
+    public void refresh()
+    {
+        ocdPage.refresh();
+        atdPage.refresh();
+        mrdPage.refresh();
+        mrudPage.refresh();
+        lsdPage.refresh();
+    }
+
+
+    /**
+     * Sets the show defauls schema flag to all pages.
+     *
+     * @param b the default schema flag
+     */
+    public void setShowDefaultSchema( boolean b )
+    {
+        ocdPage.setShowDefaultSchema( b );
+        atdPage.setShowDefaultSchema( b );
+        mrdPage.setShowDefaultSchema( b );
+        mrudPage.setShowDefaultSchema( b );
+        lsdPage.setShowDefaultSchema( b );
+    }
+
+
+    /**
+     * Sets the connection.
+     * 
+     * @param connection the connection
+     */
+    public void setConnection( IBrowserConnection connection )
+    {
+        ocdPage.setConnection( connection );
+        atdPage.setConnection( connection );
+        mrdPage.setConnection( connection );
+        mrudPage.setConnection( connection );
+        lsdPage.setConnection( connection );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setFocus()
+    {
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void doSave( IProgressMonitor monitor )
+    {
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void doSaveAs()
+    {
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isDirty()
+    {
+        return false;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isSaveAsAllowed()
+    {
+        return false;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public INavigationLocation createEmptyNavigationLocation()
+    {
+        return null;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public INavigationLocation createNavigationLocation()
+    {
+        return new SchemaBrowserNavigationLocation( this );
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-ui/src/main/java/org/apache/directory/studio/ldapbrowser/ui/editors/schemabrowser/SchemaBrowser.java
------------------------------------------------------------------------------
    svn:eol-style = native