/* * The Mana Client * Copyright (C) 2004-2009 The Mana World Development Team * Copyright (C) 2009-2012 The Mana Developers * * This file is part of The Mana Client. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef TEXTFIELD_H #define TEXTFIELD_H #include #include class TextInput; class ImageRect; class TextField; using TextHistoryList = std::list; using TextHistoryIterator = TextHistoryList::iterator; struct TextHistory { TextHistoryList history; /**< Command history. */ TextHistoryIterator current; /**< History iterator. */ TextHistory() { current = history.end(); } bool empty() const { return history.empty(); } bool atBegining() const { return current == history.begin(); } bool atEnd() const { return current == history.end(); } void toBegining() { current = history.begin(); } void toEnd() { current = history.end(); } void addEntry(const std::string &text) { history.push_back(text); } bool matchesLastEntry(const std::string &text) { return history.back() == text; } }; class AutoCompleteLister { public: virtual ~AutoCompleteLister() = default; virtual void getAutoCompleteList(std::vector&) const {} }; /** * A text field. * * \ingroup GUI */ class TextField : public gcn::TextField { public: /** * Constructor, initializes the text field with the given string. */ TextField(const std::string &text = std::string(), bool loseFocusOnTab = true); ~TextField() override; /** * Draws the text field. */ void draw(gcn::Graphics *graphics) override; /** * Update the alpha value to the graphic components. */ static void updateAlpha(); /** * Draws the background and border. */ void drawFrame(gcn::Graphics *graphics) override; /** * Determine whether the field should be numeric or not */ void setNumeric(bool numeric); /** * Set the range on the field if it is numeric */ void setRange(int min, int max) { mMinimum = min; mMaximum = max; } /** * Processes one keypress. */ void keyPressed(gcn::KeyEvent &keyEvent) override; /** * Handle text input (should possibly be new event in Guichan). */ void textInput(const TextInput &textInput); /** * Set the minimum value for a range */ void setMinimum(int min) { mMinimum = min; } /** * Set the maximum value for a range */ void setMaximum(int max) { mMaximum = max; } /** * Return the value for a numeric field */ int getValue() const; /** * Sets the TextField's source of autocomplete. Passing null will * disable autocomplete. */ void setAutoComplete(AutoCompleteLister *lister) { mAutoComplete = lister; } /** * Returns the TextField's source of autocomplete. */ AutoCompleteLister *getAutoComplete() const { return mAutoComplete; } /** * Sets the TextField's source of input history. */ void setHistory(TextHistory *history) { mHistory = history; } /** * Returns the TextField's source of input history. */ TextHistory *getHistory() const { return mHistory; } private: void autoComplete(); void handlePaste(); static int instances; static float mAlpha; static ImageRect skin; bool mNumeric = false; int mMinimum; int mMaximum; bool mLoseFocusOnTab; AutoCompleteLister *mAutoComplete = nullptr; TextHistory *mHistory = nullptr; /**< Text history. */ }; #endif