デフォルトのコントロールUIを管理するLookAndFeel

前回はコントロールとコントロールUIについて概観しました。
そして以下のクラスをコントロールUIの例として挙げました。

  • TextFieldUI
  • DropdownListUI
  • CheckButtonUI
  • CommandButtonUI

しかしこれらのクラスは実は全て抽象クラスとなっています。
実際には、以下に示すクラスがデフォルトで使用されます。

  • StandardTextFieldUI
  • StandardDropdownListUI
  • StandardCheckButtonUI
  • StandardCommandButtonUI

これらはcurlが提供するコントロールUIの標準実装です。


通常みなさんがカスタムのコントロールUIを作成する場合は、上記の標準実装を拡張することになるでしょう。

{define-class public MyCommandButtonUI {inherits StandardCommandButtonUI}
  ...
}

もし標準実装とは大きく異なる外観や振る舞いを持たせたい場合は直接CommandButtonUIなどを継承することもできます。このようにして作成したカスタムのコントロールUIを使用するには、以下のようにコントロールのui-objectプロパティを設定します。

{CommandButton ui-object = {MyCommandButtonUI}}

もしくは

let cb:CommandButton = {CommandButton}
set cb.ui-object = {MyCommandButtonUI}


ところで、上記のように明示的に設定されなかった場合に使用される既定のコントロールUI(StandardXXXUI)を管理する仕組みがcurlには存在します。これがLookAndFeelです。LookAndFeelはcurlのクラスで、各コントロールが使用する既定のコントロールUIのコレクションを保持します。


例えば、以下のようにすることで、カスタムのコントロールUIをアプリケーションの中のデフォルトとして使用させることができます。

let my-look-and-feel:StandardLookAndFeel = {StandardLookAndFeel}
{my-look-and-feel.register-ui CommandButton, MyCommandButtonUI}
set the-default-look-and-feel.target-look-and-feel = my-look-and-feel

最後の1行は少し説明が必要ですが、ここではその詳細には立ち入らないことにします。とりあえずthe-default-look-and-feelというグローバル変数が用意されており、そのtarget-look-and-feelというプロパティがアプリケーション全体で共通して使用されるLookAndFeelとなることだけ理解してください*1


LookAndFeelの利用方法はこれだけではありません。LookAndFeelはGraphicのサブクラスとなっておりGraphicが持つオプションを全て設定することができます。LookAndFeelにオプションを設定した場合、アプリケーション中で使用される全てのコントロールにその設定が適用されます*2


例えば以下のコードは、アプリケーション中の全てのコントロールの色を黒にし、文字色を白に設定します。

let my-look-and-feel:StandardLookAndFeel = {StandardLookAndFeel}
set my-look-and-feel.control-color = "black"
set my-look-and-feel.color = "white"
set the-default-look-and-feel.target-look-and-feel = my-look-and-feel


以上、前回と今回の2回に渡ってコントロールとコントロールUI、そしてLookAndFeelについて見てきました。これらを理解することによってコントロールの高度なカスタマイズが行えるようになります。コントロールについてより深く学びたい方はIDEのヘルプの以下の節を参照してください。


また、コントロールやコントロールUIのAPIオープンソースとしてIDEに付属しています。このソースコードを見ることも、コントロールの理解を深めるために非常に役立ちます。コントロールAPIソースコードについては、上記ヘルプ中の[オープン コントロール]の節に詳しいです。

*1:LookAndFeelについて詳しく知りたい方はIDEのヘルプの以下の節を参照してください。(ver.5.0)[Surge Lab 開発者ガイド > グラフィカル ユーザー インターフェイス > ダイアログとコントロール > カスタム コントロール UIの作成] (ver.4.0)[Surge Lab 開発者ガイド > グラフィカル ユーザー インターフェイス > コントロール > カスタム コントロール UIの作成]

*2:実際には単純に全てのコントロールに適用されるわけではありません。各コントロールのオプションルックアップの結果によります。オプションとゆうのはcurl独特のプロパティ伝搬メカニズムで、これについては回を改めて説明したいと思います。