📄 richbox.java
字号:
action = getKeyBinding(key);
if (action == SWT.NULL) {
// see if we have a control character
if ((event.stateMask & SWT.CTRL) != 0 && (event.character >= 0)
&& event.character <= 31) {
// get the character from the CTRL+char sequence, the control
// key subtracts 64 from the value of the key that it modifies
key = (event.character + 64) | event.stateMask;
action = getKeyBinding(key);
}
}
}
if (action == SWT.NULL) {
// 如果是只读模式,直接返回
if(readonly)
return;
// 如果没有事件和这个按键绑定,则要检查按键的内容,如果不包含一些
// 特殊的按键,则当作普通的输入处理,否则忽略掉
boolean ignore = false;
if (IS_CARBON) {
// Ignore acclerator key combinations (we do not want to
// insert a character in the text in this instance). Do not
// ignore COMMAND+ALT combinations since that key sequence
// produces characters on the mac.
ignore = (event.stateMask ^ SWT.COMMAND) == 0
|| (event.stateMask ^ (SWT.COMMAND | SWT.SHIFT)) == 0;
} else {
// Ignore acclerator key combinations (we do not want to
// insert a character in the text in this instance). Don't
// ignore CTRL+ALT combinations since that is the Alt Gr
// key on some keyboards.
ignore = (event.stateMask ^ SWT.ALT) == 0
|| (event.stateMask ^ SWT.CTRL) == 0
|| (event.stateMask ^ (SWT.ALT | SWT.SHIFT)) == 0
|| (event.stateMask ^ (SWT.CTRL | SWT.SHIFT)) == 0;
}
// -ignore anything below SPACE except for line delimiter keys and tab.
// -ignore DEL
if (!ignore && event.character > 31 && event.character != SWT.DEL
|| event.character == TAB) {
doContent(event.character);
}
} else if(action == CUSTOM_ACTION) {
getUserKeyAction(key).run();
} else {
invokeAction(action);
}
}
/**
* 输入一个字符
*
* @param character
*/
private void doContent(char key) {
Event event;
event = new Event();
event.start = selectionStart;
event.end = selectionEnd;
// replace a CR line break with the widget line break
// CR does not make sense on Windows since most (all?) applications
// don't recognize CR as a line break.
if (key == SWT.CR || key == SWT.LF) {
event.text = CRLF;
} else if(key == TAB) {
event.text = " ";
} else {
event.text = new String(new char[] { key });
}
caretOffset = selectionStart + event.text.length();
clearSelection();
modifyContent(event);
showCaret();
}
/**
* 修改内容
*
* @param text
*/
private void doContent(String text) {
Event event;
event = new Event();
event.start = selectionStart;
event.end = selectionEnd;
event.text = text.replaceAll("\t", " ");
event.text = event.text.replaceAll("\r", "");
caretOffset = selectionStart + event.text.length();
clearSelection();
modifyContent(event);
showCaret();
}
/**
* 修改内容
*
* @param event
* 事件
*/
private void modifyContent(Event event) {
event.doit = true;
notifyListeners(SWT.Verify, event);
if (event.doit) {
stopAnimation(content.getText(event.start, event.end - event.start));
content.replaceText(new TextEvent(event));
startAnimation(event.text);
setScrollBars();
}
}
/**
* 执行按键动作
*
* @param action
* 动作ID
*/
private void invokeAction(int action) {
int caretLine;
int oldColumnX = columnX;
switch(action) {
case LINE_UP:
caretLine = doSimpleLineUp();
showCaret(caretLine);
clearSelection();
columnX = oldColumnX;
break;
case LINE_DOWN:
caretLine = doSimpleLineDown();
showCaret(caretLine);
clearSelection();
columnX = oldColumnX;
break;
case COLUMN_LEFT:
doCaretLeft();
clearSelection();
break;
case COLUMN_RIGHT:
doCaretRight();
clearSelection();
break;
case LINE_START:
doLineStart();
clearSelection();
break;
case LINE_END:
doLineEnd();
clearSelection();
break;
case TEXT_START:
doTextStart();
clearSelection();
break;
case TEXT_END:
doTextEnd();
clearSelection();
break;
case PAGE_UP:
doPageUp();
clearSelection();
break;
case PAGE_DOWN:
doPageDown();
clearSelection();
break;
case SELECT_COLUMN_LEFT:
doSelectionCaretLeft();
break;
case SELECT_COLUMN_RIGHT:
doSelectionCaretRight();
break;
case SELECT_LINE_UP:
doSelectionLineUp();
break;
case SELECT_LINE_DOWN:
doSelectionLineDown();
break;
case COPY:
copy();
break;
case CUT:
cut();
break;
case PASTE:
paste();
break;
case DELETE_PREVIOUS:
if(!readonly)
doBackspace();
break;
case DELETE_NEXT:
if(!readonly)
doDelete();
break;
case SELECT_ALL:
doSelectAll();
break;
case NEW_LINE:
if(!readonly)
doContent(SWT.CR);
break;
}
}
/**
* 全选
*/
private void doSelectAll() {
caretOffset = 0;
resetSelection(0, content.getCharCount());
showCaret();
}
/**
* 粘贴
*/
private void paste() {
if(readonly)
return;
String text = (String)clipboard.getContents(TextTransfer.getInstance());
if(text == null || text.equals(""))
return;
Event event;
event = new Event();
event.start = selectionStart;
event.end = selectionEnd;
event.text = text.replaceAll("\t", " ");
caretOffset = selectionStart + event.text.length();
clearSelection();
modifyContent(event);
showCaret();
}
/**
* 剪切
*/
private void cut() {
copy();
if(!readonly)
doDelete();
}
/**
* 删除前一个字符或者被选择区域
*/
void doBackspace() {
Event event = new Event();
event.text = "";
if (selectionEnd != selectionStart) {
event.start = selectionStart;
event.end = selectionEnd;
caretOffset = selectionStart;
clearSelection();
modifyContent(event);
showCaret();
} else if (caretOffset > 0) {
int line = content.getLineAtOffset(caretOffset);
int lineOffset = content.getLineStartOffset(line);
if (caretOffset == lineOffset) {
lineOffset = content.getLineStartOffset(line - 1);
event.start = lineOffset + content.getLine(line - 1).length();
event.end = caretOffset;
caretOffset = event.start;
} else {
event.start = caretOffset - 1;
event.end = caretOffset;
if(content.isImageTag(event.start - 1)) {
event.start--;
caretOffset--;
}
caretOffset--;
}
resetSelection();
modifyContent(event);
showCaret();
}
}
/**
* 删除下一个字符或者被选择区
*/
void doDelete() {
Event event = new Event();
event.text = "";
if (selectionEnd != selectionStart) {
event.start = selectionStart;
event.end = selectionEnd;
caretOffset = selectionStart;
clearSelection();
modifyContent(event);
showCaret();
} else if (caretOffset < content.getCharCount()) {
int line = content.getLineAtOffset(caretOffset);
int lineOffset = content.getLineStartOffset(line);
int lineLength = content.getLine(line).length();
if (caretOffset == lineOffset + lineLength) {
event.start = caretOffset;
event.end = content.getLineStartOffset(line + 1);
} else {
event.start = caretOffset;
event.end = event.start + 1;
if(content.isImageTag(event.start))
event.end++;
}
modifyContent(event);
showCaret();
}
}
/**
* 拷贝
* <p>
*
* @exception SWTException
* <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been
* disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public void copy() {
checkWidget();
int length = selectionEnd - selectionStart;
if (length > 0) {
try {
setClipboardContent(selectionStart, length);
} catch (SWTError error) {
// Copy to clipboard failed. This happens when another
// application
// is accessing the clipboard while we copy. Ignore the error.
// Rethrow all other errors.
if (error.code != DND.ERROR_CANNOT_SET_CLIPBOARD) {
throw error;
}
}
}
}
/**
* 设置剪切版内容
*
* @param start
* 起始位置
* @param length
* 长度
*/
private void setClipboardContent(int start, int length) {
if(content == null)
return;
String text = content.getText(start, length);
setClipboardContent(text);
}
/**
* 设置剪切版内容
*
* @param text
*/
private void setClipboardContent(String text) {
TextTransfer textTransfer = TextTransfer.getInstance();
clipboard.setContents(new Object[] { text }, new Transfer[] { textTransfer });
}
/**
* 下移一行并选择
*/
private void doSelectionLineDown() {
int old = caretOffset;
doLineDown();
if(old == caretOffset)
return;
if(caretOffset == selectionEnd)
resetSelection(caretOffset, caretOffset);
else if(caretOffset > selectionEnd)
resetSelection(selectionStart, caretOffset);
else
resetSelection(caretOffset, selectionEnd);
}
/**
* 上移一行并选择
*/
private void doSelectionLineUp() {
int old = caretOffset;
doLineUp();
if(old == caretOffset)
return;
if(caretOffset == selectionStart)
resetSelection(caretOffset, caretOffset);
else if(caretOffset < selectionStart)
resetSelection(caretOffset, selectionEnd);
else
resetSelection(selectionStart, caretOffset);
}
/**
* 光标右移并选择
*/
private void doSelectionCaretRight() {
int old = caretOffset;
doSimpleCaretRigth();
if(old == caretOffset)
return;
if(caretOffset == selectionEnd)
resetSelection(caretOffset, caretOffset);
else if(caretOffset > selectionEnd)
resetSelection(selectionStart, caretOffset);
else
resetSelection(caretOffset, selectionEnd);
}
/**
* 光标左移1格,选中移动的位置
*/
private void doSelectionCaretLeft() {
int old = caretOffset;
doSimpleCaretLeft();
if(old == caretOffset)
return;
if(caretOffset == selectionStart)
resetSelection(caretOffset, caretOffset);
else if(caretOffset < selectionStart)
resetSelection(caretOffset, selectionEnd);
else
resetSelection(selectionStart, caretOffset);
}
/**
* 下翻一页,不改变光标的X参考点
*/
private void doPageDown() {
int lineCount = content.getLineCount();
int oldColumnX = columnX;
int caretLine;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -