SWT StyledText:将下一行的插入符定位到上一行的制表符宽度
SWT StyledText: Position caret of the next line to tab width of the previous line
我正在开发一个基于 SWT StyledText
的(富)编辑器。有一个功能我到现在还无法解决。我希望我的编辑器在用户按 Ctrl+u 时将光标放在制表符宽度处作为上一行的开头(类似于用户按 Enter 键时的 Eclipse 或 Notepad++)。我尝试了几种方法,但对我没有用。请看看我的例子。欢迎提出任何建议。提前致谢。
StyledText text = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
text.setTabs(5);
text.setText("");
text.setLeftMargin(5);
text.setBounds(0, 0, 512, 391);
text.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int currentLine = text.getLineAtOffset(text.getCaretOffset());
int currCaretOffset = text.getCaretOffset();
if(e.stateMask == SWT.CTRL && e.keyCode == 'u'){
//text.setIndent(text.getOffsetAtLine(currentLine));//doesn't work
text.append("\n");
//text.append("\t");//doesn't work
text.setCaretOffset(text.getCharCount()+text.getTabs());//doesn't work
System.out.println("caret offset "+text.getCaretOffset());
}
}
});
如果我没理解错的话,您想将光标移到下一行并缩进 "white spaces" 与上一行中的前导空格一样多。
我很惊讶没有更好的方法来做到这一点(或者也许我还没有找到),但这将完成这项工作:
private static final int TAB_WIDTH = 5;
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Whosebug");
shell.setLayout(new FillLayout());
StyledText text = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
text.setTabs(TAB_WIDTH);
text.setText("");
text.setLeftMargin(5);
text.setBounds(0, 0, 512, 391);
text.addListener(SWT.KeyUp, (e) -> {
if (e.stateMask == SWT.CTRL && e.keyCode == 'u')
{
int currentLine = text.getLineAtOffset(text.getCaretOffset());
String textAtLine = text.getLine(currentLine);
int spaces = getLeadingSpaces(textAtLine);
text.insert("\n");
text.setCaretOffset(text.getCaretOffset() + 1);
for (int i = 0; i < spaces; i++)
text.append(" ");
text.setCaretOffset(text.getCaretOffset() + spaces);
}
});
shell.pack();
shell.open();
shell.setSize(400, 300);
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private static int getLeadingSpaces(String line)
{
int counter = 0;
char[] chars = line.toCharArray();
for (char c : chars)
{
if (c == '\t')
counter += TAB_WIDTH;
else if (c == ' ')
counter++;
else
break;
}
return counter;
}
我正在开发一个基于 SWT StyledText
的(富)编辑器。有一个功能我到现在还无法解决。我希望我的编辑器在用户按 Ctrl+u 时将光标放在制表符宽度处作为上一行的开头(类似于用户按 Enter 键时的 Eclipse 或 Notepad++)。我尝试了几种方法,但对我没有用。请看看我的例子。欢迎提出任何建议。提前致谢。
StyledText text = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
text.setTabs(5);
text.setText("");
text.setLeftMargin(5);
text.setBounds(0, 0, 512, 391);
text.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int currentLine = text.getLineAtOffset(text.getCaretOffset());
int currCaretOffset = text.getCaretOffset();
if(e.stateMask == SWT.CTRL && e.keyCode == 'u'){
//text.setIndent(text.getOffsetAtLine(currentLine));//doesn't work
text.append("\n");
//text.append("\t");//doesn't work
text.setCaretOffset(text.getCharCount()+text.getTabs());//doesn't work
System.out.println("caret offset "+text.getCaretOffset());
}
}
});
如果我没理解错的话,您想将光标移到下一行并缩进 "white spaces" 与上一行中的前导空格一样多。
我很惊讶没有更好的方法来做到这一点(或者也许我还没有找到),但这将完成这项工作:
private static final int TAB_WIDTH = 5;
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Whosebug");
shell.setLayout(new FillLayout());
StyledText text = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
text.setTabs(TAB_WIDTH);
text.setText("");
text.setLeftMargin(5);
text.setBounds(0, 0, 512, 391);
text.addListener(SWT.KeyUp, (e) -> {
if (e.stateMask == SWT.CTRL && e.keyCode == 'u')
{
int currentLine = text.getLineAtOffset(text.getCaretOffset());
String textAtLine = text.getLine(currentLine);
int spaces = getLeadingSpaces(textAtLine);
text.insert("\n");
text.setCaretOffset(text.getCaretOffset() + 1);
for (int i = 0; i < spaces; i++)
text.append(" ");
text.setCaretOffset(text.getCaretOffset() + spaces);
}
});
shell.pack();
shell.open();
shell.setSize(400, 300);
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private static int getLeadingSpaces(String line)
{
int counter = 0;
char[] chars = line.toCharArray();
for (char c : chars)
{
if (c == '\t')
counter += TAB_WIDTH;
else if (c == ' ')
counter++;
else
break;
}
return counter;
}