| 1 | ///////////////////////////////////////////////////////////////////////////// |
| 2 | // Name: log.h |
| 3 | // Purpose: interface of wxLogWindow |
| 4 | // Author: wxWidgets team |
| 5 | // RCS-ID: $Id$ |
| 6 | // Licence: wxWindows license |
| 7 | ///////////////////////////////////////////////////////////////////////////// |
| 8 | |
| 9 | /** |
| 10 | @class wxLogWindow |
| 11 | @wxheader{log.h} |
| 12 | |
| 13 | This class represents a background log window: to be precise, it collects all |
| 14 | log messages in the log frame which it manages but also passes them on to the |
| 15 | log target which was active at the moment of its creation. This allows, for |
| 16 | example, to show all the log messages in a frame but still continue to process |
| 17 | them normally by showing the standard log dialog. |
| 18 | |
| 19 | @library{wxbase} |
| 20 | @category{logging} |
| 21 | |
| 22 | @see wxLogTextCtrl |
| 23 | */ |
| 24 | class wxLogWindow : public wxLogInterposer |
| 25 | { |
| 26 | public: |
| 27 | /** |
| 28 | Creates the log frame window and starts collecting the messages in it. |
| 29 | |
| 30 | @param parent |
| 31 | The parent window for the log frame, may be @NULL |
| 32 | @param title |
| 33 | The title for the log frame |
| 34 | @param show |
| 35 | @true to show the frame initially (default), otherwise |
| 36 | Show() must be called later. |
| 37 | @param passToOld |
| 38 | @true to process the log messages normally in addition to |
| 39 | logging them in the log frame (default), @false to only log them in the |
| 40 | log frame. |
| 41 | */ |
| 42 | wxLogWindow(wxFrame parent, const wxChar title, bool show = true, |
| 43 | bool passToOld = true); |
| 44 | |
| 45 | /** |
| 46 | Returns the associated log frame window. This may be used to position or resize |
| 47 | it but use Show() to show or hide it. |
| 48 | */ |
| 49 | wxFrame* GetFrame() const; |
| 50 | |
| 51 | /** |
| 52 | Called if the user closes the window interactively, will not be |
| 53 | called if it is destroyed for another reason (such as when program |
| 54 | exits). |
| 55 | Return @true from here to allow the frame to close, @false to |
| 56 | prevent this from happening. |
| 57 | |
| 58 | @see OnFrameDelete() |
| 59 | */ |
| 60 | virtual bool OnFrameClose(wxFrame frame); |
| 61 | |
| 62 | /** |
| 63 | Called immediately after the log frame creation allowing for |
| 64 | any extra initializations. |
| 65 | */ |
| 66 | virtual void OnFrameCreate(wxFrame frame); |
| 67 | |
| 68 | /** |
| 69 | Called right before the log frame is going to be deleted: will |
| 70 | always be called unlike OnFrameClose(). |
| 71 | */ |
| 72 | virtual void OnFrameDelete(wxFrame frame); |
| 73 | |
| 74 | /** |
| 75 | Shows or hides the frame. |
| 76 | */ |
| 77 | void Show(bool show = true); |
| 78 | }; |
| 79 | |
| 80 | |
| 81 | |
| 82 | /** |
| 83 | @class wxLogInterposerTemp |
| 84 | @wxheader{log.h} |
| 85 | |
| 86 | A special version of wxLogChain which uses itself as the |
| 87 | new log target. It forwards log messages to the previously installed one in |
| 88 | addition to |
| 89 | processing them itself. Unlike wxLogInterposer, it doesn't |
| 90 | delete the old target which means it can be used to temporarily redirect log |
| 91 | output. |
| 92 | |
| 93 | As per wxLogInterposer, this class must be derived from to implement |
| 94 | wxLog::DoLog |
| 95 | and/or wxLog::DoLogString methods. |
| 96 | |
| 97 | @library{wxbase} |
| 98 | @category{logging} |
| 99 | */ |
| 100 | class wxLogInterposerTemp : public wxLogChain |
| 101 | { |
| 102 | public: |
| 103 | /** |
| 104 | The default constructor installs this object as the current active log target. |
| 105 | */ |
| 106 | }; |
| 107 | |
| 108 | |
| 109 | |
| 110 | /** |
| 111 | @class wxLogChain |
| 112 | @wxheader{log.h} |
| 113 | |
| 114 | This simple class allows to chain log sinks, that is to install a new sink but |
| 115 | keep passing log messages to the old one instead of replacing it completely as |
| 116 | wxLog::SetActiveTarget does. |
| 117 | |
| 118 | It is especially useful when you want to divert the logs somewhere (for |
| 119 | example to a file or a log window) but also keep showing the error messages |
| 120 | using the standard dialogs as wxLogGui does by default. |
| 121 | |
| 122 | Example of usage: |
| 123 | |
| 124 | @code |
| 125 | wxLogChain *logChain = new wxLogChain(new wxLogStderr); |
| 126 | |
| 127 | // all the log messages are sent to stderr and also processed as usually |
| 128 | ... |
| 129 | |
| 130 | // don't delete logChain directly as this would leave a dangling |
| 131 | // pointer as active log target, use SetActiveTarget() instead |
| 132 | delete wxLog::SetActiveTarget(...something else or @NULL...); |
| 133 | @endcode |
| 134 | |
| 135 | @library{wxbase} |
| 136 | @category{logging} |
| 137 | */ |
| 138 | class wxLogChain : public wxLog |
| 139 | { |
| 140 | public: |
| 141 | /** |
| 142 | Sets the specified @c logger (which may be @NULL) as the default log |
| 143 | target but the log messages are also passed to the previous log target if any. |
| 144 | */ |
| 145 | wxLogChain(wxLog* logger); |
| 146 | |
| 147 | /** |
| 148 | Destroys the previous log target. |
| 149 | */ |
| 150 | ~wxLogChain(); |
| 151 | |
| 152 | /** |
| 153 | Detaches the old log target so it won't be destroyed when the wxLogChain object |
| 154 | is destroyed. |
| 155 | */ |
| 156 | void DetachOldLog(); |
| 157 | |
| 158 | /** |
| 159 | Returns the pointer to the previously active log target (which may be @NULL). |
| 160 | */ |
| 161 | wxLog* GetOldLog() const; |
| 162 | |
| 163 | /** |
| 164 | Returns @true if the messages are passed to the previously active log |
| 165 | target (default) or @false if PassMessages() |
| 166 | had been called. |
| 167 | */ |
| 168 | bool IsPassingMessages() const; |
| 169 | |
| 170 | /** |
| 171 | By default, the log messages are passed to the previously active log target. |
| 172 | Calling this function with @false parameter disables this behaviour |
| 173 | (presumably temporarily, as you shouldn't use wxLogChain at all otherwise) and |
| 174 | it can be reenabled by calling it again with @a passMessages set to @true. |
| 175 | */ |
| 176 | void PassMessages(bool passMessages); |
| 177 | |
| 178 | /** |
| 179 | Sets another log target to use (may be @NULL). The log target specified |
| 180 | in the @ref ctor() constructor or in a previous call to |
| 181 | this function is deleted. |
| 182 | This doesn't change the old log target value (the one the messages are |
| 183 | forwarded to) which still remains the same as was active when wxLogChain |
| 184 | object was created. |
| 185 | */ |
| 186 | void SetLog(wxLog* logger); |
| 187 | }; |
| 188 | |
| 189 | |
| 190 | |
| 191 | /** |
| 192 | @class wxLogGui |
| 193 | @wxheader{log.h} |
| 194 | |
| 195 | This is the default log target for the GUI wxWidgets applications. It is passed |
| 196 | to wxLog::SetActiveTarget at the program |
| 197 | startup and is deleted by wxWidgets during the program shut down. |
| 198 | |
| 199 | @library{wxbase} |
| 200 | @category{logging} |
| 201 | */ |
| 202 | class wxLogGui : public wxLog |
| 203 | { |
| 204 | public: |
| 205 | /** |
| 206 | Default constructor. |
| 207 | */ |
| 208 | wxLogGui(); |
| 209 | }; |
| 210 | |
| 211 | |
| 212 | |
| 213 | /** |
| 214 | @class wxLogStream |
| 215 | @wxheader{log.h} |
| 216 | |
| 217 | This class can be used to redirect the log messages to a C++ stream. |
| 218 | |
| 219 | Please note that this class is only available if wxWidgets was compiled with |
| 220 | the standard iostream library support (@c wxUSE_STD_IOSTREAM must be on). |
| 221 | |
| 222 | @library{wxbase} |
| 223 | @category{logging} |
| 224 | |
| 225 | @see wxLogStderr, wxStreamToTextRedirector |
| 226 | */ |
| 227 | class wxLogStream : public wxLog |
| 228 | { |
| 229 | public: |
| 230 | /** |
| 231 | Constructs a log target which sends all the log messages to the given |
| 232 | output stream. If it is @NULL, the messages are sent to @c cerr. |
| 233 | */ |
| 234 | wxLogStream(std::ostream ostr = NULL); |
| 235 | }; |
| 236 | |
| 237 | |
| 238 | |
| 239 | /** |
| 240 | @class wxLogStderr |
| 241 | @wxheader{log.h} |
| 242 | |
| 243 | This class can be used to redirect the log messages to a C file stream (not to |
| 244 | be confused with C++ streams). It is the default log target for the non-GUI |
| 245 | wxWidgets applications which send all the output to @c stderr. |
| 246 | |
| 247 | @library{wxbase} |
| 248 | @category{logging} |
| 249 | |
| 250 | @see wxLogStream |
| 251 | */ |
| 252 | class wxLogStderr : public wxLog |
| 253 | { |
| 254 | public: |
| 255 | /** |
| 256 | Constructs a log target which sends all the log messages to the given |
| 257 | @c FILE. If it is @NULL, the messages are sent to @c stderr. |
| 258 | */ |
| 259 | wxLogStderr(FILE fp = NULL); |
| 260 | }; |
| 261 | |
| 262 | |
| 263 | |
| 264 | /** |
| 265 | @class wxLogBuffer |
| 266 | @wxheader{log.h} |
| 267 | |
| 268 | wxLogBuffer is a very simple implementation of log sink which simply collects |
| 269 | all the logged messages in a string (except the debug messages which are output |
| 270 | in the usual way immediately as we're presumably not interested in collecting |
| 271 | them for later). The messages from different log function calls are separated |
| 272 | by the new lines. |
| 273 | |
| 274 | All the messages collected so far can be shown to the user (and the current |
| 275 | buffer cleared) by calling the overloaded wxLogBuffer::Flush |
| 276 | method. |
| 277 | |
| 278 | @library{wxbase} |
| 279 | @category{FIXME} |
| 280 | */ |
| 281 | class wxLogBuffer : public wxLog |
| 282 | { |
| 283 | public: |
| 284 | /** |
| 285 | Shows all the messages collected so far to the user (using a message box in the |
| 286 | GUI applications or by printing them out to the console in text mode) and |
| 287 | clears the internal buffer. |
| 288 | */ |
| 289 | virtual void Flush(); |
| 290 | |
| 291 | /** |
| 292 | Returns the current buffer contains. Messages from different log function calls |
| 293 | are separated with the new lines in the buffer. |
| 294 | The buffer can be cleared by Flush() which will |
| 295 | also show the current contents to the user. |
| 296 | */ |
| 297 | const wxString GetBuffer(); |
| 298 | }; |
| 299 | |
| 300 | |
| 301 | |
| 302 | /** |
| 303 | @class wxLogInterposer |
| 304 | @wxheader{log.h} |
| 305 | |
| 306 | A special version of wxLogChain which uses itself as the |
| 307 | new log target. It forwards log messages to the previously installed one in |
| 308 | addition to |
| 309 | processing them itself. |
| 310 | |
| 311 | Unlike wxLogChain which is usually used directly as is, |
| 312 | this class must be derived from to implement wxLog::DoLog |
| 313 | and/or wxLog::DoLogString methods. |
| 314 | |
| 315 | wxLogInterposer destroys the previous log target in its destructor. If you |
| 316 | don't want this to happen, use wxLogInterposerTemp instead. |
| 317 | |
| 318 | @library{wxbase} |
| 319 | @category{logging} |
| 320 | */ |
| 321 | class wxLogInterposer : public wxLogChain |
| 322 | { |
| 323 | public: |
| 324 | /** |
| 325 | The default constructor installs this object as the current active log target. |
| 326 | */ |
| 327 | }; |
| 328 | |
| 329 | |
| 330 | |
| 331 | /** |
| 332 | @class wxLogTextCtrl |
| 333 | @wxheader{log.h} |
| 334 | |
| 335 | Using these target all the log messages can be redirected to a text control. |
| 336 | The text control must have been created with @c wxTE_MULTILINE style by the |
| 337 | caller previously. |
| 338 | |
| 339 | @library{wxbase} |
| 340 | @category{logging} |
| 341 | |
| 342 | @see wxTextCtrl, wxStreamToTextRedirector |
| 343 | */ |
| 344 | class wxLogTextCtrl : public wxLog |
| 345 | { |
| 346 | public: |
| 347 | /** |
| 348 | Constructs a log target which sends all the log messages to the given text |
| 349 | control. The @a textctrl parameter cannot be @NULL. |
| 350 | */ |
| 351 | wxLogTextCtrl(wxTextCtrl textctrl); |
| 352 | }; |
| 353 | |
| 354 | |
| 355 | |
| 356 | /** |
| 357 | @class wxLog |
| 358 | @wxheader{log.h} |
| 359 | |
| 360 | wxLog class defines the interface for the @e log targets used by wxWidgets |
| 361 | logging functions as explained in the @ref overview_wxlogoverview "wxLog |
| 362 | overview". |
| 363 | The only situations when you need to directly use this class is when you want |
| 364 | to derive your own log target because the existing ones don't satisfy your |
| 365 | needs. Another case is if you wish to customize the behaviour of the standard |
| 366 | logging classes (all of which respect the wxLog settings): for example, set |
| 367 | which trace messages are logged and which are not or change (or even remove |
| 368 | completely) the timestamp on the messages. |
| 369 | |
| 370 | Otherwise, it is completely hidden behind the @e wxLogXXX() functions and |
| 371 | you may not even know about its existence. |
| 372 | |
| 373 | See @ref overview_wxlogoverview "log overview" for the descriptions of wxWidgets |
| 374 | logging facilities. |
| 375 | |
| 376 | @library{wxcore} |
| 377 | @category{logging} |
| 378 | |
| 379 | @see wxLog::RemoveTraceMask, wxLog::GetTraceMasks |
| 380 | */ |
| 381 | class wxLog |
| 382 | { |
| 383 | public: |
| 384 | /** |
| 385 | Add the @a mask to the list of allowed masks for |
| 386 | wxLogTrace(). |
| 387 | |
| 388 | @see RemoveTraceMask(), GetTraceMasks() |
| 389 | */ |
| 390 | static void AddTraceMask(const wxString& mask); |
| 391 | |
| 392 | /** |
| 393 | Removes all trace masks previously set with |
| 394 | AddTraceMask(). |
| 395 | |
| 396 | @see RemoveTraceMask() |
| 397 | */ |
| 398 | static void ClearTraceMasks(); |
| 399 | |
| 400 | /** |
| 401 | The functions below allow some limited customization of wxLog behaviour |
| 402 | without writing a new log target class (which, aside of being a matter of |
| 403 | several minutes, allows you to do anything you want). |
| 404 | The verbose messages are the trace messages which are not disabled in the |
| 405 | release mode and are generated by wxLogVerbose(). They |
| 406 | are not normally shown to the user because they present little interest, but |
| 407 | may be activated, for example, in order to help the user find some program |
| 408 | problem. |
| 409 | As for the (real) trace messages, their handling depends on the settings of |
| 410 | the (application global) @e trace mask. There are two ways to specify it: |
| 411 | either by using SetTraceMask() and |
| 412 | GetTraceMask() and using |
| 413 | wxLogTrace() which takes an integer mask or by using |
| 414 | AddTraceMask() for string trace masks. |
| 415 | The difference between bit-wise and string trace masks is that a message using |
| 416 | integer trace mask will only be logged if all bits of the mask are set in the |
| 417 | current mask while a message using string mask will be logged simply if the |
| 418 | mask had been added before to the list of allowed ones. |
| 419 | For example, |
| 420 | |
| 421 | will do something only if the current trace mask contains both |
| 422 | @c wxTraceRefCount and @c wxTraceOle, but |
| 423 | |
| 424 | will log the message if it was preceded by |
| 425 | |
| 426 | Using string masks is simpler and allows to easily add custom ones, so this is |
| 427 | the preferred way of working with trace messages. The integer trace mask is |
| 428 | kept for compatibility and for additional (but very rarely needed) flexibility |
| 429 | only. |
| 430 | The standard trace masks are given in wxLogTrace() |
| 431 | documentation. |
| 432 | Finally, the @e wxLog::DoLog() function automatically prepends a time stamp |
| 433 | to all the messages. The format of the time stamp may be changed: it can be |
| 434 | any string with % specifications fully described in the documentation of the |
| 435 | standard @e strftime() function. For example, the default format is |
| 436 | "[%d/%b/%y %H:%M:%S] " which gives something like "[17/Sep/98 22:10:16] " |
| 437 | (without quotes) for the current date. Setting an empty string as the time |
| 438 | format disables timestamping of the messages completely. |
| 439 | @note Timestamping is disabled for Visual C++ users in debug builds by |
| 440 | default because otherwise it would be impossible to directly go to the line |
| 441 | from which the log message was generated by simply clicking in the debugger |
| 442 | window on the corresponding error message. If you wish to enable it, please use |
| 443 | SetTimestamp() explicitly. |
| 444 | AddTraceMask() |
| 445 | |
| 446 | RemoveTraceMask() |
| 447 | |
| 448 | ClearTraceMasks() |
| 449 | |
| 450 | GetTraceMasks() |
| 451 | |
| 452 | IsAllowedTraceMask() |
| 453 | |
| 454 | SetVerbose() |
| 455 | |
| 456 | GetVerbose() |
| 457 | |
| 458 | SetTimestamp() |
| 459 | |
| 460 | GetTimestamp() |
| 461 | |
| 462 | SetTraceMask() |
| 463 | |
| 464 | GetTraceMask() |
| 465 | |
| 466 | SetRepetitionCounting() |
| 467 | |
| 468 | GetRepetitionCounting() |
| 469 | */ |
| 470 | |
| 471 | |
| 472 | /** |
| 473 | Disables time stamping of the log messages. |
| 474 | This function is new since wxWidgets version 2.9 |
| 475 | */ |
| 476 | void SetTimestamp(const wxString& format); |
| 477 | |
| 478 | /** |
| 479 | Called to process the message of the specified severity. @a msg is the text |
| 480 | of the message as specified in the call of @e wxLogXXX() function which |
| 481 | generated it and @a timestamp is the moment when the message was generated. |
| 482 | The base class version prepends the timestamp to the message, adds a prefix |
| 483 | corresponding to the log level and then calls |
| 484 | DoLogString() with the resulting string. |
| 485 | */ |
| 486 | virtual void DoLog(wxLogLevel level, const wxString& msg, |
| 487 | time_t timestamp); |
| 488 | |
| 489 | /** |
| 490 | Called to log the specified string. The timestamp is already included in the |
| 491 | string but still passed to this function. |
| 492 | A simple implementation may just send the string to @c stdout or, better, |
| 493 | @c stderr. |
| 494 | */ |
| 495 | virtual void DoLogString(const wxString& msg, time_t timestamp); |
| 496 | |
| 497 | /** |
| 498 | Instructs wxLog to not create new log targets on the fly if there is none |
| 499 | currently. (Almost) for internal use only: it is supposed to be called by the |
| 500 | application shutdown code. |
| 501 | Note that this function also calls |
| 502 | ClearTraceMasks(). |
| 503 | */ |
| 504 | static void DontCreateOnDemand(); |
| 505 | |
| 506 | /** |
| 507 | Shows all the messages currently in buffer and clears it. If the buffer |
| 508 | is already empty, nothing happens. |
| 509 | */ |
| 510 | virtual void Flush(); |
| 511 | |
| 512 | /** |
| 513 | Flushes the current log target if any, does nothing if there is none. |
| 514 | |
| 515 | @see Flush() |
| 516 | */ |
| 517 | static void FlushActive(); |
| 518 | |
| 519 | /** |
| 520 | Returns the pointer to the active log target (may be @NULL). |
| 521 | */ |
| 522 | static wxLog* GetActiveTarget(); |
| 523 | |
| 524 | /** |
| 525 | Returns the current log level limit. |
| 526 | */ |
| 527 | static wxLogLevel GetLogLevel(); |
| 528 | |
| 529 | /** |
| 530 | Returns whether the repetition counting mode is enabled. |
| 531 | */ |
| 532 | static bool GetRepetitionCounting(); |
| 533 | |
| 534 | /** |
| 535 | Returns the current timestamp format string. |
| 536 | */ |
| 537 | static const wxString GetTimestamp(); |
| 538 | |
| 539 | /** |
| 540 | Returns the current trace mask, see Customization() section |
| 541 | for details. |
| 542 | */ |
| 543 | static wxTraceMask GetTraceMask(); |
| 544 | |
| 545 | /** |
| 546 | Returns the currently allowed list of string trace masks. |
| 547 | |
| 548 | @see AddTraceMask(). |
| 549 | */ |
| 550 | static const wxArrayString GetTraceMasks(); |
| 551 | |
| 552 | /** |
| 553 | Returns whether the verbose mode is currently active. |
| 554 | */ |
| 555 | static bool GetVerbose(); |
| 556 | |
| 557 | /** |
| 558 | The functions in this section work with and manipulate the active log target. |
| 559 | The OnLog() is called by the @e wxLogXXX() functions |
| 560 | and invokes the DoLog() of the active log target if any. |
| 561 | Get/Set methods are used to install/query the current active target and, |
| 562 | finally, DontCreateOnDemand() disables the |
| 563 | automatic creation of a standard log target if none actually exists. It is |
| 564 | only useful when the application is terminating and shouldn't be used in other |
| 565 | situations because it may easily lead to a loss of messages. |
| 566 | OnLog() |
| 567 | |
| 568 | GetActiveTarget() |
| 569 | |
| 570 | SetActiveTarget() |
| 571 | |
| 572 | DontCreateOnDemand() |
| 573 | |
| 574 | Suspend() |
| 575 | |
| 576 | Resume() |
| 577 | */ |
| 578 | |
| 579 | |
| 580 | /** |
| 581 | Returns @true if the @a mask is one of allowed masks for |
| 582 | wxLogTrace(). |
| 583 | See also: AddTraceMask(), |
| 584 | RemoveTraceMask() |
| 585 | */ |
| 586 | static bool IsAllowedTraceMask(const wxString& mask); |
| 587 | |
| 588 | /** |
| 589 | There are two functions which must be implemented by any derived class to |
| 590 | actually process the log messages: DoLog() and |
| 591 | DoLogString(). The second function receives a string |
| 592 | which just has to be output in some way and the easiest way to write a new log |
| 593 | target is to override just this function in the derived class. If more control |
| 594 | over the output format is needed, then the first function must be overridden |
| 595 | which allows to construct custom messages depending on the log level or even |
| 596 | do completely different things depending on the message severity (for example, |
| 597 | throw away all messages except warnings and errors, show warnings on the |
| 598 | screen and forward the error messages to the user's (or programmer's) cell |
| 599 | phone - maybe depending on whether the timestamp tells us if it is day or |
| 600 | night in the current time zone). |
| 601 | There also functions to support message buffering. Why are they needed? |
| 602 | Some of wxLog implementations, most notably the standard wxLogGui class, |
| 603 | buffer the messages (for example, to avoid showing the user a zillion of modal |
| 604 | message boxes one after another -- which would be really annoying). |
| 605 | Flush() shows them all and clears the buffer contents. |
| 606 | This function doesn't do anything if the buffer is already empty. |
| 607 | Flush() |
| 608 | |
| 609 | FlushActive() |
| 610 | */ |
| 611 | |
| 612 | |
| 613 | /** |
| 614 | Forwards the message at specified level to the @e DoLog() function of the |
| 615 | active log target if there is any, does nothing otherwise. |
| 616 | */ |
| 617 | static void OnLog(wxLogLevel level, const wxString& message); |
| 618 | |
| 619 | /** |
| 620 | Remove the @a mask from the list of allowed masks for |
| 621 | wxLogTrace(). |
| 622 | See also: AddTraceMask() |
| 623 | */ |
| 624 | static void RemoveTraceMask(const wxString& mask); |
| 625 | |
| 626 | /** |
| 627 | Resumes logging previously suspended by a call to |
| 628 | Suspend(). All messages logged in the meanwhile will be |
| 629 | flushed soon. |
| 630 | */ |
| 631 | static void Resume(); |
| 632 | |
| 633 | /** |
| 634 | Sets the specified log target as the active one. Returns the pointer to the |
| 635 | previous active log target (may be @NULL). To suppress logging use a new |
| 636 | instance of wxLogNull not @NULL. If the active log target is set to @NULL a |
| 637 | new default log target will be created when logging occurs. |
| 638 | */ |
| 639 | static wxLog* SetActiveTarget(wxLog* logtarget); |
| 640 | |
| 641 | /** |
| 642 | Specifies that log messages with level logLevel should be ignored |
| 643 | and not sent to the active log target. |
| 644 | */ |
| 645 | static void SetLogLevel(wxLogLevel logLevel); |
| 646 | |
| 647 | /** |
| 648 | Enables logging mode in which a log message is logged once, and in case exactly |
| 649 | the same message successively repeats one or more times, only the number of |
| 650 | repetitions is logged. |
| 651 | */ |
| 652 | static void SetRepetitionCounting(bool repetCounting = true); |
| 653 | |
| 654 | /** |
| 655 | Sets the timestamp format prepended by the default log targets to all |
| 656 | messages. The string may contain any normal characters as well as % |
| 657 | prefixed format specificators, see @e strftime() manual for details. |
| 658 | Passing an empty string to this function disables message time stamping. |
| 659 | */ |
| 660 | static void SetTimestamp(const wxString& format); |
| 661 | |
| 662 | /** |
| 663 | Sets the trace mask, see Customization() |
| 664 | section for details. |
| 665 | */ |
| 666 | static void SetTraceMask(wxTraceMask mask); |
| 667 | |
| 668 | /** |
| 669 | Activates or deactivates verbose mode in which the verbose messages are |
| 670 | logged as the normal ones instead of being silently dropped. |
| 671 | */ |
| 672 | static void SetVerbose(bool verbose = true); |
| 673 | |
| 674 | /** |
| 675 | Suspends the logging until Resume() is called. Note that |
| 676 | the latter must be called the same number of times as the former to undo it, |
| 677 | i.e. if you call Suspend() twice you must call Resume() twice as well. |
| 678 | Note that suspending the logging means that the log sink won't be be flushed |
| 679 | periodically, it doesn't have any effect if the current log target does the |
| 680 | logging immediately without waiting for Flush() to be |
| 681 | called (the standard GUI log target only shows the log dialog when it is |
| 682 | flushed, so Suspend() works as expected with it). |
| 683 | |
| 684 | @see Resume(), wxLogNull |
| 685 | */ |
| 686 | static void Suspend(); |
| 687 | }; |
| 688 | |
| 689 | |
| 690 | |
| 691 | /** |
| 692 | @class wxLogNull |
| 693 | @wxheader{log.h} |
| 694 | |
| 695 | This class allows to temporarily suspend logging. All calls to the log |
| 696 | functions during the life time of an object of this class are just ignored. |
| 697 | |
| 698 | In particular, it can be used to suppress the log messages given by wxWidgets |
| 699 | itself but it should be noted that it is rarely the best way to cope with this |
| 700 | problem as @b all log messages are suppressed, even if they indicate a |
| 701 | completely different error than the one the programmer wanted to suppress. |
| 702 | |
| 703 | For instance, the example of the overview: |
| 704 | |
| 705 | @code |
| 706 | wxFile file; |
| 707 | |
| 708 | // wxFile.Open() normally complains if file can't be opened, we don't want it |
| 709 | { |
| 710 | wxLogNull logNo; |
| 711 | if ( !file.Open("bar") ) |
| 712 | ... process error ourselves ... |
| 713 | } // ~wxLogNull called, old log sink restored |
| 714 | |
| 715 | wxLogMessage("..."); // ok |
| 716 | @endcode |
| 717 | |
| 718 | would be better written as: |
| 719 | |
| 720 | @code |
| 721 | wxFile file; |
| 722 | |
| 723 | // don't try to open file if it doesn't exist, we are prepared to deal with |
| 724 | // this ourselves - but all other errors are not expected |
| 725 | if ( wxFile::Exists("bar") ) |
| 726 | { |
| 727 | // gives an error message if the file couldn't be opened |
| 728 | file.Open("bar"); |
| 729 | } |
| 730 | else |
| 731 | { |
| 732 | ... |
| 733 | } |
| 734 | @endcode |
| 735 | |
| 736 | |
| 737 | @library{wxbase} |
| 738 | @category{logging} |
| 739 | */ |
| 740 | class wxLogNull : public wxLog |
| 741 | { |
| 742 | public: |
| 743 | /** |
| 744 | Suspends logging. |
| 745 | */ |
| 746 | wxLogNull(); |
| 747 | |
| 748 | /** |
| 749 | Resumes logging. |
| 750 | */ |
| 751 | }; |
| 752 | |
| 753 | |
| 754 | |
| 755 | // ============================================================================ |
| 756 | // Global functions/macros |
| 757 | // ============================================================================ |
| 758 | |
| 759 | /** @ingroup group_funcmacro_log */ |
| 760 | //@{ |
| 761 | |
| 762 | /** |
| 763 | This function shows a message to the user in a safe way and should be safe |
| 764 | to call even before the application has been initialized or if it is |
| 765 | currently in some other strange state (for example, about to crash). Under |
| 766 | Windows this function shows a message box using a native dialog instead of |
| 767 | wxMessageBox() (which might be unsafe to call), elsewhere it simply prints |
| 768 | the message to the standard output using the title as prefix. |
| 769 | |
| 770 | @param title |
| 771 | The title of the message box shown to the user or the prefix of the |
| 772 | message string. |
| 773 | @param text |
| 774 | The text to show to the user. |
| 775 | |
| 776 | @see wxLogFatalError() |
| 777 | |
| 778 | @header{wx/log.h} |
| 779 | */ |
| 780 | void wxSafeShowMessage(const wxString& title, const wxString& text); |
| 781 | |
| 782 | /** |
| 783 | Returns the error code from the last system call. This function uses |
| 784 | @c errno on Unix platforms and @c GetLastError under Win32. |
| 785 | |
| 786 | @see wxSysErrorMsg(), wxLogSysError() |
| 787 | |
| 788 | @header{wx/log.h} |
| 789 | */ |
| 790 | unsigned long wxSysErrorCode(); |
| 791 | |
| 792 | /** |
| 793 | Returns the error message corresponding to the given system error code. If |
| 794 | @a errCode is 0 (default), the last error code (as returned by |
| 795 | wxSysErrorCode()) is used. |
| 796 | |
| 797 | @see wxSysErrorCode(), wxLogSysError() |
| 798 | |
| 799 | @header{wx/log.h} |
| 800 | */ |
| 801 | const wxChar* wxSysErrorMsg(unsigned long errCode = 0); |
| 802 | |
| 803 | //@} |
| 804 | |
| 805 | /** @ingroup group_funcmacro_log */ |
| 806 | //@{ |
| 807 | /** |
| 808 | For all normal, informational messages. They also appear in a message box |
| 809 | by default (but it can be changed). |
| 810 | |
| 811 | @header{wx/log.h} |
| 812 | */ |
| 813 | void wxLogMessage(const char* formatString, ... ); |
| 814 | void wxVLogMessage(const char* formatString, va_list argPtr); |
| 815 | //@} |
| 816 | |
| 817 | /** @ingroup group_funcmacro_log */ |
| 818 | //@{ |
| 819 | /** |
| 820 | For verbose output. Normally, it is suppressed, but might be activated if |
| 821 | the user wishes to know more details about the program progress (another, |
| 822 | but possibly confusing name for the same function could be @c wxLogInfo). |
| 823 | |
| 824 | @header{wx/log.h} |
| 825 | */ |
| 826 | void wxLogVerbose(const char* formatString, ... ); |
| 827 | void wxVLogVerbose(const char* formatString, va_list argPtr); |
| 828 | //@} |
| 829 | |
| 830 | /** @ingroup group_funcmacro_log */ |
| 831 | //@{ |
| 832 | /** |
| 833 | For warnings - they are also normally shown to the user, but don't |
| 834 | interrupt the program work. |
| 835 | |
| 836 | @header{wx/log.h} |
| 837 | */ |
| 838 | void wxLogWarning(const char* formatString, ... ); |
| 839 | void wxVLogWarning(const char* formatString, va_list argPtr); |
| 840 | //@} |
| 841 | |
| 842 | /** @ingroup group_funcmacro_log */ |
| 843 | //@{ |
| 844 | /** |
| 845 | Like wxLogError(), but also terminates the program with the exit code 3. |
| 846 | Using @e abort() standard function also terminates the program with this |
| 847 | exit code. |
| 848 | |
| 849 | @header{wx/log.h} |
| 850 | */ |
| 851 | void wxLogFatalError(const char* formatString, ... ); |
| 852 | void wxVLogFatalError(const char* formatString, va_list argPtr); |
| 853 | //@} |
| 854 | |
| 855 | /** @ingroup group_funcmacro_log */ |
| 856 | //@{ |
| 857 | /** |
| 858 | The functions to use for error messages, i.e. the messages that must be |
| 859 | shown to the user. The default processing is to pop up a message box to |
| 860 | inform the user about it. |
| 861 | |
| 862 | @header{wx/log.h} |
| 863 | */ |
| 864 | void wxLogError(const char* formatString, ... ); |
| 865 | void wxVLogError(const char* formatString, va_list argPtr); |
| 866 | //@} |
| 867 | |
| 868 | /** @ingroup group_funcmacro_log */ |
| 869 | //@{ |
| 870 | /** |
| 871 | Like wxLogDebug(), trace functions only do something in debug builds and |
| 872 | expand to nothing in the release one. The reason for making it a separate |
| 873 | function is that usually there are a lot of trace messages, so it might |
| 874 | make sense to separate them from other debug messages. |
| 875 | |
| 876 | wxLogDebug(const char*,const char*,...) and |
| 877 | wxLogDebug(wxTraceMask,const char*,...) can be used instead if you would |
| 878 | like to be able to separate trace messages into different categories which |
| 879 | can be enabled or disabled with the static functions provided in wxLog. |
| 880 | |
| 881 | @header{wx/log.h} |
| 882 | */ |
| 883 | void wxLogTrace(const char* formatString, ... ); |
| 884 | void wxVLogTrace(const char* formatString, va_list argPtr); |
| 885 | //@} |
| 886 | |
| 887 | /** @ingroup group_funcmacro_log */ |
| 888 | //@{ |
| 889 | /** |
| 890 | Like wxLogDebug(), trace functions only do something in debug builds and |
| 891 | expand to nothing in the release one. The reason for making it a separate |
| 892 | function is that usually there are a lot of trace messages, so it might |
| 893 | make sense to separate them from other debug messages. |
| 894 | |
| 895 | In this version of wxLogTrace(), trace messages can be separated into |
| 896 | different categories and calls using this function only log the message if |
| 897 | the given @a mask is currently enabled in wxLog. This lets you selectively |
| 898 | trace only some operations and not others by enabling the desired trace |
| 899 | masks with wxLog::AddTraceMask() or by setting the |
| 900 | @ref overview_envvars "@c WXTRACE environment variable". |
| 901 | |
| 902 | The predefined string trace masks used by wxWidgets are: |
| 903 | |
| 904 | @beginDefList |
| 905 | @itemdef{ wxTRACE_MemAlloc, Trace memory allocation (new/delete) } |
| 906 | @itemdef{ wxTRACE_Messages, Trace window messages/X callbacks } |
| 907 | @itemdef{ wxTRACE_ResAlloc, Trace GDI resource allocation } |
| 908 | @itemdef{ wxTRACE_RefCount, Trace various ref counting operations } |
| 909 | @itemdef{ wxTRACE_OleCalls, Trace OLE method calls (Win32 only) } |
| 910 | @endDefList |
| 911 | |
| 912 | @note Since both the mask and the format string are strings, this might |
| 913 | lead to function signature confusion in some cases: if you intend to |
| 914 | call the format string only version of wxLogTrace(), add a "%s" |
| 915 | format string parameter and then supply a second string parameter for |
| 916 | that "%s", the string mask version of wxLogTrace() will erroneously |
| 917 | get called instead, since you are supplying two string parameters to |
| 918 | the function. In this case you'll unfortunately have to avoid having |
| 919 | two leading string parameters, e.g. by adding a bogus integer (with |
| 920 | its "%d" format string). |
| 921 | |
| 922 | @header{wx/log.h} |
| 923 | */ |
| 924 | void wxLogTrace(const char* mask, const char* formatString, ... ); |
| 925 | void wxVLogTrace(const char* mask, |
| 926 | const char* formatString, |
| 927 | va_list argPtr); |
| 928 | //@} |
| 929 | |
| 930 | /** @ingroup group_funcmacro_log */ |
| 931 | //@{ |
| 932 | /** |
| 933 | Like wxLogDebug(), trace functions only do something in debug builds and |
| 934 | expand to nothing in the release one. The reason for making it a separate |
| 935 | function is that usually there are a lot of trace messages, so it might |
| 936 | make sense to separate them from other debug messages. |
| 937 | |
| 938 | This version of wxLogTrace() only logs the message if all the bits |
| 939 | corresponding to the @a mask are set in the wxLog trace mask which can be |
| 940 | set by calling wxLog::SetTraceMask(). This version is less flexible than |
| 941 | wxLogDebug(const char*,const char*,...) because it doesn't allow defining |
| 942 | the user trace masks easily. This is why it is deprecated in favour of |
| 943 | using string trace masks. |
| 944 | |
| 945 | The following bitmasks are defined for wxTraceMask: |
| 946 | |
| 947 | @beginDefList |
| 948 | @itemdef{ wxTraceMemAlloc, Trace memory allocation (new/delete) } |
| 949 | @itemdef{ wxTraceMessages, Trace window messages/X callbacks } |
| 950 | @itemdef{ wxTraceResAlloc, Trace GDI resource allocation } |
| 951 | @itemdef{ wxTraceRefCount, Trace various ref counting operations } |
| 952 | @itemdef{ wxTraceOleCalls, Trace OLE method calls (Win32 only) } |
| 953 | @endDefList |
| 954 | |
| 955 | @header{wx/log.h} |
| 956 | */ |
| 957 | void wxLogTrace(wxTraceMask mask, const char* formatString, ... ); |
| 958 | void wxVLogTrace(wxTraceMask mask, const char* formatString, va_list argPtr); |
| 959 | //@} |
| 960 | |
| 961 | /** @ingroup group_funcmacro_log */ |
| 962 | //@{ |
| 963 | /** |
| 964 | The right functions for debug output. They only do something in debug mode |
| 965 | (when the preprocessor symbol @c __WXDEBUG__ is defined) and expand to |
| 966 | nothing in release mode (otherwise). |
| 967 | |
| 968 | @header{wx/log.h} |
| 969 | */ |
| 970 | void wxLogDebug(const char* formatString, ... ); |
| 971 | void wxVLogDebug(const char* formatString, va_list argPtr); |
| 972 | //@} |
| 973 | |
| 974 | /** @ingroup group_funcmacro_log */ |
| 975 | //@{ |
| 976 | /** |
| 977 | Messages logged by this function will appear in the statusbar of the |
| 978 | @a frame or of the top level application window by default (i.e. when using |
| 979 | the second version of the functions). |
| 980 | |
| 981 | If the target frame doesn't have a statusbar, the message will be lost. |
| 982 | |
| 983 | @header{wx/log.h} |
| 984 | */ |
| 985 | void wxLogStatus(wxFrame* frame, const char* formatString, ... ); |
| 986 | void wxVLogStatus(wxFrame* frame, const char* formatString, va_list argPtr); |
| 987 | void wxLogStatus(const char* formatString, ... ); |
| 988 | void wxVLogStatus(const char* formatString, va_list argPtr); |
| 989 | //@} |
| 990 | |
| 991 | /** @ingroup group_funcmacro_log */ |
| 992 | //@{ |
| 993 | /** |
| 994 | Mostly used by wxWidgets itself, but might be handy for logging errors |
| 995 | after system call (API function) failure. It logs the specified message |
| 996 | text as well as the last system error code (@e errno or @e ::GetLastError() |
| 997 | depending on the platform) and the corresponding error message. The second |
| 998 | form of this function takes the error code explicitly as the first |
| 999 | argument. |
| 1000 | |
| 1001 | @see wxSysErrorCode(), wxSysErrorMsg() |
| 1002 | |
| 1003 | @header{wx/log.h} |
| 1004 | */ |
| 1005 | void wxLogSysError(const char* formatString, ... ); |
| 1006 | void wxVLogSysError(const char* formatString, va_list argPtr); |
| 1007 | //@} |
| 1008 | |