Scintilla/Multiple views

Last-modified: 2008-03-01 (土) 16:58:36

マルチビュー

Scintillaウインドウとそれが表示するドキュメントは別々の実体である。
新しいウインドウを作成するとき、新しい空のドキュメントも作成する。
各ドキュメントには、初期値1に設定される参照カウントがある。
ドキュメントはウインドウがドキュメントを変更するときにリンクされたScintillaウインドウのリストを持つ。更新が発生するとすべての他のウインドウに通知される。
システムはひとつのScintillaウインドウで多くのドキュメントを作業できるようにアレンジされ、複数のウインドウ(ウインドウ分割を使う)でひとつのドキュメントを表示することができる。


これらのメッセージは、今後のScintillaのリリースとの互換性を確実にするためドキュメント*pDocを使用する。void*としてpDocを扱うべきである。
すなわち、反参照ではなく、あなただけがそうするべきであるこのセクションで説明されるように、ポインタを使用して、収納できる。

  • SCI_GETDOCPOINTER
  • SCI_SETDOCPOINTER(<unused>, document *pDoc)
  • SCI_CREATEDOCUMENT
  • SCI_ADDREFDOCUMENT(<unused>, document *pDoc)
  • SCI_RELEASEDOCUMENT(<unused>, document *pDoc)

SCI_GETDOCPOINTER

ウインドウによって使われる現在のドキュメントのポインタを返す。
それ以外に影響はない。

SCI_SETDOCPOINTER(<unused>, document *pDoc)

このメッセージは以下を行う:

  1. 現在のドキュメントによって保持されているリストから現在のウインドウを削除する。
  2. 現在のドキュメントの参照カウントを1減算する。
  3. もし参照カウントが0になったら、ドキュメントは削除される。
  4. pDocは、ウインドウのための新しいドキュメントにセットする。
  5. もしpDocが0なら、新しい空のドキュメントを生成し、ウインドウにアタッチする。
  6. もしpDocが0でないなら、参照カウントを1加算する。

SCI_CREATEDOCUMENT

このメッセージは、新しい空のドキュメントを作成して、ポインタを返す。
このドキュメントは、エディタに選択されないで、1の参照カウントから始まる。
これは、あなたにはそれの所有権があることを意味して、SCI_SETDOCPOINTERを使用した後に、参照カウントを1つ抑えなければならない。Scintillaウインドウがそれを所有しなければならないか、またはメモリリークを避けるためにアプリケーションを終える前にSCI_RELEASEDOCUMENTと共に参照カウントを1つ抑えるのを確実にしなければならない。

SCI_ADDREFDOCUMENT(<unused>, document *pDoc)

これはドキュメントの参照カウントを1加算する。
もしあなたがScintillaウインドウの現在のドキュメントを現在のドキュメントの所有者を置き換えたいなら、たとえば、1個のウインドウで多くのドキュメントを編集しているなら、以下のようにする:

  1. SCI_GETDOCPOINTERを使って、ドキュメントのポインタをpDocに取得する。
  2. SCI_ADDREFDOCUMENT(0, pDoc)を使って、参照カウントを加算する。
  3. SCI_SETDOCPOINTER(0, pNewDoc)を使って、異なるドキュメントをセットするか、SCI_SETDOCPOINTER(0, 0) で新しい空のドキュメントをセットする。

SCI_RELEASEDOCUMENT(<unused>, document *pDoc)

このメッセージはpDocによって特定されたドキュメントの参照カウントを減算する。
pDocはSCI_GETDOCPOINTERかSCI_CREATEDOCUMENTの結果でなければならなく、まだ存在しているドキュメントを指し示さなければならない。
もしまだScintillaウインドウがアタッチされている参照カウント1のドキュメントでこれを呼ぶなら、予期せぬことが起こる。
世界を軌道で回転させ続けるために、あなたはSCI_CREATEDOCUMENTかSCI_ADDREFDOCUMENTへのSCI_RELEASEDOCUMENTへの呼び出しによる各呼び出しのバランスをとらなければならない。