logtreewidget.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <QScrollBar>
00018
00019 #include "logtreewidget.h"
00020 #include "logheaderview.h"
00021 #include "logmessagecolumndelegate.h"
00022
00023
00024
00025 LogTreeWidget::LogTreeWidget(QWidget *parent)
00026 : QTreeWidget(parent)
00027 {
00028 setHeader(new LogHeaderView(this));
00029
00030
00031
00032 if (layoutDirection() == Qt::RightToLeft) {
00033 setItemDelegateForColumn(LogTreeWidget::MessageColumn,
00034 new LogMessageColumnDelegate(this));
00035 }
00036
00037
00038 sortItems(LogTreeWidget::TimeColumn, Qt::AscendingOrder);
00039
00040
00041 _scrollOnNewItem = true;
00042 setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
00043 connect(verticalScrollBar(), SIGNAL(sliderReleased()),
00044 this, SLOT(verticalSliderReleased()));
00045 }
00046
00047
00048
00049
00050
00051 void
00052 LogTreeWidget::verticalSliderReleased()
00053 {
00054 QScrollBar *scrollBar = verticalScrollBar();
00055 if (header()->sortIndicatorOrder() == Qt::AscendingOrder)
00056 _scrollOnNewItem = (scrollBar->value() == scrollBar->maximum());
00057 else
00058 _scrollOnNewItem = (scrollBar->value() == scrollBar->minimum());
00059 }
00060
00061
00062
00063 QList<LogTreeItem *>
00064 LogTreeWidget::qlist_cast(QList<QTreeWidgetItem *> inlist)
00065 {
00066 QList<LogTreeItem *> outlist;
00067 foreach (QTreeWidgetItem *item, inlist) {
00068 outlist << (LogTreeItem *)item;
00069 }
00070 return outlist;
00071 }
00072
00073
00074 QList<LogTreeItem *>
00075 LogTreeWidget::qlist_sort(QList<LogTreeItem *> inlist)
00076 {
00077 QMap<quint32, LogTreeItem *> outlist;
00078 foreach (LogTreeItem *item, inlist) {
00079 outlist.insert(item->id(), item);
00080 }
00081 return outlist.values();
00082 }
00083
00084
00085
00086 void
00087 LogTreeWidget::showEvent(QShowEvent *event)
00088 {
00089 static bool shown = false;
00090 QTreeWidget::showEvent(event);
00091 if (!shown) {
00092
00093 ((LogHeaderView *)header())->resetColumnWidths();
00094 shown = true;
00095 }
00096 }
00097
00098
00099
00100 void
00101 LogTreeWidget::clearMessages()
00102 {
00103
00104 _itemHistory.clear();
00105 clear();
00106 }
00107
00108
00109 QStringList
00110 LogTreeWidget::selectedMessages()
00111 {
00112 QStringList messages;
00113
00114
00115 QList<LogTreeItem *> items =
00116 qlist_cast(selectedItems());
00117
00118
00119 foreach (LogTreeItem *item, qlist_sort(items)) {
00120 messages << item->toString();
00121 }
00122 return messages;
00123 }
00124
00125
00126 QStringList
00127 LogTreeWidget::allMessages()
00128 {
00129 QStringList messages;
00130
00131
00132 foreach (LogTreeItem *item, _itemHistory) {
00133 messages << item->toString();
00134 }
00135 return messages;
00136 }
00137
00138
00139 int
00140 LogTreeWidget::messageCount()
00141 {
00142 return topLevelItemCount();
00143 }
00144
00145
00146 void
00147 LogTreeWidget::setMaximumMessageCount(int max)
00148 {
00149 while (max < messageCount() && _itemHistory.size() > 0) {
00150
00151
00152 int index = indexOfTopLevelItem(_itemHistory.takeFirst());
00153 if (index != -1)
00154 delete takeTopLevelItem(index);
00155 }
00156 _maxItemCount = max;
00157 }
00158
00159
00160 void
00161 LogTreeWidget::deselectAll()
00162 {
00163 foreach(QTreeWidgetItem *item, selectedItems()) {
00164 setItemSelected(item, false);
00165 }
00166 }
00167
00168
00169 LogTreeItem*
00170 LogTreeWidget::log(LogEvent::Severity type, QString message)
00171 {
00172 int oldScrollValue;
00173 QScrollBar *scrollBar = verticalScrollBar();
00174 LogTreeItem *item = new LogTreeItem(type, message);
00175
00176
00177 oldScrollValue = scrollBar->value();
00178
00179
00180 if (messageCount() >= _maxItemCount && _itemHistory.size()) {
00181 int index = indexOfTopLevelItem(_itemHistory.takeFirst());
00182 if (index != -1)
00183 delete takeTopLevelItem(index);
00184 }
00185
00186
00187
00188
00189
00190
00191
00192 setSortingEnabled(false);
00193 addLogTreeItem(item);
00194 setSortingEnabled(true);
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 if (_scrollOnNewItem && sortColumn() == LogTreeWidget::TimeColumn) {
00212 if (header()->sortIndicatorOrder() == Qt::AscendingOrder)
00213 scrollBar->setValue(scrollBar->maximum());
00214 else
00215 scrollBar->setValue(scrollBar->minimum());
00216 } else {
00217 scrollBar->setValue(oldScrollValue);
00218 }
00219
00220 return item;
00221 }
00222
00223
00224 void
00225 LogTreeWidget::addLogTreeItem(LogTreeItem *item)
00226 {
00227 addTopLevelItem(item);
00228 _itemHistory.append(item);
00229 }
00230
00231
00232 void
00233 LogTreeWidget::filter(uint filter)
00234 {
00235 int itemsShown = 0;
00236 for (int i = _itemHistory.size()-1; i >= 0; i--) {
00237 LogTreeItem *item = _itemHistory.at(i);
00238 if ((itemsShown < _maxItemCount) && (filter & item->severity())) {
00239 itemsShown++;
00240 } else {
00241 int itemIndex = indexOfTopLevelItem(item);
00242 if (itemIndex != -1)
00243 delete takeTopLevelItem(itemIndex);
00244 _itemHistory.removeAt(i);
00245 }
00246 }
00247 }
00248
00249
00250 QList<LogTreeItem *>
00251 LogTreeWidget::find(QString text, bool highlight)
00252 {
00253 QList<LogTreeItem *> items =
00254 qlist_cast(findItems(text, Qt::MatchContains|Qt::MatchWrap, MessageColumn));
00255
00256 if (highlight) {
00257
00258 deselectAll();
00259 foreach (LogTreeItem *item, items) {
00260
00261 setItemSelected(item, true);
00262 }
00263 }
00264
00265
00266 return qlist_sort(items);
00267 }