You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pa...@apache.org on 2006/12/18 18:57:49 UTC

svn commit: r488371 [8/14] - in /directory/sandbox/pamarcelot/ldapstudio: ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/jobs/ ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/perspective/ ldapstudio-browser-ui...

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetActionGroup.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetActionGroup.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetActionGroup.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetActionGroup.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,378 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIConstants;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIPlugin;
+import org.apache.directory.ldapstudio.browser.ui.actions.CopyAction;
+import org.apache.directory.ldapstudio.browser.ui.actions.DeleteAction;
+import org.apache.directory.ldapstudio.browser.ui.actions.NewValueAction;
+import org.apache.directory.ldapstudio.browser.ui.actions.PasteAction;
+import org.apache.directory.ldapstudio.browser.ui.actions.PropertiesAction;
+import org.apache.directory.ldapstudio.browser.ui.actions.SelectAllAction;
+import org.apache.directory.ldapstudio.browser.ui.actions.ShowRawValuesAction;
+import org.apache.directory.ldapstudio.browser.ui.actions.ValueEditorPreferencesAction;
+import org.apache.directory.ldapstudio.browser.ui.actions.proxy.BrowserActionProxy;
+import org.apache.directory.ldapstudio.browser.ui.actions.proxy.EntryEditorActionProxy;
+import org.apache.directory.ldapstudio.browser.ui.editors.entry.ShowQuickFilterAction;
+import org.apache.directory.ldapstudio.browser.ui.valueproviders.ValueProvider;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.commands.ActionHandler;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.commands.ICommandService;
+
+
+public class EntryEditorWidgetActionGroup implements IMenuListener
+{
+
+    protected OpenSortDialogAction openSortDialogAction;
+
+    protected ShowRawValuesAction showRawValuesAction;
+
+    protected ShowQuickFilterAction showQuickFilterAction;
+
+    protected OpenDefaultEditorAction openDefaultEditorAction;
+
+    protected OpenBestEditorAction openBestEditorAction;
+
+    protected OpenEditorAction[] openEditorActions;
+
+    protected ValueEditorPreferencesAction openValueEditorPreferencesAction;
+
+    protected final static String newValueAction = "newValueAction";
+
+    protected final static String copyAction = "copyAction";
+
+    protected final static String pasteAction = "pasteAction";
+
+    protected final static String deleteAction = "deleteAction";
+
+    protected final static String selectAllAction = "selectAllAction";
+
+    protected final static String propertyDialogAction = "propertyDialogAction";
+
+    protected Map entryEditorActionMap;
+
+    protected IActionBars actionBars;
+
+    private EntryEditorWidget mainWidget;
+
+
+    public EntryEditorWidgetActionGroup( EntryEditorWidget mainWidget, EntryEditorWidgetConfiguration configuration )
+    {
+
+        this.mainWidget = mainWidget;
+        this.entryEditorActionMap = new HashMap();
+        TreeViewer viewer = mainWidget.getViewer();
+
+        this.openSortDialogAction = new OpenSortDialogAction( configuration.getPreferences() );
+        this.showRawValuesAction = new ShowRawValuesAction();
+        this.showQuickFilterAction = new ShowQuickFilterAction( mainWidget.getQuickFilterWidget() );
+
+        this.openBestEditorAction = new OpenBestEditorAction( viewer, this, configuration
+            .getValueProviderManager( viewer ) );
+        this.openDefaultEditorAction = new OpenDefaultEditorAction( viewer, this.openBestEditorAction );
+        ValueProvider[] valueProviders = configuration.getValueProviderManager( viewer ).getAllValueProviders();
+        this.openEditorActions = new OpenEditorAction[valueProviders.length];
+        for ( int i = 0; i < this.openEditorActions.length; i++ )
+        {
+            this.openEditorActions[i] = new OpenEditorAction( viewer, this, configuration
+                .getValueProviderManager( viewer ), valueProviders[i] );
+        }
+        this.openValueEditorPreferencesAction = new ValueEditorPreferencesAction();
+
+        this.entryEditorActionMap.put( newValueAction, new EntryEditorActionProxy( viewer, new NewValueAction() ) );
+
+        this.entryEditorActionMap.put( pasteAction, new EntryEditorActionProxy( viewer, new PasteAction() ) );
+        this.entryEditorActionMap.put( copyAction, new EntryEditorActionProxy( viewer, new CopyAction(
+            ( BrowserActionProxy ) this.entryEditorActionMap.get( pasteAction ) ) ) );
+        this.entryEditorActionMap.put( deleteAction, new EntryEditorActionProxy( viewer, new DeleteAction() ) );
+        this.entryEditorActionMap.put( selectAllAction, new EntryEditorActionProxy( viewer,
+            new SelectAllAction( viewer ) ) );
+
+        this.entryEditorActionMap.put( propertyDialogAction,
+            new EntryEditorActionProxy( viewer, new PropertiesAction() ) );
+
+    }
+
+
+    public void dispose()
+    {
+        if ( this.mainWidget != null )
+        {
+
+            this.openSortDialogAction = null;
+            this.showQuickFilterAction.dispose();
+            this.showQuickFilterAction = null;
+            this.showRawValuesAction.dispose();
+            this.showRawValuesAction = null;
+
+            this.openDefaultEditorAction.dispose();
+            this.openDefaultEditorAction = null;
+            this.openBestEditorAction.dispose();
+            this.openBestEditorAction = null;
+            for ( int i = 0; i < this.openEditorActions.length; i++ )
+            {
+                this.openEditorActions[i].dispose();
+                this.openEditorActions[i] = null;
+            }
+            this.openValueEditorPreferencesAction.dispose();
+            this.openValueEditorPreferencesAction = null;
+
+            for ( Iterator it = this.entryEditorActionMap.keySet().iterator(); it.hasNext(); )
+            {
+                String key = ( String ) it.next();
+                EntryEditorActionProxy action = ( EntryEditorActionProxy ) this.entryEditorActionMap.get( key );
+                action.dispose();
+                action = null;
+                it.remove();
+            }
+            this.entryEditorActionMap.clear();
+            this.entryEditorActionMap = null;
+
+            this.actionBars = null;
+            this.mainWidget = null;
+        }
+
+    }
+
+
+    public void enableGlobalActionHandlers( IActionBars actionBars )
+    {
+        this.actionBars = actionBars;
+        this.activateGlobalActionHandlers();
+    }
+
+
+    public void fillToolBar( IToolBarManager toolBarManager )
+    {
+
+        toolBarManager.add( ( IAction ) this.entryEditorActionMap.get( newValueAction ) );
+        toolBarManager.add( new Separator() );
+        toolBarManager.add( ( IAction ) this.entryEditorActionMap.get( deleteAction ) );
+        toolBarManager.add( new Separator() );
+        toolBarManager.add( this.showQuickFilterAction );
+        toolBarManager.update( true );
+
+    }
+
+
+    public void fillMenu( IMenuManager menuManager )
+    {
+        menuManager.add( this.openSortDialogAction );
+        menuManager.add( this.showRawValuesAction );
+        menuManager.addMenuListener( new IMenuListener()
+        {
+            public void menuAboutToShow( IMenuManager manager )
+            {
+                showRawValuesAction.setChecked( BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
+                    BrowserUIConstants.PREFERENCE_SHOW_RAW_VALUES ) );
+            }
+        } );
+    }
+
+
+    public void fillContextMenu( IMenuManager menuManager )
+    {
+        menuManager.setRemoveAllWhenShown( true );
+        menuManager.addMenuListener( this );
+    }
+
+
+    public void menuAboutToShow( IMenuManager menuManager )
+    {
+
+        // new
+        menuManager.add( ( IAction ) this.entryEditorActionMap.get( newValueAction ) );
+        menuManager.add( new Separator() );
+
+        // copy, paste, delete
+        menuManager.add( ( IAction ) this.entryEditorActionMap.get( copyAction ) );
+        menuManager.add( ( IAction ) this.entryEditorActionMap.get( pasteAction ) );
+        menuManager.add( ( IAction ) this.entryEditorActionMap.get( deleteAction ) );
+        menuManager.add( ( IAction ) this.entryEditorActionMap.get( selectAllAction ) );
+        menuManager.add( new Separator() );
+
+        // edit
+        addEditMenu( menuManager );
+        menuManager.add( new Separator() );
+
+        // properties
+        menuManager.add( ( IAction ) this.entryEditorActionMap.get( propertyDialogAction ) );
+    }
+
+
+    protected void addEditMenu( IMenuManager menuManager )
+    {
+        // edit
+        menuManager.add( this.openDefaultEditorAction );
+        MenuManager editorMenuManager = new MenuManager( "Edit Value With" );
+        if ( this.openBestEditorAction.isEnabled() )
+        {
+            editorMenuManager.add( this.openBestEditorAction );
+            editorMenuManager.add( new Separator() );
+        }
+        for ( int i = 0; i < this.openEditorActions.length; i++ )
+        {
+            if ( this.openEditorActions[i].isEnabled()
+                && this.openEditorActions[i].getValueProvider().getClass() != this.openBestEditorAction
+                    .getBestValueProvider().getClass() )
+            {
+                editorMenuManager.add( this.openEditorActions[i] );
+            }
+        }
+        editorMenuManager.add( new Separator() );
+        editorMenuManager.add( this.openValueEditorPreferencesAction );
+        menuManager.add( editorMenuManager );
+    }
+
+
+    public void activateGlobalActionHandlers()
+    {
+
+        ICommandService commandService = ( ICommandService ) PlatformUI.getWorkbench().getAdapter(
+            ICommandService.class );
+
+        if ( this.actionBars != null )
+        {
+            actionBars.setGlobalActionHandler( ActionFactory.COPY.getId(), ( IAction ) this.entryEditorActionMap
+                .get( copyAction ) );
+            actionBars.setGlobalActionHandler( ActionFactory.PASTE.getId(), ( IAction ) this.entryEditorActionMap
+                .get( pasteAction ) );
+            actionBars.setGlobalActionHandler( ActionFactory.DELETE.getId(), ( IAction ) this.entryEditorActionMap
+                .get( deleteAction ) );
+            actionBars.setGlobalActionHandler( ActionFactory.SELECT_ALL.getId(), ( IAction ) this.entryEditorActionMap
+                .get( selectAllAction ) );
+            actionBars.setGlobalActionHandler( ActionFactory.PROPERTIES.getId(), ( IAction ) this.entryEditorActionMap
+                .get( propertyDialogAction ) );
+            actionBars.setGlobalActionHandler( ActionFactory.FIND.getId(), this.showQuickFilterAction ); // IWorkbenchActionDefinitionIds.FIND_REPLACE
+
+            actionBars.updateActionBars();
+        }
+        else
+        {
+            if ( commandService != null )
+            {
+                IAction da = ( IAction ) this.entryEditorActionMap.get( deleteAction );
+                da.setActionDefinitionId( "org.apache.directory.ldapstudio.browser.action.delete" );
+                commandService.getCommand( da.getActionDefinitionId() ).setHandler( new ActionHandler( da ) );
+
+                IAction ca = ( IAction ) this.entryEditorActionMap.get( copyAction );
+                ca.setActionDefinitionId( "org.apache.directory.ldapstudio.browser.action.copy" );
+                commandService.getCommand( ca.getActionDefinitionId() ).setHandler( new ActionHandler( ca ) );
+
+                IAction pa = ( IAction ) this.entryEditorActionMap.get( pasteAction );
+                pa.setActionDefinitionId( "org.apache.directory.ldapstudio.browser.action.paste" );
+                commandService.getCommand( pa.getActionDefinitionId() ).setHandler( new ActionHandler( pa ) );
+
+                showQuickFilterAction.setActionDefinitionId( "org.apache.directory.ldapstudio.browser.action.find" );
+                commandService.getCommand( showQuickFilterAction.getActionDefinitionId() ).setHandler(
+                    new ActionHandler( showQuickFilterAction ) );
+
+                IAction pda = ( IAction ) this.entryEditorActionMap.get( propertyDialogAction );
+                pda.setActionDefinitionId( "org.apache.directory.ldapstudio.browser.action.properties" );
+                commandService.getCommand( pda.getActionDefinitionId() ).setHandler( new ActionHandler( pda ) );
+            }
+        }
+
+        if ( commandService != null )
+        {
+            IAction nva = ( IAction ) this.entryEditorActionMap.get( newValueAction );
+            commandService.getCommand( nva.getActionDefinitionId() ).setHandler( new ActionHandler( nva ) );
+            commandService.getCommand( openDefaultEditorAction.getActionDefinitionId() ).setHandler(
+                new ActionHandler( openDefaultEditorAction ) );
+        }
+
+    }
+
+
+    public void deactivateGlobalActionHandlers()
+    {
+
+        ICommandService commandService = ( ICommandService ) PlatformUI.getWorkbench().getAdapter(
+            ICommandService.class );
+
+        if ( this.actionBars != null )
+        {
+            actionBars.setGlobalActionHandler( ActionFactory.COPY.getId(), null );
+            actionBars.setGlobalActionHandler( ActionFactory.PASTE.getId(), null );
+            actionBars.setGlobalActionHandler( ActionFactory.DELETE.getId(), null );
+            actionBars.setGlobalActionHandler( ActionFactory.SELECT_ALL.getId(), null );
+            actionBars.setGlobalActionHandler( ActionFactory.FIND.getId(), null );
+            actionBars.setGlobalActionHandler( ActionFactory.PROPERTIES.getId(), null );
+
+            actionBars.updateActionBars();
+        }
+        else
+        {
+            if ( commandService != null )
+            {
+                IAction da = ( IAction ) this.entryEditorActionMap.get( deleteAction );
+                commandService.getCommand( da.getActionDefinitionId() ).setHandler( null );
+
+                IAction ca = ( IAction ) this.entryEditorActionMap.get( copyAction );
+                commandService.getCommand( ca.getActionDefinitionId() ).setHandler( null );
+
+                IAction pa = ( IAction ) this.entryEditorActionMap.get( pasteAction );
+                commandService.getCommand( pa.getActionDefinitionId() ).setHandler( null );
+
+                commandService.getCommand( showQuickFilterAction.getActionDefinitionId() ).setHandler( null );
+
+                IAction pda = ( IAction ) this.entryEditorActionMap.get( propertyDialogAction );
+                commandService.getCommand( pda.getActionDefinitionId() ).setHandler( null );
+            }
+        }
+
+        if ( commandService != null )
+        {
+            IAction nva = ( IAction ) this.entryEditorActionMap.get( newValueAction );
+            commandService.getCommand( nva.getActionDefinitionId() ).setHandler( null );
+            commandService.getCommand( openDefaultEditorAction.getActionDefinitionId() ).setHandler( null );
+        }
+
+    }
+
+
+    public OpenBestEditorAction getOpenBestEditorAction()
+    {
+        return openBestEditorAction;
+    }
+
+
+    public OpenDefaultEditorAction getOpenDefaultEditorAction()
+    {
+        return openDefaultEditorAction;
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetCellModifier.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetCellModifier.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetCellModifier.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetCellModifier.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,149 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+import org.apache.directory.ldapstudio.browser.core.model.ModelModificationException;
+import org.apache.directory.ldapstudio.browser.core.model.schema.SchemaUtils;
+import org.apache.directory.ldapstudio.browser.ui.valueproviders.ValueProviderManager;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Item;
+
+
+public class EntryEditorWidgetCellModifier implements ICellModifier
+{
+
+    private ValueProviderManager valueProviderManager;
+
+
+    public EntryEditorWidgetCellModifier( ValueProviderManager valueProviderManager )
+    {
+        this.valueProviderManager = valueProviderManager;
+    }
+
+
+    public void dispose()
+    {
+        this.valueProviderManager = null;
+    }
+
+
+    public boolean canModify( Object element, String property )
+    {
+        if ( element != null && element instanceof IValue )
+        {
+            IValue attributeValue = ( IValue ) element;
+
+            if ( !SchemaUtils.isModifyable( attributeValue.getAttribute().getAttributeTypeDescription() ) )
+            {
+                return false;
+            }
+            if ( attributeValue.isRdnPart() )
+            {
+                return false;
+            }
+            if ( EntryEditorWidgetTableMetadata.KEY_COLUMN_NAME.equals( property ) )
+            {
+                return false;
+            }
+            if ( EntryEditorWidgetTableMetadata.VALUE_COLUMN_NAME.equals( property ) )
+            {
+                return this.valueProviderManager.getCurrentValueProvider( attributeValue ).getRawValue( attributeValue ) != null;
+            }
+        }
+
+        return false;
+    }
+
+
+    public Object getValue( Object element, String property )
+    {
+        if ( element != null && element instanceof IValue )
+        {
+            IValue attributeValue = ( IValue ) element;
+            Object returnValue;
+            if ( EntryEditorWidgetTableMetadata.KEY_COLUMN_NAME.equals( property ) )
+            {
+                returnValue = attributeValue.getAttribute().getDescription();
+            }
+            else if ( EntryEditorWidgetTableMetadata.VALUE_COLUMN_NAME.equals( property ) )
+            {
+                returnValue = this.valueProviderManager.getCurrentValueProvider( attributeValue ).getRawValue(
+                    attributeValue );
+            }
+            else
+            {
+                returnValue = "";
+            }
+            return returnValue;
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    public void modify( Object element, String property, Object newRawValue )
+    {
+
+        if ( element != null && element instanceof Item )
+        {
+            element = ( ( Item ) element ).getData();
+        }
+
+        if ( element != null && element instanceof IValue )
+        {
+            IValue attributeValue = ( IValue ) element;
+
+            if ( EntryEditorWidgetTableMetadata.KEY_COLUMN_NAME.equals( property ) )
+            {
+                // no modification
+            }
+            else if ( EntryEditorWidgetTableMetadata.VALUE_COLUMN_NAME.equals( property ) )
+            {
+                try
+                {
+                    this.valueProviderManager.getCurrentValueProvider( attributeValue ).modify( attributeValue,
+                        newRawValue );
+                }
+                catch ( ModelModificationException mme )
+                {
+                    MessageDialog.openError( Display.getDefault().getActiveShell(), "Error While Modifying Value", mme
+                        .getMessage() );
+                }
+            }
+            else
+            {
+                // no modification
+            }
+        }
+        else
+        {
+            ;
+        }
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetConfiguration.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetConfiguration.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetConfiguration.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetConfiguration.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,153 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import org.apache.directory.ldapstudio.browser.ui.valueproviders.ValueProviderManager;
+import org.eclipse.jface.viewers.TreeViewer;
+
+
+public class EntryEditorWidgetConfiguration
+{
+
+    private boolean disposed = false;
+
+    protected EntryEditorWidgetSorter sorter;
+
+    protected EntryEditorWidgetFilter filter;
+
+    protected EntryEditorWidgetPreferences preferences;
+
+    protected EntryEditorWidgetContentProvider contentProvider;
+
+    protected EntryEditorWidgetLabelProvider labelProvider;
+
+    protected EntryEditorWidgetCellModifier cellModifier;
+
+    protected ValueProviderManager valueProviderManager;
+
+
+    public EntryEditorWidgetConfiguration()
+    {
+    }
+
+
+    public void dispose()
+    {
+        if ( !this.disposed )
+        {
+
+            if ( this.sorter != null )
+                this.sorter.dispose();
+            this.sorter = null;
+
+            if ( this.filter != null )
+                this.filter.dispose();
+            this.filter = null;
+
+            if ( this.preferences != null )
+                this.preferences.dispose();
+            this.preferences = null;
+
+            if ( this.contentProvider != null )
+                this.contentProvider.dispose();
+            this.contentProvider = null;
+
+            if ( this.labelProvider != null )
+                this.labelProvider.dispose();
+            this.labelProvider = null;
+
+            if ( this.cellModifier != null )
+                this.cellModifier.dispose();
+            this.cellModifier = null;
+
+            if ( this.valueProviderManager != null )
+                this.valueProviderManager.dispose();
+            this.valueProviderManager = null;
+
+            this.disposed = true;
+        }
+    }
+
+
+    public EntryEditorWidgetContentProvider getContentProvider( EntryEditorWidget mainWidget )
+    {
+        if ( this.contentProvider == null )
+            this.contentProvider = new EntryEditorWidgetContentProvider( this.getPreferences(), mainWidget );
+
+        return contentProvider;
+    }
+
+
+    public EntryEditorWidgetLabelProvider getLabelProvider( TreeViewer viewer )
+    {
+        if ( this.labelProvider == null )
+            this.labelProvider = new EntryEditorWidgetLabelProvider( this.getValueProviderManager( viewer ) );
+
+        return labelProvider;
+    }
+
+
+    public EntryEditorWidgetCellModifier getCellModifier( TreeViewer viewer )
+    {
+        if ( this.cellModifier == null )
+            this.cellModifier = new EntryEditorWidgetCellModifier( this.getValueProviderManager( viewer ) );
+
+        return cellModifier;
+    }
+
+
+    public ValueProviderManager getValueProviderManager( TreeViewer viewer )
+    {
+        if ( this.valueProviderManager == null )
+            this.valueProviderManager = new ValueProviderManager( viewer.getTree() );
+
+        return valueProviderManager;
+    }
+
+
+    public EntryEditorWidgetSorter getSorter()
+    {
+        if ( this.sorter == null )
+            this.sorter = new EntryEditorWidgetSorter( getPreferences() );
+
+        return sorter;
+    }
+
+
+    public EntryEditorWidgetFilter getFilter()
+    {
+        if ( this.filter == null )
+            this.filter = new EntryEditorWidgetFilter();
+
+        return filter;
+    }
+
+
+    public EntryEditorWidgetPreferences getPreferences()
+    {
+        if ( this.preferences == null )
+            this.preferences = new EntryEditorWidgetPreferences();
+
+        return preferences;
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetContentProvider.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetContentProvider.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetContentProvider.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetContentProvider.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,185 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.ldapstudio.browser.core.jobs.InitializeAttributesJob;
+import org.apache.directory.ldapstudio.browser.core.model.AttributeHierachie;
+import org.apache.directory.ldapstudio.browser.core.model.IAttribute;
+import org.apache.directory.ldapstudio.browser.core.model.IEntry;
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIConstants;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIPlugin;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+
+public class EntryEditorWidgetContentProvider implements ITreeContentProvider
+{
+
+    protected EntryEditorWidgetPreferences preferences;
+
+    protected EntryEditorWidget mainWidget;
+
+
+    public EntryEditorWidgetContentProvider( EntryEditorWidgetPreferences preferences, EntryEditorWidget mainWidget )
+    {
+        this.preferences = preferences;
+        this.mainWidget = mainWidget;
+    }
+
+
+    public void inputChanged( Viewer viewer, Object oldInput, Object newInput )
+    {
+
+        String dn = "";
+        boolean enabled = true;
+
+        if ( newInput != null && newInput instanceof IEntry )
+        {
+            IEntry entry = ( IEntry ) newInput;
+            dn = "DN: " + entry.getDn().toString();
+        }
+        else if ( newInput != null && newInput instanceof AttributeHierachie )
+        {
+            AttributeHierachie ah = ( AttributeHierachie ) newInput;
+            dn = "DN: " + ah.getAttribute().getEntry().getDn().toString();
+        }
+        else
+        {
+            dn = "No entry selected";
+            enabled = false;
+        }
+
+        if ( this.mainWidget.getInfoText() != null && !this.mainWidget.getInfoText().isDisposed() )
+        {
+            this.mainWidget.getInfoText().setText( dn );
+        }
+        if ( this.mainWidget.getQuickFilterWidget() != null )
+        {
+            this.mainWidget.getQuickFilterWidget().setEnabled( enabled );
+        }
+        if ( this.mainWidget.getViewer() != null && !this.mainWidget.getViewer().getTree().isDisposed() )
+        {
+            this.mainWidget.getViewer().getTree().setEnabled( enabled );
+        }
+    }
+
+
+    public void dispose()
+    {
+    }
+
+
+    public Object[] getElements( Object inputElement )
+    {
+
+        if ( inputElement != null && inputElement instanceof IEntry )
+        {
+            IEntry entry = ( IEntry ) inputElement;
+
+            if ( !entry.isAttributesInitialized() && entry.isDirectoryEntry() )
+            {
+                boolean soa = BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
+                    BrowserUIConstants.PREFERENCE_ENTRYEDITOR_SHOW_OPERATIONAL_ATTRIBUTES );
+                InitializeAttributesJob job = new InitializeAttributesJob( new IEntry[]
+                    { entry }, soa );
+                job.execute();
+                return new Object[]
+                    {};
+            }
+            else
+            {
+                IAttribute[] attributes = entry.getAttributes();
+                Object[] values = getValues( attributes );
+                return values;
+            }
+        }
+        else if ( inputElement != null && inputElement instanceof AttributeHierachie )
+        {
+            AttributeHierachie ah = ( AttributeHierachie ) inputElement;
+            IAttribute[] attributes = ah.getAttributes();
+            Object[] values = getValues( attributes );
+            return values;
+        }
+        else
+        {
+            return new Object[]
+                {};
+        }
+    }
+
+
+    private Object[] getValues( IAttribute[] attributes )
+    {
+        List valueList = new ArrayList();
+        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
+            {
+                valueList.add( attributes[i] );
+            }
+        }
+        return valueList.toArray();
+    }
+
+
+    public Object[] getChildren( Object parentElement )
+    {
+        if ( parentElement instanceof IAttribute )
+        {
+            IAttribute attribute = ( IAttribute ) parentElement;
+            IValue[] values = attribute.getValues();
+            return values;
+        }
+        return null;
+    }
+
+
+    public Object getParent( Object element )
+    {
+        if ( element instanceof IValue )
+        {
+            return ( ( IValue ) element ).getAttribute();
+        }
+        return null;
+    }
+
+
+    public boolean hasChildren( Object element )
+    {
+        return ( element instanceof IAttribute );
+    }
+
+}
\ No newline at end of file

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetFilter.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetFilter.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetFilter.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetFilter.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,220 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import java.util.ArrayList;
+
+import org.apache.directory.ldapstudio.browser.core.model.IAttribute;
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+
+public class EntryEditorWidgetFilter extends ViewerFilter
+{
+
+    protected TreeViewer viewer;
+
+    protected String quickFilterAttribute;
+
+    protected String quickFilterValue;
+
+
+    public EntryEditorWidgetFilter()
+    {
+        this.quickFilterAttribute = "";
+        this.quickFilterValue = "";
+    }
+
+
+    public void connect( TreeViewer viewer )
+    {
+        this.viewer = viewer;
+        this.viewer.addFilter( this );
+    }
+
+
+    public Object[] filter( Viewer viewer, Object parent, Object[] elements )
+    {
+
+        int size = elements.length;
+        ArrayList out = new ArrayList( size );
+        for ( int i = 0; i < size; ++i )
+        {
+            Object element = elements[i];
+            if ( select( viewer, parent, element ) )
+                out.add( element );
+        }
+
+        return out.toArray();
+    }
+
+
+    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 ( this.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 ( !this.goesThroughQuickFilter( value ) )
+            {
+                return false;
+            }
+
+            // filter attribute types
+            if ( value.getAttribute().isObjectClassAttribute() )
+                return this.isShowObjectClassAttribute();
+            else if ( value.getAttribute().isMustAttribute() )
+                return this.isShowMustAttributes();
+            else if ( value.getAttribute().isMayAttribute() )
+                return this.isShowMayAttributes();
+            else if ( value.getAttribute().isOperationalAttribute() )
+                return this.isShowOperationalAttributes();
+            else
+                return true;
+        }
+        else
+        {
+            return true;
+        }
+    }
+
+
+    private boolean goesThroughQuickFilter( IValue value )
+    {
+        // filter attribute description
+        if ( this.quickFilterAttribute != null && !"".equals( this.quickFilterAttribute ) )
+        {
+            if ( value.getAttribute().getDescription().toUpperCase().indexOf( this.quickFilterAttribute.toUpperCase() ) == -1 )
+            {
+                return false;
+            }
+        }
+
+        // fitler value
+        if ( this.quickFilterValue != null && !"".equals( this.quickFilterValue ) )
+        {
+            if ( value.isString()
+                && value.getStringValue().toUpperCase().indexOf( this.quickFilterValue.toUpperCase() ) == -1 )
+            {
+                return false;
+            }
+            else if ( value.isBinary() )
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+
+    public void dispose()
+    {
+        this.viewer = null;
+    }
+
+
+    public String getQuickFilterAttribute()
+    {
+        return quickFilterAttribute;
+    }
+
+
+    public void setQuickFilterAttribute( String quickFilterAttribute )
+    {
+        if ( !this.quickFilterAttribute.equals( quickFilterAttribute ) )
+        {
+            this.quickFilterAttribute = quickFilterAttribute;
+            if ( this.viewer != null )
+                this.viewer.refresh();
+        }
+    }
+
+
+    public String getQuickFilterValue()
+    {
+        return quickFilterValue;
+    }
+
+
+    public void setQuickFilterValue( String quickFilterValue )
+    {
+        if ( !this.quickFilterValue.equals( quickFilterValue ) )
+        {
+            this.quickFilterValue = quickFilterValue;
+            if ( this.viewer != null )
+                this.viewer.refresh();
+        }
+    }
+
+
+    public boolean isShowMayAttributes()
+    {
+        return true;
+    }
+
+
+    public boolean isShowMustAttributes()
+    {
+        return true;
+    }
+
+
+    public boolean isShowObjectClassAttribute()
+    {
+        return true;
+    }
+
+
+    public boolean isShowOperationalAttributes()
+    {
+        return true;
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetLabelProvider.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetLabelProvider.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetLabelProvider.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetLabelProvider.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,251 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import org.apache.directory.ldapstudio.browser.core.model.IAttribute;
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIConstants;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIPlugin;
+import org.apache.directory.ldapstudio.browser.ui.valueproviders.ValueProvider;
+import org.apache.directory.ldapstudio.browser.ui.valueproviders.ValueProviderManager;
+
+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;
+
+
+public class EntryEditorWidgetLabelProvider extends LabelProvider implements ITableLabelProvider, IFontProvider,
+    IColorProvider
+{
+
+    private ValueProviderManager valueProviderManager;
+
+
+    public EntryEditorWidgetLabelProvider( ValueProviderManager valueProviderManager )
+    {
+        this.valueProviderManager = valueProviderManager;
+    }
+
+
+    public void dispose()
+    {
+        super.dispose();
+        this.valueProviderManager = null;
+    }
+
+
+    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:
+                    ValueProvider vp = this.valueProviderManager.getCurrentValueProvider( 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 "";
+        }
+    }
+
+
+    public final Image getColumnImage( Object element, int index )
+    {
+        return null;
+    }
+
+
+    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( BrowserUIPlugin.getDefault()
+                    .getPreferenceStore(), BrowserUIConstants.PREFERENCE_ERROR_FONT );
+                return BrowserUIPlugin.getDefault().getFont( fontData );
+            }
+        }
+        if ( attribute != null && value == null )
+        {
+            if ( !attribute.isConsistent() )
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserUIPlugin.getDefault()
+                    .getPreferenceStore(), BrowserUIConstants.PREFERENCE_ERROR_FONT );
+                return BrowserUIPlugin.getDefault().getFont( fontData );
+            }
+        }
+
+        // attribute type
+        if ( attribute != null )
+        {
+            if ( attribute.isObjectClassAttribute() )
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserUIPlugin.getDefault()
+                    .getPreferenceStore(), BrowserUIConstants.PREFERENCE_OBJECTCLASS_FONT );
+                return BrowserUIPlugin.getDefault().getFont( fontData );
+            }
+            else if ( attribute.isMustAttribute() )
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserUIPlugin.getDefault()
+                    .getPreferenceStore(), BrowserUIConstants.PREFERENCE_MUSTATTRIBUTE_FONT );
+                return BrowserUIPlugin.getDefault().getFont( fontData );
+            }
+            else if ( attribute.isOperationalAttribute() )
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserUIPlugin.getDefault()
+                    .getPreferenceStore(), BrowserUIConstants.PREFERENCE_OPERATIONALATTRIBUTE_FONT );
+                return BrowserUIPlugin.getDefault().getFont( fontData );
+            }
+            else
+            {
+                FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserUIPlugin.getDefault()
+                    .getPreferenceStore(), BrowserUIConstants.PREFERENCE_MAYATTRIBUTE_FONT );
+                return BrowserUIPlugin.getDefault().getFont( fontData );
+            }
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    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( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                    BrowserUIConstants.PREFERENCE_ERROR_COLOR );
+                return BrowserUIPlugin.getDefault().getColor( rgb );
+            }
+        }
+        if ( attribute != null && value == null )
+        {
+            if ( !attribute.isConsistent() )
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                    BrowserUIConstants.PREFERENCE_ERROR_COLOR );
+                return BrowserUIPlugin.getDefault().getColor( rgb );
+            }
+        }
+
+        // attribute type
+        if ( attribute != null )
+        {
+            if ( attribute.isObjectClassAttribute() )
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                    BrowserUIConstants.PREFERENCE_OBJECTCLASS_COLOR );
+                return BrowserUIPlugin.getDefault().getColor( rgb );
+            }
+            else if ( attribute.isMustAttribute() )
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                    BrowserUIConstants.PREFERENCE_MUSTATTRIBUTE_COLOR );
+                return BrowserUIPlugin.getDefault().getColor( rgb );
+            }
+            else if ( attribute.isOperationalAttribute() )
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                    BrowserUIConstants.PREFERENCE_OPERATIONALATTRIBUTE_COLOR );
+                return BrowserUIPlugin.getDefault().getColor( rgb );
+            }
+            else
+            {
+                RGB rgb = PreferenceConverter.getColor( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                    BrowserUIConstants.PREFERENCE_MAYATTRIBUTE_COLOR );
+                return BrowserUIPlugin.getDefault().getColor( rgb );
+            }
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    public Color getBackground( Object element )
+    {
+        return null;
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetPreferences.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetPreferences.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetPreferences.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetPreferences.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,135 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIConstants;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIPlugin;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+
+
+public class EntryEditorWidgetPreferences implements IPropertyChangeListener
+{
+
+    protected Viewer viewer;
+
+
+    public EntryEditorWidgetPreferences()
+    {
+        BrowserUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener( this );
+    }
+
+
+    public void connect( TreeViewer viewer )
+    {
+        this.viewer = viewer;
+    }
+
+
+    public void dispose()
+    {
+        BrowserUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener( this );
+        this.viewer = null;
+    }
+
+
+    public boolean isUseFolding()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_ENABLE_FOLDING );
+    }
+
+
+    public int getFoldingThreshold()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getInt(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_FOLDING_THRESHOLD );
+    }
+
+
+    public boolean isShowMayAttributes()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_SHOW_MAY_ATTRIBUTES );
+    }
+
+
+    public boolean isShowMustAttributes()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_SHOW_MUST_ATTRIBUTES );
+    }
+
+
+    public boolean isShowObjectClassAttribute()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_SHOW_OBJECTCLASS_ATTRIBUTES );
+    }
+
+
+    public boolean isShowOperationalAttributes()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_SHOW_OPERATIONAL_ATTRIBUTES );
+    }
+
+
+    public boolean isObjectClassAndMustAttributesFirst()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_OBJECTCLASS_AND_MUST_ATTRIBUTES_FIRST );
+    }
+
+
+    public boolean isOperationalAttributesLast()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_OPERATIONAL_ATTRIBUTES_LAST );
+    }
+
+
+    public int getDefaultSortBy()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getInt(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_DEFAULT_SORT_BY );
+    }
+
+
+    public int getDefaultSortOrder()
+    {
+        return BrowserUIPlugin.getDefault().getPreferenceStore().getInt(
+            BrowserUIConstants.PREFERENCE_ENTRYEDITOR_DEFAULT_SORT_ORDER );
+    }
+
+
+    public void propertyChange( PropertyChangeEvent event )
+    {
+        if ( this.viewer != null )
+        {
+            this.viewer.refresh();
+        }
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetQuickFilterWidget.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetQuickFilterWidget.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetQuickFilterWidget.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetQuickFilterWidget.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,233 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIConstants;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIPlugin;
+import org.apache.directory.ldapstudio.browser.ui.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;
+
+
+public class EntryEditorWidgetQuickFilterWidget
+{
+
+    private EntryEditorWidgetFilter filter;
+
+    private EntryEditorWidget entryEditorWidget;
+
+    private Composite parent;
+
+    private Composite composite;
+
+    private Composite innerComposite;
+
+    private Text quickFilterAttributeText;
+
+    private Text quickFilterValueText;
+
+    private Button clearQuickFilterButton;
+
+
+    public EntryEditorWidgetQuickFilterWidget( EntryEditorWidgetFilter filter, EntryEditorWidget entryEditorWidget )
+    {
+        this.filter = filter;
+        this.entryEditorWidget = entryEditorWidget;
+    }
+
+
+    public void createComposite( Composite parent )
+    {
+        this.parent = parent;
+
+        this.composite = BaseWidgetUtils.createColumnContainer( parent, 1, 1 );
+        GridLayout gl = new GridLayout();
+        gl.marginHeight = 2;
+        gl.marginWidth = 2;
+        composite.setLayout( gl );
+
+        this.innerComposite = null;
+    }
+
+
+    private void create()
+    {
+        innerComposite = BaseWidgetUtils.createColumnContainer( this.composite, 3, 1 );
+
+        this.quickFilterAttributeText = new Text( innerComposite, SWT.BORDER );
+        this.quickFilterAttributeText.setLayoutData( new GridData( 200 - 14, SWT.DEFAULT ) );
+        this.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( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                        BrowserUIConstants.PREFERENCE_QUICKFILTER_FOREGROUND_COLOR );
+                    RGB bgRgb = PreferenceConverter.getColor( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                        BrowserUIConstants.PREFERENCE_QUICKFILTER_BACKGROUND_COLOR );
+                    Color fgColor = BrowserUIPlugin.getDefault().getColor( fgRgb );
+                    Color bgColor = BrowserUIPlugin.getDefault().getColor( bgRgb );
+                    quickFilterAttributeText.setForeground( fgColor );
+                    quickFilterAttributeText.setBackground( bgColor );
+                    FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserUIPlugin.getDefault()
+                        .getPreferenceStore(), BrowserUIConstants.PREFERENCE_QUICKFILTER_FONT );
+                    Font font = BrowserUIPlugin.getDefault().getFont( fontData );
+                    quickFilterAttributeText.setFont( font );
+                }
+                else
+                {
+                    quickFilterAttributeText.setBackground( null );
+                }
+            }
+        } );
+
+        this.quickFilterValueText = new Text( innerComposite, SWT.BORDER );
+        this.quickFilterValueText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
+        this.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( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                        BrowserUIConstants.PREFERENCE_QUICKFILTER_FOREGROUND_COLOR );
+                    RGB bgRgb = PreferenceConverter.getColor( BrowserUIPlugin.getDefault().getPreferenceStore(),
+                        BrowserUIConstants.PREFERENCE_QUICKFILTER_BACKGROUND_COLOR );
+                    Color fgColor = BrowserUIPlugin.getDefault().getColor( fgRgb );
+                    Color bgColor = BrowserUIPlugin.getDefault().getColor( bgRgb );
+                    quickFilterValueText.setForeground( fgColor );
+                    quickFilterValueText.setBackground( bgColor );
+                    FontData[] fontData = PreferenceConverter.getFontDataArray( BrowserUIPlugin.getDefault()
+                        .getPreferenceStore(), BrowserUIConstants.PREFERENCE_QUICKFILTER_FONT );
+                    Font font = BrowserUIPlugin.getDefault().getFont( fontData );
+                    quickFilterValueText.setFont( font );
+                }
+                else
+                {
+                    quickFilterValueText.setBackground( null );
+                }
+            }
+        } );
+
+        this.clearQuickFilterButton = new Button( innerComposite, SWT.PUSH );
+        this.clearQuickFilterButton.setToolTipText( "Clear Quick Filter" );
+        this.clearQuickFilterButton.setImage( BrowserUIPlugin.getDefault().getImage( BrowserUIConstants.IMG_CLEAR ) );
+        this.clearQuickFilterButton.setEnabled( false );
+        this.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 );
+    }
+
+
+    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 );
+    }
+
+
+    public void dispose()
+    {
+        if ( this.filter != null )
+        {
+            this.quickFilterAttributeText = null;
+            this.quickFilterValueText = null;
+            this.clearQuickFilterButton = null;
+            this.innerComposite = null;
+            this.composite.dispose();
+            this.composite = null;
+            this.parent = null;
+            this.filter = null;
+        }
+    }
+
+
+    public void setEnabled( boolean enabled )
+    {
+        if ( this.composite != null && !this.composite.isDisposed() )
+        {
+            this.composite.setEnabled( enabled );
+        }
+        if ( this.innerComposite != null && !this.innerComposite.isDisposed() )
+        {
+            this.innerComposite.setEnabled( enabled );
+            this.quickFilterAttributeText.setEnabled( enabled );
+            this.quickFilterValueText.setEnabled( enabled );
+            this.clearQuickFilterButton.setEnabled( enabled );
+        }
+    }
+
+
+    public void setActive( boolean visible )
+    {
+        if ( visible && this.innerComposite == null && composite != null )
+        {
+            create();
+            this.quickFilterAttributeText.setFocus();
+        }
+        else if ( !visible && this.innerComposite != null && composite != null )
+        {
+            destroy();
+            this.entryEditorWidget.getViewer().getTree().setFocus();
+        }
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetSorter.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetSorter.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetSorter.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetSorter.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,378 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.apache.directory.ldapstudio.browser.core.BrowserCoreConstants;
+import org.apache.directory.ldapstudio.browser.core.model.IAttribute;
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIConstants;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIPlugin;
+
+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;
+
+
+public class EntryEditorWidgetSorter extends ViewerSorter implements SelectionListener
+{
+
+    private TreeViewer viewer;
+
+    private int sortBy;
+
+    private int sortOrder;
+
+    private EntryEditorWidgetPreferences preferences;
+
+
+    public EntryEditorWidgetSorter( EntryEditorWidgetPreferences preferences )
+    {
+        this.sortBy = BrowserCoreConstants.SORT_BY_NONE;
+        this.sortOrder = BrowserCoreConstants.SORT_ORDER_NONE;
+        this.preferences = preferences;
+    }
+
+
+    public void connect( TreeViewer viewer )
+    {
+        this.viewer = viewer;
+        this.viewer.setSorter( this );
+
+        TreeColumn[] columns = ( ( TreeViewer ) viewer ).getTree().getColumns();
+        for ( int i = 0; i < columns.length; i++ )
+        {
+            columns[i].addSelectionListener( this );
+        }
+    }
+
+
+    public void dispose()
+    {
+        /*
+         * TableColumn[] columns = this.viewer.getTable().getColumns(); for(int
+         * i=0; i <columns.length; i++) {
+         * columns[i].removeSelectionListener(this); }
+         */
+        this.viewer = null;
+    }
+
+
+    public void widgetDefaultSelected( SelectionEvent e )
+    {
+    }
+
+
+    public void widgetSelected( SelectionEvent e )
+    {
+        if ( e.widget instanceof TreeColumn && this.viewer != null )
+        {
+
+            int index = this.viewer.getTree().indexOf( ( ( TreeColumn ) e.widget ) );
+            switch ( index )
+            {
+                case EntryEditorWidgetTableMetadata.KEY_COLUMN_INDEX:
+                    if ( this.sortBy == BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION )
+                    {
+                        // toggle sort order
+                        this.sortOrder = this.sortOrder == BrowserCoreConstants.SORT_ORDER_NONE ? BrowserCoreConstants.SORT_ORDER_ASCENDING
+                            : this.sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? BrowserCoreConstants.SORT_ORDER_DESCENDING
+                                : BrowserCoreConstants.SORT_ORDER_NONE;
+                    }
+                    else
+                    {
+                        // set new sort by
+                        this.sortBy = BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION;
+                        this.sortOrder = BrowserCoreConstants.SORT_ORDER_ASCENDING;
+                    }
+                    break;
+                case EntryEditorWidgetTableMetadata.VALUE_COLUMN_INDEX:
+                    if ( this.sortBy == BrowserCoreConstants.SORT_BY_VALUE )
+                    {
+                        // toggle sort order
+                        this.sortOrder = this.sortOrder == BrowserCoreConstants.SORT_ORDER_NONE ? BrowserCoreConstants.SORT_ORDER_ASCENDING
+                            : this.sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? BrowserCoreConstants.SORT_ORDER_DESCENDING
+                                : BrowserCoreConstants.SORT_ORDER_NONE;
+                    }
+                    else
+                    {
+                        // set new sort by
+                        this.sortBy = BrowserCoreConstants.SORT_BY_VALUE;
+                        this.sortOrder = BrowserCoreConstants.SORT_ORDER_ASCENDING;
+                    }
+                    break;
+                default:
+                    ;
+            }
+            if ( this.sortOrder == BrowserCoreConstants.SORT_ORDER_NONE )
+            {
+                this.sortBy = BrowserCoreConstants.SORT_BY_NONE;
+            }
+
+            TreeColumn[] columns = this.viewer.getTree().getColumns();
+            for ( int i = 0; i < columns.length; i++ )
+            {
+                columns[i].setImage( null );
+            }
+
+            if ( this.sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING )
+            {
+                ( ( TreeColumn ) e.widget ).setImage( BrowserUIPlugin.getDefault().getImage(
+                    BrowserUIConstants.IMG_SORT_ASCENDING ) );
+            }
+            else if ( this.sortOrder == BrowserCoreConstants.SORT_ORDER_DESCENDING )
+            {
+                ( ( TreeColumn ) e.widget ).setImage( BrowserUIPlugin.getDefault().getImage(
+                    BrowserUIConstants.IMG_SORT_DESCENDING ) );
+            }
+
+            this.viewer.refresh();
+        }
+    }
+
+
+    public void sort( final Viewer viewer, Object[] elements )
+    {
+
+        Arrays.sort( elements, new Comparator()
+        {
+            public int compare( Object a, Object b )
+            {
+                return EntryEditorWidgetSorter.this.compare( viewer, a, b );
+            }
+        } );
+
+    }
+
+
+    public int compare( Viewer viewer, Object o1, Object o2 )
+    {
+
+        // System.out.println("compare() " + o1 + " - " + o2);
+
+        // if (o1 == null && o2 == null) {
+        // return this.equal();
+        // }
+        // else if (o1 == null && o2 != null) {
+        // return this.lessThan();
+        // }
+        // else if (o1 != null && o2 == null) {
+        // return this.greaterThan();
+        // }
+        // else {
+        IAttribute attribute1 = null;
+        IValue value1 = null;
+        if ( o1 instanceof IAttribute )
+        {
+            attribute1 = ( IAttribute ) o1;
+        }
+        else if ( o1 instanceof IValue )
+        {
+            value1 = ( IValue ) o1;
+            attribute1 = value1.getAttribute();
+        }
+
+        IAttribute attribute2 = null;
+        IValue value2 = null;
+        if ( o2 instanceof IAttribute )
+        {
+            attribute2 = ( IAttribute ) o2;
+        }
+        else if ( o2 instanceof IValue )
+        {
+            value2 = ( IValue ) o2;
+            attribute2 = value2.getAttribute();
+        }
+
+        if ( value1 != null && value2 != null )
+        {
+            if ( this.getSortByOrDefault() == BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION )
+            {
+                if ( value1.getAttribute() != value2.getAttribute() )
+                {
+                    return this.compareAttributeNames( value1.getAttribute(), value2.getAttribute() );
+                }
+                else
+                {
+                    return this.compareValues( value1, value2 );
+                }
+            }
+            else if ( this.getSortByOrDefault() == BrowserCoreConstants.SORT_BY_VALUE )
+            {
+                return this.compareValues( value1, value2 );
+            }
+            else
+            {
+                return this.equal();
+            }
+        }
+        else if ( attribute1 != null && attribute2 != null )
+        {
+            return this.compareAttributeNames( attribute1, attribute2 );
+        }
+        else
+        {
+            return this.equal();
+        }
+
+        // }
+    }
+
+
+    private int compareAttributeNames( 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() );
+    }
+
+
+    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 if ((value1.isString()) && !(value2.isString())) {
+        // return lessThan();
+        // }
+        // else if ((value2.isString()) && !(value1.isString())) {
+        // return greaterThan();
+        // }
+        // else if ((value1.isString()) && (value2.isString())) {
+        // return compare(value1.getStringValue(), value2.getStringValue());
+        // }
+        // else {
+        // return equal();
+        // }
+        else
+        {
+            return compare( value1.getStringValue(), value2.getStringValue() );
+        }
+    }
+
+
+    private int getSortOrderOrDefault()
+    {
+        if ( preferences == null )
+        {
+            return BrowserCoreConstants.SORT_ORDER_ASCENDING;
+        }
+        else if ( this.sortOrder == BrowserCoreConstants.SORT_ORDER_NONE )
+        {
+            return preferences.getDefaultSortOrder();
+        }
+        else
+        {
+            return this.sortOrder;
+        }
+    }
+
+
+    private int getSortByOrDefault()
+    {
+        if ( preferences == null )
+        {
+            return BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION;
+        }
+        else if ( this.sortBy == BrowserCoreConstants.SORT_BY_NONE )
+        {
+            return preferences.getDefaultSortBy();
+        }
+        else
+        {
+            return this.sortBy;
+        }
+    }
+
+
+    private int lessThan()
+    {
+        return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? -1 : 1;
+    }
+
+
+    private int equal()
+    {
+        return 0;
+    }
+
+
+    private int greaterThan()
+    {
+        return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? 1 : -1;
+    }
+
+
+    private int compare( String s1, String s2 )
+    {
+        return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? s1.compareToIgnoreCase( s2 )
+            : s2.compareToIgnoreCase( s1 );
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetSorterDialog.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetSorterDialog.java?view=auto&rev=488371
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetSorterDialog.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-ui/src/org/apache/directory/ldapstudio/browser/ui/widgets/entryeditor/EntryEditorWidgetSorterDialog.java Mon Dec 18 09:57:38 2006
@@ -0,0 +1,159 @@
+/*
+ *  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.ldapstudio.browser.ui.widgets.entryeditor;
+
+
+import org.apache.directory.ldapstudio.browser.core.BrowserCoreConstants;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIConstants;
+import org.apache.directory.ldapstudio.browser.ui.BrowserUIPlugin;
+import org.apache.directory.ldapstudio.browser.ui.widgets.BaseWidgetUtils;
+
+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;
+
+
+public class EntryEditorWidgetSorterDialog extends Dialog
+{
+
+    public static final String DIALOG_TITLE = "Entry Editor Sorting";
+
+    public static final String SORT_BY_NONE = "No Default Sorting";
+
+    public static final String SORT_BY_ATTRIBUTE = "Attribute Description";
+
+    public static final String SORT_BY_VALUE = "Value";
+
+    private EntryEditorWidgetPreferences preferences;
+
+    private Button objectClassAndMustAttributesFirstButton;
+
+    private Button operationalAttributesLastButton;
+
+    private Combo sortByCombo;
+
+    private Button sortAcendingButton;
+
+    private Button sortDescendingButton;
+
+
+    public EntryEditorWidgetSorterDialog( Shell parentShell, EntryEditorWidgetPreferences preferences )
+    {
+        super( parentShell );
+        this.preferences = preferences;
+    }
+
+
+    protected void configureShell( Shell newShell )
+    {
+        super.configureShell( newShell );
+        newShell.setText( DIALOG_TITLE );
+    }
+
+
+    protected void buttonPressed( int buttonId )
+    {
+        if ( buttonId == IDialogConstants.OK_ID )
+        {
+            IPreferenceStore store = BrowserUIPlugin.getDefault().getPreferenceStore();
+            store.setValue( BrowserUIConstants.PREFERENCE_ENTRYEDITOR_OBJECTCLASS_AND_MUST_ATTRIBUTES_FIRST,
+                this.objectClassAndMustAttributesFirstButton.getSelection() );
+            store.setValue( BrowserUIConstants.PREFERENCE_ENTRYEDITOR_OPERATIONAL_ATTRIBUTES_LAST,
+                this.operationalAttributesLastButton.getSelection() );
+            store.setValue( BrowserUIConstants.PREFERENCE_ENTRYEDITOR_DEFAULT_SORT_ORDER, this.sortDescendingButton
+                .getSelection() ? BrowserCoreConstants.SORT_ORDER_DESCENDING
+                : BrowserCoreConstants.SORT_ORDER_ASCENDING );
+            store.setValue( BrowserUIConstants.PREFERENCE_ENTRYEDITOR_DEFAULT_SORT_BY, this.sortByCombo
+                .getSelectionIndex() == 2 ? BrowserCoreConstants.SORT_BY_VALUE
+                : this.sortByCombo.getSelectionIndex() == 1 ? BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION
+                    : BrowserCoreConstants.SORT_BY_NONE );
+        }
+        else
+        {
+            // no changes
+        }
+
+        super.buttonPressed( buttonId );
+    }
+
+
+    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( this.preferences.isObjectClassAndMustAttributesFirst() );
+
+        operationalAttributesLastButton = BaseWidgetUtils.createCheckbox( group, "Operational attributes last", 1 );
+        operationalAttributesLastButton.setSelection( this.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( this.preferences.getDefaultSortBy() == BrowserCoreConstants.SORT_BY_VALUE ? 2
+            : this.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( this.preferences.getDefaultSortOrder() == BrowserCoreConstants.SORT_ORDER_ASCENDING );
+        sortAcendingButton.setEnabled( sortByCombo.getSelectionIndex() != 0 );
+
+        sortDescendingButton = BaseWidgetUtils.createRadiobutton( sortByComposite, "Descending", 1 );
+        sortDescendingButton
+            .setSelection( this.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;
+    }
+
+}