diff --git a/src/plugins/projectexplorer/outputwindow.cpp b/src/plugins/projectexplorer/outputwindow.cpp index 3ead27b6105c43eae5361abdd9f52e01eb0231c8..d047253b8fd2ac065ffec45f624622224cafeb30 100644 --- a/src/plugins/projectexplorer/outputwindow.cpp +++ b/src/plugins/projectexplorer/outputwindow.cpp @@ -350,368 +350,3 @@ void OutputWindow::insertLine() appendPlainText(QString()); } -#if 0 -OutputWindow::OutputWindow(QWidget *parent) - : QAbstractScrollArea(parent) -{ - max_lines = 1000; - width_used = 0; - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - same_height = true; - block_scroll = false; - setWindowTitle(tr("Application Output Window")); - setWindowIcon(QIcon(":/qt4projectmanager/images/window.png")); -} - -void OutputWindow::changed() { - int remove = lines.size() - max_lines; - if (remove > 0) { - selection_start.line -= remove; - selection_end.line -= remove; - selection_start = qMax(selection_start, Selection()); - selection_end = qMax(selection_end, Selection()); - if (remove > verticalScrollBar()->value()) { - if (same_height) - viewport()->scroll(0, -remove * fontMetrics().lineSpacing()); - else - viewport()->update(); - } else { - block_scroll = true; - verticalScrollBar()->setValue(verticalScrollBar()->value() - remove); - block_scroll = false; - } - while (remove--) - lines.removeFirst(); - } - - verticalScrollBar()->setRange(0, lines.size() - 1); - -} - - -bool OutputWindow::getCursorPos(int *lineNumber, int *position, const QPoint &pos) { - if (lines.isEmpty()) - return false; - *lineNumber = verticalScrollBar()->value(); - - int x = 4 - horizontalScrollBar()->value(); - - int spacing = fontMetrics().lineSpacing(); - int leading = fontMetrics().leading(); - int height = 0; - - QTextLayout textLayout; - textLayout.setFont(font()); - - if (same_height && pos.y() > 0) { - int skipLines = pos.y() / spacing; - height += skipLines * spacing; - *lineNumber = qMin(*lineNumber + skipLines, lines.size() - 1); - } - - same_height = true; - - while ( *lineNumber < lines.size()) { - textLayout.setText(lines.at(*lineNumber)); - - textLayout.beginLayout(); - while (1) { - QTextLine line = textLayout.createLine(); - if (!line.isValid()) - break; - line.setLineWidth(INT_MAX/256); - height += leading; - line.setPosition(QPoint(x, height)); - height += static_cast<int>(line.height()); - } - textLayout.endLayout(); - if (height > pos.y()) { - *position = textLayout.lineAt(0).xToCursor(pos.x()); - break; - } - ++*lineNumber; - } - return true; -} - -void OutputWindow::setNumberOfLines(int max) -{ - max_lines = qMax(1, max); - while (lines.size() > max_lines) - lines.removeLast(); - changed(); -} - -int OutputWindow::numberOfLines() const -{ - return max_lines; -} - -bool OutputWindow::hasSelectedText() const -{ - return selection_start != selection_end; -} - -void OutputWindow::clearSelection() -{ - bool hadSelectedText = hasSelectedText(); - selection_start = selection_end = Selection(); - if (hadSelectedText) - viewport()->update(); -} - -QString OutputWindow::selectedText() const -{ - Selection sel_start = qMin(selection_start, selection_end); - Selection sel_end = qMax(selection_start, selection_end); - QString text; - - if (sel_start.line == sel_end.line) { - text += lines.at(sel_start.line).mid(sel_start.pos, sel_end.pos - sel_start.pos); - } else { - int line = sel_start.line; - text += lines.at(line++).mid(sel_start.pos); - text += QLatin1Char('\n'); - while (line < sel_end.line) { - text += lines.at(line++); - text += QLatin1Char('\n'); - } - text += lines.at(sel_end.line).left(sel_end.pos); - } - return text; -} - -void OutputWindow::appendOutput(const QString &text) -{ - lines.append(text); - if (same_height) - viewport()->update( - QRect(0, (lines.size() - verticalScrollBar()->value() - 1) * fontMetrics().lineSpacing(), - viewport()->width(), viewport()->height())); - else - viewport()->update(); - - changed(); - int top = lines.size() - (viewport()->height() / fontMetrics().lineSpacing()); - if (verticalScrollBar()->value() == top - 1) - verticalScrollBar()->setValue(top); -} - -void OutputWindow::clear() -{ - clearSelection(); - lines.clear(); - viewport()->update(); -} - -void OutputWindow::copy() -{ - if (hasSelectedText()) - QApplication::clipboard()->setText(selectedText()); -} - -void OutputWindow::selectAll() -{ - selection_start = Selection(); - selection_end.line = lines.size() - 1; - selection_end.pos = lines.last().length() - 1; - viewport()->update(); -} - -void OutputWindow::scrollContentsBy(int dx, int dy) -{ - if (block_scroll) - return; - if (dx && dy) { - viewport()->update(); - } else if (dx && !dy) { - viewport()->scroll(dx, 0); - } else { - if (same_height) { - viewport()->scroll(0, fontMetrics().lineSpacing() * dy); - } else { - viewport()->update(); - } - } -} - -void OutputWindow::keyPressEvent(QKeyEvent *e) -{ - bool accept = true; - if (e == QKeySequence::Copy) { - copy(); - } else if (e == QKeySequence::SelectAll) { - selectAll(); - } else if (e->key() == Qt::Key_Enter - || e->key() == Qt::Key_Return) { - insertLine(); - } else { - accept = false; - } - - if (accept) - e->accept(); - else - QAbstractScrollArea::keyPressEvent(e); -} - -void OutputWindow::paintEvent(QPaintEvent *e) -{ - int lineNumber = verticalScrollBar()->value(); - - int x = 4 - horizontalScrollBar()->value(); - QPainter p(viewport()); - - int spacing = fontMetrics().lineSpacing(); - int leading = fontMetrics().leading(); - int height = 0; - - QTextLayout textLayout; - textLayout.setFont(font()); - - QTextCharFormat selectionFormat; - selectionFormat.setBackground(palette().highlight()); - selectionFormat.setForeground(palette().highlightedText()); - - if (e->rect().top() <= 0 && e->rect().bottom() >= viewport()->rect().bottom()) - width_used = 0; // recalculate - - if (same_height) { - int skipLines = e->rect().top() / spacing; - height += skipLines * spacing; - lineNumber += skipLines; - } - - same_height = true; - - Selection sel_start = qMin(selection_start, selection_end); - Selection sel_end = qMax(selection_start, selection_end); - - while ( lineNumber < lines.size() && height <= e->rect().bottom()) { - - QString line = lines.at(lineNumber); - - if (line.size() == 1 && line.at(0) == QChar::ParagraphSeparator) { - int y = height + spacing/2; - p.drawLine(e->rect().left(), y, e->rect().right(), y); - height += spacing; - - } else { - textLayout.setText(line); - textLayout.beginLayout(); - while (1) { - QTextLine line = textLayout.createLine(); - if (!line.isValid()) - break; - line.setLineWidth(INT_MAX/256); - height += leading; - line.setPosition(QPoint(x, height)); - height += static_cast<int>(line.height()); - - same_height = same_height && (line.height() + leading) == spacing; - width_used = qMax(width_used, 8 + static_cast<int>(line.naturalTextWidth())); - } - textLayout.endLayout(); - - if (lineNumber >= sel_start.line && lineNumber <= sel_end.line) { - QVector<QTextLayout::FormatRange> selection(1); - selection[0].start = (lineNumber == sel_start.line)? sel_start.pos : 0; - selection[0].length = ((lineNumber == sel_end.line) ? sel_end.pos : lines.at(lineNumber).size()) - selection[0].start; - selection[0].format = selectionFormat; - - textLayout.draw(&p, QPoint(0, 0), selection); - } else { - textLayout.draw(&p, QPoint(0, 0)); - } - } - - - ++lineNumber; - } - - horizontalScrollBar()->setRange(0, qMax(0, width_used - viewport()->width())); - if (horizontalScrollBar()->pageStep() != viewport()->width()) - horizontalScrollBar()->setPageStep(viewport()->width()); - if (height > viewport()->height()) - verticalScrollBar()->setPageStep(lineNumber - verticalScrollBar()->value()); - else if (verticalScrollBar()->pageStep() != viewport()->height() / fontMetrics().lineSpacing()) - verticalScrollBar()->setPageStep(viewport()->height() / fontMetrics().lineSpacing()); -} - -void OutputWindow::mousePressEvent(QMouseEvent *e) -{ - if (e->button() == Qt::LeftButton) { - clearSelection(); - if (getCursorPos(&selection_start.line, &selection_start.pos, e->pos())) { - selection_end = selection_start; - autoscroll = 0; - } - } -} - -void OutputWindow::timerEvent(QTimerEvent *e) -{ - if (e->timerId() == autoscroll_timer.timerId()) { - int autoscroll = 0; - if (lastMouseMove.y() < 0) - autoscroll = -1; - else if (lastMouseMove.y() > viewport()->height()) - autoscroll = 1; - if (autoscroll) { - verticalScrollBar()->setValue(verticalScrollBar()->value() + autoscroll); - OutputWindow::mouseMoveEvent(0); - } - } - QAbstractScrollArea::timerEvent(e); -} - -void OutputWindow::mouseReleaseEvent(QMouseEvent *e) -{ - if (e->button() == Qt::LeftButton) { - autoscroll_timer.stop(); - if (hasSelectedText() && QApplication::clipboard()->supportsSelection()) - QApplication::clipboard()->setText(selectedText(), QClipboard::Selection); - } -} - -void OutputWindow::mouseMoveEvent(QMouseEvent *e) -{ - if (e) { - lastMouseMove = e->pos(); - if (viewport()->rect().contains(e->pos())) - autoscroll_timer.stop(); - else - autoscroll_timer.start(20, this); - } - - - Selection old = selection_end; - if (!getCursorPos(&selection_end.line, &selection_end.pos, lastMouseMove)) - return; - if (same_height) { - Selection from = qMin(old, selection_end); - Selection to = qMax(old, selection_end); - viewport()->update(QRect(0, -1 + (from.line - verticalScrollBar()->value()) * fontMetrics().lineSpacing(), - viewport()->width(), 2 + (to.line - from.line + 1) * fontMetrics().lineSpacing())); - } else { - viewport()->update(); - } -} - -void OutputWindow::contextMenuEvent(QContextMenuEvent * e) -{ - QMenu menu(this); - QAction *clearAction = menu.addAction("Clear", this, SLOT(clear())); - QAction *copyAction = menu.addAction("Copy", this, SLOT(copy()), QKeySequence::Copy); - QAction *selectAllAction = menu.addAction("Select All", this, SLOT(selectAll()), QKeySequence::SelectAll); - if (lines.empty()) { - clearAction->setDisabled(true); - selectAllAction->setDisabled(true); - } - if (!hasSelectedText()) - copyAction->setDisabled(true); - - menu.exec(e->globalPos()); -} - -#endif // 0