Package org.apache.directory.studio.ldapbrowser.ui.editors.searchresult

Source Code of org.apache.directory.studio.ldapbrowser.ui.editors.searchresult.SearchResultEditorSorter

/*
*  Licensed to the Apache Software Foundation (ASF) under one
*  or more contributor license agreements.  See the NOTICE file
*  distributed with this work for additional information
*  regarding copyright ownership.  The ASF licenses this file
*  to you under the Apache License, Version 2.0 (the
*  "License"); you may not use this file except in compliance
*  with the License.  You may obtain a copy of the License at
*    http://www.apache.org/licenses/LICENSE-2.0
*  Unless required by applicable law or agreed to in writing,
*  software distributed under the License is distributed on an
*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
*  KIND, either express or implied.  See the License for the
*  specific language governing permissions and limitations
*  under the License.
*/

package org.apache.directory.studio.ldapbrowser.ui.editors.searchresult;


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.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.ISearch;
import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult;
import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants;
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.TableColumn;


/**
* The SearchResultEditorSorter implements the Sorter for the search result editor.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$, $Date$
*/
public class SearchResultEditorSorter extends ViewerSorter implements SelectionListener
{

    /** The content provider. */
    protected SearchResultEditorContentProvider contentProvider;

    /** The search. */
    private ISearch search;

    /** The columns. */
    private TableColumn[] columns;

    /** The show DN flag. */
    private boolean showDn;

    /** The sort property. */
    private int sortBy;

    /** The sort order. */
    private int sortOrder;


    /**
     * Connects this sorter to the given content provider.
     *
     * @param contentProvider the content provider
     */
    public void connect( SearchResultEditorContentProvider contentProvider )
    {
        this.contentProvider = contentProvider;

        sortBy = 0;
        sortOrder = BrowserCoreConstants.SORT_ORDER_NONE;

        columns = contentProvider.getViewer().getTable().getColumns();
        for ( int i = 0; i < columns.length; i++ )
        {
            columns[i].addSelectionListener( this );
        }
    }


    /**
     * Called when the input of the viewer has been changed.
     *
     * @param newSearch the new search
     * @param showDn the show DN flag
     */
    public void inputChanged( ISearch newSearch, boolean showDn )
    {
        this.search = newSearch;
        this.showDn = showDn;

        for ( int i = 0; columns != null && i < columns.length; i++ )
        {
            columns[i].removeSelectionListener( this );
        }
        columns = contentProvider.getViewer().getTable().getColumns();
        for ( int i = 0; i < columns.length; i++ )
        {
            columns[i].addSelectionListener( this );
        }

        // check sort column
        int visibleColumns = search.getReturningAttributes().length;
        if ( showDn )
        {
            visibleColumns++;
        }
        if ( visibleColumns < sortBy + 1 )
        {
            setSortColumn( 0 );
            setSortColumn( 0 );
            setSortColumn( 0 );
        }
    }


    public void dispose()
    {
        for ( int i = 0; columns != null && i < columns.length; i++ )
        {
            if ( !columns[i].isDisposed() )
            {
                columns[i].removeSelectionListener( this );
            }
        }
        columns = null;
        search = null;
        contentProvider = null;
    }


    /**
     * {@inheritDoc}
     */
    public void widgetDefaultSelected( SelectionEvent e )
    {
    }


    /**
     * {@inheritDoc}
     */
    public void widgetSelected( SelectionEvent e )
    {
        if ( e.widget instanceof TableColumn )
        {
            int index = contentProvider.getViewer().getTable().indexOf( ( ( TableColumn ) e.widget ) );
            setSortColumn( index );
        }
    }


