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 17:48:54 UTC

svn commit: r592079 [13/17] - in /directory/sandbox/felixk/studio-ldapbrowser-common: ./ 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/...

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetContentProvider.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetContentProvider.java?rev=592079&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetContentProvider.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetContentProvider.java Mon Nov  5 08:48:35 2007
@@ -0,0 +1,230 @@
+/*
+ *  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.common.widgets.entryeditor;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants;
+import org.apache.directory.studio.ldapbrowser.core.jobs.InitializeAttributesJob;
+import org.apache.directory.studio.ldapbrowser.core.model.AttributeHierarchy;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.IValue;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+
+/**
+ * The EntryEditorWidgetContentProvider implements the content provider for
+ * the entry editor widget. It accepts an {@link IEntry} or an 
+ * {@link AttributeHierarchy} as input.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryEditorWidgetContentProvider implements ITreeContentProvider
+{
+
+    /** The preferences. */
+    protected EntryEditorWidgetPreferences preferences;
+
+    /** The main widget. */
+    protected EntryEditorWidget mainWidget;
+
+
+    /**
+     * Creates a new instance of EntryEditorWidgetContentProvider.
+     * 
+     * @param preferences the preferences
+     * @param mainWidget the main widget
+     */
+    public EntryEditorWidgetContentProvider( EntryEditorWidgetPreferences preferences, EntryEditorWidget mainWidget )
+    {
+        this.preferences = preferences;
+        this.mainWidget = mainWidget;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * 
+     * This implementations updates the enabled state and the info text.
+     */
+    public void inputChanged( Viewer viewer, Object oldInput, Object newInput )
+    {
+        if ( mainWidget != null )
+        {
+            String dn = "";
+            boolean enabled = true;
+
+            if ( newInput != null && newInput instanceof IEntry )
+            {
+                IEntry entry = ( IEntry ) newInput;
+                dn = "DN: " + entry.getDn().getUpName();
+            }
+            else if ( newInput != null && newInput instanceof AttributeHierarchy )
+            {
+                AttributeHierarchy ah = ( AttributeHierarchy ) newInput;
+                dn = "DN: " + ah.getAttribute().getEntry().getDn().getUpName();
+            }
+            else
+            {
+                dn = "No entry selected";
+                enabled = false;
+            }
+
+            if ( mainWidget.getInfoText() != null && !mainWidget.getInfoText().isDisposed() )
+            {
+                mainWidget.getInfoText().setText( dn );
+            }
+            if ( mainWidget.getQuickFilterWidget() != null )
+            {
+                mainWidget.getQuickFilterWidget().setEnabled( enabled );
+            }
+            if ( mainWidget.getViewer() != null && !mainWidget.getViewer().getTree().isDisposed() )
+            {
+                mainWidget.getViewer().getTree().setEnabled( enabled );
+            }
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void dispose()
+    {
+        preferences = null;
+        mainWidget = null;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public Object[] getElements( Object inputElement )
+    {
+
+        if ( inputElement != null && inputElement instanceof IEntry )
+        {
+            IEntry entry = ( IEntry ) inputElement;
+
+            if ( !entry.isAttributesInitialized() && entry.isDirectoryEntry() )
+            {
+                boolean soa = BrowserCommonActivator.getDefault().getPreferenceStore().getBoolean(
+                    BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_SHOW_OPERATIONAL_ATTRIBUTES );
+                InitializeAttributesJob job = new InitializeAttributesJob( new IEntry[]
+                    { entry }, soa );
+                job.execute();
+                return new Object[0];
+            }
+            else
+            {
+                IAttribute[] attributes = entry.getAttributes();
+                Object[] values = getValues( attributes );
+                return values;
+            }
+        }
+        else if ( inputElement != null && inputElement instanceof AttributeHierarchy )
+        {
+            AttributeHierarchy ah = ( AttributeHierarchy ) inputElement;
+            IAttribute[] attributes = ah.getAttributes();
+            Object[] values = getValues( attributes );
+            return values;
+        }
+        else
+        {
+            return new Object[0];
+        }
+    }
+
+
+    /**
+     * Gets the values of the given attributes.
+     * 
+     * @param attributes the attributes
+     * 
+     * @return the values
+     */
+    private Object[] getValues( IAttribute[] attributes )
+    {
+        List<Object> valueList = new ArrayList<Object>();
+        for ( int i = 0; attributes != null && i < attributes.length; i++ )
+        {
+            IValue[] values = attributes[i].getValues();
+            if ( this.preferences == null || !this.preferences.isUseFolding()
+                || ( values.length <= this.preferences.getFoldingThreshold() ) )
+            {
+                for ( int j = 0; j < values.length; j++ )
+                {
+                    valueList.add( values[j] );
+                }
+            }
+            else
+            {
+                // if folding threshold is exceeded then return the attribute itself
+                valueList.add( attributes[i] );
+            }
+        }
+        return valueList.toArray();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public Object[] getChildren( Object parentElement )
+    {
+        if ( parentElement instanceof IAttribute )
+        {
+            IAttribute attribute = ( IAttribute ) parentElement;
+            IValue[] values = attribute.getValues();
+            return values;
+        }
+        return null;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public Object getParent( Object element )
+    {
+        if ( element instanceof IValue )
+        {
+            return ( ( IValue ) element ).getAttribute();
+        }
+        return null;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasChildren( Object element )
+    {
+        return ( element instanceof IAttribute );
+    }
+
+}
\ No newline at end of file

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetContentProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetFilter.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetFilter.java?rev=592079&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetFilter.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetFilter.java Mon Nov  5 08:48:35 2007
@@ -0,0 +1,285 @@
+/*
+ *  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.common.widgets.entryeditor;
+
+
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IValue;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+
+/**
+ * The EntryEditorWidgetFilter implements the filter for
+ * the entry editor widget.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryEditorWidgetFilter extends ViewerFilter
+{
+
+    /** The viewer to filter. */
+    protected TreeViewer viewer;
+
+    /** The quick filter attribute. */
+    protected String quickFilterAttribute;
+
+    /** The quick filter value. */
+    protected String quickFilterValue;
+
+
+    /**
+     * Creates a new instance of EntryEditorWidgetFilter.
+     */
+    public EntryEditorWidgetFilter()
+    {
+        this.quickFilterAttribute = "";
+        this.quickFilterValue = "";
+    }
+
+
+    /**
+     * Connects this filter with the given viewer.
+     * 
+     * @param viewer the viewer
+     */
+    public void connect( TreeViewer viewer )
+    {
+        this.viewer = viewer;
+        viewer.addFilter( this );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean select( Viewer viewer, Object parentElement, Object element )
+    {
+        if ( element instanceof IAttribute )
+        {
+            IAttribute attribute = ( IAttribute ) element;
+
+            // check if one of the values goes through the quick filter
+            boolean oneGoesThrough = false;
+            IValue[] values = attribute.getValues();
+            for ( int i = 0; i < values.length; i++ )
+            {
+                if ( goesThroughQuickFilter( values[i] ) )
+                {
+                    oneGoesThrough = true;
+                    break;
+                }
+            }
+            if ( !oneGoesThrough )
+            {
+                return false;
+            }
+
+            return true;
+        }
+        else if ( element instanceof IValue )
+        {
+            IValue value = ( IValue ) element;
+
+            // check quick filter
+            if ( !goesThroughQuickFilter( value ) )
+            {
+                return false;
+            }
+
+            // filter attribute types
+            if ( value.getAttribute().isObjectClassAttribute() )
+            {
+                return isShowObjectClassAttribute();
+            }
+            else if ( value.getAttribute().isMustAttribute() )
+            {
+                return isShowMustAttributes();
+            }
+            else if ( value.getAttribute().isMayAttribute() )
+            {
+                return isShowMayAttributes();
+            }
+            else if ( value.getAttribute().isOperationalAttribute() )
+            {
+                return isShowOperationalAttributes();
+            }
+            else
+            {
+                return true;
+            }
+        }
+        else
+        {
+            return true;
+        }
+    }
+
+
+    /**
+     * Checks if the given value goes through quick filter.
+     * 
+     * @param value the value
+     * 
+     * @return true, if goes through quick filter
+     */
+    private boolean goesThroughQuickFilter( IValue value )
+    {
+        // filter attribute description
+        if ( quickFilterAttribute != null && !"".equals( quickFilterAttribute ) )
+        {
+            if ( value.getAttribute().getDescription().toUpperCase().indexOf( quickFilterAttribute.toUpperCase() ) == -1 )
+            {
+                return false;
+            }
+        }
+
+        // fitler value
+        if ( quickFilterValue != null && !"".equals( quickFilterValue ) )
+        {
+            if ( value.isString()
+                && value.getStringValue().toUpperCase().indexOf( quickFilterValue.toUpperCase() ) == -1 )
+            {
+                return false;
+            }
+            else if ( value.isBinary() )
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+
+    /**
+     * Disposes this filter.
+     */
+    public void dispose()
+    {
+        viewer = null;
+    }
+
+
+    /**
+     * Gets the quick filter attribute.
+     * 
+     * @return the quick filter attribute
+     */
+    public String getQuickFilterAttribute()
+    {
+        return quickFilterAttribute;
+    }
+
+
+    /**
+     * Sets the quick filter attribute.
+     * 
+     * @param quickFilterAttribute the quick filter attribute
+     */
+    public void setQuickFilterAttribute( String quickFilterAttribute )
+    {
+        if ( !this.quickFilterAttribute.equals( quickFilterAttribute ) )
+        {
+            this.quickFilterAttribute = quickFilterAttribute;
+            if ( viewer != null )
+            {
+                viewer.refresh();
+            }
+        }
+    }
+
+
+    /**
+     * Gets the quick filter value.
+     * 
+     * @return the quick filter value
+     */
+    public String getQuickFilterValue()
+    {
+        return quickFilterValue;
+    }
+
+
+    /**
+     * Sets the quick filter value.
+     * 
+     * @param quickFilterValue the quick filter value
+     */
+    public void setQuickFilterValue( String quickFilterValue )
+    {
+        if ( !this.quickFilterValue.equals( quickFilterValue ) )
+        {
+            this.quickFilterValue = quickFilterValue;
+            if ( viewer != null )
+            {
+                viewer.refresh();
+            }
+        }
+    }
+
+
+    /**
+     * Checks if may attributes should be shown.
+     * 
+     * @return true, if may attributes should be shown
+     */
+    public boolean isShowMayAttributes()
+    {
+        return true;
+    }
+
+
+    /**
+     * Checks if must attributes should be shown.
+     * 
+     * @return true, if must attributes should be shown
+     */
+    public boolean isShowMustAttributes()
+    {
+        return true;
+    }
+
+
+    /**
+     * Checks if the objectClass attribute should be shown.
+     * 
+     * @return true, if the objectClass attribute should be shown
+     */
+    public boolean isShowObjectClassAttribute()
+    {
+        return true;
+    }
+
+
+    /**
+     * Checks if operational attributes should be shown.
+     * 
+     * @return true, if operational attributes should be shown
+     */
+    public boolean isShowOperationalAttributes()
+    {
+        return true;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetLabelProvider.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetLabelProvider.java?rev=592079&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetLabelProvider.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetLabelProvider.java Mon Nov  5 08:48:35 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.common.widgets.entryeditor;
+
+
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IValue;
+import org.apache.directory.studio.valueeditors.IValueEditor;
+import org.apache.directory.studio.valueeditors.ValueEditorManager;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.IFontProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.RGB;
+
+
+/**
+ * The EntryEditorWidgetLabelProvider implements the label provider for
+ * the entry editor widget.
+ * 
+ * It provides the type value pairs for {@link IValue} objects and type plus 
+ * the number of values for {@link IAttribute} objects. It also implements 
+ * {@link IFontProvider} and {@link IColorProvider} to set the font and color
+ * depending on whether the attribte is a must, may or operational attribute.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryEditorWidgetLabelProvider extends LabelProvider implements ITableLabelProvider, IFontProvider,
+    IColorProvider
+{
+
+    /** The value editor manager. */
+    private ValueEditorManager valueEditorManager;
+
+
+    /**
+     * Creates a new instance of EntryEditorWidgetLabelProvider.
+     * 
+     * @param valueEditorManager the value editor manager
+     */
+    public EntryEditorWidgetLabelProvider( ValueEditorManager valueEditorManager )
+    {
+        this.valueEditorManager = valueEditorManager;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void dispose()
+    {
+        super.dispose();
+        valueEditorManager = null;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public final String getColumnText( Object obj, int index )
+    {
+        if ( obj != null && obj instanceof IValue )
+        {
+            IValue value = ( IValue ) obj;
+            switch ( index )
+            {
+                case EntryEditorWidgetTableMetadata.KEY_COLUMN_INDEX:
+                    return value.getAttribute().getDescription();
+                case EntryEditorWidgetTableMetadata.VALUE_COLUMN_INDEX:
+                    IValueEditor vp = this.valueEditorManager.getCurrentValueEditor( value );
+                    String dv = vp.getDisplayValue( value );
+                    return dv;
+                default:
+                    return "";
+            }
+        }
+        else if ( obj != null && obj instanceof IAttribute )
+        {
+            IAttribute attribute = ( IAttribute ) obj;
+            if ( index == EntryEditorWidgetTableMetadata.KEY_COLUMN_INDEX )
+            {
+                return attribute.getDescription() + " (" + attribute.getValueSize() + " values)";
+            }
+            else
+            {
+                return "";
+            }
+        }
+        else
+        {
+            return "";
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public final Image getColumnImage( Object element, int index )
+    {
+        return null;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public Font getFont( Object element )
+    {
+        IAttribute attribute = null;
+        IValue value = null;
+        if ( element instanceof IAttribute )
+        {
+            attribute = ( IAttribute ) element;
+        }
+        else if ( element instanceof IValue )
+        {
+            value = ( IValue ) element;
+            attribute = value.getAttribute();
+        }
+
+        // inconsistent attributes and values
+        if ( value != null )
+        {
+            if ( value.isEmpty() )
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserCommonActivator.getDefault()
+                    .getPreferenceStore(), BrowserCommonConstants.PREFERENCE_ERROR_FONT );
+                return BrowserCommonActivator.getDefault().getFont( fontData );
+            }
+        }
+        if ( attribute != null && value == null )
+        {
+            if ( !attribute.isConsistent() )
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserCommonActivator.getDefault()
+                    .getPreferenceStore(), BrowserCommonConstants.PREFERENCE_ERROR_FONT );
+                return BrowserCommonActivator.getDefault().getFont( fontData );
+            }
+        }
+
+        // attribute type
+        if ( attribute != null )
+        {
+            if ( attribute.isObjectClassAttribute() )
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserCommonActivator.getDefault()
+                    .getPreferenceStore(), BrowserCommonConstants.PREFERENCE_OBJECTCLASS_FONT );
+                return BrowserCommonActivator.getDefault().getFont( fontData );
+            }
+            else if ( attribute.isMustAttribute() )
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserCommonActivator.getDefault()
+                    .getPreferenceStore(), BrowserCommonConstants.PREFERENCE_MUSTATTRIBUTE_FONT );
+                return BrowserCommonActivator.getDefault().getFont( fontData );
+            }
+            else if ( attribute.isOperationalAttribute() )
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserCommonActivator.getDefault()
+                    .getPreferenceStore(), BrowserCommonConstants.PREFERENCE_OPERATIONALATTRIBUTE_FONT );
+                return BrowserCommonActivator.getDefault().getFont( fontData );
+            }
+            else
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserCommonActivator.getDefault()
+                    .getPreferenceStore(), BrowserCommonConstants.PREFERENCE_MAYATTRIBUTE_FONT );
+                return BrowserCommonActivator.getDefault().getFont( fontData );
+            }
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public Color getForeground( Object element )
+    {
+        IAttribute attribute = null;
+        IValue value = null;
+        if ( element instanceof IAttribute )
+        {
+            attribute = ( IAttribute ) element;
+        }
+        else if ( element instanceof IValue )
+        {
+            value = ( IValue ) element;
+            attribute = value.getAttribute();
+        }
+
+        // inconsistent attributes and values
+        if ( value != null )
+        {
+            if ( value.isEmpty() )
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                    BrowserCommonConstants.PREFERENCE_ERROR_COLOR );
+                return BrowserCommonActivator.getDefault().getColor( rgb );
+            }
+        }
+        if ( attribute != null && value == null )
+        {
+            if ( !attribute.isConsistent() )
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                    BrowserCommonConstants.PREFERENCE_ERROR_COLOR );
+                return BrowserCommonActivator.getDefault().getColor( rgb );
+            }
+        }
+
+        // attribute type
+        if ( attribute != null )
+        {
+            if ( attribute.isObjectClassAttribute() )
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                    BrowserCommonConstants.PREFERENCE_OBJECTCLASS_COLOR );
+                return BrowserCommonActivator.getDefault().getColor( rgb );
+            }
+            else if ( attribute.isMustAttribute() )
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                    BrowserCommonConstants.PREFERENCE_MUSTATTRIBUTE_COLOR );
+                return BrowserCommonActivator.getDefault().getColor( rgb );
+            }
+            else if ( attribute.isOperationalAttribute() )
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                    BrowserCommonConstants.PREFERENCE_OPERATIONALATTRIBUTE_COLOR );
+                return BrowserCommonActivator.getDefault().getColor( rgb );
+            }
+            else
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                    BrowserCommonConstants.PREFERENCE_MAYATTRIBUTE_COLOR );
+                return BrowserCommonActivator.getDefault().getColor( rgb );
+            }
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public Color getBackground( Object element )
+    {
+        return null;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetLabelProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetPreferences.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetPreferences.java?rev=592079&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetPreferences.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetPreferences.java Mon Nov  5 08:48:35 2007
@@ -0,0 +1,213 @@
+/*
+ *  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.common.widgets.entryeditor;
+
+
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants;
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreConstants;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+
+
+/**
+ * This class is a wrapper for the preferences of the entry editor widget.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryEditorWidgetPreferences implements IPropertyChangeListener
+{
+
+    /** The viewer. */
+    protected Viewer viewer;
+
+
+    /**
+     * Creates a new instance of EntryEditorWidgetPreferences.
+     */
+    public EntryEditorWidgetPreferences()
+    {
+        BrowserCommonActivator.getDefault().getPreferenceStore().addPropertyChangeListener( this );
+    }
+
+
+    /**
+     * Connects this preferences with the given viewer.
+     * 
+     * @param viewer the viewer
+     */
+    public void connect( TreeViewer viewer )
+    {
+        this.viewer = viewer;
+    }
+
+
+    /**
+     * Disposes this preferences.
+     */
+    public void dispose()
+    {
+        BrowserCommonActivator.getDefault().getPreferenceStore().removePropertyChangeListener( this );
+        viewer = null;
+    }
+
+
+    /**
+     * Checks if folding is enabled.
+     * 
+     * @return true, if folding is enabled
+     */
+    public boolean isUseFolding()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getBoolean(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_ENABLE_FOLDING );
+    }
+
+
+    /**
+     * Gets the folding threshold.
+     * 
+     * @return the folding threshold
+     */
+    public int getFoldingThreshold()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getInt(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_FOLDING_THRESHOLD );
+    }
+
+
+    /**
+     * Checks if may attributes should be shown.
+     * 
+     * @return true, if may attributes should be shown
+     */
+    public boolean isShowMayAttributes()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getBoolean(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_SHOW_MAY_ATTRIBUTES );
+    }
+
+
+    /**
+     * Checks if must attributes should be shown.
+     * 
+     * @return true, if must attributes should be shown
+     */
+    public boolean isShowMustAttributes()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getBoolean(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_SHOW_MUST_ATTRIBUTES );
+    }
+
+
+    /**
+     * Checks if object class attribute should be shown.
+     * 
+     * @return true, if object class attribute should be shown
+     */
+    public boolean isShowObjectClassAttribute()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getBoolean(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_SHOW_OBJECTCLASS_ATTRIBUTES );
+    }
+
+
+    /**
+     * Checks if operational attributes should be shown.
+     * 
+     * @return true, if operational attributes should be shown
+     */
+    public boolean isShowOperationalAttributes()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getBoolean(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_SHOW_OPERATIONAL_ATTRIBUTES );
+    }
+
+
+    /**
+     * Checks if object class and must attributes should be 
+     * grouped before may attributes.
+     * 
+     * @return true, if object class and must attributes first
+     */
+    public boolean isObjectClassAndMustAttributesFirst()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getBoolean(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_OBJECTCLASS_AND_MUST_ATTRIBUTES_FIRST );
+    }
+
+
+    /**
+     * Checks if operational attributes should be grouped after may attributes.
+     * 
+     * @return true, if operational attributes last
+     */
+    public boolean isOperationalAttributesLast()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getBoolean(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_OPERATIONAL_ATTRIBUTES_LAST );
+    }
+
+
+    /**
+     * Gets the default sort property, one of 
+     * {@link BrowserCoreConstants#SORT_BY_ATTRIBUTE_DESCRIPTION} or
+     * {@link BrowserCoreConstants#SORT_BY_VALUE}.
+     * 
+     * @return the default sort property
+     */
+    public int getDefaultSortBy()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getInt(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_DEFAULT_SORT_BY );
+    }
+
+
+    /**
+     * Gets the default sort property, one of 
+     * {@link BrowserCoreConstants#SORT_ORDER_NONE},
+     * {@link BrowserCoreConstants#SORT_ORDER_ASCENDING} or
+     * {@link BrowserCoreConstants#SORT_ORDER_DESCENDING}.
+     * 
+     * @return the default sort property
+     */
+    public int getDefaultSortOrder()
+    {
+        return BrowserCommonActivator.getDefault().getPreferenceStore().getInt(
+            BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_DEFAULT_SORT_ORDER );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void propertyChange( PropertyChangeEvent event )
+    {
+        if ( this.viewer != null )
+        {
+            this.viewer.refresh();
+        }
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetPreferences.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetQuickFilterWidget.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetQuickFilterWidget.java?rev=592079&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetQuickFilterWidget.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetQuickFilterWidget.java Mon Nov  5 08:48:35 2007
@@ -0,0 +1,287 @@
+/*
+ *  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.common.widgets.entryeditor;
+
+
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants;
+import org.apache.directory.studio.ldapbrowser.common.widgets.BaseWidgetUtils;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+
+/**
+ * The EntryEditorWidgetQuickFilterWidget implements an instant search 
+ * for the entry editor widget. It contains separate search fields for
+ * attribute type and/or value.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryEditorWidgetQuickFilterWidget
+{
+
+    /** The filter to propagate the entered filter phrases. */
+    private EntryEditorWidgetFilter filter;
+
+    /** The entry editor widget. */
+    private EntryEditorWidget entryEditorWidget;
+
+    /** The parent, used to create the composite. */
+    private Composite parent;
+
+    /** The outer composite. */
+    private Composite composite;
+
+    /** The inner composite, it is created/destroyed when showing/hiding the quick filter. */
+    private Composite innerComposite;
+
+    /** The quick filter attribute text. */
+    private Text quickFilterAttributeText;
+
+    /** The quick filter value text. */
+    private Text quickFilterValueText;
+
+    /** The clear quick filter button. */
+    private Button clearQuickFilterButton;
+
+
+    /**
+     * Creates a new instance of EntryEditorWidgetQuickFilterWidget.
+     * 
+     * @param filter the filter
+     * @param entryEditorWidget the entry editor widget
+     */
+    public EntryEditorWidgetQuickFilterWidget( EntryEditorWidgetFilter filter, EntryEditorWidget entryEditorWidget )
+    {
+        this.filter = filter;
+        this.entryEditorWidget = entryEditorWidget;
+    }
+
+
+    /**
+     * Creates the outer composite.
+     * 
+     * @param parent the parent
+     */
+    public void createComposite( Composite parent )
+    {
+        this.parent = parent;
+
+        composite = BaseWidgetUtils.createColumnContainer( parent, 1, 1 );
+        GridLayout gl = new GridLayout();
+        gl.marginHeight = 2;
+        gl.marginWidth = 2;
+        composite.setLayout( gl );
+
+        innerComposite = null;
+    }
+
+
+    /**
+     * Creates the inner composite with its input fields.
+     */
+    private void create()
+    {
+        innerComposite = BaseWidgetUtils.createColumnContainer( composite, 3, 1 );
+
+        quickFilterAttributeText = new Text( innerComposite, SWT.BORDER );
+        quickFilterAttributeText.setLayoutData( new GridData( 200 - 14, SWT.DEFAULT ) );
+        quickFilterAttributeText.addModifyListener( new ModifyListener()
+        {
+            public void modifyText( ModifyEvent e )
+            {
+                filter.setQuickFilterAttribute( quickFilterAttributeText.getText() );
+                clearQuickFilterButton.setEnabled( !"".equals( quickFilterAttributeText.getText() )
+                    || !"".equals( quickFilterValueText.getText() ) );
+                if ( !"".equals( quickFilterAttributeText.getText() ) )
+                {
+                    RGB fgRgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                        BrowserCommonConstants.PREFERENCE_QUICKFILTER_FOREGROUND_COLOR );
+                    RGB bgRgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                        BrowserCommonConstants.PREFERENCE_QUICKFILTER_BACKGROUND_COLOR );
+                    Color fgColor = BrowserCommonActivator.getDefault().getColor( fgRgb );
+                    Color bgColor = BrowserCommonActivator.getDefault().getColor( bgRgb );
+                    quickFilterAttributeText.setForeground( fgColor );
+                    quickFilterAttributeText.setBackground( bgColor );
+                    FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserCommonActivator.getDefault()
+                        .getPreferenceStore(), BrowserCommonConstants.PREFERENCE_QUICKFILTER_FONT );
+                    Font font = BrowserCommonActivator.getDefault().getFont( fontData );
+                    quickFilterAttributeText.setFont( font );
+                }
+                else
+                {
+                    quickFilterAttributeText.setBackground( null );
+                }
+            }
+        } );
+
+        quickFilterValueText = new Text( innerComposite, SWT.BORDER );
+        quickFilterValueText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        quickFilterValueText.addModifyListener( new ModifyListener()
+        {
+            public void modifyText( ModifyEvent e )
+            {
+                filter.setQuickFilterValue( quickFilterValueText.getText() );
+                clearQuickFilterButton.setEnabled( !"".equals( quickFilterAttributeText.getText() )
+                    || !"".equals( quickFilterValueText.getText() ) );
+                if ( !"".equals( quickFilterValueText.getText() ) )
+                {
+                    RGB fgRgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                        BrowserCommonConstants.PREFERENCE_QUICKFILTER_FOREGROUND_COLOR );
+                    RGB bgRgb = PreferenceConverter.getColor( BrowserCommonActivator.getDefault().getPreferenceStore(),
+                        BrowserCommonConstants.PREFERENCE_QUICKFILTER_BACKGROUND_COLOR );
+                    Color fgColor = BrowserCommonActivator.getDefault().getColor( fgRgb );
+                    Color bgColor = BrowserCommonActivator.getDefault().getColor( bgRgb );
+                    quickFilterValueText.setForeground( fgColor );
+                    quickFilterValueText.setBackground( bgColor );
+                    FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserCommonActivator.getDefault()
+                        .getPreferenceStore(), BrowserCommonConstants.PREFERENCE_QUICKFILTER_FONT );
+                    Font font = BrowserCommonActivator.getDefault().getFont( fontData );
+                    quickFilterValueText.setFont( font );
+                }
+                else
+                {
+                    quickFilterValueText.setBackground( null );
+                }
+            }
+        } );
+
+        clearQuickFilterButton = new Button( innerComposite, SWT.PUSH );
+        clearQuickFilterButton.setToolTipText( "Clear Quick Filter" );
+        clearQuickFilterButton.setImage( BrowserCommonActivator.getDefault().getImage( BrowserCommonConstants.IMG_CLEAR ) );
+        clearQuickFilterButton.setEnabled( false );
+        clearQuickFilterButton.addSelectionListener( new SelectionAdapter()
+        {
+            public void widgetSelected( SelectionEvent e )
+            {
+                if ( !"".equals( quickFilterAttributeText.getText() ) )
+                {
+                    quickFilterAttributeText.setText( "" );
+                }
+                if ( !"".equals( quickFilterValueText.getText() ) )
+                {
+                    quickFilterValueText.setText( "" );
+                }
+            }
+        } );
+
+        setEnabled( composite.isEnabled() );
+
+        composite.layout( true, true );
+        parent.layout( true, true );
+    }
+
+
+    /**
+     * Destroys the inner widget.
+     */
+    private void destroy()
+    {
+        if ( !"".equals( quickFilterAttributeText.getText() ) )
+        {
+            quickFilterAttributeText.setText( "" );
+        }
+        if ( !"".equals( quickFilterValueText.getText() ) )
+        {
+            quickFilterValueText.setText( "" );
+        }
+        innerComposite.dispose();
+        innerComposite = null;
+
+        composite.layout( true, true );
+        parent.layout( true, true );
+    }
+
+
+    /**
+     * Disposes this widget.
+     */
+    public void dispose()
+    {
+        if ( filter != null )
+        {
+            quickFilterAttributeText = null;
+            quickFilterValueText = null;
+            clearQuickFilterButton = null;
+            innerComposite = null;
+            composite.dispose();
+            composite = null;
+            parent = null;
+            filter = null;
+        }
+    }
+
+
+    /**
+     * Enables or disables this quick filter widget.
+     * 
+     * @param enabled true to enable this quick filter widget, false to disable it
+     */
+    public void setEnabled( boolean enabled )
+    {
+        if ( composite != null && !composite.isDisposed() )
+        {
+            composite.setEnabled( enabled );
+        }
+        if ( innerComposite != null && !innerComposite.isDisposed() )
+        {
+            innerComposite.setEnabled( enabled );
+            quickFilterAttributeText.setEnabled( enabled );
+            quickFilterValueText.setEnabled( enabled );
+            clearQuickFilterButton.setEnabled( enabled );
+        }
+    }
+
+
+    /**
+     * Activates or deactivates this quick filter widget.
+     *
+     * @param visible true to crate this quick filter widget, false to destroy it
+     */
+    public void setActive( boolean visible )
+    {
+        if ( visible && innerComposite == null && composite != null )
+        {
+            create();
+            quickFilterAttributeText.setFocus();
+        }
+        else if ( !visible && innerComposite != null && composite != null )
+        {
+            destroy();
+            entryEditorWidget.getViewer().getTree().setFocus();
+        }
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetQuickFilterWidget.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorter.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorter.java?rev=592079&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorter.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorter.java Mon Nov  5 08:48:35 2007
@@ -0,0 +1,434 @@
+/*
+ *  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.common.widgets.entryeditor;
+
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants;
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreConstants;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IValue;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.TreeColumn;
+
+
+/**
+ * The EntryEditorWidgetSorter implements the Sorter for the entry editor widget.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryEditorWidgetSorter extends ViewerSorter implements SelectionListener
+{
+
+    /** The tree viewer. */
+    private TreeViewer viewer;
+
+    /** The sort property. */
+    private int sortBy;
+
+    /** The sort order. */
+    private int sortOrder;
+
+    /** The preferences. */
+    private EntryEditorWidgetPreferences preferences;
+
+
+    /**
+     * Creates a new instance of EntryEditorWidgetSorter.
+     * 
+     * @param preferences the preferences
+     */
+    public EntryEditorWidgetSorter( EntryEditorWidgetPreferences preferences )
+    {
+        this.sortBy = BrowserCoreConstants.SORT_BY_NONE;
+        this.sortOrder = BrowserCoreConstants.SORT_ORDER_NONE;
+        this.preferences = preferences;
+    }
+
+
+    /**
+     * Connects this sorter to the given tree viewer.
+     * 
+     * @param viewer the viewer
+     */
+    public void connect( TreeViewer viewer )
+    {
+        this.viewer = viewer;
+        viewer.setSorter( this );
+
+        TreeColumn[] columns = ( ( TreeViewer ) viewer ).getTree().getColumns();
+        for ( int i = 0; i < columns.length; i++ )
+        {
+            columns[i].addSelectionListener( this );
+        }
+    }
+
+
+    /**
+     * Disposes this sorter.
+     */
+    public void dispose()
+    {
+        viewer = null;
+        preferences = null;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void widgetDefaultSelected( SelectionEvent e )
+    {
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * 
+     * Switches the sort property and sort order when clicking the table headers.
+     */
+    public void widgetSelected( SelectionEvent e )
+    {
+        if ( e.widget instanceof TreeColumn && viewer != null )
+        {
+            int index = viewer.getTree().indexOf( ( ( TreeColumn ) e.widget ) );
+            switch ( index )
+            {
+                case EntryEditorWidgetTableMetadata.KEY_COLUMN_INDEX:
+                    if ( sortBy == BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION )
+                    {
+                        // toggle sort order
+                        sortOrder = sortOrder == BrowserCoreConstants.SORT_ORDER_NONE ? BrowserCoreConstants.SORT_ORDER_ASCENDING
+                            : sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? BrowserCoreConstants.SORT_ORDER_DESCENDING
+                                : BrowserCoreConstants.SORT_ORDER_NONE;
+                    }
+                    else
+                    {
+                        // set new sort by
+                        sortBy = BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION;
+                        sortOrder = BrowserCoreConstants.SORT_ORDER_ASCENDING;
+                    }
+                    break;
+                case EntryEditorWidgetTableMetadata.VALUE_COLUMN_INDEX:
+                    if ( sortBy == BrowserCoreConstants.SORT_BY_VALUE )
+                    {
+                        // toggle sort order
+                        sortOrder = sortOrder == BrowserCoreConstants.SORT_ORDER_NONE ? BrowserCoreConstants.SORT_ORDER_ASCENDING
+                            : sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? BrowserCoreConstants.SORT_ORDER_DESCENDING
+                                : BrowserCoreConstants.SORT_ORDER_NONE;
+                    }
+                    else
+                    {
+                        // set new sort by
+                        sortBy = BrowserCoreConstants.SORT_BY_VALUE;
+                        sortOrder = BrowserCoreConstants.SORT_ORDER_ASCENDING;
+                    }
+                    break;
+                default:
+                    ;
+            }
+            if ( sortOrder == BrowserCoreConstants.SORT_ORDER_NONE )
+            {
+                sortBy = BrowserCoreConstants.SORT_BY_NONE;
+            }
+
+            TreeColumn[] columns = viewer.getTree().getColumns();
+            for ( int i = 0; i < columns.length; i++ )
+            {
+                columns[i].setImage( null );
+            }
+
+            if ( sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING )
+            {
+                ( ( TreeColumn ) e.widget ).setImage( BrowserCommonActivator.getDefault().getImage(
+                    BrowserCommonConstants.IMG_SORT_ASCENDING ) );
+            }
+            else if ( sortOrder == BrowserCoreConstants.SORT_ORDER_DESCENDING )
+            {
+                ( ( TreeColumn ) e.widget ).setImage( BrowserCommonActivator.getDefault().getImage(
+                    BrowserCommonConstants.IMG_SORT_DESCENDING ) );
+            }
+
+            viewer.refresh();
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void sort( final Viewer viewer, Object[] elements )
+    {
+        Arrays.sort( elements, new Comparator<Object>()
+        {
+            public int compare( Object a, Object b )
+            {
+                return EntryEditorWidgetSorter.this.compare( viewer, a, b );
+            }
+        } );
+
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public int compare( Viewer viewer, Object o1, Object o2 )
+    {
+        // check o1
+        IAttribute attribute1 = null;
+        IValue value1 = null;
+        if ( o1 instanceof IAttribute )
+        {
+            attribute1 = ( IAttribute ) o1;
+        }
+        else if ( o1 instanceof IValue )
+        {
+            value1 = ( IValue ) o1;
+            attribute1 = value1.getAttribute();
+        }
+
+        // check o2
+        IAttribute attribute2 = null;
+        IValue value2 = null;
+        if ( o2 instanceof IAttribute )
+        {
+            attribute2 = ( IAttribute ) o2;
+        }
+        else if ( o2 instanceof IValue )
+        {
+            value2 = ( IValue ) o2;
+            attribute2 = value2.getAttribute();
+        }
+
+        // compare
+        if ( value1 != null && value2 != null )
+        {
+            if ( getSortByOrDefault() == BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION )
+            {
+                if ( value1.getAttribute() != value2.getAttribute() )
+                {
+                    return compareAttributes( value1.getAttribute(), value2.getAttribute() );
+                }
+                else
+                {
+                    return compareValues( value1, value2 );
+                }
+            }
+            else if ( getSortByOrDefault() == BrowserCoreConstants.SORT_BY_VALUE )
+            {
+                return compareValues( value1, value2 );
+            }
+            else
+            {
+                return equal();
+            }
+        }
+        else if ( attribute1 != null && attribute2 != null )
+        {
+            return compareAttributes( attribute1, attribute2 );
+        }
+        else
+        {
+            return equal();
+        }
+    }
+
+
+    /**
+     * Compares attribute kind or description.
+     * 
+     * @param attribute1 the attribute1
+     * @param attribute2 the attribute2
+     * 
+     * @return the compare result
+     */
+    private int compareAttributes( IAttribute attribute1, IAttribute attribute2 )
+    {
+        if ( this.sortOrder == BrowserCoreConstants.SORT_ORDER_NONE )
+        {
+            if ( preferences == null || preferences.isObjectClassAndMustAttributesFirst() )
+            {
+                if ( attribute1.isObjectClassAttribute() )
+                {
+                    return lessThan();
+                }
+                else if ( attribute2.isObjectClassAttribute() )
+                {
+                    return greaterThan();
+                }
+
+                if ( attribute1.isMustAttribute() && !attribute2.isMustAttribute() )
+                {
+                    return lessThan();
+                }
+                else if ( attribute2.isMustAttribute() && !attribute1.isMustAttribute() )
+                {
+                    return greaterThan();
+                }
+            }
+            if ( preferences == null || preferences.isOperationalAttributesLast() )
+            {
+                if ( attribute1.isOperationalAttribute() && !attribute2.isOperationalAttribute() )
+                {
+                    return greaterThan();
+                }
+                else if ( attribute2.isOperationalAttribute() && !attribute1.isOperationalAttribute() )
+                {
+                    return lessThan();
+                }
+            }
+        }
+
+        return compare( attribute1.getDescription(), attribute2.getDescription() );
+    }
+
+
+    /**
+     * Compares values.
+     * 
+     * @param value1 the value1
+     * @param value2 the value2
+     * 
+     * @return the compare result
+     */
+    private int compareValues( IValue value1, IValue value2 )
+    {
+        if ( value1.isEmpty() && value2.isEmpty() )
+        {
+            return equal();
+        }
+        else if ( value1.isEmpty() && !value2.isEmpty() )
+        {
+            return greaterThan();
+        }
+        else if ( !value1.isEmpty() && value2.isEmpty() )
+        {
+            return lessThan();
+        }
+        else
+        {
+            return compare( value1.getStringValue(), value2.getStringValue() );
+        }
+    }
+
+
+    /**
+     * Gets the current sort order or the default sort order from the preferences .
+     * 
+     * @return the current sort order or default sort order
+     */
+    private int getSortOrderOrDefault()
+    {
+        if ( preferences == null )
+        {
+            return BrowserCoreConstants.SORT_ORDER_ASCENDING;
+        }
+        else if ( sortOrder == BrowserCoreConstants.SORT_ORDER_NONE )
+        {
+            return preferences.getDefaultSortOrder();
+        }
+        else
+        {
+            return sortOrder;
+        }
+    }
+
+
+    /**
+     * Gets the current sort property or the default sort property from the preferences .
+     * 
+     * @return the current sort property or default sort property
+     */
+    private int getSortByOrDefault()
+    {
+        if ( preferences == null )
+        {
+            return BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION;
+        }
+        else if ( sortBy == BrowserCoreConstants.SORT_BY_NONE )
+        {
+            return preferences.getDefaultSortBy();
+        }
+        else
+        {
+            return sortBy;
+        }
+    }
+
+
+    /**
+     * Returns +1 or -1, depending on the sort order.
+     *
+     * @return +1 or -1, depending on the sort order
+     */
+    private int lessThan()
+    {
+        return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? -1 : 1;
+    }
+
+
+    /**
+     * Returns 0.
+     *
+     * @return 0
+     */
+    private int equal()
+    {
+        return 0;
+    }
+
+
+    /**
+     * Returns +1 or -1, depending on the sort order.
+     *
+     * @return +1 or -1, depending on the sort order
+     */
+    private int greaterThan()
+    {
+        return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? 1 : -1;
+    }
+
+
+    /**
+     * Compares the two strings using the Strings's compareToIgnoreCase method, 
+     * pays attention for the sort order.
+     *
+     * @param s1 the first string to compare
+     * @param s2 the second string to compare
+     * @return a negative integer, zero, or a positive integer
+     * @see java.lang.String#compareToIgnoreCase(String)
+     */
+    private int compare( String s1, String s2 )
+    {
+        return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? s1.compareToIgnoreCase( s2 )
+            : s2.compareToIgnoreCase( s1 );
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorterDialog.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorterDialog.java?rev=592079&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorterDialog.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorterDialog.java Mon Nov  5 08:48:35 2007
@@ -0,0 +1,189 @@
+/*
+ *  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.common.widgets.entryeditor;
+
+
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants;
+import org.apache.directory.studio.ldapbrowser.common.widgets.BaseWidgetUtils;
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreConstants;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * This class represents the dialog used to change the entry editors's  default sort preferences.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryEditorWidgetSorterDialog extends Dialog
+{
+
+    /** The Constant DIALOG_TITLE. */
+    public static final String DIALOG_TITLE = "Entry Editor Sorting";
+
+    /** The Constant SORT_BY_NONE. */
+    public static final String SORT_BY_NONE = "No Default Sorting";
+
+    /** The Constant SORT_BY_ATTRIBUTE. */
+    public static final String SORT_BY_ATTRIBUTE = "Attribute Description";
+
+    /** The Constant SORT_BY_VALUE. */
+    public static final String SORT_BY_VALUE = "Value";
+
+    /** The preferences. */
+    private EntryEditorWidgetPreferences preferences;
+
+    /** The object class and must attributes first button. */
+    private Button objectClassAndMustAttributesFirstButton;
+
+    /** The operational attributes last button. */
+    private Button operationalAttributesLastButton;
+
+    /** The sort by combo. */
+    private Combo sortByCombo;
+
+    /** The sort acending button. */
+    private Button sortAcendingButton;
+
+    /** The sort descending button. */
+    private Button sortDescendingButton;
+
+
+    /**
+     * Creates a new instance of EntryEditorWidgetSorterDialog.
+     * 
+     * @param parentShell the parent shell
+     * @param preferences the preferences
+     */
+    public EntryEditorWidgetSorterDialog( Shell parentShell, EntryEditorWidgetPreferences preferences )
+    {
+        super( parentShell );
+        this.preferences = preferences;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * 
+     * This implementation calls its super implementation and sets the dialog's title.
+     */
+    protected void configureShell( Shell newShell )
+    {
+        super.configureShell( newShell );
+        newShell.setText( DIALOG_TITLE );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * 
+     * This implementation saves the changed settings when OK is pressed.
+     */
+    protected void buttonPressed( int buttonId )
+    {
+        if ( buttonId == IDialogConstants.OK_ID )
+        {
+            IPreferenceStore store = BrowserCommonActivator.getDefault().getPreferenceStore();
+            store.setValue( BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_OBJECTCLASS_AND_MUST_ATTRIBUTES_FIRST,
+                objectClassAndMustAttributesFirstButton.getSelection() );
+            store.setValue( BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_OPERATIONAL_ATTRIBUTES_LAST,
+                operationalAttributesLastButton.getSelection() );
+            store.setValue( BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_DEFAULT_SORT_ORDER, sortDescendingButton
+                .getSelection() ? BrowserCoreConstants.SORT_ORDER_DESCENDING
+                : BrowserCoreConstants.SORT_ORDER_ASCENDING );
+            store.setValue( BrowserCommonConstants.PREFERENCE_ENTRYEDITOR_DEFAULT_SORT_BY,
+                sortByCombo.getSelectionIndex() == 2 ? BrowserCoreConstants.SORT_BY_VALUE : sortByCombo
+                    .getSelectionIndex() == 1 ? BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION
+                    : BrowserCoreConstants.SORT_BY_NONE );
+        }
+
+        super.buttonPressed( buttonId );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected Control createDialogArea( Composite parent )
+    {
+        Composite composite = ( Composite ) super.createDialogArea( parent );
+
+        Group group = BaseWidgetUtils.createGroup( composite, "Group attributes", 1 );
+        GridData gd = new GridData( GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL );
+        gd.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH );
+        group.setLayoutData( gd );
+
+        objectClassAndMustAttributesFirstButton = BaseWidgetUtils.createCheckbox( group,
+            "ObjectClass and must attributes first", 1 );
+        objectClassAndMustAttributesFirstButton.setSelection( preferences.isObjectClassAndMustAttributesFirst() );
+
+        operationalAttributesLastButton = BaseWidgetUtils.createCheckbox( group, "Operational attributes last", 1 );
+        operationalAttributesLastButton.setSelection( preferences.isOperationalAttributesLast() );
+
+        Group sortingGroup = BaseWidgetUtils.createGroup( composite, "Sort attributes", 1 );
+
+        Composite sortByComposite = BaseWidgetUtils.createColumnContainer( sortingGroup, 4, 1 );
+        BaseWidgetUtils.createLabel( sortByComposite, "Sort by", 1 );
+        sortByCombo = BaseWidgetUtils.createReadonlyCombo( sortByComposite, new String[]
+            { SORT_BY_NONE, SORT_BY_ATTRIBUTE, SORT_BY_VALUE }, 0, 1 );
+        sortByCombo.select( preferences.getDefaultSortBy() == BrowserCoreConstants.SORT_BY_VALUE ? 2 : preferences
+            .getDefaultSortBy() == BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION ? 1 : 0 );
+        sortByCombo.addSelectionListener( new SelectionAdapter()
+        {
+            public void widgetSelected( SelectionEvent e )
+            {
+                sortAcendingButton.setEnabled( sortByCombo.getSelectionIndex() != 0 );
+                sortDescendingButton.setEnabled( sortByCombo.getSelectionIndex() != 0 );
+            }
+        } );
+
+        sortAcendingButton = BaseWidgetUtils.createRadiobutton( sortByComposite, "Ascending", 1 );
+        sortAcendingButton
+            .setSelection( preferences.getDefaultSortOrder() == BrowserCoreConstants.SORT_ORDER_ASCENDING );
+        sortAcendingButton.setEnabled( sortByCombo.getSelectionIndex() != 0 );
+
+        sortDescendingButton = BaseWidgetUtils.createRadiobutton( sortByComposite, "Descending", 1 );
+        sortDescendingButton
+            .setSelection( preferences.getDefaultSortOrder() == BrowserCoreConstants.SORT_ORDER_DESCENDING );
+        sortDescendingButton.setEnabled( sortByCombo.getSelectionIndex() != 0 );
+
+        BaseWidgetUtils.createSpacer( composite, 2 );
+
+        BaseWidgetUtils.createLabel( composite,
+            "Please click to table headers to sort by attribute description or value.", 1 );
+
+        applyDialogFont( composite );
+        return composite;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetSorterDialog.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetTableMetadata.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetTableMetadata.java?rev=592079&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetTableMetadata.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetTableMetadata.java Mon Nov  5 08:48:35 2007
@@ -0,0 +1,50 @@
+/*
+ *  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.common.widgets.entryeditor;
+
+
+/**
+ * The EntryEditorWidgetTableMetadata interface contains some constants used
+ * by the entry editor widget.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public interface EntryEditorWidgetTableMetadata
+{
+
+    /** The Constant KEY_COLUMN_INDEX. */
+    public static final int KEY_COLUMN_INDEX = 0;
+
+    /** The Constant VALUE_COLUMN_INDEX. */
+    public static final int VALUE_COLUMN_INDEX = 1;
+
+    /** The Constant KEY_COLUMN_NAME. */
+    public static final String KEY_COLUMN_NAME = "Attribute Description";
+
+    /** The Constant VALUE_COLUMN_NAME. */
+    public static final String VALUE_COLUMN_NAME = "Value";
+
+    /** The Constant COLUM_NAMES. */
+    public static final String[] COLUM_NAMES =
+        { KEY_COLUMN_NAME, VALUE_COLUMN_NAME };
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetTableMetadata.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetUniversalListener.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetUniversalListener.java?rev=592079&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetUniversalListener.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetUniversalListener.java Mon Nov  5 08:48:35 2007
@@ -0,0 +1,238 @@
+/*
+ *  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.common.widgets.entryeditor;
+
+
+import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
+import org.apache.directory.studio.ldapbrowser.common.actions.BrowserSelectionUtils;
+import org.apache.directory.studio.ldapbrowser.core.events.BulkModificationEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.EmptyValueAddedEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.EmptyValueDeletedEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.EntryModificationEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.EntryUpdateListener;
+import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
+import org.apache.directory.studio.ldapbrowser.core.events.ValueAddedEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.ValueDeletedEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.ValueModifiedEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.ValueRenamedEvent;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IValue;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+
+
+/**
+ * The EntryEditorWidgetUniversalListener manages all events for the entry editor widget.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EntryEditorWidgetUniversalListener implements EntryUpdateListener
+{
+
+    /** The tree viewer */
+    protected TreeViewer viewer;
+
+    /** The action used to start the default value editor */
+    protected OpenDefaultEditorAction startEditAction;
+
+    /** This listener starts the value editor when pressing enter */
+    protected SelectionListener viewerSelectionListener = new SelectionAdapter()
+    {
+        /**
+         * {@inheritDoc}
+         */
+        public void widgetSelected( SelectionEvent e )
+        {
+        }
+
+
+        /**
+         * {@inheritDoc}
+         *
+         * This implementation starts the value editor.
+         */
+        public void widgetDefaultSelected( SelectionEvent e )
+        {
+            if ( startEditAction.isEnabled() )
+            {
+                startEditAction.run();
+            }
+        }
+    };
+
+    /** This listener starts the value editor or expands/collapses the selected attribute */
+    protected MouseListener viewerMouseListener = new MouseAdapter()
+    {
+        /**
+         * {@inheritDoc}
+         *
+         * This implementation starts the value editor or expands/collapses the selected attribute.
+         */
+        public void mouseDoubleClick( MouseEvent e )
+        {
+            IAttribute[] attributes = BrowserSelectionUtils.getAttributes( viewer.getSelection() );
+            IValue[] values = BrowserSelectionUtils.getValues( viewer.getSelection() );
+            if ( attributes.length == 1 && values.length == 0 )
+            {
+                if ( viewer.getExpandedState( attributes[0] ) )
+                {
+                    viewer.collapseToLevel( attributes[0], 1 );
+                }
+                else
+                {
+                    viewer.expandToLevel( attributes[0], 1 );
+                }
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void mouseDown( MouseEvent e )
+        {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void mouseUp( MouseEvent e )
+        {
+        }
+    };
+
+
+    /**
+     * Creates a new instance of EntryEditorWidgetUniversalListener.
+     *
+     * @param treeViewer the tree viewer
+     * @param startEditAction the action used to start the default value editor
+     */
+    public EntryEditorWidgetUniversalListener( TreeViewer treeViewer, OpenDefaultEditorAction startEditAction )
+    {
+        this.startEditAction = startEditAction;
+        this.viewer = treeViewer;
+
+        // register listeners
+        viewer.getTree().addSelectionListener( viewerSelectionListener  );
+        viewer.getTree().addMouseListener( viewerMouseListener  );
+        EventRegistry.addEntryUpdateListener( this, BrowserCommonActivator.getDefault().getEventRunner() );
+    }
+
+
+    /**
+     * Disposes this universal listener.
+     */
+    public void dispose()
+    {
+        if ( viewer != null )
+        {
+            EventRegistry.removeEntryUpdateListener( this );
+
+            startEditAction = null;
+            viewer = null;
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     *
+     * This implementation refreshes the viewer and selects a value depending
+     * on the event.
+     */
+    public void entryUpdated( EntryModificationEvent event )
+    {
+
+        if ( viewer == null || viewer.getTree() == null || viewer.getTree().isDisposed() || viewer.getInput() == null
+            || ( event.getModifiedEntry() != viewer.getInput() && !( event instanceof BulkModificationEvent ) ) )
+        {
+            return;
+        }
+
+        // force closing of cell editors
+        if ( viewer.isCellEditorActive() )
+        {
+            viewer.cancelEditing();
+        }
+
+        // refresh
+        viewer.refresh();
+
+        // selection value
+        if ( event instanceof ValueAddedEvent )
+        {
+            // select the vadded value
+            ValueAddedEvent vaEvent = ( ValueAddedEvent ) event;
+            viewer.setSelection( new StructuredSelection( vaEvent.getAddedValue() ), true );
+            viewer.refresh();
+        }
+        else if ( event instanceof ValueDeletedEvent )
+        {
+            // select another value of the deleted attribute
+            ValueDeletedEvent vdEvent = ( ValueDeletedEvent ) event;
+            if ( viewer.getSelection().isEmpty() && vdEvent.getDeletedValue().getAttribute().getValueSize() > 0 )
+            {
+                viewer.setSelection(
+                    new StructuredSelection( vdEvent.getDeletedValue().getAttribute().getValues()[0] ), true );
+            }
+        }
+        else if ( event instanceof EmptyValueAddedEvent )
+        {
+            // select the added value and start editing
+            EmptyValueAddedEvent evaEvent = ( EmptyValueAddedEvent ) event;
+            viewer.setSelection( new StructuredSelection( evaEvent.getAddedValue() ), true );
+            if ( startEditAction.isEnabled() )
+            {
+                startEditAction.run();
+            }
+        }
+        else if ( event instanceof EmptyValueDeletedEvent )
+        {
+            // select another value of the deleted attribute
+            EmptyValueDeletedEvent evdEvent = ( EmptyValueDeletedEvent ) event;
+            if ( viewer.getSelection().isEmpty() && evdEvent.getDeletedValue().getAttribute().getValueSize() > 0 )
+            {
+                viewer.setSelection(
+                    new StructuredSelection( evdEvent.getDeletedValue().getAttribute().getValues()[0] ), true );
+            }
+        }
+        else if ( event instanceof ValueModifiedEvent )
+        {
+            // select the modified value
+            ValueModifiedEvent vmEvent = ( ValueModifiedEvent ) event;
+            viewer.setSelection( new StructuredSelection( vmEvent.getNewValue() ), true );
+        }
+        else if ( event instanceof ValueRenamedEvent )
+        {
+            // select the renamed value
+            ValueRenamedEvent vrEvent = ( ValueRenamedEvent ) event;
+            viewer.setSelection( new StructuredSelection( vrEvent.getNewValue() ), true );
+        }
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-common/src/main/java/org/apache/directory/studio/ldapbrowser/common/widgets/entryeditor/EntryEditorWidgetUniversalListener.java
------------------------------------------------------------------------------
    svn:eol-style = native