|
@@ -1,5 +1,7 @@
|
|
|
#include "fb2code.hpp"
|
|
|
|
|
|
+#ifdef USE_SCINTILLA
|
|
|
+
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
//
|
|
|
// http://qtcoder.blogspot.com/2010/10/qscintills.html
|
|
@@ -10,7 +12,7 @@
|
|
|
#include <Qsci/qscilexerxml.h>
|
|
|
#include <QtDebug>
|
|
|
|
|
|
-Fb2Scintilla::Fb2Scintilla(QWidget *parent) :
|
|
|
+Fb2CodeEdit::Fb2CodeEdit(QWidget *parent) :
|
|
|
QsciScintilla(parent)
|
|
|
{
|
|
|
zoomTo(1);
|
|
@@ -67,13 +69,13 @@ Fb2Scintilla::Fb2Scintilla(QWidget *parent) :
|
|
|
connect(this, SIGNAL(linesChanged()), SLOT(linesChanged()));
|
|
|
}
|
|
|
|
|
|
-void Fb2Scintilla::linesChanged()
|
|
|
+void Fb2CodeEdit::linesChanged()
|
|
|
{
|
|
|
QString width = QString().setNum(lines() * 10);
|
|
|
setMarginWidth(0, width);
|
|
|
}
|
|
|
|
|
|
-void Fb2Scintilla::load(const QByteArray &array, const QList<int> &folds)
|
|
|
+void Fb2CodeEdit::load(const QByteArray &array, const QList<int> &folds)
|
|
|
{
|
|
|
SendScintilla(SCI_SETTEXT, array.constData());
|
|
|
SendScintilla(SCI_EMPTYUNDOBUFFER);
|
|
@@ -83,3 +85,109 @@ void Fb2Scintilla::load(const QByteArray &array, const QList<int> &folds)
|
|
|
foldLine(*it);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+#else // USE_SCINTILLA
|
|
|
+
|
|
|
+#include <QtGui>
|
|
|
+
|
|
|
+Fb2CodeEdit::Fb2CodeEdit(QWidget *parent) : QPlainTextEdit(parent)
|
|
|
+{
|
|
|
+ lineNumberArea = new LineNumberArea(this);
|
|
|
+
|
|
|
+ connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int)));
|
|
|
+ connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(updateLineNumberArea(QRect,int)));
|
|
|
+ connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine()));
|
|
|
+
|
|
|
+ #ifdef Q_WS_WIN
|
|
|
+ setFont(QFont("Courier New", 8));
|
|
|
+ #else
|
|
|
+ setFont(QFont("Monospace", 8));
|
|
|
+ #endif
|
|
|
+
|
|
|
+ updateLineNumberAreaWidth(0);
|
|
|
+ highlightCurrentLine();
|
|
|
+}
|
|
|
+
|
|
|
+int Fb2CodeEdit::lineNumberAreaWidth()
|
|
|
+{
|
|
|
+ int digits = 1;
|
|
|
+ int max = qMax(1, blockCount());
|
|
|
+ while (max >= 10) {
|
|
|
+ max /= 10;
|
|
|
+ ++digits;
|
|
|
+ }
|
|
|
+
|
|
|
+ int space = 3 + fontMetrics().width(QLatin1Char('9')) * digits;
|
|
|
+
|
|
|
+ return space;
|
|
|
+}
|
|
|
+
|
|
|
+void Fb2CodeEdit::updateLineNumberAreaWidth(int /* newBlockCount */)
|
|
|
+{
|
|
|
+ setViewportMargins(lineNumberAreaWidth(), 0, 0, 0);
|
|
|
+}
|
|
|
+
|
|
|
+void Fb2CodeEdit::updateLineNumberArea(const QRect &rect, int dy)
|
|
|
+{
|
|
|
+ if (dy)
|
|
|
+ lineNumberArea->scroll(0, dy);
|
|
|
+ else
|
|
|
+ lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height());
|
|
|
+
|
|
|
+ if (rect.contains(viewport()->rect()))
|
|
|
+ updateLineNumberAreaWidth(0);
|
|
|
+}
|
|
|
+
|
|
|
+void Fb2CodeEdit::resizeEvent(QResizeEvent *e)
|
|
|
+{
|
|
|
+ QPlainTextEdit::resizeEvent(e);
|
|
|
+
|
|
|
+ QRect cr = contentsRect();
|
|
|
+ lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height()));
|
|
|
+}
|
|
|
+
|
|
|
+void Fb2CodeEdit::highlightCurrentLine()
|
|
|
+{
|
|
|
+ QList<QTextEdit::ExtraSelection> extraSelections;
|
|
|
+
|
|
|
+ if (!isReadOnly()) {
|
|
|
+ QTextEdit::ExtraSelection selection;
|
|
|
+
|
|
|
+ QColor lineColor = QColor(Qt::yellow).lighter(160);
|
|
|
+
|
|
|
+ selection.format.setBackground(lineColor);
|
|
|
+ selection.format.setProperty(QTextFormat::FullWidthSelection, true);
|
|
|
+ selection.cursor = textCursor();
|
|
|
+ selection.cursor.clearSelection();
|
|
|
+ extraSelections.append(selection);
|
|
|
+ }
|
|
|
+
|
|
|
+ setExtraSelections(extraSelections);
|
|
|
+}
|
|
|
+
|
|
|
+void Fb2CodeEdit::lineNumberAreaPaintEvent(QPaintEvent *event)
|
|
|
+{
|
|
|
+ QPainter painter(lineNumberArea);
|
|
|
+ painter.fillRect(event->rect(), Qt::lightGray);
|
|
|
+
|
|
|
+ QTextBlock block = firstVisibleBlock();
|
|
|
+ int blockNumber = block.blockNumber();
|
|
|
+ int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();
|
|
|
+ int bottom = top + (int) blockBoundingRect(block).height();
|
|
|
+
|
|
|
+ while (block.isValid() && top <= event->rect().bottom()) {
|
|
|
+ if (block.isVisible() && bottom >= event->rect().top()) {
|
|
|
+ QString number = QString::number(blockNumber + 1);
|
|
|
+ painter.setPen(Qt::black);
|
|
|
+ painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(),
|
|
|
+ Qt::AlignRight, number);
|
|
|
+ }
|
|
|
+
|
|
|
+ block = block.next();
|
|
|
+ top = bottom;
|
|
|
+ bottom = top + (int) blockBoundingRect(block).height();
|
|
|
+ ++blockNumber;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#endif // USE_SCINTILLA
|