Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/consolecommands/src/libraries/core/Shell.h @ 6518

Last change on this file since 6518 was 6180, checked in by rgrieder, 15 years ago

Extended Shell line colouring in order to distinguish output from COUT, entered commands and hints.

  • Property svn:eol-style set to native
File size: 5.6 KB
Line 
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:
25 *      Reto Grieder
26 *
27 */
28
29#ifndef _Shell_H__
30#define _Shell_H__
31
32#include "CorePrereqs.h"
33
34#include <list>
35#include <sstream>
36#include <string>
37#include <vector>
38
39#include "util/OutputHandler.h"
40#include "OrxonoxClass.h"
41#include "ConfigFileManager.h"
42#include "input/InputBuffer.h"
43
44namespace orxonox
45{
46    class _CoreExport ShellListener
47    {
48        friend class Shell;
49
50        public:
51            virtual ~ShellListener() {}
52
53        private:
54            virtual void linesChanged() {}
55            virtual void onlyLastLineChanged() {}
56            virtual void lineAdded() {}
57            virtual void inputChanged() {}
58            virtual void cursorChanged() {}
59            virtual void executed() {}
60            virtual void exit() {}
61    };
62
63
64    class _CoreExport Shell : virtual public OrxonoxClass, public OutputListener
65    {
66        public:
67            enum LineType
68            {
69                None    = OutputLevel::None,
70                Warning = OutputLevel::Warning,
71                Error   = OutputLevel::Error,
72                Info    = OutputLevel::Info,
73                Debug   = OutputLevel::Debug,
74                Verbose = OutputLevel::Verbose,
75                Ultra   = OutputLevel::Ultra,
76                Input,
77                Command,
78                Hint
79            };
80
81            Shell(const std::string& consoleName, bool bScrollable);
82            ~Shell();
83
84            void setConfigValues();
85            void commandHistoryOffsetChanged();
86            void commandHistoryLengthChanged();
87
88            void registerListener(ShellListener* listener);
89            void unregisterListener(ShellListener* listener);
90
91            inline InputBuffer* getInputBuffer()
92                { return this->inputBuffer_; }
93
94            void setCursorPosition(unsigned int cursor);
95            inline unsigned int getCursorPosition() const
96                { return this->inputBuffer_->getCursorPosition(); }
97
98            inline std::string getInput() const
99                { return this->inputBuffer_->get(); }
100
101            typedef std::list<std::pair<std::string, LineType> > LineList;
102            LineList::const_iterator getNewestLineIterator() const;
103            LineList::const_iterator getEndIterator() const;
104
105            void addOutputLine(const std::string& line, LineType type = None);
106            void clearOutput();
107
108            inline unsigned int getNumLines() const
109                { return this->outputLines_.size(); }
110            inline unsigned int getScrollPosition() const
111                { return this->scrollPosition_; }
112
113            inline const std::string& getPromptPrefix() const { return this->promptPrefix_; }
114            void setPromptPrefix(const std::string& str);
115
116        private:
117            Shell(const Shell& other);
118
119            void addToHistory(const std::string& command);
120            std::string getFromHistory() const;
121            void clearInput();
122            // OutputListener
123            void outputChanged(int level);
124
125            void configureInputBuffer();
126
127            // InputBuffer callbacks
128            void inputChanged();
129            void execute();
130            void hintAndComplete();
131            void backspace();
132            void deleteChar();
133            void cursorRight();
134            void cursorLeft();
135            void cursorEnd();
136            void cursorHome();
137            void historyUp();
138            void historyDown();
139            void historySearchUp();
140            void historySearchDown();
141            void scrollUp();
142            void scrollDown();
143            void exit();
144
145            template <void (ShellListener::*F)()>
146            void updateListeners()
147            {
148                for (std::list<ShellListener*>::const_iterator it = this->listeners_.begin(); it != this->listeners_.end(); )
149                    ((*(it++))->*F)();
150            }
151
152            std::list<ShellListener*> listeners_;
153            InputBuffer*              inputBuffer_;
154            std::stringstream         outputBuffer_;
155            bool                      bFinishedLastLine_;
156            LineList                  outputLines_;
157            LineList::const_iterator  scrollIterator_;
158            unsigned int              scrollPosition_;
159            unsigned int              historyPosition_;
160            ConfigFileType            commandHistoryConfigFileType_;
161
162            std::string               promptPrefix_;
163            const std::string         consoleName_;
164            const bool                bScrollable_;
165
166            // Config values
167            unsigned int              maxHistoryLength_;
168            unsigned int              historyOffset_;
169            std::vector<std::string>  commandHistory_;
170            int                       softDebugLevel_;
171    };
172}
173
174#endif /* _Shell_H__ */
Note: See TracBrowser for help on using the repository browser.