    /**
     * Sets the sort column.
     *
     * @param index the new sort column
     */
    private void setSortColumn( int index )
    {
        if ( sortBy == index )
        {
            // toggle sort order
            sortOrder = sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? BrowserCoreConstants.SORT_ORDER_DESCENDING
                : sortOrder == BrowserCoreConstants.SORT_ORDER_DESCENDING ? BrowserCoreConstants.SORT_ORDER_NONE
                    : BrowserCoreConstants.SORT_ORDER_ASCENDING;
        }
        else
        {
            // set new sort by
            sortBy = index;
            sortOrder = BrowserCoreConstants.SORT_ORDER_ASCENDING;
        }
        if ( sortOrder == BrowserCoreConstants.SORT_ORDER_NONE )
        {
            sortBy = BrowserCoreConstants.SORT_BY_NONE;
        }

        TableColumn[] columns = contentProvider.getViewer().getTable().getColumns();
        for ( int i = 0; i < columns.length; i++ )
        {
            columns[i].setImage( null );
        }

        if ( sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING )
        {
            ( columns[index] ).setImage( BrowserCommonActivator.getDefault().getImage(
                BrowserCommonConstants.IMG_SORT_ASCENDING ) );
        }
        else if ( sortOrder == BrowserCoreConstants.SORT_ORDER_DESCENDING )
        {
            ( columns[index] ).setImage( BrowserCommonActivator.getDefault().getImage(
                BrowserCommonConstants.IMG_SORT_DESCENDING ) );
        }
        else
        {
            ( columns[index] ).setImage( null );
        }

        contentProvider.refresh();
    }


    /**
     * Checks if is sorted.
     *
     * @return true, if is sorted
     */
    public boolean isSorted()
    {
        // return sortOrder != SORT_ORDER_NONE;
        return true;
    }


    /**
     * {@inheritDoc}
     */
    public void sort( final Viewer viewer, Object[] elements )
    {
        if ( isSorted() )
        {
            Arrays.sort( elements, new Comparator<Object>()
            {
                public int compare( Object a, Object b )
                {
                    return SearchResultEditorSorter.this.compare( viewer, a, b );
                }
            } );
        }

    }


    /**
     * {@inheritDoc}
     */
    public int compare( Viewer viewer, Object o1, Object o2 )
    {
        if ( search == null )
        {
            return equal();
        }

        ISearchResult sr1 = ( ISearchResult ) o1;
        ISearchResult sr2 = ( ISearchResult ) o2;

        IEntry entry1 = sr1.getEntry();
        IEntry entry2 = sr2.getEntry();

        String attributeName;
        if ( showDn && sortBy == 0 )
        {
            attributeName = BrowserUIConstants.DN;
        }
        else if ( showDn && sortBy > 0 )
        {
            attributeName = search.getReturningAttributes()[sortBy - 1];
        }
        else
        {
            attributeName = search.getReturningAttributes()[sortBy];
        }

        if ( attributeName == BrowserUIConstants.DN )
        {
            // compare normalized names
            return compare( entry1.getDn().getNormName(), entry2.getDn().getNormName() );
        }
        else
        {
            AttributeHierarchy ah1 = entry1.getAttributeWithSubtypes( attributeName );
            AttributeHierarchy ah2 = entry2.getAttributeWithSubtypes( attributeName );
            if ( ah1 == null && ah2 == null )
            {
                return equal();
            }
            else if ( ah1 == null && ah2 != null )
            {
                return lessThan();
            }
            else if ( ah1 != null && ah2 == null )
            {
                return greaterThan();
            }
            else
            {
                IAttribute attribute1 = ah1.getAttribute();
                IAttribute attribute2 = ah2.getAttribute();

                String value1 = getValue( attribute1 );
                String value2 = getValue( attribute2 );
                return compare( value1, value2 );
            }
        }
    }


    /**
     * Gets the value.
     *
     * @param attribute the attribute
     *
     * @return the value
     */
    private String getValue( IAttribute attribute )
    {
        if ( attribute.getValueSize() > 0 )
        {
            return attribute.getStringValue();
        }
        else
        {
            return ""; //$NON-NLS-1$
        }
    }


    /**
     * Gets the less than value.
     *
     * @return the less than value
     */
    private int lessThan()
    {
        return sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? -1 : 1;
    }


    /**
     * Gets the equal value.
     *
     * @return the equal value
     */
    private int equal()
    {
        return 0;
    }


    /**
     * Gets the greater than value.
     *
     * @return the greater than value
     */
    private int greaterThan()
    {
        return sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? 1 : -1;
    }


    /**
     * Compare two strings.
     *
     * @param s1 the 1st string
     * @param s2 the 2nd string
     *
     * @return the compare result
     */
    private int compare( String s1, String s2 )
    {
        return sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? s1.compareToIgnoreCase( s2 ) : s2
            .compareToIgnoreCase( s1 );
    }

}
TOP

Related Classes of org.apache.directory.studio.ldapbrowser.ui.editors.searchresult.SearchResultEditorSorter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.