印刷
カテゴリ: テキストエディタ作成
参照数: 662

実際の検索を実装する前に、先に検索結果を表示できるようにしておく。

/**
 * @brief 文字列修飾種別
**/
typedef unsigned long text_extra_t;

#define text_extra_none             0          ///< 状態なし
#define text_extra_and              0x80000000 ///< フラグクリア定義
#define text_extra_binary           0x00001    ///< バイナリ文字
#define text_extra_parenthesis_s    0x00002    ///< 『(』始まり
#define text_extra_parenthesis_c    0x00004    ///< 『(』前行からの続き
#define text_extra_bracket_s        0x00008    ///< 『[』始まり
#define text_extra_bracket_c        0x00010    ///< 『[』前行からの続き
#define text_extra_brace_s          0x00020    ///< 『{』始まり
#define text_extra_brace_c          0x00040    ///< 『{』前行からの続き
#define text_extra_doublequote_s    0x00100    ///< 『"』始まり
#define text_extra_doublequote_c    0x00200    ///< 『"』前行からの続き
#define text_extra_quote_s          0x00400    ///< 『'』始まり
#define text_extra_quote_c          0x00800    ///< 『'』前行からの続き
#define text_extra_line_comment     0x01000    ///< 行コメント
#define text_extra_block_comment_s  0x02000    ///< ブロックコメント始まり
#define text_extra_block_comment_c  0x04000    ///< ブロックコメント前行からの続き
#define text_extra_keyword_s        0x08000    ///< キーワード始まり
#define text_extra_search_s         0x10000    ///< 検索ワード始まり
#define text_extra_search_c         0x20000    ///< 検索ワード前行からの続き
#define text_extra_parenthesis_e    (text_extra_and | text_extra_parenthesis_s | text_extra_parenthesis_c)            ///< 『"』終わり
#define text_extra_bracket_e        (text_extra_and | text_extra_bracket_s | text_extra_bracket_c)                    ///< 『"』終わり
#define text_extra_brace_e          (text_extra_and | text_extra_brace_s | text_extra_brace_c)                        ///< 『"』終わり
#define text_extra_doublequote_e    (text_extra_and | text_extra_doublequote_s | text_extra_doublequote_c)            ///< 『"』終わり
#define text_extra_quote_e          (text_extra_and | text_extra_quote_s | text_extra_quote_c)                        ///< 『'』終わり
#define text_extra_block_comment_e  (text_extra_and | text_extra_block_comment_s | text_extra_block_comment_c)        ///< ブロックコメント終わり
#define text_extra_keyword_e        (text_extra_and | text_extra_keyword_s)                                           ///< キーワード終わり
#define text_extra_search_e         (text_extra_and | text_extra_search_s | text_extra_search_c)                      ///< 検索ワード終わり

 

こんな定義を追加。

末尾が _c の前行からの続きってのは、編集した際の状態変更で再度解析が必要な行を絞るため。

括弧の定義は…必要かどうかまだ分からないな。。一応入れてある。要らなければ、uint16_t で済むね。

末尾が _e のものはその状態の完了を示していて、実際にクリアする値を表してる。

開始は、

flag |= 〜〜_c;

完了は、

flag &= ~(〜〜_e & ~text_extra_and);

みたいに。

 

んで、行クラスに下記定義

/**
 * @struct line_extra_t
 * @brief 行修飾状態
**/
typedef struct _line_extra_t {

    editor::bsize_t pos; ///< 文字位置
    text_extra_t extra; ///< 修飾情報
} line_extra_t;

これを

 std::list<line_extra_t>* m_line_extra;    ///< 行修飾状態

こんな感じでぶら下げる。

pos の位置からその状態extra(例えば行コメント)が始まるような指定で、この集合をイテレータで順に辿っていく感じかな。

あとはその指定に応じて描画色もしくは背景色を変えてやれば、テキストの部分色替えは完成。

一応これでキーワードの色替えなんかも対応できる…はず。