}
// case A: simple filter
if ( filter.getFilterComponent() != null && filter.getFilterComponent() instanceof LdapFilterItemComponent )
{
LdapFilterItemComponent fc = ( LdapFilterItemComponent ) filter.getFilterComponent();
// case A1: editing attribute type: show matching attribute types
if ( fc.getStartToken().getOffset() <= offset
&& offset <= fc.getStartToken().getOffset() + fc.getStartToken().getLength() )
{
addPossibleAttributeTypes( proposalList, fc.getAttributeToken().getValue(), fc.getAttributeToken()
.getOffset() );
}
String attributeType = null;
if ( schema != null && schema.hasAttributeTypeDescription( fc.getAttributeToken().getValue() ) )
{
attributeType = fc.getAttributeToken().getValue();
}
// case A2: after attribte type: show possible filter types and extensible match options
if ( attributeType != null )
{
if ( ( fc.getAttributeToken().getOffset() <= offset || fc.getFilterToken() != null )
&& offset <= fc.getAttributeToken().getOffset() + fc.getAttributeToken().getLength()
+ ( fc.getFilterToken() != null ? fc.getFilterToken().getLength() : 0 ) )
{
//String attributeType = fc.getAttributeToken().getValue();
String filterType = fc.getFilterToken() != null ? fc.getFilterToken().getValue() : ""; //$NON-NLS-1$
int filterTypeOffset = fc.getAttributeToken().getOffset() + fc.getAttributeToken().getLength();
addPossibleFilterTypes( proposalList, attributeType, filterType, filterTypeOffset );
}
}
// case A3: editing objectClass attribute: show matching object classes
if ( attributeType != null && SchemaConstants.OBJECT_CLASS_AT.equalsIgnoreCase( attributeType ) )
{
if ( ( fc.getValueToken() != null && fc.getValueToken().getOffset() <= offset || fc
.getFilterToken() != null )
&& offset <= fc.getAttributeToken().getOffset() + fc.getAttributeToken().getLength()
+ ( fc.getFilterToken() != null ? fc.getFilterToken().getLength() : 0 )
+ ( fc.getValueToken() != null ? fc.getValueToken().getLength() : 0 ) )
{
addPossibleObjectClasses( proposalList, fc.getValueToken() == null ? "" : fc.getValueToken() //$NON-NLS-1$
.getValue(), fc.getValueToken() == null ? offset : fc.getValueToken().getOffset() );
}
}
}
// case B: extensible filter
if ( filter.getFilterComponent() != null
&& filter.getFilterComponent() instanceof LdapFilterExtensibleComponent )
{
LdapFilterExtensibleComponent fc = ( LdapFilterExtensibleComponent ) filter.getFilterComponent();
// case B1: editing extensible attribute type: show matching attribute types
if ( fc.getAttributeToken() != null && fc.getAttributeToken().getOffset() <= offset
&& offset <= fc.getAttributeToken().getOffset() + fc.getAttributeToken().getLength() )
{
addPossibleAttributeTypes( proposalList, fc.getAttributeToken().getValue(), fc.getAttributeToken()
.getOffset() );
}
// case B2: editing dn
if ( fc.getDnAttrToken() != null && fc.getDnAttrToken().getOffset() <= offset
&& offset <= fc.getDnAttrToken().getOffset() + fc.getDnAttrToken().getLength() )
{
addDnAttr( proposalList, fc.getDnAttrToken().getValue(), fc.getDnAttrToken().getOffset() );
}
// case B3: editing matching rule
if ( fc.getMatchingRuleColonToken() != null
&& fc.getMatchingRuleToken() == null
&& fc.getMatchingRuleColonToken().getOffset() <= offset
&& offset <= fc.getMatchingRuleColonToken().getOffset()
+ fc.getMatchingRuleColonToken().getLength() )
{
if ( fc.getDnAttrColonToken() == null )
{
addDnAttr( proposalList, "", offset ); //$NON-NLS-1$
}
addPossibleMatchingRules( proposalList, "", offset, fc.getEqualsColonToken(), fc.getEqualsToken() ); //$NON-NLS-1$
}
if ( fc.getMatchingRuleToken() != null && fc.getMatchingRuleToken().getOffset() <= offset
&& offset <= fc.getMatchingRuleToken().getOffset() + fc.getMatchingRuleToken().getLength() )
{
if ( fc.getDnAttrColonToken() == null )
{
addDnAttr( proposalList, fc.getMatchingRuleToken().getValue(), fc.getMatchingRuleToken()
.getOffset() );
}
String matchingRuleValue = fc.getMatchingRuleToken().getValue();
addPossibleMatchingRules( proposalList, matchingRuleValue, fc.getMatchingRuleToken().getOffset(),
fc.getEqualsColonToken(), fc.getEqualsToken() );
}
}
}
return proposalList.toArray( new ICompletionProposal[0] );