我正在开发一个eclipse插件,它使用SimpleContentProposalProvider类显示文本单元格编辑器的内容提议,这很好用。我的问题 - 我想显示内容提案的帮助文本/ doc,类似于显示每种方法的doc的java编辑器。我该如何实现此功能。
我是否需要编写IContentProposalProvider的自定义实现并使用getDescription()?
代码:
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.bindings.keys.ParseException;
import org.eclipse.jface.fieldassist.ContentProposal;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.IContentProposalListener2;
import org.eclipse.jface.fieldassist.SimpleContentProposalProvider;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
public class TextCellEditorWithContentProposal extends TextCellEditor {
private ContentProposalAdapter contentProposalAdapter;
private boolean popupOpen = false; // true, iff popup is currently open
public TextCellEditorWithContentProposal(Composite parent,
SimpleContentProposalProvider contentProposalProvider,
KeyStroke keyStroke, char[] autoActivationCharacters) {
super(parent);
enableContentProposal(contentProposalProvider, keyStroke,
autoActivationCharacters);
}
private void enableContentProposal(
SimpleContentProposalProvider contentProposalProvider,
KeyStroke keyStroke, char[] autoActivationCharacters) {
try {
keyStroke = KeyStroke.getInstance("Ctrl+Space");
} catch (ParseException e) {
// Logger.getLogger("").error("KeyStroke Parse Exception");
}
contentProposalAdapter = new ContentProposalAdapter(text,
new TextContentAdapter(), contentProposalProvider, keyStroke,
autoActivationCharacters);
contentProposalAdapter
.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
contentProposalProvider.setFiltering(true);
contentProposalAdapter.setLabelProvider(new ILabelProvider() {
public void addListener(ILabelProviderListener arg0) {
}
public void dispose() {
}
public boolean isLabelProperty(Object arg0, String arg1) {
return false;
}
public void removeListener(ILabelProviderListener arg0) {
}
public Image getImage(Object element) {
Image img=null;
System.out.println("Content proposal>>>>>>>>>>>>>>>>>>>"+((ContentProposal)element).getLabel());
try {
img = Activator.getImageDescriptor("icons/blue-icon.png").createImage();
} catch (Exception e) {
e.printStackTrace();
}
return img;
}
public String getText(Object element) {
return ((ContentProposal)element).getLabel();
}
});
// Listen for popup open/close events to be able to handle focus
// events correctly
contentProposalAdapter
.addContentProposalListener(new IContentProposalListener2() {
public void proposalPopupClosed(
ContentProposalAdapter adapter) {
popupOpen = false;
}
public void proposalPopupOpened(
ContentProposalAdapter adapter) {
popupOpen = true;
}
});
}
/**
* Return the {@link ContentProposalAdapter} of this cell editor.
*
* @return the {@link ContentProposalAdapter}
*/
public ContentProposalAdapter getContentProposalAdapter() {
return contentProposalAdapter;
}
protected void focusLost() {
if (!popupOpen) {
// Focus lost deactivates the cell editor.
// This must not happen if focus lost was caused by activating
// the completion proposal popup.
super.focusLost();
}
}
protected boolean dependsOnExternalFocusListener() {
// Always return false;
// Otherwise, the ColumnViewerEditor will install an additional
// focus listener
// that cancels cell editing on focus lost, even if focus gets lost
// due to
// activation of the completion proposal popup. See also bug 58777.
return false;
}
}
答案 0 :(得分:0)
是的,请使用您自己的IContentProposalProvider
并对每个提案使用ContentProposal
。
一个非常简单的提供者可能看起来像:
class SpecialCharactersProposalProvider implements IContentProposalProvider
{
@Override
public IContentProposal [] getProposals(String contents, int position)
{
return new IContentProposal [] {
new ContentProposal("text to insert", "label", "long description"),
};
}
}
ContentProposal
的第三个参数是您想要的长文本。