public void customizeAutoEditParameters()

in plugins/ldapbrowser.common/src/main/java/org/apache/directory/studio/ldapbrowser/common/filtereditor/FilterAutoEditStrategy.java [85:240]


    public void customizeAutoEditParameters( String currentFilter, AutoEditParameters aep )
    {
        parser.parse( currentFilter );
        LdapFilter filter = parser.getModel().getFilter( aep.offset );
        if ( filter == null )
        {
            return;
        }

        // check balanced parenthesis
        int balanced = 0;
        for ( int i = 0; i < currentFilter.length(); i++ )
        {
            if ( currentFilter.charAt( i ) == '(' )
            {
                balanced++;
            }
            else if ( currentFilter.charAt( i ) == ')' )
            {
                balanced--;
            }
        }

        if ( aep.length > 0 && ( aep.text == null || "".equals( aep.text ) ) ) //$NON-NLS-1$
        {
            // delete surrounding parenthesis after deleting the last character
            if ( filter.toString().length() - aep.length == 2 && filter.getStartToken() != null
                && filter.getStopToken() != null
                && aep.offset >= filter.getStartToken().getOffset() + filter.getStartToken().getLength()
                && aep.offset + aep.length <= filter.getStopToken().getOffset() )
            {
                if ( filter.toString().length() - aep.length == 2 )
                {
                    aep.offset -= 1;
                    aep.length += 2;
                    aep.caretOffset = aep.offset;
                    aep.shiftsCaret = false;
                }
            }

            // delete closing parenthesis after deleting the opening parenthesis
            if ( filter.toString().length() - aep.length == 1 && filter.getStartToken() != null
                && filter.getStopToken() != null && aep.offset == filter.getStartToken().getOffset() )
            {
                aep.length += 1;
                aep.caretOffset = aep.offset;
                aep.shiftsCaret = false;
            }

        }

        if ( ( aep.length == 0 || aep.length == currentFilter.length() ) && aep.text != null && !"".equals( aep.text ) ) //$NON-NLS-1$
        {
            boolean isNewFilter = aep.text.equals( "(" ); //$NON-NLS-1$
            boolean isNewNestedFilter = aep.text.equals( "&" ) || aep.text.equals( "|" ) || aep.text.equals( "!" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
            boolean isSurroundNew = false;
            boolean isSurroundNested = false;
            boolean isSurroundBeforeOtherFilter = false;
            boolean isSurroundAfterOtherFilter = false;
            if ( !Character.isWhitespace( aep.text.charAt( 0 ) )
                && !aep.text.startsWith( "(" ) && !aep.text.endsWith( ")" ) ) //$NON-NLS-1$ //$NON-NLS-2$
            {
                // isSurroundNew
                isSurroundNew = aep.offset == 0;

                // isSurroundNested
                if ( filter.getStartToken() != null
                    && ( filter.getFilterComponent() instanceof LdapAndFilterComponent
                        || filter.getFilterComponent() instanceof LdapOrFilterComponent || filter.getFilterComponent() instanceof LdapNotFilterComponent ) )
                {
                    LdapFilterComponent fc = filter.getFilterComponent();
                    LdapFilter[] filters = fc.getFilters();

                    if ( filters.length == 0 && aep.offset > fc.getStartToken().getOffset() )
                    {
                        // no nested filter yet
                        isSurroundNested = true;
                    }

                    if ( filters.length > 0 && aep.offset > fc.getStartToken().getOffset()
                        && aep.offset < filters[0].getStartToken().getOffset() )
                    {
                        // before first nested filter
                        isSurroundNested = true;
                    }

                    if ( filters.length > 0 && aep.offset > filters[filters.length - 1].getStopToken().getOffset()
                        && aep.offset <= filter.getStopToken().getOffset() )
                    {
                        // after last nested filter
                        isSurroundNested = true;
                    }

                    for ( int i = 0; i < filters.length; i++ )
                    {
                        if ( filters.length > i + 1 )
                        {
                            if ( aep.offset > filters[i].getStopToken().getOffset()
                                && aep.offset <= filters[i + 1].getStopToken().getOffset() )
                            {
                                // between nested filter
                                isSurroundNested = true;
                            }
                        }
                    }
                }

                // isSurroundBeforeOtherFilter
                isSurroundBeforeOtherFilter = filter.getStartToken() != null
                    && aep.offset == filter.getStartToken().getOffset();

                // isSurroundAfterOtherFilter
                isSurroundAfterOtherFilter = filter.getStopToken() != null
                    && aep.offset == filter.getStopToken().getOffset()
                    && ( filter.getFilterComponent() instanceof LdapAndFilterComponent
                        || filter.getFilterComponent() instanceof LdapOrFilterComponent || filter.getFilterComponent() instanceof LdapNotFilterComponent );
            }

            // add opening parenthesis '('
            if ( isSurroundNew || isSurroundNested || isSurroundAfterOtherFilter || isSurroundBeforeOtherFilter )
            {
                aep.text = "(" + aep.text; //$NON-NLS-1$
                aep.caretOffset = aep.offset + aep.text.length();
                aep.shiftsCaret = false;
            }

            // add parenthesis for nested filters
            if ( isNewNestedFilter )
            {
                aep.text = aep.text + "()"; //$NON-NLS-1$
                aep.caretOffset = aep.offset + aep.text.length() - 1;
                aep.shiftsCaret = false;
            }

            // add closing parenthesis ')'
            if ( isNewFilter || isSurroundNew || isSurroundNested || isSurroundAfterOtherFilter
                || isSurroundBeforeOtherFilter )
            {
                if ( balanced == 0 )
                {
                    aep.text = aep.text + ")"; //$NON-NLS-1$
                    if ( aep.caretOffset == -1 )
                    {
                        aep.caretOffset = aep.offset + aep.text.length() - 1;
                        aep.shiftsCaret = false;
                    }
                }
            }

            // translate tab to IDENT_STRING
            if ( aep.text.equals( "\t" ) ) //$NON-NLS-1$
            {
                aep.text = INDENT_STRING;
            }
        }
    }