void TextField::positionCaret( int position, bool surpressNegChange) { bool negChange = false; if(position > getTextLength()) { position = getTextLength(); } if(position < 0) { position = 0; } if(position < caretPosition && !surpressNegChange) { negChange = true; } caretPosition = position; scrollToCaret(negChange,true); relocateCaret(); //because circular dependencies //are the new recursion! scrollToCaret(negChange,true); relocateCaret(); }
void TextField::setSize( const Dimension& size ) { Widget::setSize(size); scrollToCaret(false,false); relocateCaret(); setSelection(getSelectionStart(),getSelectionEnd()); }
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(); }
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 TextBox::keyPressed(KeyEvent& keyEvent) { Key key = keyEvent.getKey(); if (key.getValue() == Key::Left) mText->setCaretPosition(mText->getCaretPosition() - 1); else if (key.getValue() == Key::Right) mText->setCaretPosition(mText->getCaretPosition() + 1); else if (key.getValue() == Key::Down) mText->setCaretRow(mText->getCaretRow() + 1); else if (key.getValue() == Key::Up) mText->setCaretRow(mText->getCaretRow() - 1); else if (key.getValue() == Key::Home) mText->setCaretColumn(0); else if (key.getValue() == Key::End) mText->setCaretColumn(mText->getNumberOfCharacters(mText->getCaretRow())); else if (key.getValue() == Key::Enter && mEditable) mText->insert('\n'); else if (key.getValue() == Key::Backspace && mEditable) mText->remove(-1); else if (key.getValue() == Key::Delete && mEditable) mText->remove(1); else if(key.getValue() == Key::PageUp) { Widget* par = getParent(); if (par != NULL) { int rowsPerPage = par->getChildrenArea().height / getFont()->getHeight(); mText->setCaretRow(mText->getCaretRow() - rowsPerPage); } } else if(key.getValue() == Key::PageDown) { Widget* par = getParent(); if (par != NULL) { int rowsPerPage = par->getChildrenArea().height / getFont()->getHeight(); mText->setCaretRow(mText->getCaretRow() + rowsPerPage); } } else if(key.getValue() == Key::Tab && mEditable) { mText->insert(' '); mText->insert(' '); mText->insert(' '); mText->insert(' '); } else if (key.isCharacter() && mEditable) mText->insert(key.getValue()); adjustSize(); scrollToCaret(); keyEvent.consume(); }
void TextField::setRightPadding( int padding ) { rightPadding = padding; scrollToCaret(false,true); relocateCaret(); }
void TextField::setTextAlignment( AlignmentEnum alignment ) { textAlign = alignment; scrollToCaret(false,true); relocateCaret(); }