58FXIMPLEMENT_ABSTRACT(
GUIMessageWindow, FXText, GUIMessageWindowMap, ARRAYNUMBER(GUIMessageWindowMap))
64 FXText(parent,
nullptr, 0, 0, 0, 0, 0, 50),
65 myMainWindow(mainWindow),
66 myErrorRetriever(
nullptr),
67 myMessageRetriever(
nullptr),
68 myWarningRetriever(
nullptr) {
74 setHiliteStyles(myStyles);
75 myTimeText =
TL(
" time");
102 const FXint idS =
MAX2(text.rfind(
" '", pos), text.rfind(
"='", pos));
103 const FXint idE = text.find(
"'", pos);
104 if (idS >= 0 && idE >= 0 && idS >= lineS && idE <= lineE) {
105 FXint typeS = text.rfind(
" ", idS - 1);
107 if (text.at(typeS + 1) ==
'(') {
110 std::string type(text.mid(typeS + 1, idS - typeS - 1).lower().text());
115 const std::string id(text.mid(idS + 2, idE - idS - 2).text());
116 const std::string typedID = type +
":" + id;
127 const FXint end = text.find_first_of(
" ,", pos + 1);
130 time = text.mid(pos, end - pos).text();
132 time = text.mid(pos, text.length() - pos).text();
136 if (time.back() ==
'\n') {
142 if (time.back() ==
'.') {
149 if (time.front() ==
' ') {
150 time = time.substr(1);
164 FXText::setCursorPos(pos, notify);
167 if (viewIDs.empty()) {
171 const FXString text = getText();
173 if (glObj !=
nullptr) {
176 if (getApp()->getKeyState(KEY_Control_L)) {
180 const int lookback =
MIN2(pos, 20);
181 const int start =
MAX2(lineStart(pos), pos - lookback);
182 const FXString candidate = text.mid(start, lineEnd(pos) - start);
183 FXint timePos = candidate.find(
myTimeText.c_str());
186 if (pos >= 0 && pos > start + timePos) {
229 FXString text(msg.c_str());
231 FXint pos = text.find(
"'");
234 if (glObj !=
nullptr) {
236 FXString insText = text.left(pos + 1);
237 FXText::appendStyledText(insText, style + 1);
238 text.erase(0, pos + 1);
239 pos = text.find(
"'");
240 insText = text.left(pos);
241 FXText::appendStyledText(insText, style + 4);
244 pos = text.find(
"'", pos + 1);
248 const int timeTerm = (int)
myTimeText.size() + 1;
254 FXString insText = text.left(pos + timeTerm);
255 FXText::appendStyledText(insText, style + 1);
256 text.erase(0, pos + timeTerm);
257 pos = text.find(
" ");
259 pos = text.rfind(
".");
261 insText = text.left(pos);
262 FXText::appendStyledText(insText, style + 4);
267 FXText::appendStyledText(text, style + 1,
true);
268 FXText::setCursorPos(getLength() - 1);
269 FXText::setBottomLine(getLength() - 1);
279 std::string msg = std::string(100,
'-') +
"\n";
280 FXText::appendStyledText(msg.c_str(), (FXint) msg.length(), 1,
true);
281 FXText::setCursorPos(getLength() - 1);
282 FXText::setBottomLine(getLength() - 1);
292 if (getLength() == 0) {
295 FXText::removeText(0, getLength(),
true);
327 FXEvent* e = (FXEvent*) ptr;
329 if (e->state & CONTROLMASK) {
330 return FXText::onKeyPress(o, sel, ptr);
338 FXText::onRightBtnRelease(o, sel, ptr);
342 FXEvent*
event = (FXEvent*)ptr;
347 FXMenuPane contextMenu(
this);
351 nullptr,
this, FXText::ID_SELECT_ALL);
352 if (getSelStartPos() >= getSelEndPos()) {
355 if (getLength() == 0) {
356 selAllCmd->disable();
358 new FXMenuSeparator(&contextMenu);
361 if (getLength() == 0) {
364 contextMenu.create();
365 contextMenu.popup(
nullptr, event->root_x, event->root_y);
366 getApp()->runModalWhileShown(&contextMenu);
380 sender->handle(
this, getLength() > 0 ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
393 const FXColor white = FXRGB(0xff, 0xff, 0xff);
394 const FXColor blue = FXRGB(0x00, 0x00, 0x88);
395 const FXColor green = FXRGB(0x00, 0x88, 0x00);
396 const FXColor red = FXRGB(0x88, 0x00, 0x00);
397 const FXColor yellow = FXRGB(0xe6, 0x98, 0x00);
398 const FXColor fuchsia = FXRGB(0x88, 0x00, 0x88);
401 myStyles[0].normalBackColor = white;
402 myStyles[0].selectForeColor = white;
405 myStyles[0].hiliteBackColor = white;
406 myStyles[0].activeBackColor = white;
410 myStyles[1].normalForeColor = green;
411 myStyles[1].selectBackColor = green;
412 myStyles[1].hiliteForeColor = green;
414 myStyles[4].style = STYLE_UNDERLINE;
421 myStyles[5].style = STYLE_UNDERLINE;
424 myStyles[3].normalForeColor = yellow;
425 myStyles[3].selectBackColor = yellow;
426 myStyles[3].hiliteForeColor = yellow;
428 myStyles[6].style = STYLE_UNDERLINE;
431 myStyles[7].normalForeColor = fuchsia;
432 myStyles[7].selectBackColor = fuchsia;
433 myStyles[7].hiliteForeColor = fuchsia;
@ MID_CLEARMESSAGEWINDOW
Clear simulation output.
@ MESSAGE_OCCURRED
send when a message occurred
@ GLDEBUG_OCCURRED
send when a gldebug occurred
@ ERROR_OCCURRED
send when a error occurred
@ DEBUG_OCCURRED
send when a debug occurred
@ WARNING_OCCURRED
send when a warning occurred
GUISelectedStorage gSelected
A global holder of selected objects.
FXDEFMAP(GUIMessageWindow) GUIMessageWindowMap[]
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
constexpr SUMOTime TIME2STEPS(double x)
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
static FXMenuCommand * buildFXMenuCommandShortcut(FXComposite *p, const std::string &text, const std::string &shortcut, const std::string &info, FXIcon *icon, FXObject *tgt, FXSelector sel)
build menu command
void setView(GUIGlID id)
Centers the view onto the given artifact.
GUIGlID getGlID() const
Returns the numerical id of the object.
void unblockObject(GUIGlID id)
Marks an object as unblocked.
GUIGlObject * getObjectBlocking(GUIGlID id) const
Returns the object from the container locking it.
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
virtual void addBreakpoint(SUMOTime)
add breakpoint to the application
GUIGlChildWindow * getViewByID(const std::string &id) const
get specific view by ID
std::vector< std::string > getViewIDs() const
get view IDs
A logging window for the gui.
GUIMainWindow * myMainWindow
main window
void addSeparator()
Adds a a separator to this log window.
OutputDevice * myErrorRetriever
The instances of message retriever encapsulations.
void unregisterMsgHandlers()
unregister message handlers
static SUMOTime myBreakPointOffset
Offset when creating breakpoint by clicking on time links.
void clear()
Clears the window.
void fillStyles()
fill styles
static std::string myTimeText
The time text to look for.
static FXHiliteStyle * myStyles
The text colors used.
static bool myLocateLinks
whether messages are linked to the GUI elements
long onRightBtnRelease(FXObject *o, FXSelector sel, void *data)
handle right button release
long onUpdClear(FXObject *sender, FXSelector, void *data)
handle update of clear command
void appendMsg(GUIEventType eType, const std::string &msg)
Adds new text to the window.
static FXHiliteStyle * getStyles()
The text colors used.
virtual void setCursorPos(FXint pos, FXbool notify=FALSE)
set cursor position over a certain line
SUMOTime getTimeString(const FXString &text, const FXint pos) const
get time string object
static std::map< std::string, std::string > myTypeStrings
The translated type strings text to look for.
OutputDevice * myWarningRetriever
OutputDevice * myMessageRetriever
~GUIMessageWindow()
Destructor.
long onKeyPress(FXObject *o, FXSelector sel, void *data)
handle keys
long onCmdClear(FXObject *, FXSelector, void *)
handle clear command
const GUIGlObject * getActiveStringObject(const FXString &text, const FXint pos, const FXint lineS, const FXint lineE) const
get active string object
void registerMsgHandlers()
register message handlers
void toggleSelection(GUIGlID id)
Toggles selection of an object.
virtual void addRetriever(OutputDevice *retriever)
Adds a further retriever to the instance responsible for a certain msg type.
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
virtual void removeRetriever(OutputDevice *retriever)
Removes the retriever from the handler.
static MsgHandler * getMessageInstance()
Returns the instance to add normal messages to.
static std::string to_lower_case(const std::string &str)
Transfers the content to lower case.