Scintilla/Styling

Last-modified: 2008-03-01 (土) 19:09:25

スタイル

スタイリングメッセージは、テキストにスタイルを割り当てることができる。
標準のScintilla設定は各文字に有効な8スタイルビットを、5ビット(0~4はスタイル0~31)とインディケータを定義する3ビット(5~7)に分割してスタイルに設定する。
あなたはSCI_SETSTYLEBITSと共にスタイルとインディケータの間のバランスを変えることができる。
標準の解析器のひとつがあなたのスタイルの需要を満たすことができるか、またはあなたがあなた自身に書くことができるなら、解析器は、たぶんあなたのドキュメントの形式に合わせる最も簡単な方法である。
スタイルを実行するコンテナを使うことに決めたときはSCI_SETLEXERでSCLEX_CONTAINERを選択する。
この場合、テキストを表示用にスタイルする必要が出るたびにSCN_STYLENEEDED通知がコンテナに送られる。
スタイルは空き時間で行うように指示することができる。
解析器を使っている場合も含め、コンパイラが見つけたエラーに印をつけるために装飾コマンドを使うこともあるだろう。
次のコマンドが提供されている。

  • SCI_GETENDSTYLED
  • SCI_STARTSTYLING(int position, int mask)
  • SCI_SETSTYLING(int length, int style)
  • SCI_SETSTYLINGEX(int length, const char *styles)
  • SCI_SETLINESTATE(int line, int value)
  • SCI_GETLINESTATE(int line)
  • SCI_GETMAXLINESTATE

SCI_GETENDSTYLED

Scintillaは正しく装飾されたと思われる最後の文字を記録している。
その次の文字が装飾されれば記録はその方向へ移動し、それ以前の文字が修正されれば記録の位置も戻る。
テキストの描画の前に何らかの装飾が必要かどうかを知るためにこの位置が検査され、もし必要ならば通知SCN_STYLENEEDEDがコンテナに送られる。
コンテナはSCI_GETENDSTYLEDで装飾の開始点を見つけることができる。
Scintillaは常に行全体に対して装飾目的の問い合わせを行う。

SCI_STARTSTYLING(int pos, int mask)

装飾処理の準備する。
位置posを開始点とし、どの装飾が設定可能かを示すマスクをmaskで指定する。
マスクによって何度か同じ点を処理させることができる。
例えば一回目で基本装飾を行ってコードテキストを素早く正確に表示させ、他方時間のかかる二回目で文法の誤りを検出し、指標を使って誤りがどれなのかを示すといった使い方ができる。
標準設定では装飾が5ビット、指標が3ビットになっているが、この状態でmaskを31 (0x1f)にすると、テキストの装飾のみを設定し、指標を操作させないでいることができる。
SCI_STARTSTYLINGの後、装飾に使う解析時の実体ごとにSCI_SETSTYLINGメッセージを送信する。

SCI_SETSTYLING(int length, int style)

このメッセージは、開始文字の長さのスタイルがスタイルの位置で始まるように設定して、長さに従ってスタイルの位置を増加させる。次の呼び出しの準備ができている。
sCellがスタイルバイトであれば、操作は以下のとおりである:

if ((sCell & mask) != style) sCell = (sCell & ~mask) | (style & mask);

SCI_SETSTYLINGEX(int length, const char *styles)

SCI_SETSTYLINGが指定範囲に同じ装飾を設定するのに対し、このメッセージでは装飾開始位置とlengthで定まる範囲の各バイトごとにstyles配列の装飾を設定する。
stylesの各バイトはマスクで指定されたビット以外を設定すべきではない。
実行後、装飾開始位置はlengthの分だけ移動し、次の呼び出しに利用できるようになる。

SCI_SETLINESTATE(int line, int value)

SCI_GETLINESTATE(int line)

各文字に対し8ビットの解析状態が格納されているように、各行にも整数が格納されている。
ASPページ内でどのスクリプト言語が使われているか、などといった長い範囲の分析状態の格納に使うことができる。
SCI_SETLINESTATEでこの値を設定し、SCI_GETLINESTATEで取得することができる。

SCI_GETMAXLINESTATE

これはどんな行状態を持っているか最後の行を戻す。