NSTextTab の使い道

ふと気付いたことだが、Mail.app の日付表示が見やすい。「昨日」とか「2006/12/09」の部分は左揃えになっていて、一方、時刻は3ケタでも4ケタでも右端にビシッと揃っている。他のアプリケーションではこうはいかない−左揃えに引きずられて、右端はガタガタだ。


で、BathyScaphe でもこの「時刻を右端にピタッと揃える」表示をやりたくなった。…しかし、どうやればいいの?

しばらく考えた末、基本は左揃えにしつつ、日付と時刻の間にタブ文字を入れて、右寄せタブを設定してやることを思いついた。

ソースコード・レベルで右寄せタブだの、タブ幅だのを設定するには、NSTextTab クラスを使う。http://www.cocoadev.com/index.pl?NSTextTab には、このあまり触れる機会の無いクラスの解説が、チュートリアル風に掲載されており、大変参考になった。
右寄せタブを仕込んだ NSAttributedString をデータソースで用意してやるのはいいとして、重要なのはタブ幅をどうするかということだ。タブ幅は、テーブルビューのカラム幅に一致*1させておく必要がある。また、ユーザがテーブルビューのカラム幅を調節した際に、リアルタイムに新しいカラム幅に応じてタブ幅を再設定する必要がある。Mail.app はさらに気が利いていて、カラム幅を調節するとリアルタイムで日付の書式まで「短い表記〜中間〜長い表記」と変化するが、BathyScaphe ではそこまで真似することは見送った。
どのタイミングで誰にこの「カラム幅の変更検知→タブ幅の再設定」をやらせるか、しばらく試行錯誤した末、テーブル・ビューのデータ・ソースで -tableView:objectValueForTableColumn:row: が呼び出される際にやることにした*2。-tableViewColumnDidResize: で最初はやってみたのだが、これでは「DidResize」の通り、リサイズが終わらないと表示が更新されない。リサイズ中のリアルタイムでの確認ができないのがやはりネックであった。


こうしてついに、BathyScaphe でもビシッと決めることに成功した:


相変わらず地味な改良だが、個人的には気合いを入れたものである。次回の Sneaky からお目見えする予定。

*1:正確には、[tableColumn width] - [tableView interCellSpacing]*2 くらい

*2:もちろん、頻繁に呼び出されるメソッド故、できるだけタブ幅の再計算をしなくてすむように工夫は必要だ