Apple アプリケーション風ソースリスト
iTunesあたりから始まって今はSafariもMailもiCalも、ほとんどがこの微妙な青色のソースリストを使ってる。
この「Apple アプリケーション風ソースリスト」略して林檎ソースを実現するにはいくつかポイントがある。
- NSTableViewのsetSelectionHighlightStyle:にNSTableViewSelectionHighlightStyleSourceListを指定する。
- NSSplitViewのサブクラスにおいてdividerThicknessで1を返す。
- NSSplitViewのサブクラスにおいてdrawDividerInRect:で1pxの線を描画する。
- NSSplitViewのDelegateにおいてsplitView:effectiveRect:forDrawnRect:ofDividerAtIndex:でドラッグ可能なRectを返す。林檎ソースの区切り線は1pxしか幅が無いのだが、ドラッグできる範囲はもっと広いので。
- NSSplitViewの中身であるNSTableViewを包んでいるNSScrollViewにおいて、setBorderType:でNSNoBorderを指定する。
このうち1番と4番はLeopardでしか出来ないが、設定自体はとても簡単だった。問題は5番。ThousandはNSTableViewだけでなくNSBrowserも使っているのだが、NSBrowserはNSTableViewのようにNSScrollViewで包まれてはいない。じゃあ内側にあるのかというと、ある。あるのだが、この内側のNSScrollViewは一回setBorderType:してもNSBrowserの大きさが変わると元に戻ってしまうなどという厄介な奴だった。
1日ほどどうしようか悩んだ末に、NSBrowserのサブクラスを作ることにした。このサブクラスは内側のNSScrollViewの、borderTypeプロパティをKVOで監視する。で、勝手に変更されたら即座に指定したタイプにsetBorderType:する。強引極まりないが、とりあえずこれで動いているみたい。