/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui.assist;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.IContentProposal;
import org.eclipse.jface.fieldassist.IContentProposalListener2;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Text;
/**
* ������ʾ�ı��ؼ���չ�ࡣ������ʾ��Ϣ��ʹ�������á�
*
* @author mawb
*/
public class TextContentAssistEx extends Text implements IContentProposalProvider {
protected IAssistantProvider provider;
private SimpleContentProposalAdapter adapter;
// �ı��ָ���
private String separator = null;
/**
* @param parent ������
* @param style �ؼ���ʽ
*/
public TextContentAssistEx(Composite parent, int style) {
super(parent, style);
initTextContentAssist();
}
/**
* @return the adapter
*/
public ContentProposalAdapter getAdapter() {
return adapter;
}
/**
*
* @param parent ������
* @param style �ؼ���ʽ
* @param provider ������ʾ�ṩ��
*/
public TextContentAssistEx(Composite parent, int style, IAssistantProvider provider) {
super(parent, style);
this.provider = provider;
initTextContentAssist();
}
/**
* ��ʼ��������ʾ��Ϣ��
*/
private void initTextContentAssist() {
adapter = new SimpleContentProposalAdapter(this, new TextContentAdapter(), this, KeyStroke.getInstance(SWT.ALT, '/'), null);
adapter.setPropagateKeys(true);
adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
adapter.addContentProposalListener(new IContentProposalListener2() {
public void proposalPopupClosed(ContentProposalAdapter adapter) {
Event e = new Event();
e.data = new Boolean(false);
}
public void proposalPopupOpened(ContentProposalAdapter adapter) {
Event e = new Event();
e.data = new Boolean(true);
}
});
// this.addKeyListener(new KeyAdapter(){
// public void keyPressed(KeyEvent e) {
// if(e.character=='/' && e.stateMask==SWT.ALT){
// adapter.openProposalPopup();
// }
// }
// });
}
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Widget#checkSubclass()
*/
@Override
protected void checkSubclass() {
// super.checkSubclass();
}
/*
* @param contentProvider the contentProvider to set
*/
public void setContentProvider(IAssistantProvider provider) {
this.provider = provider;
}
public void setContentSeparator(String separator) {
this.separator = separator;
}
/* (non-Javadoc)
* @see org.eclipse.jface.fieldassist.IContentProposalProvider#getProposals(java.lang.String, int)
*/
public IContentProposal[] getProposals(String contents, int position) {
// String text = getValidContent(contents, position);
List<IContentProposal> list = new ArrayList<IContentProposal>();
Object[] proposals = provider.getProposals();
if (proposals == null) {
return new IContentProposal[0];
}
// ��ȡ��ƥ���ַ�������ǰ�ַ����ͺ��ַ���
int start = getStartIndex(contents, position);
int end = getEndIndex(contents, position);
String matchingStr = contents.substring(start, position);
String prefixStr = contents.substring(0, start);
String suffixStr = contents.substring(end);
for (int i = 0; i < proposals.length; i++) {
final Object tempProposal = proposals[i];
final String content = provider.getContent(tempProposal);
if (content.length () >= matchingStr.length() && content.substring(0, matchingStr.length()).equalsIgnoreCase(matchingStr)) {
list.add(getProposal(tempProposal, prefixStr, suffixStr));
}
}
return (IContentProposal[]) list.toArray (new IContentProposal[list.size ()]);
}
/**
* ��ȡ��ƥ���ַ�������ʼλ�ã���ǰ�������λ�õ�ǰһ���ָ����ĺ�һλ���ָ�������ʱΪ0��
*
* @param contents ��ʾ��
* @param position ��ǰ���λ��
* @return
*/
private int getStartIndex(String contents, int position) {
if (separator != null && !separator.equals("")) {
int start = contents.lastIndexOf(separator, position);
if (start >= 0) {
return start + separator.length();
}
}
return 0;
}
/**
* ��ȡ��ƥ���ַ����Ľ���λ�ã���ǰ�������λ�õĺ�һ���ָ�������ʼλ�ã��ָ�������ʱΪ��ʾ���ij��ȣ�
*
* @param contents ��ʾ��
* @param position ��ǰ���λ��
* @return
*/
private int getEndIndex(String contents, int position) {
if (separator != null && !separator.equals("")) {
int end = contents.indexOf(separator, position);
if (end >= 0) {
return end;
}
}
return contents.length();
}
/**
* ��ȡ������ʾ��ʾ���ݡ�
*
* @param tempProposal
* @return
*/
private IContentProposal getProposal(final Object tempProposal, final String prefix, final String suffix) {
IContentProposal proposal = new IContentProposal() {
public String getContent() {
return prefix + provider.getContent(tempProposal) + suffix;
}
public int getCursorPosition() {
return provider.getContent(tempProposal).length() + prefix.length();
}
public String getDescription() {
return provider.getDescription(tempProposal);
}
public String getLabel() {
return provider.getLabel(tempProposal);
}
};
return proposal;
}
}