Mercurial > hg > forks > UniversalIndentGUI
changeset 754:4ec2ac09969d
Renamed the logger class and put it into a namespace for later universal tool reuse.
git-svn-id: svn://svn.code.sf.net/p/universalindent/code/trunk@1031 59b1889a-e5ac-428c-b0c7-476e01d41282
author | thomas_-_s <thomas_-_s@59b1889a-e5ac-428c-b0c7-476e01d41282> |
---|---|
date | Tue, 21 Dec 2010 23:07:50 +0000 |
parents | e64c04dc6f61 |
children | 302411a51c00 |
files | UniversalIndentGUI.pro src/MainWindow.cpp src/UiGuiLogger.cpp src/UiGuiLogger.h src/UiGuiLoggerDialog.ui src/debugging/TSLogger.cpp src/debugging/TSLogger.h src/debugging/TSLoggerDialog.ui src/main.cpp |
diffstat | 9 files changed, 475 insertions(+), 458 deletions(-) [+] |
line wrap: on
line diff
--- a/UniversalIndentGUI.pro Fri Oct 22 16:26:27 2010 +0000 +++ b/UniversalIndentGUI.pro Tue Dec 21 23:07:50 2010 +0000 @@ -189,20 +189,20 @@ src/UiGuiHighlighter.h \ src/UiGuiIndentServer.h \ src/UiGuiIniFileParser.h \ - src/UiGuiLogger.h \ src/UiGuiSettings.h \ src/UiGuiSettingsDialog.h \ src/UiGuiSystemInfo.h \ src/UiGuiVersion.h \ - src/UpdateCheckDialog.h + src/UpdateCheckDialog.h \ + src/debugging/TSLogger.h FORMS += src/MainWindow.ui \ src/ToolBarWidget.ui \ - src/UiGuiLoggerDialog.ui \ src/UiGuiSettingsDialog.ui \ src/AboutDialog.ui \ - src/UpdateCheckDialog.ui + src/UpdateCheckDialog.ui \ + src/debugging/TSLoggerDialog.ui SOURCES += src/AboutDialog.cpp \ src/AboutDialogGraphicsView.cpp \ @@ -215,12 +215,12 @@ src/UiGuiHighlighter.cpp \ src/UiGuiIndentServer.cpp \ src/UiGuiIniFileParser.cpp \ - src/UiGuiLogger.cpp \ src/UiGuiSettings.cpp \ src/UiGuiSettingsDialog.cpp \ src/UiGuiSystemInfo.cpp \ src/UiGuiVersion.cpp \ - src/UpdateCheckDialog.cpp + src/UpdateCheckDialog.cpp \ + src/debugging/TSLogger.cpp RESOURCES += resources/Icons.qrc RC_FILE = resources/programicon.rc
--- a/src/MainWindow.cpp Fri Oct 22 16:26:27 2010 +0000 +++ b/src/MainWindow.cpp Tue Dec 21 23:07:50 2010 +0000 @@ -21,7 +21,7 @@ #include "ui_MainWindow.h" #include "UiGuiVersion.h" -#include "UiGuiLogger.h" +#include "debugging/TSLogger.h" #include "SettingsPaths.h" #include "ui_ToolBarWidget.h" @@ -57,6 +57,8 @@ #include <Qsci/qsciscintilla.h> #include <Qsci/qsciprinter.h> +using namespace tschweitzer; + //! \defgroup grp_MainWindow All concerning main window functionality. /*! @@ -206,7 +208,7 @@ connect( _mainWindowForm->actionExportPDF, SIGNAL(triggered()), this, SLOT(exportToPDF()) ); connect( _mainWindowForm->actionExportHTML, SIGNAL(triggered()), this, SLOT(exportToHTML()) ); connect( _mainWindowForm->actionCheck_for_update, SIGNAL(triggered()), _updateCheckDialog, SLOT(checkForUpdateAndShowDialog()) ); - connect( _mainWindowForm->actionShowLog, SIGNAL(triggered()), UiGuiLogger::getInstance(), SLOT(show()) ); + connect( _mainWindowForm->actionShowLog, SIGNAL(triggered()), debugging::TSLogger::getInstance(), SLOT(show()) ); // Init the menu for selecting one of the recently opened files. updateRecentlyOpenedList();
--- a/src/UiGuiLogger.cpp Fri Oct 22 16:26:27 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,239 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2006-2010 by Thomas Schweitzer * - * thomas-schweitzer(at)arcor.de * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License version 2.0 as * - * published by the Free Software Foundation. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program in the file LICENSE.GPL; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ - -#include "UiGuiLogger.h" -#include "ui_UiGuiLoggerDialog.h" - -#include "SettingsPaths.h" - -#include <QDateTime> -#include <QFile> -#include <QFileInfo> -#include <QUrl> -#include <QTextStream> -#include <QDesktopServices> - -#include <ctime> - -UiGuiLogger* UiGuiLogger::_instance = NULL; - -/*! - \class UiGuiLogger - \brief This class handles any kind of data logging, for debugging and whatever purpose. - - Beneath being able of displaying a dialog window containing all log messages of the - current session, a log file in the systems temporary directory is used. Its name - is "UiGUI_log.html". - - Setting a verbose level allows to only write messages that have the selected minimum - priority to the log. - */ - -/*! - \brief Returns the only existing instance of UiGuiLogger. If the instance doesn't exist, it will be created. - */ -UiGuiLogger* UiGuiLogger::getInstance(int verboseLevel) { - if ( _instance == NULL ) - _instance = new UiGuiLogger(verboseLevel); - - return _instance; -} - - -/*! - \brief Returns the only existing instance of UiGuiLogger. If the instance doesn't exist, it will be created. - */ -UiGuiLogger* UiGuiLogger::getInstance() { -#ifdef _DEBUG - return UiGuiLogger::getInstance(QtDebugMsg); -#else - return UiGuiLogger::getInstance(QtWarningMsg); -#endif -} - - -/*! - \brief Initializes the dialog and sets the path to the log file in the systems temporary directory. - Sets the default verbose level to warning level. - */ -UiGuiLogger::UiGuiLogger(int verboseLevel) : QDialog() { - _uiGuiLoggerDialogForm = new Ui::UiGuiLoggerDialog(); - _uiGuiLoggerDialogForm->setupUi(this); -#ifdef _DEBUG - _verboseLevel = QtDebugMsg; -#else - _verboseLevel = QtMsgType(verboseLevel); -#endif - - _logFileInitState = NOTINITIALZED; - - connect( _uiGuiLoggerDialogForm->openLogFileFolderToolButton, SIGNAL(clicked()), this, SLOT(openLogFileFolder()) ); - - // Make the main application not to wait for the logging window to close. - setAttribute(Qt::WA_QuitOnClose, false); -} - - -/*! - \brief Logs all incoming messages \a msg to the dialogs text edit and to the log file. - - Only messages whos \a type have a higher priority than the set verbose level are logged. - */ -void UiGuiLogger::messageHandler(QtMsgType type, const char *msg) { - if ( _instance == NULL ) - _instance = UiGuiLogger::getInstance(); - - // Only log messages that have a higher or equal priority than set with the verbose level. - if ( type < _instance->_verboseLevel ) - return; - - // Init log message with prepended date and time. - QString message = QDateTime::currentDateTime().toString(); - - // Depending on the QtMsgType prepend a different colored Debug, Warning, Critical or Fatal. - switch (type) { - case QtDebugMsg : - message += " <span style=\"font-weight:bold; color:black;\">Debug:</span> "; - break; - case QtWarningMsg : - message += " <span style=\"font-weight:bold; color:gold;\">Warning:</span> "; - break; - case QtCriticalMsg : - message += "<span style=\"font-weight:bold; color:red;\">Critical:</span> "; - break; - case QtFatalMsg : - message += " <span style=\"font-weight:bold; color:#D60000;\">Fatal:</span> "; - // This one is no Qt message type, but can be used to send info messages to the log - // by calling UiGuiLogger::messageHandler() directly. - case UiGuiInfoMsg : - message += " <span style=\"font-weight:bold; color:darkgray;\">Info:</span> "; - break; - } - - // Append the ti UTF-8 back converted message parameter. - message += QString::fromUtf8( msg ) + "<br/>\n"; - - // Write the message to the log windows text edit. - _instance->_uiGuiLoggerDialogForm->logTextEdit->append( message ); - - // Write/append the log message to the log file. - _instance->writeToLogFile( message ); - - // In case of a fatal error abort the application. - if ( type == QtFatalMsg ) - abort(); -} - - -/*! - \brief Calling this the verbose level can be set in a range from 0 to 3 - which is equal to debug, warning, critical and fatal priority. - */ -void UiGuiLogger::setVerboseLevel(int level) { - if ( level < 0 ) - _verboseLevel = QtDebugMsg; - if ( level > 3 ) - _verboseLevel = QtFatalMsg; - else - _verboseLevel = QtMsgType(level); -} - - -/*! - \brief Deletes the existing _instance of UiGuiLogger. - */ -void UiGuiLogger::deleteInstance() { - if ( _instance != NULL ) { - delete _instance; - _instance = NULL; - } -} - - -/*! - \brief Opens the folder that contains the created log file with the name "UiGUI_log.html". - */ -void UiGuiLogger::openLogFileFolder() { - QDesktopServices::openUrl( QFileInfo( _logFile ).absolutePath() ); -} - - -/*! - \brief Writes the \a message to the used log file. - */ -void UiGuiLogger::writeToLogFile(const QString &message) { - // If the file where all logging messages should go to isn't initilized yet, do that now. - if ( _logFileInitState == NOTINITIALZED ) { - _logFileInitState = INITIALIZING; - - // On different systems it may be that "QDir::tempPath()" ends with a "/" or not. So check this. - // Remove any trailing slashes. - QString tempPath = QFileInfo( SettingsPaths::getTempPath() ).absolutePath(); - while ( tempPath.right(1) == "/" ) { - tempPath.chop(1); - } - - // To make the temporary log file invulnerable against file symbolic link hacks - // append the current date and time up to milliseconds to its name and a random character. - QString logFileName = "UiGUI_log_" + QDateTime::currentDateTime().toString("yyyyMMdd"); - logFileName += "-" + QDateTime::currentDateTime().toString("hhmmsszzz"); - // By random decide whether to append a number or an upper or lower case character. - qsrand( time(NULL) ); - unsigned char randomChar; - switch ( qrand() % 3 ) { - // Append a number from 0 to 9. - case 0 : - randomChar = qrand() % 10 + '0'; - break; - // Append a upper case characer between A and Z. - case 1 : - randomChar = qrand() % 26 + 'A'; - break; - // Append a lower case characer between a and z. - default : - randomChar = qrand() % 26 + 'a'; - break; - } - logFileName += "_" + QString(randomChar) + ".html"; - - _logFile.setFileName( tempPath + "/" + logFileName ); - - // Set the tooltip of the open log file folder button to show the unique name of the log file. - _uiGuiLoggerDialogForm->openLogFileFolderToolButton->setToolTip( _uiGuiLoggerDialogForm->openLogFileFolderToolButton->toolTip() + " (" + logFileName + ")" ); - - _logFileInitState = INITIALZED; - } - - // Add the message to the message queue. - _messageQueue << message; - - // If the logging file is initialzed, write all messages contained in the message queue into the file. - if ( _logFileInitState == INITIALZED ) { - // Write/append the log message to the log file. - if ( _logFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append) ) { - QTextStream out(&_logFile); - - while ( !_messageQueue.isEmpty() ) { - out << _messageQueue.takeFirst() << "\n"; - } - - _logFile.close(); - } - } -}
--- a/src/UiGuiLogger.h Fri Oct 22 16:26:27 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2006-2010 by Thomas Schweitzer * - * thomas-schweitzer(at)arcor.de * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License version 2.0 as * - * published by the Free Software Foundation. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program in the file LICENSE.GPL; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ - -#ifndef UIGUILOGGER_H -#define UIGUILOGGER_H - -#define UiGuiInfoMsg QtMsgType(4) - -#include <QDialog> -#include <QFile> - -namespace Ui { - class UiGuiLoggerDialog; -} - - -class UiGuiLogger : public QDialog -{ - Q_OBJECT - -public: - static UiGuiLogger* getInstance(int verboseLevel); - static UiGuiLogger* getInstance(); - static void messageHandler(QtMsgType type, const char *msg); - static void deleteInstance(); - void setVerboseLevel(int level); - -private slots: - void openLogFileFolder(); - -private: - Ui::UiGuiLoggerDialog *_uiGuiLoggerDialogForm; - - enum LogFileInitState { NOTINITIALZED, INITIALIZING, INITIALZED } _logFileInitState; - UiGuiLogger(int verboseLevel); - void writeToLogFile(const QString &message); - - static UiGuiLogger* _instance; - QtMsgType _verboseLevel; - QFile _logFile; - QStringList _messageQueue; -}; - -#endif // UIGUILOGGER_H
--- a/src/UiGuiLoggerDialog.ui Fri Oct 22 16:26:27 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>UiGuiLoggerDialog</class> - <widget class="QDialog" name="UiGuiLoggerDialog"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>1030</width> - <height>263</height> - </rect> - </property> - <property name="windowTitle"> - <string>Log</string> - </property> - <property name="windowIcon"> - <iconset resource="../resources/Icons.qrc"> - <normaloff>:/mainWindow/document-properties.png</normaloff>:/mainWindow/document-properties.png</iconset> - </property> - <layout class="QVBoxLayout"> - <item> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Logged messages</string> - </property> - </widget> - </item> - <item> - <widget class="QTextEdit" name="logTextEdit"> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QToolButton" name="cleanUpToolButton"> - <property name="toolTip"> - <string>Clear log</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="icon"> - <iconset resource="../resources/Icons.qrc"> - <normaloff>:/mainWindow/edit-clear.png</normaloff>:/mainWindow/edit-clear.png</iconset> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="openLogFileFolderToolButton"> - <property name="toolTip"> - <string>Open folder containing log file.</string> - </property> - <property name="statusTip"> - <string>Open folder containing log file.</string> - </property> - <property name="icon"> - <iconset resource="../resources/Icons.qrc"> - <normaloff>:/mainWindow/document-open.png</normaloff>:/mainWindow/document-open.png</iconset> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="standardButtons"> - <set>QDialogButtonBox::Close</set> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <resources> - <include location="../resources/Icons.qrc"/> - </resources> - <connections> - <connection> - <sender>UiGuiLoggerDialog</sender> - <signal>finished(int)</signal> - <receiver>UiGuiLoggerDialog</receiver> - <slot>close()</slot> - <hints> - <hint type="sourcelabel"> - <x>2</x> - <y>45</y> - </hint> - <hint type="destinationlabel"> - <x>5</x> - <y>59</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>clicked(QAbstractButton*)</signal> - <receiver>UiGuiLoggerDialog</receiver> - <slot>close()</slot> - <hints> - <hint type="sourcelabel"> - <x>419</x> - <y>280</y> - </hint> - <hint type="destinationlabel"> - <x>477</x> - <y>263</y> - </hint> - </hints> - </connection> - <connection> - <sender>cleanUpToolButton</sender> - <signal>clicked()</signal> - <receiver>logTextEdit</receiver> - <slot>clear()</slot> - <hints> - <hint type="sourcelabel"> - <x>27</x> - <y>282</y> - </hint> - <hint type="destinationlabel"> - <x>22</x> - <y>231</y> - </hint> - </hints> - </connection> - </connections> -</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/debugging/TSLogger.cpp Tue Dec 21 23:07:50 2010 +0000 @@ -0,0 +1,251 @@ +/*************************************************************************** + * Copyright (C) 2006-2010 by Thomas Schweitzer * + * thomas-schweitzer(at)arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2.0 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program in the file LICENSE.GPL; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "TSLogger.h" +#include "ui_TSLoggerDialog.h" + +#include "SettingsPaths.h" + +#include <QDateTime> +#include <QFile> +#include <QFileInfo> +#include <QUrl> +#include <QTextStream> +#include <QDesktopServices> +#include <QMessageBox> + +#include <ctime> + +using namespace tschweitzer; +using namespace tschweitzer::debugging; + +TSLogger* TSLogger::_instance = NULL; + +/*! + \class TSLogger + \brief This class handles any kind of data logging, for debugging and whatever purpose. + + Beneath being able of displaying a dialog window containing all log messages of the + current session, a log file in the systems temporary directory is used. Its name + is "UiGUI_log.html". + + Setting a verbose level allows to only write messages that have the selected minimum + priority to the log. + */ + +/*! + \brief Returns the only existing instance of TSLogger. If the instance doesn't exist, it will be created. + */ +TSLogger* TSLogger::getInstance(int verboseLevel) { + if ( _instance == NULL ) + _instance = new TSLogger(verboseLevel); + + return _instance; +} + + +/*! + \brief Returns the only existing instance of TSLogger. If the instance doesn't exist, it will be created. + */ +TSLogger* TSLogger::getInstance() { +#ifdef _DEBUG + return TSLogger::getInstance(QtDebugMsg); +#else + return TSLogger::getInstance(QtWarningMsg); +#endif +} + + +/*! + \brief Initializes the dialog and sets the path to the log file in the systems temporary directory. + Sets the default verbose level to warning level. + */ +TSLogger::TSLogger(int verboseLevel) : QDialog() { + _TSLoggerDialogForm = new Ui::TSLoggerDialog(); + _TSLoggerDialogForm->setupUi(this); +#ifdef _DEBUG + _verboseLevel = QtDebugMsg; +#else + _verboseLevel = QtMsgType(verboseLevel); +#endif + + _logFileInitState = NOTINITIALZED; + + connect( _TSLoggerDialogForm->openLogFileFolderToolButton, SIGNAL(clicked()), this, SLOT(openLogFileFolder()) ); + + // Make the main application not to wait for the logging window to close. + setAttribute(Qt::WA_QuitOnClose, false); +} + + +/*! + \brief Logs all incoming messages \a msg to the dialogs text edit and to the log file. + + Only messages whos \a type have a higher priority than the set verbose level are logged. + */ +void TSLogger::messageHandler(QtMsgType type, const char *msg) { + if ( _instance == NULL ) + _instance = TSLogger::getInstance(); + +//* + QMessageBox messageBox; + QString messageBoxText = QString::fromUtf8( msg ); + messageBox.setText( messageBoxText ); + messageBox.setWindowModality( Qt::ApplicationModal ); + messageBox.exec(); +//*/ + + // Only log messages that have a higher or equal priority than set with the verbose level. + if ( type < _instance->_verboseLevel ) + return; + + // Init log message with prepended date and time. + QString message = QDateTime::currentDateTime().toString(); + + // Depending on the QtMsgType prepend a different colored Debug, Warning, Critical or Fatal. + switch (type) { + case QtDebugMsg : + message += " <span style=\"font-weight:bold; color:black;\">Debug:</span> "; + break; + case QtWarningMsg : + message += " <span style=\"font-weight:bold; color:gold;\">Warning:</span> "; + break; + case QtCriticalMsg : + message += "<span style=\"font-weight:bold; color:red;\">Critical:</span> "; + break; + case QtFatalMsg : + message += " <span style=\"font-weight:bold; color:#D60000;\">Fatal:</span> "; + // This one is no Qt message type, but can be used to send info messages to the log + // by calling TSLogger::messageHandler() directly. + case TSLoggerInfoMsg : + message += " <span style=\"font-weight:bold; color:darkgray;\">Info:</span> "; + break; + } + + // Append the to UTF-8 back converted message parameter. + message += QString::fromUtf8( msg ) + "<br/>\n"; + + // Write the message to the log windows text edit. + _instance->_TSLoggerDialogForm->logTextEdit->append( message ); + + // Write/append the log message to the log file. + _instance->writeToLogFile( message ); + + // In case of a fatal error abort the application. + if ( type == QtFatalMsg ) + abort(); +} + + +/*! + \brief Calling this the verbose level can be set in a range from 0 to 3 + which is equal to debug, warning, critical and fatal priority. + */ +void TSLogger::setVerboseLevel(int level) { + if ( level < 0 ) + _verboseLevel = QtDebugMsg; + if ( level > 3 ) + _verboseLevel = QtFatalMsg; + else + _verboseLevel = QtMsgType(level); +} + + +/*! + \brief Deletes the existing _instance of TSLogger. + */ +void TSLogger::deleteInstance() { + if ( _instance != NULL ) { + delete _instance; + _instance = NULL; + } +} + + +/*! + \brief Opens the folder that contains the created log file with the name "UiGUI_log.html". + */ +void TSLogger::openLogFileFolder() { + QDesktopServices::openUrl( QFileInfo( _logFile ).absolutePath() ); +} + + +/*! + \brief Writes the \a message to the used log file. + */ +void TSLogger::writeToLogFile(const QString &message) { + // If the file where all logging messages should go to isn't initilized yet, do that now. + if ( _logFileInitState == NOTINITIALZED ) { + _logFileInitState = INITIALIZING; + + // On different systems it may be that "QDir::tempPath()" ends with a "/" or not. So check this. + // Remove any trailing slashes. + QString tempPath = QFileInfo( SettingsPaths::getTempPath() ).absolutePath(); + while ( tempPath.right(1) == "/" ) { + tempPath.chop(1); + } + + // To make the temporary log file invulnerable against file symbolic link hacks + // append the current date and time up to milliseconds to its name and a random character. + QString logFileName = "UiGUI_log_" + QDateTime::currentDateTime().toString("yyyyMMdd"); + logFileName += "-" + QDateTime::currentDateTime().toString("hhmmsszzz"); + // By random decide whether to append a number or an upper or lower case character. + qsrand( time(NULL) ); + unsigned char randomChar; + switch ( qrand() % 3 ) { + // Append a number from 0 to 9. + case 0 : + randomChar = qrand() % 10 + '0'; + break; + // Append a upper case characer between A and Z. + case 1 : + randomChar = qrand() % 26 + 'A'; + break; + // Append a lower case characer between a and z. + default : + randomChar = qrand() % 26 + 'a'; + break; + } + logFileName += "_" + QString(randomChar) + ".html"; + + _logFile.setFileName( tempPath + "/" + logFileName ); + + // Set the tooltip of the open log file folder button to show the unique name of the log file. + _TSLoggerDialogForm->openLogFileFolderToolButton->setToolTip( _TSLoggerDialogForm->openLogFileFolderToolButton->toolTip() + " (" + logFileName + ")" ); + + _logFileInitState = INITIALZED; + } + + // Add the message to the message queue. + _messageQueue << message; + + // If the logging file is initialzed, write all messages contained in the message queue into the file. + if ( _logFileInitState == INITIALZED ) { + // Write/append the log message to the log file. + if ( _logFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append) ) { + QTextStream out(&_logFile); + + while ( !_messageQueue.isEmpty() ) { + out << _messageQueue.takeFirst() << "\n"; + } + + _logFile.close(); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/debugging/TSLogger.h Tue Dec 21 23:07:50 2010 +0000 @@ -0,0 +1,63 @@ +/*************************************************************************** + * Copyright (C) 2006-2010 by Thomas Schweitzer * + * thomas-schweitzer(at)arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2.0 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program in the file LICENSE.GPL; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef TSLogger_H +#define TSLogger_H + +#include <QDialog> +#include <QFile> + +namespace Ui { + class TSLoggerDialog; +} + +namespace tschweitzer { namespace debugging { + +#define TSLoggerInfoMsg QtMsgType(4) + +class TSLogger : public QDialog +{ + Q_OBJECT + +public: + static TSLogger* getInstance(int verboseLevel); + static TSLogger* getInstance(); + static void messageHandler(QtMsgType type, const char *msg); + static void deleteInstance(); + void setVerboseLevel(int level); + +private slots: + void openLogFileFolder(); + +private: + Ui::TSLoggerDialog *_TSLoggerDialogForm; + + enum LogFileInitState { NOTINITIALZED, INITIALIZING, INITIALZED } _logFileInitState; + TSLogger(int verboseLevel); + void writeToLogFile(const QString &message); + + static TSLogger* _instance; + QtMsgType _verboseLevel; + QFile _logFile; + QStringList _messageQueue; +}; + +}} // namespace tschweitzer::debugging + +#endif // TSLogger_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/debugging/TSLoggerDialog.ui Tue Dec 21 23:07:50 2010 +0000 @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>TSLoggerDialog</class> + <widget class="QDialog" name="TSLoggerDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1030</width> + <height>263</height> + </rect> + </property> + <property name="windowTitle"> + <string>Log</string> + </property> + <property name="windowIcon"> + <iconset resource="../resources/Icons.qrc"> + <normaloff>:/mainWindow/document-properties.png</normaloff>:/mainWindow/document-properties.png</iconset> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Logged messages</string> + </property> + </widget> + </item> + <item> + <widget class="QTextEdit" name="logTextEdit"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QToolButton" name="cleanUpToolButton"> + <property name="toolTip"> + <string>Clear log</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../resources/Icons.qrc"> + <normaloff>:/mainWindow/edit-clear.png</normaloff>:/mainWindow/edit-clear.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="openLogFileFolderToolButton"> + <property name="toolTip"> + <string>Open folder containing log file.</string> + </property> + <property name="statusTip"> + <string>Open folder containing log file.</string> + </property> + <property name="icon"> + <iconset resource="../resources/Icons.qrc"> + <normaloff>:/mainWindow/document-open.png</normaloff>:/mainWindow/document-open.png</iconset> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources> + <include location="../resources/Icons.qrc"/> + </resources> + <connections> + <connection> + <sender>TSLoggerDialog</sender> + <signal>finished(int)</signal> + <receiver>TSLoggerDialog</receiver> + <slot>close()</slot> + <hints> + <hint type="sourcelabel"> + <x>2</x> + <y>45</y> + </hint> + <hint type="destinationlabel"> + <x>5</x> + <y>59</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>clicked(QAbstractButton*)</signal> + <receiver>TSLoggerDialog</receiver> + <slot>close()</slot> + <hints> + <hint type="sourcelabel"> + <x>419</x> + <y>280</y> + </hint> + <hint type="destinationlabel"> + <x>477</x> + <y>263</y> + </hint> + </hints> + </connection> + <connection> + <sender>cleanUpToolButton</sender> + <signal>clicked()</signal> + <receiver>logTextEdit</receiver> + <slot>clear()</slot> + <hints> + <hint type="sourcelabel"> + <x>27</x> + <y>282</y> + </hint> + <hint type="destinationlabel"> + <x>22</x> + <y>231</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- a/src/main.cpp Fri Oct 22 16:26:27 2010 +0000 +++ b/src/main.cpp Tue Dec 21 23:07:50 2010 +0000 @@ -20,7 +20,7 @@ #include "MainWindow.h" #include "UiGuiIndentServer.h" -#include "UiGuiLogger.h" +#include "debugging/TSLogger.h" #include "UiGuiIniFileParser.h" #include "UiGuiSettings.h" #include "UiGuiVersion.h" @@ -102,7 +102,7 @@ } #endif - +using namespace tschweitzer::debugging; /*! /brief Entry point to UniversalIndentGUI application. @@ -217,15 +217,15 @@ // Setting UTF-8 as default 8-Bit encoding to ensure that qDebug does no false string conversion. QTextCodec::setCodecForCStrings( QTextCodec::codecForName("UTF-8") ); QTextCodec::setCodecForLocale( QTextCodec::codecForName("UTF-8") ); - // Force creation of an UiGuiLogger instance here, to avoid recursion with SettingsPaths init function. + // Force creation of an TSLogger instance here, to avoid recursion with SettingsPaths init function. #ifdef _DEBUG - UiGuiLogger::getInstance(0); + TSLogger::getInstance(0); #else - UiGuiLogger::getInstance(verboseLevel); + TSLogger::getInstance(verboseLevel); #endif - qInstallMsgHandler( UiGuiLogger::messageHandler ); - UiGuiLogger::messageHandler( UiGuiInfoMsg, QString("Starting UiGUI Version %1 %2").arg(PROGRAM_VERSION_STRING).arg(PROGRAM_REVISION).toAscii() ); - UiGuiLogger::messageHandler( UiGuiInfoMsg, QString("Running on %1").arg(UiGuiSystemInfo::getOperatingSystem()).toAscii() ); + qInstallMsgHandler( TSLogger::messageHandler ); + TSLogger::messageHandler( TSLoggerInfoMsg, QString("Starting UiGUI Version %1 %2").arg(PROGRAM_VERSION_STRING).arg(PROGRAM_REVISION).toAscii() ); + TSLogger::messageHandler( TSLoggerInfoMsg, QString("Running on %1").arg(UiGuiSystemInfo::getOperatingSystem()).toAscii() ); // Set default values for all by UniversalIndentGUI used settings objects. QCoreApplication::setOrganizationName("UniversalIndentGUI"); @@ -257,7 +257,7 @@ delete mainWindow; SettingsPaths::cleanAndRemoveTempDir(); - UiGuiLogger::deleteInstance(); + TSLogger::deleteInstance(); return returnValue; }