1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VisualWorks 8.0 pulのRBTabbedToolsetsでタブがボタンに重なるバグを直す

Posted at

VisualWorks 8.0公開!

 VisualWorks 8.0が公開されてCincom社のウェブページからダウンロードできるようになりました。

 メジャーアップデートというわけでいじってみたのですが、ちょいとした見た目の変な部分があったのでそれを修正する方法を公開します。

RBTabbedToolsetsのインストール

 RBTabbedToolsetsはVisualWorksのブラウザにタブ機能を追加する便利な機能です。
 parcel_button.png
 メインタブの左から三つ目のオレンジ色の箱形がパーセルを呼び出すボタンなのでここからパーセルマネージャを呼び出します。
parcel.png

 Popularカテゴリの中にRBTabbedToolsetsが含まれているのでこれをLoadします。
 そしておもむろにBrowserを立ち上げてみると……
browser_bfore.png
 なぜかタブとその上のボタンが重なってしまってます。なんか気持ちが悪い。
 VisualWorks7系統まではタブが一つの時は何も表示されない仕様だったのが、(nothing selected)と出てしまっているようです。
 こういうときは自前でちょこちょこっとブラウザを直してしまいましょう。
 メインの開発に使うブラウザとかも簡単に手を入れられるのがSmalltalkの良いところ。逆にこの環境に慣れると他の言語でちょっとした修正もできないことが理不尽に感じるようになってしまうという副作用がありますが……(^_^;)

修正。まずはあたりをつける

 さて、まずはバグの原因になっている箇所のあたりをつけるところから。
 まぁ、当然のようにRBTabbedToolsetsをインストールしたことで発生したバグですから、そのパッケージに含まれていると考えるのが自然だと思います。
 ブラウザの右上にある四角いエリアはサーチが効くようになっています。(あ、自分の場合Searchlight-Toolsパーセルをインストール済みなのでサクッとみつかりましたが、入れてない場合はPackageのペインからRBTabbedToolsetsパッケージを探して下さい)
 tabbed_search.png
 さて、ここでパッケージの中身をのぞいてみましょう。
tabbed_method.png
 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の時にはタブが表示されないようにするみたいなことをしたいときにすぐ対応できて良いかなぁ、なんて感じます。
 とにかく、修正したらコミットして、再度ブラウザを開いてみましょう。

fixed.png

 さっきと違ってタブが重なっていません。とりあえずの目標は達成されました。
 こんな風に、Smalltalkならシステムのツールもカスタマイズやバグとりが簡単にできてしまいます、という例でした。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?