JavaScriptを使って、クリップボード履歴にある文字列を加工するテストがうまくいったので、環境設定パネルに、使用するマクロを選択できるインターフェイスを作成することにしました。
まず考えた方法が、チェックボックスの付いたリスト表示。Gmailなどでも使われていますね。チェックボックスを個別にチェックしたり、「すべてを選択」や「選択を解除」で、まとめてオン/オフすることもできます。
ただ、チェックボックスを連続してチェックしていくような単純作業は、数が多くなると苦痛なものです。見た目も、ちょっと野暮ったいですね。
次に考えたのが、TableView。NSTableViewは使ったこともあるし、二つのTableView間でドラッグ&ドロップすれば、チェックボックスも不要になります。
難点は、階層表示ができないこと。表示するマクロの数が少なければ問題ありませんが、そうでない場合に、一階層で多くのファイルを表示するのは見づらく感じます。
最終的には、OutlineViewを採用することになりました。これなら、階層表示ができますし、それをそのままメニュー内のフォルダとして利用することもできるからです。
ただ、これが思いの外大変で、予定よりずいぶん時間がかかる作業になってしまいました。
『Cocoa Programming』と「Theocacao: NSTreeController and Drag and Drop」を参考に始めて見たものの、なかなか思うような結果になりません。だいたい、ダミーのコードを使ったハックが必要だったり、非公開クラスの_NSArrayControllerTreeNodeを使用しないと、目的を達成できないというのも、何か変な気がします。Leopardでは改善されたようですが、Tigerでは結局中途半端な実装のままですし。
何とか望みの結果を達成できたのは、CocoabuilderのMLアーカイブのおかげです。
あと助かったのが、こちらの書き込み。
- NSOutlineView/NSTreeControllerのサンプル読み…難航中 | hippos-lab::blog
- NSOutlineView/NSTreeControllerのサンプル読み-2 | hippos-lab::blog
Appleの公開している、OutlineViewを使ったサンプルコード、SourceView。必要環境が”Xcode 3.0, Mac OS X 10.5″なので中身を見てなかったんですが、こちらのブログのエントリーを拝見してダウンロードしてみたところ、一部はTigerにも流用できることが分かりました。
初めは、Nodeクラスをつくる参考にしようと、BaseNodeを写経していたんですが、数カ所直してみたらTigerでもビルド可能なことが判明。Objective-C 2.0で採用された、”in”とNSIntegerを、NSEnumeratorやintに書き換えれば動くようになりました。
OutlineViewのセルにアイコンを表示することも、Leopardで採用された機能を使った、セパレータの表示以外は、TigerでもOKでした。どうして、アイコン画像をBaseNodeクラスが保持しているのか分からなかったので、変更を加えたりしたところもありましたが、基本的にはこのサンプル通りでうまくいきました。
これだけ手間取ると分かっていれば、こちらを後回しにして、リクエストのあった機能を実現させた方が良かった気もしますが、OutlineViewは他にも使い道があるので、これで良かったことにしておきます。定型文の管理インターフェイスも、これを使えそうです。
有用な情報を公開してくださっている方達に感謝です。
Recent Comments