zoukankan      html  css  js  c++  java
  • [Eclipse]实现内容助理(1. 自动完成)

    在实际项目应用里,如果需要用户手动输入比较复杂的文本内容时可以考虑利用内容助理(Content Assistant)功能减轻用户负担,同时减低出错的机会。Jface的SourceViewer支持内容助理,这篇帖子里介绍一下如 何实现自动完成(Auto Completion)功能,即向用户提示接下来可能输入的内容。

    //Create a new source viewer
    sourceViewer = new SourceViewer(shell, null, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);

    //Set a blank document
    sourceViewer.setDocument(new Document(""));
    sourceViewer.setEditable(
    true);

    StyledText txtSource = sourceViewer.getTextWidget();
    GridData gd 
    = new GridData(GridData.FILL_BOTH);
    txtSource.setLayoutData(gd);

    自动完成功能一般在以下两种条件下弹出一个小窗口向用户提示当前可供选择的选项,一是用户按下指定的组合键时,二是用户输入了特定的字 符时,SourceViewer支持这两种触发方式。在程序里使用SourceViewer和使用一般控件没有很大的分别,只是SourceViewer 是StyledText的包装,所以一些操作要通过getTextWidget()完成,如下所示:

    //Configure source viewer, add content assistant support
    sourceViewer.configure(new SourceViewerConfiguration() {
        @Override
        
    public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
            ContentAssistant assistant 
    = new ContentAssistant();
            IContentAssistProcessor cap 
    = new MyContentAssistProcessor();
            assistant.setContentAssistProcessor(cap, IDocument.DEFAULT_CONTENT_TYPE);
            assistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
            assistant.enableAutoActivation(
    true);
            
    return assistant;
        }
    });

    现在这个SourceViewer还不能弹出任何提示,因为我们还没有给它一个SourceViewerConfiguration,后者通过getContentAssistant()负责提供一个IContentAssistant的实现。下面的代码显示了如何为SourceViewer设置SourceViewerConfiguration,这个例子里不论当前文本框里是什么内容都弹出一样的提示选项,在实际应用里可以根据内容改变选项:

    public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
        String content 
    = viewer.getTextWidget().getText();

        
    try {

            
    //Demo options
            final String[] options = new String[] { "sum()""count()""sort()" };

            
    //Dynamically generate proposal
            ArrayList result = new ArrayList();
            
    for (int i = 0; i < options.length; i++) {
                CompletionProposal proposal 
    = new CompletionProposal(options[i], offset, 0, options[i].length());
                result.add(proposal);
            }
            
    return (ICompletionProposal[]) result.toArray(new ICompletionProposal[result.size()]);
        } 
    catch (Exception e) {
            e.printStackTrace();
        }
        
    return null;
    }

    public char[] getCompletionProposalAutoActivationCharacters() {
        
    return TRIGGER_TOKENS;
    }

    上面代码里,MyContentAssistProcessor是我们对IContentAssistant接口的实现,它里面与自动完成有关的是computeCompletionProposals()和getCompletionProposalAutoActivationCharacters()这两个方法,前者返回的结果数组将作为弹出提示窗口里的选项,后者返回的字符数组包含了可以触发弹出窗口的特殊字符。

    最后,我们还要支持用户触发内容助理,这要求为SourceViewer添加一个监听器:

    sourceViewer.appendVerifyKeyListener(new VerifyKeyListener() {
        
    public void verifyKey(VerifyEvent event) {
            
    // Check for Alt+/
            if (event.stateMask == SWT.ALT && event.character == '/') {
                
    // Check if source viewer is able to perform operation
                if (sourceViewer.canDoOperation(SourceViewer.CONTENTASSIST_PROPOSALS))
                    
    // Perform operation
                    sourceViewer.doOperation(SourceViewer.CONTENTASSIST_PROPOSALS);
                
    // Veto this key press to avoid further processing
                event.doit = false;
            }
        }
    });

    实现后的结果截图如下图所示,(示例代码下载):


    相关参考链接:
    为 SWT 应用程序配备内容助理
    FAQ How do I add Content Assist to my language editor?
    Eclipse Help - Content Assist

  • 相关阅读:
    正则表达式获取字符串中html<input>标签指定value值
    [转]利用SqlBulkCopy快速大批量导入数据(SqlBulkCopy强大)
    ASP.NET数据库操作常用类
    response.redirect 和Server.Transfer有什么区别?
    数据驱动的依存句法分析方法简介(一)
    C#序列化问题
    MSSQL 标量函数
    事件和委托问题转
    Copy指定目录下的所有文件到新位置
    页面指定播放视频
  • 原文地址:https://www.cnblogs.com/bjzhanghao/p/908648.html
Copyright © 2011-2022 走看看