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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2459 - (show annotations) (download)
Mon Jul 8 10:06:57 2013 UTC (10 years, 9 months ago) by capela
File size: 8344 byte(s)
- Autoconf script and libqt4 >= 4.4 baseline fix.
1 // qsamplerMessages.cpp
2 //
3 /****************************************************************************
4 Copyright (C) 2004-2013, 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
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 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
21 *****************************************************************************/
22
23 #include "qsamplerAbout.h"
24 #include "qsamplerMessages.h"
25
26 #include <QSocketNotifier>
27
28 #include <QFile>
29 #include <QTextEdit>
30 #include <QTextCursor>
31 #include <QTextStream>
32 #include <QTextBlock>
33 #include <QScrollBar>
34 #include <QDateTime>
35 #include <QIcon>
36
37 #if !defined(WIN32)
38 #include <unistd.h>
39 #endif
40
41
42 namespace QSampler {
43
44 // 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 // QSampler::Messages - Messages log dockable window.
54 //
55
56 // Constructor.
57 Messages::Messages ( QWidget *pParent )
58 : QDockWidget(pParent)
59 {
60 // Surely a name is crucial (e.g.for storing geometry settings)
61 QDockWidget::setObjectName("qsamplerMessages");
62
63 // 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
68 // Create local text view widget.
69 m_pMessagesTextView = new QTextEdit(this);
70 // QFont font(m_pMessagesTextView->font());
71 // font.setFamily("Fixed");
72 // 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
78 // Initialize default message limit.
79 m_iMessagesLines = 0;
80 setMessagesLimit(QSAMPLER_MESSAGES_MAXLINES);
81
82 m_pMessagesLog = NULL;
83
84 // Prepare the dockable window stuff.
85 QDockWidget::setWidget(m_pMessagesTextView);
86 QDockWidget::setFeatures(QDockWidget::AllDockWidgetFeatures);
87 QDockWidget::setAllowedAreas(
88 Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
89 // Some specialties to this kind of dock window...
90 QDockWidget::setMinimumHeight(120);
91
92 // 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 }
98
99
100 // Destructor.
101 Messages::~Messages (void)
102 {
103 // Turn off and close logging.
104 setLogging(false);
105
106 // No more notifications.
107 if (m_pStdoutNotifier)
108 delete m_pStdoutNotifier;
109
110 // No need to delete child widgets, Qt does it all for us.
111 }
112
113
114 // Own stdout/stderr socket notifier slot.
115 void Messages::stdoutNotify ( int fd )
116 {
117 #if !defined(WIN32)
118 char achBuffer[1024];
119 int cchBuffer = ::read(fd, achBuffer, sizeof(achBuffer) - 1);
120 if (cchBuffer > 0) {
121 achBuffer[cchBuffer] = (char) 0;
122 appendStdoutBuffer(achBuffer);
123 }
124 #endif
125 }
126
127
128 // Stdout buffer handler -- now splitted by complete new-lines...
129 void Messages::appendStdoutBuffer ( const QString& s )
130 {
131 m_sStdoutBuffer.append(s);
132
133 int iLength = m_sStdoutBuffer.lastIndexOf('\n');
134 if (iLength > 0) {
135 QString sTemp = m_sStdoutBuffer.left(iLength);
136 m_sStdoutBuffer.remove(0, iLength + 1);
137 QStringList list = sTemp.split('\n');
138 QStringListIterator iter(list);
139 while (iter.hasNext())
140 appendMessagesText(iter.next());
141 }
142 }
143
144
145 // Stdout flusher -- show up any unfinished line...
146 void Messages::flushStdoutBuffer (void)
147 {
148 if (!m_sStdoutBuffer.isEmpty()) {
149 appendMessagesText(m_sStdoutBuffer);
150 m_sStdoutBuffer.truncate(0);
151 }
152 }
153
154
155 // Stdout capture accessors.
156 bool Messages::isCaptureEnabled (void)
157 {
158 return (bool) (m_pStdoutNotifier != NULL);
159 }
160
161 void Messages::setCaptureEnabled ( bool bCapture )
162 {
163 // Flush current buffer.
164 flushStdoutBuffer();
165
166 #if !defined(WIN32)
167 // Destroy if already enabled.
168 if (!bCapture && m_pStdoutNotifier) {
169 delete m_pStdoutNotifier;
170 m_pStdoutNotifier = NULL;
171 // Close the notification pipes.
172 if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
173 ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
174 m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
175 }
176 if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
177 ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
178 m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
179 }
180 }
181 // Are we going to make up the capture?
182 if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {
183 ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDOUT_FILENO);
184 ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDERR_FILENO);
185 m_pStdoutNotifier = new QSocketNotifier(
186 m_fdStdout[QSAMPLER_MESSAGES_FDREAD], QSocketNotifier::Read, this);
187 QObject::connect(m_pStdoutNotifier,
188 SIGNAL(activated(int)),
189 SLOT(stdoutNotify(int)));
190 }
191 #endif
192 }
193
194
195 // Message font accessors.
196 QFont Messages::messagesFont (void)
197 {
198 return m_pMessagesTextView->font();
199 }
200
201 void Messages::setMessagesFont ( const QFont& font )
202 {
203 m_pMessagesTextView->setFont(font);
204 }
205
206
207 // Maximum number of message lines accessors.
208 int Messages::messagesLimit (void)
209 {
210 return m_iMessagesLimit;
211 }
212
213 void Messages::setMessagesLimit ( int iMessagesLimit )
214 {
215 m_iMessagesLimit = iMessagesLimit;
216 m_iMessagesHigh = iMessagesLimit + (iMessagesLimit / 3);
217 }
218
219 // Messages logging stuff.
220 bool Messages::isLogging (void) const
221 {
222 return (m_pMessagesLog != NULL);
223 }
224
225 void Messages::setLogging ( bool bEnabled, const QString& sFilename )
226 {
227 if (m_pMessagesLog) {
228 appendMessages(tr("Logging stopped --- %1 ---")
229 .arg(QDateTime::currentDateTime().toString()));
230 m_pMessagesLog->close();
231 delete m_pMessagesLog;
232 m_pMessagesLog = NULL;
233 }
234
235 if (bEnabled) {
236 m_pMessagesLog = new QFile(sFilename);
237 if (m_pMessagesLog->open(QIODevice::Text | QIODevice::Append)) {
238 appendMessages(tr("Logging started --- %1 ---")
239 .arg(QDateTime::currentDateTime().toString()));
240 } else {
241 delete m_pMessagesLog;
242 m_pMessagesLog = NULL;
243 }
244 }
245 }
246
247
248 // Messages log output method.
249 void Messages::appendMessagesLog ( const QString& s )
250 {
251 if (m_pMessagesLog) {
252 QTextStream(m_pMessagesLog) << s << endl;
253 m_pMessagesLog->flush();
254 }
255 }
256
257 // Messages widget output method.
258 void Messages::appendMessagesLine ( const QString& s )
259 {
260 // Check for message line limit...
261 if (m_iMessagesLines > m_iMessagesHigh) {
262 m_pMessagesTextView->setUpdatesEnabled(false);
263 QTextCursor textCursor(m_pMessagesTextView->document()->begin());
264 while (m_iMessagesLines > m_iMessagesLimit) {
265 // Move cursor extending selection
266 // from start to next line-block...
267 textCursor.movePosition(
268 QTextCursor::NextBlock, QTextCursor::KeepAnchor);
269 m_iMessagesLines--;
270 }
271 // Remove the excessive line-blocks...
272 textCursor.removeSelectedText();
273 m_pMessagesTextView->setUpdatesEnabled(true);
274 }
275
276 m_pMessagesTextView->append(s);
277 m_iMessagesLines++;
278 }
279
280
281 // The main utility methods.
282 void Messages::appendMessages ( const QString& s )
283 {
284 appendMessagesColor(s, "#999999");
285 }
286
287 void Messages::appendMessagesColor ( const QString& s, const QString &c )
288 {
289 QString sText = QTime::currentTime().toString("hh:mm:ss.zzz") + ' ' + s;
290 appendMessagesLine("<font color=\"" + c + "\">" + sText + "</font>");
291 appendMessagesLog(sText);
292 }
293
294 void Messages::appendMessagesText ( const QString& s )
295 {
296 appendMessagesLine(s);
297 appendMessagesLog(s);
298 }
299
300
301 // History reset.
302 void Messages::clear (void)
303 {
304 m_iMessagesLines = 0;
305 m_pMessagesTextView->clear();
306 }
307
308 } // namespace QSampler
309
310
311 // end of qsamplerMessages.cpp

  ViewVC Help
Powered by ViewVC