bool GuiTextEdit::OnKeyEvent(const KeyEvent& ke) { if (!IsVisible()) { return false; } // Buttons can generate key events, so this GuiTextEdit object may not have the focus (the button // just clicked would have it). So the last GuiTextEdit to have the focus should accept this key. if (!HasFocus()) { #ifdef TEXT_EDIT_DEBUG std::cout << "Key event ignored by " << m_name << " as does not have focus.\n"; #endif return false; } // Is this the current or most recent GuiTextEdit to have focus ? // TODO if (!ke.keyDown) { return true; } switch (ke.keyType) { case AMJU_KEY_CHAR: // Prevent chars like Tab if (ke.key >= ' ') // && ke.key <= (char)127) { Insert(ke.key); } else { // TODO Alert user that character is out of range } break; case AMJU_KEY_UP: case AMJU_KEY_DOWN: // TODO Multi line text break; case AMJU_KEY_LEFT: #ifdef MACOSX if (ke.modifier & AMJU_KEY_MOD_ALT) // jump to prev word #else if (ke.modifier & AMJU_KEY_MOD_CTRL) #endif { // Prev word if (ke.modifier & AMJU_KEY_MOD_SHIFT) { #ifdef TEXT_EDIT_DEBUG std::cout << "Prev word + select\n"; #endif m_caret = PrevWord(m_caret); m_triListSelection = 0; } else { #ifdef TEXT_EDIT_DEBUG std::cout << "Prev word\n"; #endif m_caret = PrevWord(m_caret); m_selectedText = m_caret; m_triListSelection = 0; } } else if (ke.modifier & AMJU_KEY_MOD_SHIFT) { #ifdef TEXT_EDIT_DEBUG std::cout << "Prev char + select\n"; #endif // Select char to left if (m_caret > 0) { m_caret--; m_triListSelection = 0; } } else { #ifdef TEXT_EDIT_DEBUG std::cout << "Prev char\n"; #endif if (m_caret > 0) { // Move caret left m_caret--; m_selectedText = m_caret; m_triListSelection = 0; } } break; case AMJU_KEY_RIGHT: #ifdef MACOSX if (ke.modifier & AMJU_KEY_MOD_ALT) // jump to next word #else if (ke.modifier & AMJU_KEY_MOD_CTRL) #endif { // Next word if (ke.modifier & AMJU_KEY_MOD_SHIFT) { #ifdef TEXT_EDIT_DEBUG std::cout << "Next word + select\n"; #endif m_caret = NextWord(m_caret); m_triListSelection = 0; } else { #ifdef TEXT_EDIT_DEBUG std::cout << "Next word\n"; #endif m_caret = NextWord(m_caret); m_selectedText = m_caret; m_triListSelection = 0; } } else if (ke.modifier & AMJU_KEY_MOD_SHIFT) { #ifdef TEXT_EDIT_DEBUG std::cout << "Next char + select\n"; #endif if (m_caret < (int)m_text.size()) { m_caret++; m_triListSelection = 0; } } else { #ifdef TEXT_EDIT_DEBUG std::cout << "Next char\n"; #endif if (m_caret < (int)m_text.size()) { m_caret++; m_selectedText = m_caret; m_triListSelection = 0; } } break; case AMJU_KEY_ENTER: // TODO multi-line ExecuteCommand(); break; case AMJU_KEY_SPACE: Insert(' '); break; case AMJU_KEY_ESC: // OnCancel(); break; case AMJU_KEY_BACKSPACE: { int left = std::min(m_caret, m_selectedText); int right = std::max(m_caret, m_selectedText); if (left == right && m_caret > 0) { left--; } std::string leftStr = m_text.substr(0, left); std::string rightStr = m_text.substr(right); m_text = leftStr + rightStr; m_caret = left; m_selectedText = m_caret; m_triListSelection = 0; if (m_onChangeFunc) { m_onChangeFunc(this); } m_triList = 0; // force rebuild } break; case AMJU_KEY_DELETE: //if () { int left = std::min(m_caret, m_selectedText); int right = std::max(m_caret, m_selectedText); if (left == right && m_caret < (int)m_text.size()) { right++; } std::string leftStr = m_text.substr(0, left); std::string rightStr = m_text.substr(right); m_text = leftStr + rightStr; m_caret = left; m_selectedText = m_caret; m_triListSelection = 0; if (m_onChangeFunc) { m_onChangeFunc(this); } m_triList = 0; // force rebuild } break; default: #ifdef _DEBUG std::cout << "Unexpected key type: " << ke.keyType << " key: '" << ke.key << "' (int: " << (int)ke.key << ")\n"; #endif // Assert(0); // handle this key ? break; } if (m_caret >= m_last || m_caret <= m_first) { RecalcFirstLast(); } return true; // handled }
void scSelection::MoveSelect( eSelectMove moveSelect ) { int setmax = 1; switch ( moveSelect ) { case ePrevChar: case eNextChar: case ePrevCharInPara: case eNextCharInPara: SLCCharacterMove( *this, moveSelect ); break; case ePrevWord: PrevWord( ); break; case eNextWord: NextWord( ); break; case ePrevSpellWord: PrevSpellWord( ); break; case eNextSpellWord: NextSpellWord( ); break; case eStartWord: StartWord( ); break; case eEndWord: EndWord( ); break; case ePrevEntireLine: PrevEntireLine(); break; case eNextEntireLine: NextEntireLine(); break; case ePrevLine: PrevLine(); setmax = 0; break; case eNextLine: NextLine(); setmax = 0; break; case eStartLine: StartLine(); break; case eEndLine: EndLine(); break; case ePrevPara: case eNextPara: case eFirstPara: case eLastPara: Para( moveSelect ); break; case eBeginPara: BeginPara(); break; case eEndPara: EndPara(); break; case ePrevEntireColumn: PrevColumn(); break; case eNextEntireColumn: NextColumn(); break; case eBeginColumn: StartColumn( ); break; case eEndColumn: EndColumn(); break; case eStartStream: fMark.SelectStartStream(); fPoint.SelectStartStream(); break; case eEndStream: fMark.SelectEndStream(); fPoint.SelectEndStream(); break; default: SCDebugBreak(); break; } fMark.UpdateInfo( setmax ); fPoint.UpdateInfo( setmax ); }
/* ---------- page/scroll keys ----------- */ static int DoScrolling(WINDOW wnd, int c, PARAM p2) { switch (c) { case PGUP: case PGDN: if (isMultiLine(wnd)) BaseWndProc(EDITBOX, wnd, KEYBOARD, c, p2); break; case CTRL_PGUP: case CTRL_PGDN: BaseWndProc(EDITBOX, wnd, KEYBOARD, c, p2); break; case HOME: Home(wnd); break; case END: End(wnd); break; case CTRL_FWD: NextWord(wnd); break; case CTRL_BS: PrevWord(wnd); break; case CTRL_HOME: if (isMultiLine(wnd)) { SendMessage(wnd, SCROLLDOC, TRUE, 0); wnd->CurrLine = 0; wnd->WndRow = 0; } Home(wnd); break; case CTRL_END: if (isMultiLine(wnd) && wnd->WndRow+wnd->wtop+1 < wnd->wlines && wnd->wlines > 0) { SendMessage(wnd, SCROLLDOC, FALSE, 0); SetLinePointer(wnd, wnd->wlines-1); wnd->WndRow = min(ClientHeight(wnd)-1, wnd->wlines-1); Home(wnd); } End(wnd); break; case UP: if (isMultiLine(wnd)) Upward(wnd); break; case DN: if (isMultiLine(wnd)) Downward(wnd); break; case FWD: Forward(wnd); break; case BS: Backward(wnd); break; default: return FALSE; } if (!KeyBoardMarking && TextBlockMarked(wnd)) { ClearTextBlock(wnd); SendMessage(wnd, PAINT, 0, 0); } SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow); return TRUE; }
void scSelection::Extend( eSelectMove moveSelect ) { int setmax = 1; switch ( moveSelect ) { case ePrevChar: fPoint.SelectPrevChar(); break; case eNextChar: fPoint.SelectNextChar(); break; case ePrevWord: { TextMarker mark = fMark; PrevWord(); fMark = mark; break; } case eNextWord: { TextMarker mark = fMark; NextWord( ); fMark = mark; break; } case ePrevSpellWord: fPoint.SelectPrevSpellWord( ); break; case eNextSpellWord: fPoint.SelectNextSpellWord( ); break; case eStartWord: fPoint.SelectStartWord( ); break; case eEndWord: fPoint.SelectEndWord( ); break; case ePrevEntireLine: fPoint.SelectPrevLine(); fPoint.SelectStartLine(); break; case eNextEntireLine: fPoint.SelectNextLine(); fPoint.SelectEndLine(); break; case ePrevLine: fPoint.SelectPrevLine(); setmax = 0; break; case eNextLine: fPoint.SelectNextLine(); setmax = 0; break; case eStartLine: fPoint.SelectStartLine(); break; case eEndLine: fPoint.SelectEndLine(); break; case eBeginPara: fPoint.SelectStartPara(); break; case eEndPara: fPoint.SelectEndPara(); break; case eBeginColumn: fPoint.SelectStartColumn(); break; case eEndColumn: fPoint.SelectEndColumn(); break; case ePrevCharInPara: fPoint.SelectPrevCharInPara(); break; case eNextCharInPara: fPoint.SelectNextCharInPara(); break; case ePrevPara: fPoint.SelectPrevPara(); break; case eNextPara: fPoint.SelectNextPara(); break; case eFirstPara: fPoint.SelectStartStream(); break; case eLastPara: fPoint.SelectEndStream(); break; case eStartStream: fPoint.SelectStartStream(); break; case eEndStream: fPoint.SelectEndStream(); break; case ePrevEntireColumn: case eNextEntireColumn: default: SCDebugBreak(); break; } fMark.UpdateInfo( setmax ); fPoint.UpdateInfo( setmax ); }