/[svn]/qsampler/trunk/src/qsamplerMessages.cpp
ViewVC logotype

Diff of /qsampler/trunk/src/qsamplerMessages.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 920 by capela, Sun Sep 24 12:47:51 2006 UTC revision 1474 by schoenebeck, Mon Nov 5 20:47:38 2007 UTC
# Line 1  Line 1 
1  // qsamplerMessages.cpp  // qsamplerMessages.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2006, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.
5       Copyright (C) 2007, Christian Schoenebeck
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License     modify it under the terms of the GNU General Public License
# Line 19  Line 20 
20    
21  *****************************************************************************/  *****************************************************************************/
22    
23    #include "qsamplerAbout.h"
24  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
25    
26  #include <qsocketnotifier.h>  #include <QSocketNotifier>
27  #include <qstringlist.h>  #include <QTextEdit>
28  #include <qtextedit.h>  #include <QTextCursor>
29  #include <qdatetime.h>  #include <QTextBlock>
30  #include <qtooltip.h>  #include <QScrollBar>
31  #include <qpixmap.h>  #include <QDateTime>
32    #include <QIcon>
 #include "config.h"  
33    
34  #if !defined(WIN32)  #if !defined(WIN32)
35  #include <unistd.h>  #include <unistd.h>
# Line 48  Line 49 
49  //  //
50    
51  // Constructor.  // Constructor.
52  qsamplerMessages::qsamplerMessages ( QWidget *pParent, const char *pszName )  qsamplerMessages::qsamplerMessages ( QWidget *pParent )
53      : QDockWindow(pParent, pszName)      : QDockWidget(pParent)
54  {  {
55            // Surely a name is crucial (e.g.for storing geometry settings)
56            QDockWidget::setObjectName("qsamplerMessages");
57    
58      // Intialize stdout capture stuff.      // Intialize stdout capture stuff.
59      m_pStdoutNotifier = NULL;      m_pStdoutNotifier = NULL;
60      m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;      m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;
61      m_fdStdout[QSAMPLER_MESSAGES_FDWRITE] = QSAMPLER_MESSAGES_FDNIL;      m_fdStdout[QSAMPLER_MESSAGES_FDWRITE] = QSAMPLER_MESSAGES_FDNIL;
62    
63      // Surely a name is crucial (e.g.for storing geometry settings)          // Create local text view widget.
64      if (pszName == 0)          m_pTextView = new QTextEdit(this);
         QDockWindow::setName("qsamplerMessages");  
   
     // Create local text view widget.  
     m_pTextView = new QTextEdit(this);  
65  //  QFont font(m_pTextView->font());  //  QFont font(m_pTextView->font());
66  //  font.setFamily("Fixed");  //  font.setFamily("Fixed");
67  //  m_pTextView->setFont(font);  //  m_pTextView->setFont(font);
68      m_pTextView->setWordWrap(QTextEdit::NoWrap);          m_pTextView->setLineWrapMode(QTextEdit::NoWrap);
69      m_pTextView->setReadOnly(true);          m_pTextView->setReadOnly(true);
70      m_pTextView->setUndoRedoEnabled(false);          m_pTextView->setUndoRedoEnabled(false);
71  #if QT_VERSION >= 0x030200  //      m_pTextView->setTextFormat(Qt::LogText);
72      m_pTextView->setTextFormat(Qt::LogText);  
73  #endif          // Initialize default message limit.
74      // Initialize default message limit.          m_iMessagesLines = 0;
75      setMessagesLimit(QSAMPLER_MESSAGES_MAXLINES);          setMessagesLimit(QSAMPLER_MESSAGES_MAXLINES);
76    
77      // Prepare the dockable window stuff.          // Prepare the dockable window stuff.
78      QDockWindow::setWidget(m_pTextView);          QDockWidget::setWidget(m_pTextView);
79      QDockWindow::setOrientation(Qt::Horizontal);          QDockWidget::setFeatures(QDockWidget::AllDockWidgetFeatures);
80      QDockWindow::setCloseMode(QDockWindow::Always);          QDockWidget::setAllowedAreas(
81      QDockWindow::setResizeEnabled(true);                  Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
82          // Some specialties to this kind of dock window...          // Some specialties to this kind of dock window...
83          QDockWindow::setFixedExtentHeight(120);          QDockWidget::setMinimumHeight(120);
84    
85      // Finally set the default caption and tooltip.          // Finally set the default caption and tooltip.
86      QString sCaption = tr("Messages");          const QString& sCaption = tr("Messages");
87      QToolTip::add(this, sCaption);          QDockWidget::setWindowTitle(sCaption);
88      QDockWindow::setCaption(sCaption);  //      QDockWidget::setWindowIcon(QIcon(":/icons/qsamplerMessages.png"));
89            QDockWidget::setToolTip(sCaption);
90  }  }
91    
92    
# Line 100  qsamplerMessages::~qsamplerMessages (voi Line 101  qsamplerMessages::~qsamplerMessages (voi
101  }  }
102    
103    
104    void qsamplerMessages::showEvent (QShowEvent* event)
105    {
106        QDockWidget::showEvent(event);
107        emit visibilityChanged(isVisible());
108    }
109    
110    
111  // Own stdout/stderr socket notifier slot.  // Own stdout/stderr socket notifier slot.
112  void qsamplerMessages::stdoutNotify ( int fd )  void qsamplerMessages::stdoutNotify ( int fd )
113  {  {
# Line 117  void qsamplerMessages::stdoutNotify ( in Line 125  void qsamplerMessages::stdoutNotify ( in
125  // Stdout buffer handler -- now splitted by complete new-lines...  // Stdout buffer handler -- now splitted by complete new-lines...
126  void qsamplerMessages::appendStdoutBuffer ( const QString& s )  void qsamplerMessages::appendStdoutBuffer ( const QString& s )
127  {  {
128      m_sStdoutBuffer.append(s);          m_sStdoutBuffer.append(s);
129    
130      int iLength = m_sStdoutBuffer.findRev('\n') + 1;          int iLength = m_sStdoutBuffer.lastIndexOf('\n');
131      if (iLength > 0) {          if (iLength > 0) {
132          QString sTemp = m_sStdoutBuffer.left(iLength);                  QString sTemp = m_sStdoutBuffer.left(iLength);
133          m_sStdoutBuffer.remove(0, iLength);                  m_sStdoutBuffer.remove(0, iLength + 1);
134          QStringList list = QStringList::split('\n', sTemp, true);                  QStringList list = sTemp.split('\n');
135          for (QStringList::Iterator iter = list.begin(); iter != list.end(); iter++)                  QStringListIterator iter(list);
136              appendMessagesText(*iter);                  while (iter.hasNext())
137      }                          appendMessagesText(iter.next());
138            }
139  }  }
140    
141    
# Line 152  void qsamplerMessages::setCaptureEnabled Line 161  void qsamplerMessages::setCaptureEnabled
161      flushStdoutBuffer();      flushStdoutBuffer();
162    
163  #if !defined(WIN32)  #if !defined(WIN32)
164      // Destroy if already enabled.          // Destroy if already enabled.
165      if (!bCapture && m_pStdoutNotifier) {          if (!bCapture && m_pStdoutNotifier) {
166          delete m_pStdoutNotifier;                  delete m_pStdoutNotifier;
167          m_pStdoutNotifier = NULL;                  m_pStdoutNotifier = NULL;
168          // Close the notification pipes.                  // Close the notification pipes.
169          if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {                  if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
170              ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);                          ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
171              m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;                          m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;
172          }                  }
173          if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {                  if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
174              ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);                          ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
175              m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;                          m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;
176          }                  }
177      }          }
178      // Are we going to make up the capture?          // Are we going to make up the capture?
179      if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {          if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {
180          ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDOUT_FILENO);                  ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDOUT_FILENO);
181          ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDERR_FILENO);                  ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDERR_FILENO);
182          m_pStdoutNotifier = new QSocketNotifier(m_fdStdout[QSAMPLER_MESSAGES_FDREAD], QSocketNotifier::Read, this);                  m_pStdoutNotifier = new QSocketNotifier(
183          QObject::connect(m_pStdoutNotifier, SIGNAL(activated(int)), this, SLOT(stdoutNotify(int)));                          m_fdStdout[QSAMPLER_MESSAGES_FDREAD], QSocketNotifier::Read, this);
184      }                  QObject::connect(m_pStdoutNotifier,
185                            SIGNAL(activated(int)),
186                            SLOT(stdoutNotify(int)));
187            }
188  #endif  #endif
189  }  }
190    
# Line 199  void qsamplerMessages::setMessagesLimit Line 211  void qsamplerMessages::setMessagesLimit
211  {  {
212      m_iMessagesLimit = iMessagesLimit;      m_iMessagesLimit = iMessagesLimit;
213      m_iMessagesHigh  = iMessagesLimit + (iMessagesLimit / 3);      m_iMessagesHigh  = iMessagesLimit + (iMessagesLimit / 3);
 #if QT_VERSION >= 0x030200  
         m_pTextView->setMaxLogLines(iMessagesLimit);  
 #endif  
214  }  }
215    
216    
# Line 213  void qsamplerMessages::appendMessages ( Line 222  void qsamplerMessages::appendMessages (
222    
223  void qsamplerMessages::appendMessagesColor ( const QString& s, const QString &c )  void qsamplerMessages::appendMessagesColor ( const QString& s, const QString &c )
224  {  {
225      appendMessagesText("<font color=\"" + c + "\">" + QTime::currentTime().toString("hh:mm:ss.zzz") + " " + s + "</font>");          appendMessagesText("<font color=\"" + c + "\">"
226                    + QTime::currentTime().toString("hh:mm:ss.zzz")
227                    + ' ' + s + "</font>");
228  }  }
229    
230  void qsamplerMessages::appendMessagesText ( const QString& s )  void qsamplerMessages::appendMessagesText ( const QString& s )
231  {  {
 #if QT_VERSION < 0x030200  
232      // Check for message line limit...      // Check for message line limit...
233      if (m_iMessagesLimit > 0) {      if (m_iMessagesLines > m_iMessagesHigh) {
234          int iParagraphs = m_pTextView->paragraphs();                  m_pTextView->setUpdatesEnabled(false);
235          if (iParagraphs > m_iMessagesHigh) {                  QTextCursor textCursor(m_pTextView->document()->begin());
236              m_pTextView->setUpdatesEnabled(false);                  while (m_iMessagesLines > m_iMessagesLimit) {
237              while (iParagraphs > m_iMessagesLimit) {                          // Move cursor extending selection
238                  m_pTextView->removeParagraph(0);                          // from start to next line-block...
239                  iParagraphs--;                          textCursor.movePosition(
240              }                                  QTextCursor::NextBlock, QTextCursor::KeepAnchor);
241              m_pTextView->scrollToBottom();                          m_iMessagesLines--;
242              m_pTextView->setUpdatesEnabled(true);                  }
243          }                  // Remove the excessive line-blocks...
244                    textCursor.removeSelectedText();
245                    m_pTextView->setUpdatesEnabled(true);
246      }      }
247  #endif  
248      m_pTextView->append(s);          // Count always as a new line out there...
249            m_pTextView->append(s);
250            m_iMessagesLines++;
251  }  }
252    
253    
254  // One time scroll to the most recent message.  // History reset.
255  void qsamplerMessages::scrollToBottom (void)  void qsamplerMessages::clear (void)
256  {  {
257      flushStdoutBuffer();          m_iMessagesLines = 0;
258      m_pTextView->scrollToBottom();          m_pTextView->clear();
259  }  }
260    
261    

Legend:
Removed from v.920  
changed lines
  Added in v.1474

  ViewVC Help
Powered by ViewVC