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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2441 - (hide annotations) (download)
Wed Apr 10 09:11:37 2013 UTC (11 years ago) by capela
File size: 8501 byte(s)
* Preparations for Qt5 migration. (FIXING)
1 capela 94 // qsamplerMessages.cpp
2     //
3     /****************************************************************************
4 capela 2441 Copyright (C) 2004-2013, rncbc aka Rui Nuno Capela. All rights reserved.
5 capela 1464 Copyright (C) 2007, Christian Schoenebeck
6 capela 94
7     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License
9     as published by the Free Software Foundation; either version 2
10     of the License, or (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17 capela 920 You should have received a copy of the GNU General Public License along
18     with this program; if not, write to the Free Software Foundation, Inc.,
19     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 capela 94
21     *****************************************************************************/
22    
23 capela 1465 #include "qsamplerAbout.h"
24 capela 94 #include "qsamplerMessages.h"
25    
26 capela 1465 #include <QSocketNotifier>
27 capela 1738
28     #include <QFile>
29 capela 1465 #include <QTextEdit>
30     #include <QTextCursor>
31 capela 1738 #include <QTextStream>
32 capela 1465 #include <QTextBlock>
33 schoenebeck 1461 #include <QScrollBar>
34 capela 1465 #include <QDateTime>
35     #include <QIcon>
36 schoenebeck 1461
37 capela 115 #if !defined(WIN32)
38     #include <unistd.h>
39     #endif
40    
41 capela 1558
42     namespace QSampler {
43    
44 capela 94 // The default maximum number of message lines.
45     #define QSAMPLER_MESSAGES_MAXLINES 1000
46    
47     // Notification pipe descriptors
48     #define QSAMPLER_MESSAGES_FDNIL -1
49     #define QSAMPLER_MESSAGES_FDREAD 0
50     #define QSAMPLER_MESSAGES_FDWRITE 1
51    
52     //-------------------------------------------------------------------------
53 capela 1558 // QSampler::Messages - Messages log dockable window.
54 capela 94 //
55    
56     // Constructor.
57 capela 1558 Messages::Messages ( QWidget *pParent )
58 capela 1739 : QDockWidget(pParent)
59 capela 94 {
60 capela 1465 // Surely a name is crucial (e.g.for storing geometry settings)
61     QDockWidget::setObjectName("qsamplerMessages");
62    
63 capela 1739 // Intialize stdout capture stuff.
64     m_pStdoutNotifier = NULL;
65     m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
66     m_fdStdout[QSAMPLER_MESSAGES_FDWRITE] = QSAMPLER_MESSAGES_FDNIL;
67 capela 94
68 capela 1465 // Create local text view widget.
69 capela 1738 m_pMessagesTextView = new QTextEdit(this);
70     // QFont font(m_pMessagesTextView->font());
71 capela 94 // font.setFamily("Fixed");
72 capela 1738 // m_pMessagesTextView->setFont(font);
73     m_pMessagesTextView->setLineWrapMode(QTextEdit::NoWrap);
74     m_pMessagesTextView->setReadOnly(true);
75     m_pMessagesTextView->setUndoRedoEnabled(false);
76     // m_pMessagesTextView->setTextFormat(Qt::LogText);
77 capela 94
78 capela 1465 // Initialize default message limit.
79     m_iMessagesLines = 0;
80     setMessagesLimit(QSAMPLER_MESSAGES_MAXLINES);
81    
82 capela 1738 m_pMessagesLog = NULL;
83    
84 capela 1465 // Prepare the dockable window stuff.
85 capela 1738 QDockWidget::setWidget(m_pMessagesTextView);
86 capela 1465 QDockWidget::setFeatures(QDockWidget::AllDockWidgetFeatures);
87     QDockWidget::setAllowedAreas(
88     Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
89 capela 772 // Some specialties to this kind of dock window...
90 capela 1465 QDockWidget::setMinimumHeight(120);
91 capela 94
92 capela 1465 // Finally set the default caption and tooltip.
93     const QString& sCaption = tr("Messages");
94     QDockWidget::setWindowTitle(sCaption);
95     // QDockWidget::setWindowIcon(QIcon(":/icons/qsamplerMessages.png"));
96     QDockWidget::setToolTip(sCaption);
97 capela 94 }
98    
99    
100     // Destructor.
101 capela 1558 Messages::~Messages (void)
102 capela 94 {
103 capela 1739 // Turn off and close logging.
104 capela 1738 setLogging(false);
105    
106 capela 1739 // No more notifications.
107     if (m_pStdoutNotifier)
108     delete m_pStdoutNotifier;
109 capela 94
110 capela 1739 // No need to delete child widgets, Qt does it all for us.
111 capela 94 }
112    
113    
114 capela 2441 #if QT_VERSION < 0x040300
115 capela 1738 void Messages::showEvent ( QShowEvent *pEvent )
116 schoenebeck 1470 {
117 capela 1739 QDockWidget::showEvent(pEvent);
118     emit visibilityChanged(isVisible());
119 schoenebeck 1470 }
120 capela 2441 #endif
121 schoenebeck 1470
122 capela 94 // Own stdout/stderr socket notifier slot.
123 capela 1558 void Messages::stdoutNotify ( int fd )
124 capela 94 {
125     #if !defined(WIN32)
126 capela 1739 char achBuffer[1024];
127     int cchBuffer = ::read(fd, achBuffer, sizeof(achBuffer) - 1);
128     if (cchBuffer > 0) {
129     achBuffer[cchBuffer] = (char) 0;
130     appendStdoutBuffer(achBuffer);
131     }
132 capela 94 #endif
133     }
134    
135    
136     // Stdout buffer handler -- now splitted by complete new-lines...
137 capela 1558 void Messages::appendStdoutBuffer ( const QString& s )
138 capela 94 {
139 capela 1465 m_sStdoutBuffer.append(s);
140 capela 94
141 schoenebeck 1474 int iLength = m_sStdoutBuffer.lastIndexOf('\n');
142 capela 1465 if (iLength > 0) {
143     QString sTemp = m_sStdoutBuffer.left(iLength);
144 schoenebeck 1474 m_sStdoutBuffer.remove(0, iLength + 1);
145 capela 1465 QStringList list = sTemp.split('\n');
146     QStringListIterator iter(list);
147     while (iter.hasNext())
148     appendMessagesText(iter.next());
149     }
150 capela 94 }
151    
152    
153     // Stdout flusher -- show up any unfinished line...
154 capela 1558 void Messages::flushStdoutBuffer (void)
155 capela 94 {
156 capela 1739 if (!m_sStdoutBuffer.isEmpty()) {
157     appendMessagesText(m_sStdoutBuffer);
158     m_sStdoutBuffer.truncate(0);
159     }
160 capela 94 }
161    
162    
163     // Stdout capture accessors.
164 capela 1558 bool Messages::isCaptureEnabled (void)
165 capela 94 {
166 capela 1739 return (bool) (m_pStdoutNotifier != NULL);
167 capela 94 }
168    
169 capela 1558 void Messages::setCaptureEnabled ( bool bCapture )
170 capela 94 {
171 capela 1739 // Flush current buffer.
172     flushStdoutBuffer();
173 capela 94
174     #if !defined(WIN32)
175 capela 1465 // Destroy if already enabled.
176     if (!bCapture && m_pStdoutNotifier) {
177     delete m_pStdoutNotifier;
178     m_pStdoutNotifier = NULL;
179     // Close the notification pipes.
180     if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
181     ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
182     m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
183     }
184     if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
185     ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
186     m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
187     }
188     }
189     // Are we going to make up the capture?
190     if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {
191     ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDOUT_FILENO);
192     ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDERR_FILENO);
193     m_pStdoutNotifier = new QSocketNotifier(
194     m_fdStdout[QSAMPLER_MESSAGES_FDREAD], QSocketNotifier::Read, this);
195     QObject::connect(m_pStdoutNotifier,
196     SIGNAL(activated(int)),
197     SLOT(stdoutNotify(int)));
198     }
199 capela 94 #endif
200     }
201    
202    
203     // Message font accessors.
204 capela 1558 QFont Messages::messagesFont (void)
205 capela 94 {
206 capela 1739 return m_pMessagesTextView->font();
207 capela 94 }
208    
209 capela 1738 void Messages::setMessagesFont ( const QFont& font )
210 capela 94 {
211 capela 1739 m_pMessagesTextView->setFont(font);
212 capela 94 }
213    
214    
215     // Maximum number of message lines accessors.
216 capela 1558 int Messages::messagesLimit (void)
217 capela 94 {
218 capela 1739 return m_iMessagesLimit;
219 capela 94 }
220    
221 capela 1558 void Messages::setMessagesLimit ( int iMessagesLimit )
222 capela 94 {
223 capela 1739 m_iMessagesLimit = iMessagesLimit;
224     m_iMessagesHigh = iMessagesLimit + (iMessagesLimit / 3);
225 capela 94 }
226    
227 capela 1738 // Messages logging stuff.
228     bool Messages::isLogging (void) const
229     {
230     return (m_pMessagesLog != NULL);
231     }
232 capela 94
233 capela 1738 void Messages::setLogging ( bool bEnabled, const QString& sFilename )
234 capela 94 {
235 capela 1738 if (m_pMessagesLog) {
236     appendMessages(tr("Logging stopped --- %1 ---")
237     .arg(QDateTime::currentDateTime().toString()));
238     m_pMessagesLog->close();
239     delete m_pMessagesLog;
240     m_pMessagesLog = NULL;
241     }
242    
243     if (bEnabled) {
244     m_pMessagesLog = new QFile(sFilename);
245     if (m_pMessagesLog->open(QIODevice::Text | QIODevice::Append)) {
246     appendMessages(tr("Logging started --- %1 ---")
247     .arg(QDateTime::currentDateTime().toString()));
248     } else {
249     delete m_pMessagesLog;
250     m_pMessagesLog = NULL;
251     }
252     }
253 capela 94 }
254    
255 capela 1738
256     // Messages log output method.
257     void Messages::appendMessagesLog ( const QString& s )
258 capela 94 {
259 capela 1738 if (m_pMessagesLog) {
260     QTextStream(m_pMessagesLog) << s << endl;
261     m_pMessagesLog->flush();
262     }
263 capela 94 }
264    
265 capela 1738 // Messages widget output method.
266     void Messages::appendMessagesLine ( const QString& s )
267 capela 94 {
268 capela 1738 // Check for message line limit...
269     if (m_iMessagesLines > m_iMessagesHigh) {
270     m_pMessagesTextView->setUpdatesEnabled(false);
271     QTextCursor textCursor(m_pMessagesTextView->document()->begin());
272 capela 1465 while (m_iMessagesLines > m_iMessagesLimit) {
273     // Move cursor extending selection
274     // from start to next line-block...
275     textCursor.movePosition(
276     QTextCursor::NextBlock, QTextCursor::KeepAnchor);
277     m_iMessagesLines--;
278     }
279     // Remove the excessive line-blocks...
280     textCursor.removeSelectedText();
281 capela 1738 m_pMessagesTextView->setUpdatesEnabled(true);
282     }
283 capela 1465
284 capela 1738 m_pMessagesTextView->append(s);
285 capela 1465 m_iMessagesLines++;
286 capela 94 }
287    
288    
289 capela 1738 // The main utility methods.
290     void Messages::appendMessages ( const QString& s )
291     {
292 capela 1739 appendMessagesColor(s, "#999999");
293 capela 1738 }
294    
295     void Messages::appendMessagesColor ( const QString& s, const QString &c )
296     {
297     QString sText = QTime::currentTime().toString("hh:mm:ss.zzz") + ' ' + s;
298     appendMessagesLine("<font color=\"" + c + "\">" + sText + "</font>");
299     appendMessagesLog(sText);
300     }
301    
302     void Messages::appendMessagesText ( const QString& s )
303     {
304     appendMessagesLine(s);
305     appendMessagesLog(s);
306     }
307    
308    
309 capela 1465 // History reset.
310 capela 1558 void Messages::clear (void)
311 capela 94 {
312 capela 1465 m_iMessagesLines = 0;
313 capela 1738 m_pMessagesTextView->clear();
314 capela 94 }
315    
316 capela 1558 } // namespace QSampler
317 capela 94
318 capela 1558
319 capela 94 // end of qsamplerMessages.cpp

  ViewVC Help
Powered by ViewVC