Apple アプリケーション風ソースリスト


iTunesあたりから始まって今はSafariもMailもiCalも、ほとんどがこの微妙な青色のソースリストを使ってる。
この「Apple アプリケーション風ソースリスト」略して林檎ソースを実現するにはいくつかポイントがある。

  1. NSTableViewのsetSelectionHighlightStyle:にNSTableViewSelectionHighlightStyleSourceListを指定する。
  2. NSSplitViewのサブクラスにおいてdividerThicknessで1を返す。
  3. NSSplitViewのサブクラスにおいてdrawDividerInRect:で1pxの線を描画する。
  4. NSSplitViewのDelegateにおいてsplitView:effectiveRect:forDrawnRect:ofDividerAtIndex:でドラッグ可能なRectを返す。林檎ソースの区切り線は1pxしか幅が無いのだが、ドラッグできる範囲はもっと広いので。
  5. NSSplitViewの中身であるNSTableViewを包んでいるNSScrollViewにおいて、setBorderType:でNSNoBorderを指定する。

このうち1番と4番はLeopardでしか出来ないが、設定自体はとても簡単だった。問題は5番。ThousandはNSTableViewだけでなくNSBrowserも使っているのだが、NSBrowserはNSTableViewのようにNSScrollViewで包まれてはいない。じゃあ内側にあるのかというと、ある。あるのだが、この内側のNSScrollViewは一回setBorderType:してもNSBrowserの大きさが変わると元に戻ってしまうなどという厄介な奴だった。
1日ほどどうしようか悩んだ末に、NSBrowserのサブクラスを作ることにした。このサブクラスは内側のNSScrollViewの、borderTypeプロパティをKVOで監視する。で、勝手に変更されたら即座に指定したタイプにsetBorderType:する。強引極まりないが、とりあえずこれで動いているみたい。