如何在NatTable TextCellEditor中启用内容提案?

时间:2015-10-12 14:58:10

标签: eclipse-rcp jface nattable

我目前正在寻找Nattable TextCellEditor中的内容辅助功能。我已经找到了通过扩展Nattable TextCellEditor来附加ContentProposalAdapter和IContentProposalProvider的方法。但是,建议列表中的选定值未在文本控件中更新。

摘录:

@Override

protected Text createEditorControl(final Composite parent, final int  Style) {
this.textControl = super.createEditorControl(parent, style);

  contentProposalAdapter =
      new ContentProposalAdapter(this.textControl, new TextContentAdapter(), contentProposalProvider, keyStroke,
          null);


  contentProposalAdapter.addContentProposalListener(new IContentProposalListener() {

    @Override
    public void proposalAccepted(IContentProposal proposal) {
    System.out.println(proposal.getContent());

    }

  });
}

1 个答案:

答案 0 :(得分:0)

您遇到的问题是在弹出窗口中选择值时触发的内部FocusListener。要添加支持,还需要使用在内容提议弹出窗口打开时不会触发的侦听器覆盖内部FocusListener。

一个例子是添加一个布尔标志,指示弹出窗口是打开的,并添加一个相应地设置标志的监听器。

private boolean popupOpen = false;
...
contentProposalAdapter.addContentProposalListener(new IContentProposalListener2() {

        @Override
        public void proposalPopupClosed(ContentProposalAdapter adapter) {
            this.popupOpen = false;
        }

        @Override
        public void proposalPopupOpened(ContentProposalAdapter adapter) {
            this.popupOpen = true;
        }
});

然后在构造函数中实现并设置一个FocusListener来处理该标志。

this.focusListener = new FocusAdapter() {
        @Override
        public void focusLost(FocusEvent e) {
            if (!TextCellEditor.this.popupOpen) {
                if (!commit(MoveDirectionEnum.NONE, true)) {
                    if (e.widget instanceof Control && !e.widget.isDisposed()) {
                        ((Control) e.widget).forceFocus();
                    }
                } else {
                    if (!TextCellEditor.this.parent.isDisposed())
                        TextCellEditor.this.parent.forceFocus();
                }
            }
        }
};

如果值在选择后应立即提交,则需要添加一个在选择后执行提交的侦听器。

contentProposalAdapter.addContentProposalListener(new IContentProposalListener() {

        @Override
        public void proposalAccepted(IContentProposal proposal) {
            commit(MoveDirectionEnum.NONE);
        }
});

不幸的是,AbstractCellEditor #InlineFocusListener是私有的,因此无法扩展。

随意为NatTable提交增强票,以便能够轻松地将内容提案添加到文本单元格编辑器中。

https://bugs.eclipse.org/bugs/enter_bug.cgi?product=NatTable