--- qsampler/trunk/src/qsamplerMessages.cpp 2007/11/01 17:49:27 1465 +++ qsampler/trunk/src/qsamplerMessages.cpp 2013/07/08 10:06:57 2459 @@ -1,7 +1,7 @@ // qsamplerMessages.cpp // /**************************************************************************** - Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved. + Copyright (C) 2004-2013, rncbc aka Rui Nuno Capela. All rights reserved. Copyright (C) 2007, Christian Schoenebeck This program is free software; you can redistribute it and/or @@ -24,8 +24,11 @@ #include "qsamplerMessages.h" #include + +#include #include #include +#include #include #include #include @@ -35,6 +38,9 @@ #include #endif + +namespace QSampler { + // The default maximum number of message lines. #define QSAMPLER_MESSAGES_MAXLINES 1000 @@ -43,39 +49,40 @@ #define QSAMPLER_MESSAGES_FDREAD 0 #define QSAMPLER_MESSAGES_FDWRITE 1 - //------------------------------------------------------------------------- -// qsamplerMessages - Messages log dockable window. +// QSampler::Messages - Messages log dockable window. // // Constructor. -qsamplerMessages::qsamplerMessages ( QWidget *pParent ) - : QDockWidget(pParent) +Messages::Messages ( QWidget *pParent ) + : QDockWidget(pParent) { // Surely a name is crucial (e.g.for storing geometry settings) QDockWidget::setObjectName("qsamplerMessages"); - // Intialize stdout capture stuff. - m_pStdoutNotifier = NULL; - m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL; - m_fdStdout[QSAMPLER_MESSAGES_FDWRITE] = QSAMPLER_MESSAGES_FDNIL; + // Intialize stdout capture stuff. + m_pStdoutNotifier = NULL; + m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL; + m_fdStdout[QSAMPLER_MESSAGES_FDWRITE] = QSAMPLER_MESSAGES_FDNIL; // Create local text view widget. - m_pTextView = new QTextEdit(this); -// QFont font(m_pTextView->font()); + m_pMessagesTextView = new QTextEdit(this); +// QFont font(m_pMessagesTextView->font()); // font.setFamily("Fixed"); -// m_pTextView->setFont(font); - m_pTextView->setLineWrapMode(QTextEdit::NoWrap); - m_pTextView->setReadOnly(true); - m_pTextView->setUndoRedoEnabled(false); -// m_pTextView->setTextFormat(Qt::LogText); +// m_pMessagesTextView->setFont(font); + m_pMessagesTextView->setLineWrapMode(QTextEdit::NoWrap); + m_pMessagesTextView->setReadOnly(true); + m_pMessagesTextView->setUndoRedoEnabled(false); +// m_pMessagesTextView->setTextFormat(Qt::LogText); // Initialize default message limit. m_iMessagesLines = 0; setMessagesLimit(QSAMPLER_MESSAGES_MAXLINES); + m_pMessagesLog = NULL; + // Prepare the dockable window stuff. - QDockWidget::setWidget(m_pTextView); + QDockWidget::setWidget(m_pMessagesTextView); QDockWidget::setFeatures(QDockWidget::AllDockWidgetFeatures); QDockWidget::setAllowedAreas( Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); @@ -91,39 +98,42 @@ // Destructor. -qsamplerMessages::~qsamplerMessages (void) +Messages::~Messages (void) { - // No more notifications. - if (m_pStdoutNotifier) - delete m_pStdoutNotifier; + // Turn off and close logging. + setLogging(false); + + // No more notifications. + if (m_pStdoutNotifier) + delete m_pStdoutNotifier; - // No need to delete child widgets, Qt does it all for us. + // No need to delete child widgets, Qt does it all for us. } // Own stdout/stderr socket notifier slot. -void qsamplerMessages::stdoutNotify ( int fd ) +void Messages::stdoutNotify ( int fd ) { #if !defined(WIN32) - char achBuffer[1024]; - int cchBuffer = ::read(fd, achBuffer, sizeof(achBuffer) - 1); - if (cchBuffer > 0) { - achBuffer[cchBuffer] = (char) 0; - appendStdoutBuffer(achBuffer); - } + char achBuffer[1024]; + int cchBuffer = ::read(fd, achBuffer, sizeof(achBuffer) - 1); + if (cchBuffer > 0) { + achBuffer[cchBuffer] = (char) 0; + appendStdoutBuffer(achBuffer); + } #endif } // Stdout buffer handler -- now splitted by complete new-lines... -void qsamplerMessages::appendStdoutBuffer ( const QString& s ) +void Messages::appendStdoutBuffer ( const QString& s ) { m_sStdoutBuffer.append(s); - int iLength = m_sStdoutBuffer.lastIndexOf('\n') + 1; + int iLength = m_sStdoutBuffer.lastIndexOf('\n'); if (iLength > 0) { QString sTemp = m_sStdoutBuffer.left(iLength); - m_sStdoutBuffer.remove(0, iLength); + m_sStdoutBuffer.remove(0, iLength + 1); QStringList list = sTemp.split('\n'); QStringListIterator iter(list); while (iter.hasNext()) @@ -133,25 +143,25 @@ // Stdout flusher -- show up any unfinished line... -void qsamplerMessages::flushStdoutBuffer (void) +void Messages::flushStdoutBuffer (void) { - if (!m_sStdoutBuffer.isEmpty()) { - appendMessagesText(m_sStdoutBuffer); - m_sStdoutBuffer.truncate(0); - } + if (!m_sStdoutBuffer.isEmpty()) { + appendMessagesText(m_sStdoutBuffer); + m_sStdoutBuffer.truncate(0); + } } // Stdout capture accessors. -bool qsamplerMessages::isCaptureEnabled (void) +bool Messages::isCaptureEnabled (void) { - return (bool) (m_pStdoutNotifier != NULL); + return (bool) (m_pStdoutNotifier != NULL); } -void qsamplerMessages::setCaptureEnabled ( bool bCapture ) +void Messages::setCaptureEnabled ( bool bCapture ) { - // Flush current buffer. - flushStdoutBuffer(); + // Flush current buffer. + flushStdoutBuffer(); #if !defined(WIN32) // Destroy if already enabled. @@ -183,49 +193,74 @@ // Message font accessors. -QFont qsamplerMessages::messagesFont (void) +QFont Messages::messagesFont (void) { - return m_pTextView->font(); + return m_pMessagesTextView->font(); } -void qsamplerMessages::setMessagesFont( const QFont& font ) +void Messages::setMessagesFont ( const QFont& font ) { - m_pTextView->setFont(font); + m_pMessagesTextView->setFont(font); } // Maximum number of message lines accessors. -int qsamplerMessages::messagesLimit (void) +int Messages::messagesLimit (void) { - return m_iMessagesLimit; + return m_iMessagesLimit; } -void qsamplerMessages::setMessagesLimit ( int iMessagesLimit ) +void Messages::setMessagesLimit ( int iMessagesLimit ) { - m_iMessagesLimit = iMessagesLimit; - m_iMessagesHigh = iMessagesLimit + (iMessagesLimit / 3); + m_iMessagesLimit = iMessagesLimit; + m_iMessagesHigh = iMessagesLimit + (iMessagesLimit / 3); } +// Messages logging stuff. +bool Messages::isLogging (void) const +{ + return (m_pMessagesLog != NULL); +} -// The main utility methods. -void qsamplerMessages::appendMessages ( const QString& s ) +void Messages::setLogging ( bool bEnabled, const QString& sFilename ) { - appendMessagesColor(s, "#999999"); + if (m_pMessagesLog) { + appendMessages(tr("Logging stopped --- %1 ---") + .arg(QDateTime::currentDateTime().toString())); + m_pMessagesLog->close(); + delete m_pMessagesLog; + m_pMessagesLog = NULL; + } + + if (bEnabled) { + m_pMessagesLog = new QFile(sFilename); + if (m_pMessagesLog->open(QIODevice::Text | QIODevice::Append)) { + appendMessages(tr("Logging started --- %1 ---") + .arg(QDateTime::currentDateTime().toString())); + } else { + delete m_pMessagesLog; + m_pMessagesLog = NULL; + } + } } -void qsamplerMessages::appendMessagesColor ( const QString& s, const QString &c ) + +// Messages log output method. +void Messages::appendMessagesLog ( const QString& s ) { - appendMessagesText("" - + QTime::currentTime().toString("hh:mm:ss.zzz") - + ' ' + s + ""); + if (m_pMessagesLog) { + QTextStream(m_pMessagesLog) << s << endl; + m_pMessagesLog->flush(); + } } -void qsamplerMessages::appendMessagesText ( const QString& s ) +// Messages widget output method. +void Messages::appendMessagesLine ( const QString& s ) { - // Check for message line limit... - if (m_iMessagesLines > m_iMessagesHigh) { - m_pTextView->setUpdatesEnabled(false); - QTextCursor textCursor(m_pTextView->document()->begin()); + // Check for message line limit... + if (m_iMessagesLines > m_iMessagesHigh) { + m_pMessagesTextView->setUpdatesEnabled(false); + QTextCursor textCursor(m_pMessagesTextView->document()->begin()); while (m_iMessagesLines > m_iMessagesLimit) { // Move cursor extending selection // from start to next line-block... @@ -235,21 +270,42 @@ } // Remove the excessive line-blocks... textCursor.removeSelectedText(); - m_pTextView->setUpdatesEnabled(true); - } + m_pMessagesTextView->setUpdatesEnabled(true); + } - // Count always as a new line out there... - m_pTextView->append(s); + m_pMessagesTextView->append(s); m_iMessagesLines++; } +// The main utility methods. +void Messages::appendMessages ( const QString& s ) +{ + appendMessagesColor(s, "#999999"); +} + +void Messages::appendMessagesColor ( const QString& s, const QString &c ) +{ + QString sText = QTime::currentTime().toString("hh:mm:ss.zzz") + ' ' + s; + appendMessagesLine("" + sText + ""); + appendMessagesLog(sText); +} + +void Messages::appendMessagesText ( const QString& s ) +{ + appendMessagesLine(s); + appendMessagesLog(s); +} + + // History reset. -void qsamplerMessages::clear (void) +void Messages::clear (void) { m_iMessagesLines = 0; - m_pTextView->clear(); + m_pMessagesTextView->clear(); } +} // namespace QSampler + // end of qsamplerMessages.cpp