Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/output/src/libraries/core/command/Shell.h @ 8797

Last change on this file since 8797 was 8797, checked in by landauf, 13 years ago

removed onlyLastLineChanged() callback from ShellListener, since it's not possible to print a line of output word by word anymore, instead only whole lines are printed.

  • Property svn:eol-style set to native
File size: 8.6 KB
RevLine 
[1505]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
[6105]25 *      Reto Grieder
[1505]26 *
27 */
28
[7401]29/**
30    @defgroup ShellConsole Shell and console
31    @ingroup Command
32*/
33
34/**
35    @file
36    @ingroup Command ShellConsole
37    @brief Declaration of the Shell and ShellListener classes.
38*/
39
[1505]40#ifndef _Shell_H__
41#define _Shell_H__
42
[7203]43#include "core/CorePrereqs.h"
[1792]44
[1505]45#include <list>
[6105]46#include <sstream>
[3196]47#include <string>
[1505]48#include <vector>
49
[8795]50#include "util/output/BaseWriter.h"
[8729]51#include "core/Core.h"
[7203]52#include "core/OrxonoxClass.h"
[1505]53
54namespace orxonox
55{
[7401]56    /**
57        @brief An interface, used to get a notification if the state of the Shell changes.
58    */
[1505]59    class _CoreExport ShellListener
60    {
61        friend class Shell;
62
63        public:
64            virtual ~ShellListener() {}
65
66        private:
[7401]67            virtual void linesChanged() {}          ///< Called if all output-lines have changed
68            virtual void lineAdded() {}             ///< Called if a new line was added to the output
69            virtual void inputChanged() {}          ///< Called if the input has changed
70            virtual void cursorChanged() {}         ///< Called if the cursor in the input line has changed
71            virtual void executed() {}              ///< Called if a command from the input line was executed
72            virtual void exit() {}                  ///< Called if the console should be closed
[1505]73    };
74
[6105]75
[7401]76    /**
77        @brief The Shell is the logical component of the console that displays output to the user and allows him to enter commands.
78
[8795]79        The Shell gathers output sent from OutputManager by inheriting from BaseWriter.
[7401]80        The output-lines are stored in the shell, so they can be displayed in a graphical
81        console. Additionally the Shell has an InputBuffer which is needed by the user to
82        enter commands.
83
84        Different graphical consoles build upon a Shell, for example InGameConsole and IOConsole.
85    */
[8795]86    class _CoreExport Shell : public BaseWriter, public DevModeListener
[1505]87    {
88        public:
[7401]89            /// Defines the type of a line of text in the Shell - some types depend on the output level, others are of internal use.
[6417]90            enum LineType
91            {
[8795]92                DebugOutput     = debug_output,
93                UserError       = user_error,
94                UserWarning     = user_warning,
95                UserStatus      = user_status,
96                UserInfo        = user_info,
97                InternalError   = internal_error,
98                InternalWarning = internal_warning,
99                InternalStatus  = internal_status,
100                InternalInfo    = internal_info,
101                Verbose         = verbose,
102                VerboseMore     = verbose_more,
103                VerboseUltra    = verbose_ultra,
104                Cout,
[6417]105                Input,
106                Command,
107                Hint
108            };
109
110            Shell(const std::string& consoleName, bool bScrollable);
[6105]111            ~Shell();
[1505]112
[6105]113            void setConfigValues();
[1747]114            void commandHistoryOffsetChanged();
115            void commandHistoryLengthChanged();
[1505]116
117            void registerListener(ShellListener* listener);
118            void unregisterListener(ShellListener* listener);
119
[7401]120            /// Returns the input buffer which is needed by the user to enter text into the shell.
[1755]121            inline InputBuffer* getInputBuffer()
122                { return this->inputBuffer_; }
[1505]123
124            void setCursorPosition(unsigned int cursor);
[8729]125            unsigned int getCursorPosition() const;
[1505]126
[8729]127            const std::string& getInput() const;
[1505]128
[6417]129            typedef std::list<std::pair<std::string, LineType> > LineList;
130            LineList::const_iterator getNewestLineIterator() const;
131            LineList::const_iterator getEndIterator() const;
[1505]132
[8795]133            void addOutput(const std::string& text, LineType type = DebugOutput);
[6105]134            void clearOutput();
[1505]135
[7401]136            /// Returns the number of output-lines that are displayed in the shell.
[1505]137            inline unsigned int getNumLines() const
[6105]138                { return this->outputLines_.size(); }
[7401]139            /// Returns the line which is currently viewed if the user scrolls through the older output-lines in the shell.
[1505]140            inline unsigned int getScrollPosition() const
141                { return this->scrollPosition_; }
142
[7401]143            /// Returns the cache size that is actually used in CommandExecutor, but placed here for better readability of the config file.
[7229]144            static inline unsigned int getCacheSize()
145                { return Shell::cacheSize_s; }
146
[1505]147        private:
148            Shell(const Shell& other);
149
[8729]150            // DevModeListener
151            void devModeChanged(bool value);
152
[1505]153            void addToHistory(const std::string& command);
[6417]154            const std::string& getFromHistory() const;
[6105]155            void clearInput();
[8795]156            // BaseWriter
157            virtual void printLine(const std::string& line, OutputLevel level);
[1505]158
[6105]159            void configureInputBuffer();
160
161            // InputBuffer callbacks
[1505]162            void inputChanged();
163            void execute();
[6105]164            void hintAndComplete();
[1505]165            void backspace();
[6105]166            void deleteChar();
167            void cursorRight();
168            void cursorLeft();
169            void cursorEnd();
170            void cursorHome();
171            void historyUp();
172            void historyDown();
173            void historySearchUp();
174            void historySearchDown();
175            void scrollUp();
176            void scrollDown();
[1505]177            void exit();
178
[7401]179            /// Iterates through all registered @ref ShellListener "shell listeners" and calls the function @a F.
[6105]180            template <void (ShellListener::*F)()>
181            void updateListeners()
182            {
183                for (std::list<ShellListener*>::const_iterator it = this->listeners_.begin(); it != this->listeners_.end(); )
184                    ((*(it++))->*F)();
185            }
186
[7401]187            std::list<ShellListener*> listeners_;           ///< The registered shell listeners
188            InputBuffer*              inputBuffer_;         ///< The input buffer that is needed by the user to enter text
189            LineList                  outputLines_;         ///< A list of all output-lines that were displayed in the shell so far
190            LineList::const_iterator  scrollIterator_;      ///< An iterator to an entry of the list of output-lines, changes if the user scrolls through the output in the shell
191            unsigned int              scrollPosition_;      ///< The number of the line that is currently being referenced by scrollIterator_
192            unsigned int              historyPosition_;     ///< If the user scrolls through the history of entered commands (stored in commandHistory_), this contains the currently viewed history entry
[1792]193
[7401]194            const std::string         consoleName_;         ///< The name of this shell - used to define the name of the soft-debug-level config-value
195            const bool                bScrollable_;         ///< If true, the user can scroll through the output-lines
[3280]196
[6105]197            // Config values
[7401]198            unsigned int              maxHistoryLength_;    ///< The maximum number of saved commands
199            unsigned int              historyOffset_;       ///< The command history is a circular buffer, this variable defines the current write-offset
200            std::vector<std::string>  commandHistory_;      ///< The history of commands that were entered by the user
[8795]201            OutputLevel               debugLevel_;          //!< The maximum level of output that is displayed in the shell (will be passed to OutputListener to filter output)
[7401]202            static unsigned int       cacheSize_s;          ///< The maximum cache size of the CommandExecutor - this is stored here for better readability of the config file and because CommandExecutor is no OrxonoxClass
[1505]203    };
204}
205
206#endif /* _Shell_H__ */
Note: See TracBrowser for help on using the repository browser.