void Text::setCaretPosition(int x, int y, Font* font) { if (mRows.empty()) return; setCaretRow(y / font->getHeight()); setCaretColumn(font->getStringIndexAt(mRows[mCaretRow], x)); }
void TextBox::keyPressed(gcn::KeyEvent& keyEvent) { gcn::Key key = keyEvent.getKey(); int action = static_cast<KeyEvent*>(&keyEvent)->getActionId(); switch (action) { case Input::KEY_GUI_LEFT: { --mCaretColumn; if (mCaretColumn < 0) { --mCaretRow; if (mCaretRow < 0) { mCaretRow = 0; mCaretColumn = 0; } else { mCaretColumn = mTextRows[mCaretRow].size(); } } break; } case Input::KEY_GUI_RIGHT: { ++mCaretColumn; if (mCaretColumn > static_cast<int>(mTextRows[mCaretRow].size())) { ++ mCaretRow; if (mCaretRow >= static_cast<int>(mTextRows.size())) { mCaretRow = mTextRows.size() - 1; if (mCaretRow < 0) mCaretRow = 0; mCaretColumn = mTextRows[mCaretRow].size(); } else { mCaretColumn = 0; } } break; } case Input::KEY_GUI_DOWN: { setCaretRow(mCaretRow + 1); break; } case Input::KEY_GUI_UP: { setCaretRow(mCaretRow - 1); break; } case Input::KEY_GUI_HOME: { mCaretColumn = 0; break; } case Input::KEY_GUI_END: { mCaretColumn = mTextRows[mCaretRow].size(); break; } case Input::KEY_GUI_SELECT2: { if (mEditable) { mTextRows.insert(mTextRows.begin() + mCaretRow + 1, mTextRows[mCaretRow].substr(mCaretColumn, mTextRows[mCaretRow].size() - mCaretColumn)); mTextRows[mCaretRow].resize(mCaretColumn); ++mCaretRow; mCaretColumn = 0; } break; } case Input::KEY_GUI_BACKSPACE: { if (mCaretColumn != 0 && mEditable) { mTextRows[mCaretRow].erase(mCaretColumn - 1, 1); --mCaretColumn; } else if (mCaretColumn == 0 && mCaretRow != 0 && mEditable) { mCaretColumn = mTextRows[mCaretRow - 1].size(); mTextRows[mCaretRow - 1] += mTextRows[mCaretRow]; mTextRows.erase(mTextRows.begin() + mCaretRow); --mCaretRow; } break; } case Input::KEY_GUI_DELETE: { if (mCaretColumn < static_cast<int>( mTextRows[mCaretRow].size()) && mEditable) { mTextRows[mCaretRow].erase(mCaretColumn, 1); } else if (mCaretColumn == static_cast<int>( mTextRows[mCaretRow].size()) && mCaretRow < (static_cast<int>(mTextRows.size()) - 1) && mEditable) { mTextRows[mCaretRow] += mTextRows[mCaretRow + 1]; mTextRows.erase(mTextRows.begin() + mCaretRow + 1); } break; } case Input::KEY_GUI_PAGE_UP: { gcn::Widget* par = getParent(); if (par) { int rowsPerPage = par->getChildrenArea().height / getFont()->getHeight(); mCaretRow -= rowsPerPage; if (mCaretRow < 0) mCaretRow = 0; } break; } case Input::KEY_GUI_PAGE_DOWN: { gcn::Widget* par = getParent(); if (par) { int rowsPerPage = par->getChildrenArea().height / getFont()->getHeight(); mCaretRow += rowsPerPage; if (mCaretRow >= static_cast<int>(mTextRows.size())) mCaretRow = mTextRows.size() - 1; } break; } case Input::KEY_GUI_TAB: { if (mEditable) { mTextRows[mCaretRow].insert(mCaretColumn, std::string(" ")); mCaretColumn += 4; } break; } default: { if (key.isCharacter() && mEditable) { mTextRows[mCaretRow].insert(mCaretColumn, std::string(1, static_cast<char>(key.getValue()))); ++ mCaretColumn; } break; } } adjustSize(); scrollToCaret(); keyEvent.consume(); }
void TextBox::setCaretRowColumn(int row, int column) { setCaretRow(row); setCaretColumn(column); }
bool TextBox::keyPress(const Key& key) { bool ret = false; if (key.getValue() == Key::K_LEFT) { mCaretColumn = UTF8GetPrev(mTextRows[mCaretRow], mCaretColumn); if (mCaretColumn < 0) { --mCaretRow; if (mCaretRow < 0) { mCaretRow = 0; mCaretColumn = 0; } else { mCaretColumn = mTextRows[mCaretRow].size(); } } ret = true; } else if (key.getValue() == Key::K_RIGHT) { mCaretColumn = UTF8GetNext(mTextRows[mCaretRow], mCaretColumn); if (mCaretColumn > (int)mTextRows[mCaretRow].size()) { ++mCaretRow; if (mCaretRow >= (int)mTextRows.size()) { mCaretRow = mTextRows.size() - 1; if (mCaretRow < 0) { mCaretRow = 0; } mCaretColumn = mTextRows[mCaretRow].size(); } else { mCaretColumn = 0; } } ret = true; } else if (key.getValue() == Key::K_DOWN) { setCaretRow(mCaretRow + 1); ret = true; } else if (key.getValue() == Key::K_UP) { setCaretRow(mCaretRow - 1); ret = true; } else if (key.getValue() == Key::K_HOME) { mCaretColumn = 0; ret = true; } else if (key.getValue() == Key::K_END) { mCaretColumn = mTextRows[mCaretRow].size(); ret = true; } else if (key.getValue() == Key::K_ENTER && mEditable) { mTextRows.insert(mTextRows.begin() + mCaretRow + 1, mTextRows[mCaretRow].substr(mCaretColumn, mTextRows[mCaretRow].size() - mCaretColumn)); mTextRows[mCaretRow].resize(mCaretColumn); ++mCaretRow; mCaretColumn = 0; ret = true; } else if (key.getValue() == Key::K_BACKSPACE && mCaretColumn != 0 && mEditable) { int newpos = UTF8GetPrev(mTextRows[mCaretRow], mCaretColumn); mTextRows[mCaretRow].erase(newpos, mCaretColumn - newpos); mCaretColumn = newpos; ret = true; } else if (key.getValue() == Key::K_BACKSPACE && mCaretColumn == 0 && mCaretRow != 0 && mEditable) { mCaretColumn = mTextRows[mCaretRow - 1].size(); mTextRows[mCaretRow - 1] += mTextRows[mCaretRow]; mTextRows.erase(mTextRows.begin() + mCaretRow); --mCaretRow; ret = true; } else if (key.getValue() == Key::K_DELETE && mCaretColumn < (int)mTextRows[mCaretRow].size() && mEditable) { int newpos = UTF8GetNext(mTextRows[mCaretRow], mCaretColumn); mTextRows[mCaretRow].erase(mCaretColumn, newpos - mCaretColumn); ret = true; } else if (key.getValue() == Key::K_DELETE && mCaretColumn == (int)mTextRows[mCaretRow].size() && mCaretRow < ((int)mTextRows.size() - 1) && mEditable) { mTextRows[mCaretRow] += mTextRows[mCaretRow + 1]; mTextRows.erase(mTextRows.begin() + mCaretRow + 1); ret = true; } else if(key.getValue() == Key::K_PAGE_UP) { int w, h, rowsPerPage; getParent()->getDrawSize(w, h, this); rowsPerPage = h / getFont()->getHeight(); mCaretRow -= rowsPerPage; if (mCaretRow < 0) { mCaretRow = 0; } ret = true; } else if(key.getValue() == Key::K_PAGE_DOWN) { int w, h, rowsPerPage; getParent()->getDrawSize(w, h, this); rowsPerPage = h / getFont()->getHeight(); mCaretRow += rowsPerPage; if (mCaretRow >= (int)mTextRows.size()) { mCaretRow = mTextRows.size() - 1; } ret = true; } else if(key.getValue() == Key::K_TAB && mEditable) { mTextRows[mCaretRow].insert(mCaretColumn,std::string(" ")); mCaretColumn += 4; ret = true; } else if (key.getValue() == 'v' - 'a' + 1 && mEditable) // ctrl-v { std::string str; if (GetClipboard(str) >= 0) { for (size_t i = 0; i < str.size(); ++i) { keyPress(Key(str[i])); } ret = true; } } else if (key.isCharacter() && mEditable) { mTextRows[mCaretRow].insert(mCaretColumn,key.toString()); mCaretColumn = UTF8GetNext(mTextRows[mCaretRow], mCaretColumn); ret = true; } adjustSize(); scrollToCaret(); return ret; }
void Text::remove(int numberOfCharacters) { if (mRows.empty() || numberOfCharacters == 0) return; // We should remove characters left of the caret position. if (numberOfCharacters < 0) { while (numberOfCharacters != 0) { // If the caret position is zero there is nothing // more to do. if (mCaretPosition == 0) break; // If we are at the end of the row // and the row is not the first row we // need to merge two rows. if (mCaretColumn == 0 && mCaretRow != 0) { mRows[mCaretRow - 1] += mRows[mCaretRow]; mRows.erase(mRows.begin() + mCaretRow); setCaretRow(mCaretRow - 1); setCaretColumn(getNumberOfCharacters(mCaretRow)); } else { mRows[mCaretRow].erase(mCaretColumn - 1, 1); setCaretPosition(mCaretPosition - 1); } numberOfCharacters++; } } // We should remove characters right of the caret position. else if (numberOfCharacters > 0) { while (numberOfCharacters != 0) { // If all rows have been removed there is nothing // more to do. if (mRows.empty()) break; // If we are at the end of row and the row // is not the last row we need to merge two // rows. if (mCaretColumn == mRows[mCaretRow].size() && mCaretRow < (mRows.size() - 1)) { mRows[mCaretRow] += mRows[mCaretRow + 1]; mRows.erase(mRows.begin() + mCaretRow + 1); } else { mRows[mCaretRow].erase(mCaretColumn, 1); } numberOfCharacters--; } } }
void TextBox::keyPressed(KeyEvent& keyEvent) { Key key = keyEvent.getKey(); if (key.getValue() == Key::LEFT) { --mCaretColumn; if (mCaretColumn < 0) { --mCaretRow; if (mCaretRow < 0) { mCaretRow = 0; mCaretColumn = 0; } else { mCaretColumn = mTextRows[mCaretRow].size(); } } } else if (key.getValue() == Key::RIGHT) { ++mCaretColumn; if (mCaretColumn > (int)mTextRows[mCaretRow].size()) { ++mCaretRow; if (mCaretRow >= (int)mTextRows.size()) { mCaretRow = mTextRows.size() - 1; if (mCaretRow < 0) { mCaretRow = 0; } mCaretColumn = mTextRows[mCaretRow].size(); } else { mCaretColumn = 0; } } } else if (key.getValue() == Key::DOWN) { setCaretRow(mCaretRow + 1); } else if (key.getValue() == Key::UP) { setCaretRow(mCaretRow - 1); } else if (key.getValue() == Key::HOME) { mCaretColumn = 0; } else if (key.getValue() == Key::END) { mCaretColumn = mTextRows[mCaretRow].size(); } else if (key.getValue() == Key::ENTER && mEditable) { mTextRows.insert(mTextRows.begin() + mCaretRow + 1, mTextRows[mCaretRow].substr(mCaretColumn, mTextRows[mCaretRow].size() - mCaretColumn)); mTextRows[mCaretRow].resize(mCaretColumn); ++mCaretRow; mCaretColumn = 0; } else if (key.getValue() == Key::BACKSPACE && mCaretColumn != 0 && mEditable) { wchar_t c = mTextRows[mCaretRow][mCaretColumn-1]; if(c < 128) { mTextRows[mCaretRow].erase(mCaretColumn - 1, 1); --mCaretColumn; } else { mTextRows[mCaretRow].erase(mCaretColumn - 3, 3); mCaretColumn -= 3; } } else if (key.getValue() == Key::BACKSPACE && mCaretColumn == 0 && mCaretRow != 0 && mEditable) { mCaretColumn = mTextRows[mCaretRow - 1].size(); mTextRows[mCaretRow - 1] += mTextRows[mCaretRow]; mTextRows.erase(mTextRows.begin() + mCaretRow); --mCaretRow; } // else if (key.getValue() == Key::DELETE // && mCaretColumn < (int)mTextRows[mCaretRow].size() // && mEditable) else if (key.getValue() == 1013 && mCaretColumn != 0 && mEditable) { mTextRows[mCaretRow].erase(mCaretColumn, 1); } else if (key.getValue() == 1013 && mCaretColumn == (int)mTextRows[mCaretRow].size() && mCaretRow < ((int)mTextRows.size() - 1) && mEditable) { mTextRows[mCaretRow] += mTextRows[mCaretRow + 1]; mTextRows.erase(mTextRows.begin() + mCaretRow + 1); } else if(key.getValue() == Key::PAGE_UP) { Widget* par = getParent(); if (par != NULL) { int rowsPerPage = par->getChildrenArea().height / getFont()->getHeight(); mCaretRow -= rowsPerPage; if (mCaretRow < 0) { mCaretRow = 0; } } } else if(key.getValue() == Key::PAGE_DOWN) { Widget* par = getParent(); if (par != NULL) { int rowsPerPage = par->getChildrenArea().height / getFont()->getHeight(); mCaretRow += rowsPerPage; if (mCaretRow >= (int)mTextRows.size()) { mCaretRow = mTextRows.size() - 1; } } } else if(key.getValue() == Key::TAB && mEditable) { mTextRows[mCaretRow].insert(mCaretColumn, std::string(" ")); mCaretColumn += 4; } else if (key.isCharacter() && mEditable) { mTextRows[mCaretRow].insert(mCaretColumn, std::string(1,(char)key.getValue())); ++mCaretColumn; } // ak add ime else if (key.isIME()) { char szImeChar[3]; if (key.getValue() < 128) { szImeChar[0]=(char)key.getValue(); szImeChar[1]='\0'; } else { szImeChar[0]=(char)(key.getValue()>>8); szImeChar[1]=(char)key.getValue(); szImeChar[2]='\0'; } mTextRows[mCaretRow].insert(mCaretColumn, szImeChar); ++mCaretColumn; }