VisualWorks 8.0公開!
VisualWorks 8.0が公開されてCincom社のウェブページからダウンロードできるようになりました。
メジャーアップデートというわけでいじってみたのですが、ちょいとした見た目の変な部分があったのでそれを修正する方法を公開します。
RBTabbedToolsetsのインストール
RBTabbedToolsetsはVisualWorksのブラウザにタブ機能を追加する便利な機能です。
メインタブの左から三つ目のオレンジ色の箱形がパーセルを呼び出すボタンなのでここからパーセルマネージャを呼び出します。
Popularカテゴリの中にRBTabbedToolsetsが含まれているのでこれをLoadします。
そしておもむろにBrowserを立ち上げてみると……
なぜかタブとその上のボタンが重なってしまってます。なんか気持ちが悪い。
VisualWorks7系統まではタブが一つの時は何も表示されない仕様だったのが、(nothing selected)と出てしまっているようです。
こういうときは自前でちょこちょこっとブラウザを直してしまいましょう。
メインの開発に使うブラウザとかも簡単に手を入れられるのがSmalltalkの良いところ。逆にこの環境に慣れると他の言語でちょっとした修正もできないことが理不尽に感じるようになってしまうという副作用がありますが……(^_^;)
修正。まずはあたりをつける
さて、まずはバグの原因になっている箇所のあたりをつけるところから。
まぁ、当然のようにRBTabbedToolsetsをインストールしたことで発生したバグですから、そのパッケージに含まれていると考えるのが自然だと思います。
ブラウザの右上にある四角いエリアはサーチが効くようになっています。(あ、自分の場合Searchlight-Toolsパーセルをインストール済みなのでサクッとみつかりましたが、入れてない場合はPackageのペインからRBTabbedToolsetsパッケージを探して下さい)
さて、ここでパッケージの中身をのぞいてみましょう。
2つのオブジェクトが転がっています。
一つはAutohideTabControlComposite。もう一つはRefactoringBrowserです。
今回の挙動は自動的にタブが隠されて、隠され切れずにボタンと重なっているものと思われますので、名前からするとAutohideTabControlCompositeが怪しそうです。
AutohideTabControlCompositeの挙動を把握する
まず、初見のクラスと対面することになった場合、皆さんはどうするでしょうか? マジメにソースコードを解析してその挙動をを把握しようと努めるのではないかと思います。
ところが、Smalltalkを弄っていると、まず何とかしてデバッガを立ち上げようとすることになります。
SqueakなどはHaloと呼ばれる部品をワンクリックで呼び出して、いきなりGUI部品のコードをのぞき見るという変態的なことができて大変楽なのですが、VisualWorksはもう少しお上品なのでいきなりコードを覗くわけにはいかないようですので、どこかでデバッガを立ち上げることを考えます。
今回のターゲットであるAutohideTabControlCompositeには3つのメソッドがあります。
それぞれ、initialize-releaseカテゴリのtabBar:subCanvas:border: メソッド、privateカテゴリのrelayoutメソッド、そしてtestingカテゴリのshouldShowTabBarメソッドです。
……って、あれ? なんかもうカテゴリとメソッド名からしてtestingカテゴリのshouldShowTabBarメソッドが怪しいじゃあないですか。
(testingカテゴリにはBooleanを返すquery methodが入っています。「ケント・ベックのSmalltalkベストプラクティス・パターン」のp34、Query Methodを参照下さい)
というわけで、めちゃめちゃ怪しいshouldShowTabBarが見つかったわけですが、これがtabBar:subCanvas:border:でもガンガン呼ばれているのが分かります。
コードをみてみると
^self tabBar bottomComponent sequence size > 1
となっているので、これはどうやらタブが2個以上かどうかを判定しているようです。
コメントにも
I extend my subclass behavior by adjusting the layout of my children based on whether the tab bar has more than one tab or not. If not, it is not shown, when 2+ exist, it is shown.
となっていますから、どうやらビンゴのようです。
……今回はDebuggerを立ち上げるまでもなさそうです。すみませんでしたorz
修正作業
修正方針としては、この挙動が常にタブが複数ある状態にしておけばOKということになります。
具体的には二つ考えられて、
^self tabBar bottomComponent sequence size > 0
とするのと、
^true
とするのと、どちらでもいけます。要はtrueさえ返せばいいわけで。
ただ、個人的には前者の方が、ちゃんとshouldShowTabBarがfalseの時にはタブが表示されないようにするみたいなことをしたいときにすぐ対応できて良いかなぁ、なんて感じます。
とにかく、修正したらコミットして、再度ブラウザを開いてみましょう。
さっきと違ってタブが重なっていません。とりあえずの目標は達成されました。
こんな風に、Smalltalkならシステムのツールもカスタマイズやバグとりが簡単にできてしまいます、という例でした。