Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2003-2024 German Aerospace Center (DLR) and others. 4 : // This program and the accompanying materials are made available under the 5 : // terms of the Eclipse Public License 2.0 which is available at 6 : // https://www.eclipse.org/legal/epl-2.0/ 7 : // This Source Code may also be made available under the following Secondary 8 : // Licenses when the conditions for such availability set forth in the Eclipse 9 : // Public License 2.0 are satisfied: GNU General Public License, version 2 10 : // or later which is available at 11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html 12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later 13 : /****************************************************************************/ 14 : /// @file GUIMessageWindow.h 15 : /// @author Daniel Krajzewicz 16 : /// @author Jakob Erdmann 17 : /// @date Tue, 25 Nov 2003 18 : /// 19 : // A logging window for the gui 20 : /****************************************************************************/ 21 : #pragma once 22 : #include <config.h> 23 : 24 : #include <string> 25 : #include <utils/foxtools/fxheader.h> 26 : #include <utils/gui/events/GUIEvent.h> 27 : #include <utils/gui/windows/GUIMainWindow.h> 28 : #include <utils/iodevices/OutputDevice.h> 29 : 30 : 31 : // =========================================================================== 32 : // class declarations 33 : // =========================================================================== 34 : class GUIGlObject; 35 : 36 : 37 : // =========================================================================== 38 : // class definitions 39 : // =========================================================================== 40 : /** 41 : * @class GUIMessageWindow 42 : * @brief A logging window for the gui 43 : * 44 : * This class displays messages incoming to the gui from either the load or 45 : * the run thread. 46 : * 47 : * The text is colored in dependence to its type (messages: green, warnings: yellow, 48 : * errors: red) 49 : * 50 : * Each time a new message is passed, the window is reopened. 51 : */ 52 : class GUIMessageWindow : public FXText { 53 0 : FXDECLARE(GUIMessageWindow) 54 : public: 55 : /** @brief Constructor 56 : * 57 : * @param[in] parent The parent window 58 : */ 59 : GUIMessageWindow(FXComposite* parent, GUIMainWindow* mainWindow); 60 : 61 : /// @brief Destructor 62 : ~GUIMessageWindow(); 63 : 64 : /// @brief set cursor position over a certain line 65 : virtual void setCursorPos(FXint pos, FXbool notify = FALSE); 66 : 67 : /** @brief Adds new text to the window 68 : * 69 : * The type of the text is determined by the first parameter 70 : * 71 : * @param[in] eType The type of the event the message was generated by 72 : * @param[in] msg The message 73 : * @see GUIEventType 74 : */ 75 : void appendMsg(GUIEventType eType, const std::string& msg); 76 : 77 : /// @brief Adds a a separator to this log window 78 : void addSeparator(); 79 : 80 : /// @brief Clears the window 81 : void clear(); 82 : 83 : /// @brief register message handlers 84 : void registerMsgHandlers(); 85 : 86 : /// @brief unregister message handlers 87 : void unregisterMsgHandlers(); 88 : 89 : /// @brief switch locate links on and off 90 : static void enableLocateLinks(const bool val) { 91 0 : myLocateLinks = val; 92 : } 93 : 94 : /// @brief ask whether locate links is enabled 95 : static bool locateLinksEnabled() { 96 0 : return myLocateLinks; 97 : } 98 : 99 : /// @brief switch locate links on and off 100 : static void setBreakPointOffset(SUMOTime val) { 101 0 : myBreakPointOffset = val; 102 : } 103 : 104 : /// @brief ask whether locate links is enabled 105 : static SUMOTime getBreakPointOffset() { 106 0 : return myBreakPointOffset; 107 : } 108 : 109 : /// @brief handle keys 110 : long onKeyPress(FXObject* o, FXSelector sel, void* data); 111 : 112 : /// @brief The text colors used 113 : static FXHiliteStyle* getStyles(); 114 : 115 : protected: 116 : /// @brief FOX needs this 117 : FOX_CONSTRUCTOR(GUIMessageWindow) 118 : 119 : private: 120 : /// @brief class MsgOutputDevice 121 : class MsgOutputDevice : public OutputDevice { 122 : 123 : public: 124 : /// @brief constructor 125 0 : MsgOutputDevice(GUIMessageWindow* msgWindow, GUIEventType type) : 126 0 : myMsgWindow(msgWindow), 127 0 : myType(type) { } 128 : 129 : /// @brief destructor 130 0 : ~MsgOutputDevice() { } 131 : 132 : protected: 133 : /// @brief get Output Stream 134 0 : std::ostream& getOStream() { 135 0 : return myStream; 136 : } 137 : /// @brief write hook 138 0 : void postWriteHook() { 139 0 : myMsgWindow->appendMsg(myType, myStream.str()); 140 0 : myStream.str(""); 141 0 : } 142 : 143 : private: 144 : /// @brief pointer to message Windows 145 : GUIMessageWindow* myMsgWindow; 146 : 147 : /// @brief output string stream 148 : std::ostringstream myStream; 149 : 150 : /// @brief type of event 151 : GUIEventType myType; 152 : }; 153 : 154 : /// @brief get active string object 155 : const GUIGlObject* getActiveStringObject(const FXString& text, const FXint pos, const FXint lineS, const FXint lineE) const; 156 : 157 : /// @brief get time string object 158 : SUMOTime getTimeString(const FXString& text, const FXint pos, const FXint lineS, const FXint lineE) const; 159 : 160 : /// @brief fill styles 161 : void fillStyles(); 162 : 163 : /// @brief main window 164 : GUIMainWindow* myMainWindow; 165 : 166 : /// @brief whether messages are linked to the GUI elements 167 : static bool myLocateLinks; 168 : 169 : /// @brief Offset when creating breakpoint by clicking on time links 170 : static SUMOTime myBreakPointOffset; 171 : 172 : /// @brief The text colors used 173 : static FXHiliteStyle* myStyles; 174 : 175 : /// @brief The instances of message retriever encapsulations 176 : OutputDevice* myErrorRetriever, *myDebugRetriever, *myGLDebugRetriever, *myMessageRetriever, *myWarningRetriever; 177 : };