永井@知能.九工大です.

From: Hidetoshi NAGAI <nagai / ai.kyutech.ac.jp>
Subject: [ruby-dev:38340] Re: [1.8.7][1.9.1][tk] 自前実装の拡張 widget を使いたい場合
Date: Mon, 27 Apr 2009 12:04:48 +0900
Message-ID: <20090427.120447.74747064.nagai / ai.kyutech.ac.jp>
> 両方を殺さずに何とかできそうな対処案を思い付きました.
> ちょっと今は本業の方が忙しいのですぐとはいかないかもしれませんが,
> もう少しつめてみて,仕上りましたら本 ML で連絡します.
> もし良かったら,その際にテストしていただけますと助かります.

長らく放置状態で申し訳ありませんでしたが,
近い内に仕上げて commit できそうです.

方針を簡単に説明しておきますと,以下のようになります.

まず
・widget_set と toplevel 名の symbol とを管理する TABLE[set][sym]
・toplevel の alias を定義するモジュール ALIASES
・toplevel の alias (sym) を管理する OWNER[sym]
というようなものを用意しておき,
ALIASES を Oject クラスに Mix-in します.
操作時の条件は少しややこしいのですが,
必要に応じて Object クラス上にも ALIASES と同じものを定義します.

例えば TkButton(Tk::Button) と TkCombobox(Ttk::Combobox) において
         ALIASES                      Object
  ----------------------------------------------------
   TkButton(Tk::Button)       <-  TkButton(Tk::Button)
   TkCombobox(Ttk::Combobox)  <-  未定義
というような状況になるわけです.

これにより,TkButton, TkCombobox 共に見えつつも
TkCombobox については独自クラスを定義することが可能です.
その場合,
         ALIASES                      Object
  ----------------------------------------------------
   TkButton(Tk::Button)       <-  TkButton(Tk::Button)
   TkCombobox(Ttk::Combobox)      TkCombobox(独自定義)
となります.

もし TkCombobox に独自クラスを定義せずに TkCombobox.new などと
TkCombobox(Ttk::Combobox) を参照した場合は
         ALIASES                      Object
  ----------------------------------------------------
   TkButton(Tk::Button)       <-  TkButton(Tk::Button)
   TkCombobox(Ttk::Combobox)  <-  TkCombobox(Ttk::Combobox)
となります.

唯一(?)の問題は TkCombobox が Object クラス上で未定義の状態で
TkCombobox に機能追加しようとして class TkCombobox とした場合です.
この場合,新しいクラスが定義されてしまい,期待通りにはなりません.
ですが,Ttk::Combobox を直接に参照した場合や
先に default_widget_set を :Ttk に切替えた場合には
Object クラスへの定義を行うのでこの問題は生じませんし,
明示的に現在の default_widget_set の要素とするように宣言することで
Object クラスへ定義させることも可能ですので
許容できるレベルではないかと思います.
-- 
永井 秀利  (nagai / ai.kyutech.ac.jp)
九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門