fb2code.hpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #ifndef FB2CODE_H
  2. #define FB2CODE_H
  3. #include <QByteArray>
  4. #include <QList>
  5. #include <QPlainTextEdit>
  6. #include <QObject>
  7. #include <QSyntaxHighlighter>
  8. #include <QTextCharFormat>
  9. #include <QColor>
  10. #include <QTextEdit>
  11. class FbHighlighter : public QSyntaxHighlighter
  12. {
  13. public:
  14. FbHighlighter(QObject* parent);
  15. FbHighlighter(QTextDocument* parent);
  16. FbHighlighter(QTextEdit* parent);
  17. ~FbHighlighter();
  18. enum HighlightType
  19. {
  20. SyntaxChar,
  21. ElementName,
  22. Comment,
  23. AttributeName,
  24. AttributeValue,
  25. Error,
  26. Other
  27. };
  28. void setHighlightColor(HighlightType type, QColor color, bool foreground = true);
  29. void setHighlightFormat(HighlightType type, QTextCharFormat format);
  30. protected:
  31. void highlightBlock(const QString& rstrText);
  32. int processDefaultText(int i, const QString& rstrText);
  33. private:
  34. void init();
  35. QTextCharFormat fmtSyntaxChar;
  36. QTextCharFormat fmtElementName;
  37. QTextCharFormat fmtComment;
  38. QTextCharFormat fmtAttributeName;
  39. QTextCharFormat fmtAttributeValue;
  40. QTextCharFormat fmtError;
  41. QTextCharFormat fmtOther;
  42. enum ParsingState
  43. {
  44. NoState = 0,
  45. ExpectElementNameOrSlash,
  46. ExpectElementName,
  47. ExpectAttributeOrEndOfElement,
  48. ExpectEqual,
  49. ExpectAttributeValue
  50. };
  51. enum BlockState
  52. {
  53. NoBlock = -1,
  54. InComment,
  55. InElement
  56. };
  57. ParsingState state;
  58. };
  59. QT_BEGIN_NAMESPACE
  60. class QPaintEvent;
  61. class QResizeEvent;
  62. class QSize;
  63. class QWidget;
  64. QT_END_NAMESPACE
  65. class FbCodeEdit : public QPlainTextEdit
  66. {
  67. Q_OBJECT
  68. public:
  69. FbCodeEdit(QWidget *parent = 0);
  70. QString text() const { return toPlainText(); }
  71. bool read(QIODevice *device);
  72. void load(const QByteArray data)
  73. { setPlainText(QString::fromUtf8(data.data())); }
  74. bool isUndoAvailable() { return false; }
  75. bool isRedoAvailable() { return false; }
  76. void zoomTo ( int ) {}
  77. bool findText(const QString &exp, QTextDocument::FindFlags options = 0);
  78. bool isModified() const { return document()->isModified(); }
  79. public slots:
  80. void find();
  81. void zoomIn();
  82. void zoomOut();
  83. void zoomReset();
  84. protected:
  85. void resizeEvent(QResizeEvent *event);
  86. private slots:
  87. void updateLineNumberAreaWidth(int newBlockCount);
  88. void highlightCurrentLine();
  89. void updateLineNumberArea(const QRect &, int);
  90. private:
  91. class LineNumberArea : public QWidget
  92. {
  93. public:
  94. LineNumberArea(FbCodeEdit *parent) : QWidget(parent) { editor = parent; }
  95. QSize sizeHint() const { return QSize(editor->lineNumberAreaWidth(), 0); }
  96. protected:
  97. void paintEvent(QPaintEvent *event) { editor->lineNumberAreaPaintEvent(event); }
  98. private:
  99. FbCodeEdit *editor;
  100. };
  101. private:
  102. void lineNumberAreaPaintEvent(QPaintEvent *event);
  103. int lineNumberAreaWidth();
  104. void setZoomRatio(qreal ratio);
  105. private:
  106. FbHighlighter * highlighter;
  107. QWidget *lineNumberArea;
  108. qreal zoomRatio;
  109. static qreal baseFontSize;
  110. static qreal zoomRatioMin;
  111. static qreal zoomRatioMax;
  112. friend class FbCodeEdit::LineNumberArea;
  113. };
  114. #endif // FB2CODE_H