пятница, 8 октября 2010 г.

QScintilla: пишем Lexer

Перед дальнейшим написанием лексера нужно уяснить парадигму паттерна "Виртуальный метод", который использует QScintilla.
Лескер состоит из набора виртуальный функций, которые нужно переопределить. Класс QsciScintilla при необходимости вызывает виртуальные методы базового класса, однако в соответствии с полиморфизмом, будут вызываться методы нашего лексера.
Вот перечень виртуальных функций, необходимых для переопределения:
  //! Возвращает название языка
  virtual const char * language() const;
  //! Цвета для стилей
  virtual QColor defaultColor(int style) const;
  //! Шрифты для стилей
  virtual QFont defaultFont(int style) const;
  //! Бакгроунд для стилей
  virtual QColor defaultPaper(int style) const;
  //! Разбор текста на стили
  virtual void styleText (int start, int end);
  //! Описание
  virtual QString description (int style) const;

* This source code was highlighted with Source Code Highlighter.
Переменная style - это просто идентификатор стиля. Мы сами ее определяем. Для этого в лексере мы определяем некий enum для наших стилей.
  enum
  {
   Default = 0,
   Comment = 1,
   Binary  = 2,
   String  = 3,
   Keyword1 = 4,
   Keyword2 = 5,
   Keyword3 = 6,
   Keyword4 = 7,
   Const  = 8
  };

* This source code was highlighted with Source Code Highlighter.
Имена стилей и их числовые обозначения значения не имеют, далее станет ясно почему.
Самой важной виртуальной функцией является   virtual void styleText (int start, int end);

Именно она отвечает за отрисовку. К этой функции QScintilla обращается всякий раз, когда ей надо перерисовать кусок текста начиная с позиции start до позиции end.

Комментариев нет:

Отправить комментарий