Eclipse IConsole Caret Position

时间:2013-09-10 05:09:34

标签: java eclipse

我正在实现一个Eclipse插件,其中IOConsole从键盘接收输入并生成输出(IOConsoleInputStream,IOConsoleOutputStream)。 我试图通过将TextConsoleViewer扩展为此处建议的

来将插入符始终放在最后一个字符处

How to set the Caret of the IOConsole

问题在于,当打印输出后更改插入符号位置时,输出字符(由另一个引用输出流的线程写入)不会计入控制台字符数。

这是我的代码的链接

https://code.google.com/p/mdpm/source/browse/com.lowcoupling.mdpm.console/src/com/lowcoupling/mdpm/console/MDPMConsole.java

感谢

1 个答案:

答案 0 :(得分:2)

setCaretOffset()的源代码表明,如果使用大于文本长度的偏移量,则使用文本的长度,实际上将插入符号放在文本的末尾。因此,将Integer.MAX_VALUE设置为偏移是一个可行的选项,无需对文本长度进行任何检查。

如果您无法获得有关冲洗何时完成的通知,我建议您将插入符号延迟几百毫秒。它不会给用户带来任何干扰,并为您提供强大的解决方案。

供参考,以下是setCaretOffset()的源代码:

public void setCaretOffset(int offset) {
    checkWidget();
    int length = getCharCount();
    if (length > 0 && offset != caretOffset) {
        if (offset < 0) {
            offset = 0;
        } else if (offset > length) {
            offset = length;  // <-- use the length as offset
        } else {
            if (isLineDelimiter(offset)) {
                // offset is inside a multi byte line delimiter. This is an 
                // illegal operation and an exception is thrown. Fixes 1GDKK3R
                SWT.error(SWT.ERROR_INVALID_ARGUMENT);
            }
        }
        setCaretOffset(offset, PREVIOUS_OFFSET_TRAILING);
        // clear the selection if the caret is moved.
        // don't notify listeners about the selection change.
        if (blockSelection) {
            clearBlockSelection(true, false);
        } else {
            clearSelection(false);
        }
    }
    setCaretLocation();
}