Example #1
0
	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();
	}
Example #2
0
	void TextField::setSize( const Dimension& size )
	{
		Widget::setSize(size);

		scrollToCaret(false,false);
		relocateCaret();
		setSelection(getSelectionStart(),getSelectionEnd());
	}
Example #3
0
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();
}
Example #4
0
    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;
    }
Example #5
0
    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();
    }
Example #6
0
	void TextField::setRightPadding( int padding )
	{
		rightPadding = padding;
		scrollToCaret(false,true);
		relocateCaret();
	}
Example #7
0
	void TextField::setTextAlignment( AlignmentEnum alignment )
	{
		textAlign = alignment;
		scrollToCaret(false,true);
		relocateCaret();
	}