/*******************************************************************************
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
*******************************************************************************/
package com.liferay.ide.project.ui.jdt;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposal;
import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
import org.eclipse.jface.text.AbstractReusableInformationControlCreator;
import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.osgi.util.TextProcessor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Shell;
/**
* @author Simon Jiang
*/
@SuppressWarnings( "restriction" )
public class ComponentPropertyCompletionProposal extends JavaCompletionProposal
{
private int replacementStart;
private int replacementEnd;
private String addtionalString;
private String source;
public ComponentPropertyCompletionProposal(
JavaContentAssistInvocationContext jdt, String replacementString, int replacementOffset, int replacementLength,
Image image, String displayString, int relevance, int replacementStart, int replacementEnd,
String addtionalString, String source )
{
super( replacementString, replacementOffset, replacementLength, image, displayString, relevance );
this.replacementStart = replacementStart;
this.replacementEnd = replacementEnd;
this.addtionalString = addtionalString;
this.source = source;
}
@Override
public IInformationControlCreator getInformationControlCreator()
{
return new AbstractReusableInformationControlCreator()
{
@Override
protected IInformationControl doCreateInformationControl( final Shell parent )
{
return new DefaultInformationControl( parent, true );
}
};
}
@Override
public Object getAdditionalProposalInfo( IProgressMonitor monitor )
{
String info = this.addtionalString;
return info;
}
private boolean fIsValidated = true;
protected boolean isOffsetValid( int offset )
{
return getReplacementOffset() <= offset;
}
/**
* Gets the replacement offset.
*
* @return Returns a int
*/
@Override
public final int getReplacementOffset()
{
if( !fReplacementOffsetComputed )
setReplacementOffset( getReplaceStart() );
return super.getReplacementOffset();
}
/**
* Sets the replacement length.
*
* @param replacementLength
* The replacementLength to set
*/
public void setReplacementLength( int replacementLength )
{
Assert.isTrue( replacementLength >= 0 );
super.setReplacementLength( replacementLength );
}
public int getReplaceStart()
{
if( source.contains( "\"" ) )
{
return replacementStart - 1;
}
return replacementStart; // default overridden by concrete implementation
}
public int getReplaceEnd()
{
return replacementEnd;
}
public int setReplaceEnd( final int replacementEnd )
{
return this.replacementEnd = replacementEnd;
}
public final int getReplacementLength()
{
if( !fReplacementLengthComputed )
setReplacementLength( getReplaceEnd() - getReplaceStart() );
if( source.contains( "\"" ) && source.endsWith( "\"" ) )
{
return super.getReplacementLength() + 1;
}
return super.getReplacementLength();
}
private boolean fReplacementOffsetComputed;
private boolean fReplacementLengthComputed;
@Override
public boolean validate( IDocument document, int offset, DocumentEvent event )
{
if( !isOffsetValid( offset ) )
return fIsValidated = false;
String prefix = getPrefix( document, offset );
String removeQuotPrefix = prefix.replace( "\"", "" );
fIsValidated = isValidPrefix( removeQuotPrefix );
if( fIsValidated )
{
setReplaceEnd( getReplaceEnd() );
}
if( fIsValidated && event != null )
{
int delta = ( event.fText == null ? 0 : event.fText.length() ) - event.fLength;
final int newLength = Math.max( getReplacementLength() + delta, 0 );
setReplacementLength( newLength );
setReplaceEnd( getReplaceEnd() + delta );
}
return fIsValidated;
}
protected boolean isValidPrefix( String prefix )
{
String word = TextProcessor.deprocess( getDisplayString() );
return isPrefix( prefix, word );
}
}