From 833e498f54c1d33be94c09214315b368cccaec06 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 5 Mar 2014 12:25:56 +0300 Subject: Merger textfield and merge textbox. --- src/gui/widgets/textbox.cpp | 245 +++++++++++++++++++++++++++++++++++++++- src/gui/widgets/textbox.h | 254 +++++++++++++++++++++++++++++++++++++++++- src/gui/widgets/textfield.cpp | 77 ++++++++++++- src/gui/widgets/textfield.h | 105 +++++++++++++++-- 4 files changed, 664 insertions(+), 17 deletions(-) (limited to 'src/gui/widgets') diff --git a/src/gui/widgets/textbox.cpp b/src/gui/widgets/textbox.cpp index a1ce0e61d..a00d0ccf8 100644 --- a/src/gui/widgets/textbox.cpp +++ b/src/gui/widgets/textbox.cpp @@ -20,6 +20,49 @@ * along with this program. If not, see . */ +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson + * + * + * Per Larsson a.k.a finalman + * Olof Naessén a.k.a jansem/yakslem + * + * Visit: http://guichan.sourceforge.net + * + * License: (BSD) + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name of Guichan nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #include "gui/widgets/textbox.h" #include "events/keyevent.h" @@ -34,9 +77,23 @@ #include "debug.h" TextBox::TextBox(const Widget2 *const widget) : - gcn::TextBox(widget), - mMinWidth(getWidth()) + Widget(widget), + MouseListener(), + KeyListener(), + mTextRows(), + mCaretColumn(0), + mCaretRow(0), + mMinWidth(getWidth()), + mEditable(true), + mOpaque(true) { + setText(""); + setFocusable(true); + + addMouseListener(this); + addKeyListener(this); + adjustSize(); + mForegroundColor = getThemeColor(Theme::TEXTBOX); setOpaque(false); setFrameSize(0); @@ -163,7 +220,33 @@ void TextBox::setTextWrapped(const std::string &text, const int minDimension) mMinWidth = minWidth; - gcn::TextBox::setText(wrappedStream.str()); + setText(wrappedStream.str()); +} + +void TextBox::setText(const std::string& text) +{ + mCaretColumn = 0; + mCaretRow = 0; + + mTextRows.clear(); + + size_t pos; + size_t lastPos = 0; + int length; + do + { + pos = text.find("\n", lastPos); + + if (pos != std::string::npos) + length = static_cast(pos - lastPos); + else + length = static_cast(text.size() - lastPos); + std::string sub = text.substr(lastPos, length); + mTextRows.push_back(sub); + lastPos = pos + 1; + } while (pos != std::string::npos); + + adjustSize(); } void TextBox::keyPressed(KeyEvent& keyEvent) @@ -391,3 +474,159 @@ void TextBox::setForegroundColorAll(const Color &color1, mForegroundColor = color1; mForegroundColor2 = color2; } + +std::string TextBox::getText() const +{ + if (mTextRows.empty()) + return std::string(""); + + int i; + std::string text; + + const int sz = static_cast(mTextRows.size()); + for (i = 0; i < sz - 1; ++ i) + text.append(mTextRows[i]).append("\n"); + text.append(mTextRows[i]); + + return text; +} + +void TextBox::setTextRow(const int row, const std::string& text) +{ + mTextRows[row] = text; + + if (mCaretRow == row) + setCaretColumn(mCaretColumn); + + adjustSize(); +} + +void TextBox::setCaretPosition(unsigned int position) +{ + for (int row = 0, sz = static_cast(mTextRows.size()); + row < sz; row ++) + { + if (position <= mTextRows[row].size()) + { + mCaretRow = row; + mCaretColumn = position; + return; // we are done + } + else + { + position--; + } + } + + // position beyond end of text + mCaretRow = static_cast(mTextRows.size() - 1); + mCaretColumn = static_cast(mTextRows[mCaretRow].size()); +} + +void TextBox::setCaretRow(const int row) +{ + mCaretRow = row; + + const int sz = static_cast(mTextRows.size()); + if (mCaretRow >= sz) + mCaretRow = sz - 1; + + if (mCaretRow < 0) + mCaretRow = 0; + + setCaretColumn(mCaretColumn); +} + +unsigned int TextBox::getCaretPosition() const +{ + int pos = 0, row; + + for (row = 0; row < mCaretRow; row++) + pos += static_cast(mTextRows[row].size()); + + return pos + mCaretColumn; +} + +void TextBox::setCaretColumn(const int column) +{ + mCaretColumn = column; + + const int sz = static_cast(mTextRows[mCaretRow].size()); + if (mCaretColumn > sz) + mCaretColumn = sz; + + if (mCaretColumn < 0) + mCaretColumn = 0; +} + +void TextBox::setCaretRowColumn(const int row, const int column) +{ + setCaretRow(row); + setCaretColumn(column); +} + +void TextBox::scrollToCaret() +{ + Rect scroll; + Font *const font = getFont(); + scroll.x = font->getWidth( + mTextRows[mCaretRow].substr(0, mCaretColumn)); + scroll.y = font->getHeight() * mCaretRow; + scroll.width = font->getWidth(" "); + + // add 2 for some extra space + scroll.height = font->getHeight() + 2; + + showPart(scroll); +} + +void TextBox::addRow(const std::string &row) +{ + mTextRows.push_back(row); + adjustSize(); +} + +void TextBox::mousePressed(MouseEvent& mouseEvent) +{ + if (mouseEvent.getButton() == MouseEvent::LEFT) + { + const int height = getFont()->getHeight(); + if (!height) + return; + + mCaretRow = mouseEvent.getY() / height; + + const int sz = static_cast(mTextRows.size()); + if (mCaretRow >= sz) + mCaretRow = sz - 1; + + mCaretColumn = getFont()->getStringIndexAt( + mTextRows[mCaretRow], mouseEvent.getX()); + } +} + +void TextBox::mouseDragged(MouseEvent& mouseEvent) +{ + mouseEvent.consume(); +} + +void TextBox::drawCaret(Graphics *const graphics, const int x, const int y) +{ + graphics->setColor(mForegroundColor); + graphics->drawLine(x, getFont()->getHeight() + y, x, y); +} + +void TextBox::adjustSize() +{ + int width = 0; + Font *const font = getFont(); + for (size_t i = 0, sz = mTextRows.size(); i < sz; ++i) + { + const int w = font->getWidth(mTextRows[i]); + if (width < w) + width = w; + } + + setWidth(width + 1); + setHeight(static_cast(font->getHeight() * mTextRows.size())); +} diff --git a/src/gui/widgets/textbox.h b/src/gui/widgets/textbox.h index 3f78fd247..8de0fe0bf 100644 --- a/src/gui/widgets/textbox.h +++ b/src/gui/widgets/textbox.h @@ -20,10 +20,56 @@ * along with this program. If not, see . */ +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson + * + * + * Per Larsson a.k.a finalman + * Olof Naessén a.k.a jansem/yakslem + * + * Visit: http://guichan.sourceforge.net + * + * License: (BSD) + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name of Guichan nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #ifndef GUI_WIDGETS_TEXTBOX_H #define GUI_WIDGETS_TEXTBOX_H -#include "gui/base/widgets/textbox.hpp" +#include "gui/widgets/widget.h" + +#include "listeners/keylistener.h" +#include "listeners/mouselistener.h" #include "localconsts.h" @@ -34,7 +80,9 @@ * * \ingroup GUI */ -class TextBox final : public gcn::TextBox +class TextBox final : public Widget, + public MouseListener, + public KeyListener { public: /** @@ -66,8 +114,210 @@ class TextBox final : public gcn::TextBox void setForegroundColorAll(const Color &color1, const Color &color2); + /** + * Sets the text of the text box. + * + * @param text The text of the text box. + * @see getText + */ + void setText(const std::string& text); + + /** + * Gets the text of the text box. + * + * @return The text of the text box. + * @see setText + */ + std::string getText() const; + + /** + * Gets a certain row from the text. + * + * @param row The number of the row to get from the text. + * @return A row from the text of the text box. + * @see setTextRow + */ + const std::string& getTextRow(const int row) const + { return mTextRows[row]; } + + /** + * Sets the text of a certain row of the text. + * + * @param row The number of the row to set in the text. + * @param text The text to set in the given row number. + * @see getTextRow + */ + void setTextRow(const int row, const std::string& text); + + /** + * Gets the number of rows in the text. + * + * @return The number of rows in the text. + */ + unsigned int getNumberOfRows() const + { return static_cast(mTextRows.size()); } + + /** + * Gets the caret position in the text. + * + * @return The caret position in the text. + * @see setCaretPosition + */ + unsigned int getCaretPosition() const; + + /** + * Sets the position of the caret in the text. + * + * @param position the positon of the caret. + * @see getCaretPosition + */ + void setCaretPosition(unsigned int position); + + /** + * Gets the row number where the caret is currently located. + * + * @return The row number where the caret is currently located. + * @see setCaretRow + */ + unsigned int getCaretRow() const + { return mCaretRow; } + + /** + * Sets the row where the caret should be currently located. + * + * @param The row where the caret should be currently located. + * @see getCaretRow + */ + void setCaretRow(const int row); + + /** + * Gets the column where the caret is currently located. + * + * @return The column where the caret is currently located. + * @see setCaretColumn + */ + unsigned int getCaretColumn() const; + + /** + * Sets the column where the caret should be currently located. + * + * @param The column where the caret should be currently located. + * @see getCaretColumn + */ + void setCaretColumn(const int column); + + /** + * Sets the row and the column where the caret should be curretly + * located. + * + * @param row The row where the caret should be currently located. + * @param column The column where the caret should be currently located. + * @see getCaretRow, getCaretColumn + */ + void setCaretRowColumn(const int row, const int column); + + /** + * Scrolls the text to the caret if the text box is in a scroll area. + * + * @see ScrollArea + */ + void scrollToCaret(); + + /** + * Checks if the text box is editable. + * + * @return True it the text box is editable, false otherwise. + * @see setEditable + */ + bool isEditable() const + { return mEditable; } + + /** + * Sets the text box to be editable or not. + * + * @param editable True if the text box should be editable, false otherwise. + */ + void setEditable(const bool editable) + { mEditable = editable; } + + /** + * Adds a row of text to the end of the text. + * + * @param row The row to add. + */ + void addRow(const std::string &row); + + /** + * Checks if the text box is opaque. An opaque text box will draw + * it's background and it's text. A non opaque text box only draw it's + * text making it transparent. + * + * @return True if the text box is opaque, false otherwise. + * @see setOpaque + */ + bool isOpaque() + { return mOpaque; } + + /** + * Sets the text box to be opaque or not. An opaque text box will draw + * it's background and it's text. A non opaque text box only draw it's + * text making it transparent. + * + * @param opaque True if the text box should be opaque, false otherwise. + * @see isOpaque + */ + void setOpaque(const bool opaque) + { mOpaque = opaque; } + + void fontChanged() override final + { adjustSize(); } + + void mousePressed(MouseEvent& mouseEvent) override final; + + void mouseDragged(MouseEvent& mouseEvent) override final; + private: + /** + * Draws the caret. Overloaded this method if you want to + * change the style of the caret. + * + * @param graphics a Graphics object to draw with. + * @param x the x position. + * @param y the y position. + */ + void drawCaret(Graphics *const graphics, const int x, const int y); + + /** + * Adjusts the text box's size to fit the text. + */ + void adjustSize(); + + /** + * Holds all the rows of the text. + */ + std::vector mTextRows; + + /** + * Holds the current column of the caret. + */ + int mCaretColumn; + + /** + * Holds the current row of the caret. + */ + int mCaretRow; + int mMinWidth; + + /** + * True if the text box is editable, false otherwise. + */ + bool mEditable; + + /** + * True if the text box is editable, false otherwise. + */ + bool mOpaque; }; #endif // GUI_WIDGETS_TEXTBOX_H diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp index 1906c5c32..98e852b00 100644 --- a/src/gui/widgets/textfield.cpp +++ b/src/gui/widgets/textfield.cpp @@ -20,6 +20,49 @@ * along with this program. If not, see . */ +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson + * + * + * Per Larsson a.k.a finalman + * Olof Naessén a.k.a jansem/yakslem + * + * Visit: http://guichan.sourceforge.net + * + * License: (BSD) + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name of Guichan nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #include "gui/widgets/textfield.h" #include "client.h" @@ -54,9 +97,13 @@ TextField::TextField(const Widget2 *restrict const widget, ActionListener *restrict const listener, const std::string &restrict eventId, const bool sendAlwaysEvents): - gcn::TextField(widget, text), + Widget(widget), FocusListener(), - mSendAlwaysEvents(sendAlwaysEvents), + KeyListener(), + MouseListener(), + mText(text), + mCaretPosition(0), + mXScroll(0), mCaretColor(&getThemeColor(Theme::CARET)), mPopupMenu(nullptr), mMinimum(0), @@ -65,8 +112,13 @@ TextField::TextField(const Widget2 *restrict const widget, mPadding(1), mNumeric(false), mLoseFocusOnTab(loseFocusOnTab), - mAllowSpecialActions(true) + mAllowSpecialActions(true), + mSendAlwaysEvents(sendAlwaysEvents) { + setFocusable(true); + addMouseListener(this); + addKeyListener(this); + setFrameSize(2); mForegroundColor = getThemeColor(Theme::TEXTFIELD); mForegroundColor2 = getThemeColor(Theme::TEXTFIELD_OUTLINE); @@ -672,9 +724,11 @@ void TextField::mousePressed(MouseEvent &mouseEvent) } } } - else + else if (mouseEvent.getButton() == MouseEvent::LEFT) { - gcn::TextField::mousePressed(mouseEvent); + mCaretPosition = getFont()->getStringIndexAt( + mText, mouseEvent.getX() + mXScroll); + fixScroll(); } } @@ -689,3 +743,16 @@ void TextField::focusGained(const Event &event A_UNUSED) void TextField::focusLost(const Event &event A_UNUSED) { } + +void TextField::setText(const std::string& text) +{ + const size_t sz = text.size(); + if (sz < mCaretPosition) + mCaretPosition = sz; + mText = text; +} + +void TextField::mouseDragged(MouseEvent& mouseEvent) +{ + mouseEvent.consume(); +} diff --git a/src/gui/widgets/textfield.h b/src/gui/widgets/textfield.h index 4c1b4bffc..93ae155be 100644 --- a/src/gui/widgets/textfield.h +++ b/src/gui/widgets/textfield.h @@ -20,12 +20,57 @@ * along with this program. If not, see . */ +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson + * + * + * Per Larsson a.k.a finalman + * Olof Naessén a.k.a jansem/yakslem + * + * Visit: http://guichan.sourceforge.net + * + * License: (BSD) + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name of Guichan nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #ifndef GUI_WIDGETS_TEXTFIELD_H #define GUI_WIDGETS_TEXTFIELD_H #include "listeners/focuslistener.h" +#include "listeners/keylistener.h" +#include "listeners/mouselistener.h" -#include "gui/base/widgets/textfield.hpp" +#include "gui/widgets/widget.h" #include "localconsts.h" @@ -36,8 +81,10 @@ class PopupMenu; * * \ingroup GUI */ -class TextField : public gcn::TextField, - public FocusListener +class TextField : public Widget, + public FocusListener, + public KeyListener, + public MouseListener { public: /** @@ -145,22 +192,65 @@ class TextField : public gcn::TextField, std::string getTextBeforeCaret() const { return mText.substr(0, mCaretPosition); } + /** + * Sets the text of the text field. + * + * @param text The text of the text field. + * @see getText + */ + void setText(const std::string& text); + + /** + * Gets the text of the text field. + * + * @return The text of the text field. + * @see setText + */ + const std::string& getText() const + { return mText; } + + /** + * Gets the caret position. As there is only one line of text + * in a text field the position is the caret's x coordinate. + * + * @return The caret position. + * @see setCaretPosition + */ + unsigned int getCaretPosition() const + { return mCaretPosition; } + + void mouseDragged(MouseEvent& mouseEvent) override final; + protected: - void drawCaret(Graphics* graphics, int x) override final; + void drawCaret(Graphics* graphics, int x); void fixScroll(); void fontChanged(); - bool mSendAlwaysEvents; - bool handleNormalKeys(const int action, bool &consumed); void handleCtrlKeys(const int action, bool &consumed); static Skin *mSkin; - private: + /** + * Holds the text of the text box. + */ + std::string mText; + + /** + * Holds the caret position. + */ + unsigned int mCaretPosition; + + /** + * Holds the amount scrolled in x. If a user types more characters than + * the text field can display, due to the text field being to small, the + * text needs to scroll in order to show the last type character. + */ + int mXScroll; + const Color *mCaretColor; PopupMenu *mPopupMenu; static int instances; @@ -173,6 +263,7 @@ class TextField : public gcn::TextField, bool mNumeric; bool mLoseFocusOnTab; bool mAllowSpecialActions; + bool mSendAlwaysEvents; }; #endif // GUI_WIDGETS_TEXTFIELD_H -- cgit v1.2.3-70-g09d2