fb2code.hpp 3.3 KB

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