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;
}
}
}