⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 richbox.java

📁 java写的qq代码实现qq的部分功能
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
			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 + -