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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1465 - (show annotations) (download)
Thu Nov 1 17:49:27 2007 UTC (16 years, 5 months ago) by capela
File size: 7285 byte(s)
- Qt4 migration: main toolbars and messages dock-widget fix.

1 // qsamplerMessages.cpp
2 //
3 /****************************************************************************
4 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
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 #include <QTextEdit>
28 #include <QTextCursor>
29 #include <QTextBlock>
30 #include <QScrollBar>
31 #include <QDateTime>
32 #include <QIcon>
33
34 #if !defined(WIN32)
35 #include <unistd.h>
36 #endif
37
38 // The default maximum number of message lines.
39 #define QSAMPLER_MESSAGES_MAXLINES 1000
40
41 // Notification pipe descriptors
42 #define QSAMPLER_MESSAGES_FDNIL -1
43 #define QSAMPLER_MESSAGES_FDREAD 0
44 #define QSAMPLER_MESSAGES_FDWRITE 1
45
46
47 //-------------------------------------------------------------------------
48 // qsamplerMessages - Messages log dockable window.
49 //
50
51 // Constructor.
52 qsamplerMessages::qsamplerMessages ( QWidget *pParent )
53 : 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.
59 m_pStdoutNotifier = NULL;
60 m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
61 m_fdStdout[QSAMPLER_MESSAGES_FDWRITE] = QSAMPLER_MESSAGES_FDNIL;
62
63 // Create local text view widget.
64 m_pTextView = new QTextEdit(this);
65 // QFont font(m_pTextView->font());
66 // font.setFamily("Fixed");
67 // m_pTextView->setFont(font);
68 m_pTextView->setLineWrapMode(QTextEdit::NoWrap);
69 m_pTextView->setReadOnly(true);
70 m_pTextView->setUndoRedoEnabled(false);
71 // m_pTextView->setTextFormat(Qt::LogText);
72
73 // Initialize default message limit.
74 m_iMessagesLines = 0;
75 setMessagesLimit(QSAMPLER_MESSAGES_MAXLINES);
76
77 // Prepare the dockable window stuff.
78 QDockWidget::setWidget(m_pTextView);
79 QDockWidget::setFeatures(QDockWidget::AllDockWidgetFeatures);
80 QDockWidget::setAllowedAreas(
81 Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
82 // Some specialties to this kind of dock window...
83 QDockWidget::setMinimumHeight(120);
84
85 // Finally set the default caption and tooltip.
86 const QString& sCaption = tr("Messages");
87 QDockWidget::setWindowTitle(sCaption);
88 // QDockWidget::setWindowIcon(QIcon(":/icons/qsamplerMessages.png"));
89 QDockWidget::setToolTip(sCaption);
90 }
91
92
93 // Destructor.
94 qsamplerMessages::~qsamplerMessages (void)
95 {
96 // No more notifications.
97 if (m_pStdoutNotifier)
98 delete m_pStdoutNotifier;
99
100 // No need to delete child widgets, Qt does it all for us.
101 }
102
103
104 // Own stdout/stderr socket notifier slot.
105 void qsamplerMessages::stdoutNotify ( int fd )
106 {
107 #if !defined(WIN32)
108 char achBuffer[1024];
109 int cchBuffer = ::read(fd, achBuffer, sizeof(achBuffer) - 1);
110 if (cchBuffer > 0) {
111 achBuffer[cchBuffer] = (char) 0;
112 appendStdoutBuffer(achBuffer);
113 }
114 #endif
115 }
116
117
118 // Stdout buffer handler -- now splitted by complete new-lines...
119 void qsamplerMessages::appendStdoutBuffer ( const QString& s )
120 {
121 m_sStdoutBuffer.append(s);
122
123 int iLength = m_sStdoutBuffer.lastIndexOf('\n') + 1;
124 if (iLength > 0) {
125 QString sTemp = m_sStdoutBuffer.left(iLength);
126 m_sStdoutBuffer.remove(0, iLength);
127 QStringList list = sTemp.split('\n');
128 QStringListIterator iter(list);
129 while (iter.hasNext())
130 appendMessagesText(iter.next());
131 }
132 }
133
134
135 // Stdout flusher -- show up any unfinished line...
136 void qsamplerMessages::flushStdoutBuffer (void)
137 {
138 if (!m_sStdoutBuffer.isEmpty()) {
139 appendMessagesText(m_sStdoutBuffer);
140 m_sStdoutBuffer.truncate(0);
141 }
142 }
143
144
145 // Stdout capture accessors.
146 bool qsamplerMessages::isCaptureEnabled (void)
147 {
148 return (bool) (m_pStdoutNotifier != NULL);
149 }
150
151 void qsamplerMessages::setCaptureEnabled ( bool bCapture )
152 {
153 // Flush current buffer.
154 flushStdoutBuffer();
155
156 #if !defined(WIN32)
157 // Destroy if already enabled.
158 if (!bCapture && m_pStdoutNotifier) {
159 delete m_pStdoutNotifier;
160 m_pStdoutNotifier = NULL;
161 // Close the notification pipes.
162 if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
163 ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
164 m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
165 }
166 if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
167 ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
168 m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
169 }
170 }
171 // Are we going to make up the capture?
172 if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {
173 ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDOUT_FILENO);
174 ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDERR_FILENO);
175 m_pStdoutNotifier = new QSocketNotifier(
176 m_fdStdout[QSAMPLER_MESSAGES_FDREAD], QSocketNotifier::Read, this);
177 QObject::connect(m_pStdoutNotifier,
178 SIGNAL(activated(int)),
179 SLOT(stdoutNotify(int)));
180 }
181 #endif
182 }
183
184
185 // Message font accessors.
186 QFont qsamplerMessages::messagesFont (void)
187 {
188 return m_pTextView->font();
189 }
190
191 void qsamplerMessages::setMessagesFont( const QFont& font )
192 {
193 m_pTextView->setFont(font);
194 }
195
196
197 // Maximum number of message lines accessors.
198 int qsamplerMessages::messagesLimit (void)
199 {
200 return m_iMessagesLimit;
201 }
202
203 void qsamplerMessages::setMessagesLimit ( int iMessagesLimit )
204 {
205 m_iMessagesLimit = iMessagesLimit;
206 m_iMessagesHigh = iMessagesLimit + (iMessagesLimit / 3);
207 }
208
209
210 // The main utility methods.
211 void qsamplerMessages::appendMessages ( const QString& s )
212 {
213 appendMessagesColor(s, "#999999");
214 }
215
216 void qsamplerMessages::appendMessagesColor ( const QString& s, const QString &c )
217 {
218 appendMessagesText("<font color=\"" + c + "\">"
219 + QTime::currentTime().toString("hh:mm:ss.zzz")
220 + ' ' + s + "</font>");
221 }
222
223 void qsamplerMessages::appendMessagesText ( const QString& s )
224 {
225 // Check for message line limit...
226 if (m_iMessagesLines > m_iMessagesHigh) {
227 m_pTextView->setUpdatesEnabled(false);
228 QTextCursor textCursor(m_pTextView->document()->begin());
229 while (m_iMessagesLines > m_iMessagesLimit) {
230 // Move cursor extending selection
231 // from start to next line-block...
232 textCursor.movePosition(
233 QTextCursor::NextBlock, QTextCursor::KeepAnchor);
234 m_iMessagesLines--;
235 }
236 // Remove the excessive line-blocks...
237 textCursor.removeSelectedText();
238 m_pTextView->setUpdatesEnabled(true);
239 }
240
241 // Count always as a new line out there...
242 m_pTextView->append(s);
243 m_iMessagesLines++;
244 }
245
246
247 // History reset.
248 void qsamplerMessages::clear (void)
249 {
250 m_iMessagesLines = 0;
251 m_pTextView->clear();
252 }
253
254
255 // end of qsamplerMessages.cpp

  ViewVC Help
Powered by ViewVC