2008/02/29

NSCollectionViewを使う

コトノコで辞書の外字一覧を表示させるウィンドウ. いままではNSTableViewを用いて一覧を表示させていましたが,辞書によっては5000近くの外字があり, 表示されるまでが遅いし, 使いにくいという問題がありました.そこで, 文字パレット位のレスポンスを期待してMac OS X 10.5から追加されたNSCollectionViewを使ってみました.

結論からいくと, 5000個のエントリを表示させるには遅すぎて使えません.NSViewを使っているので重いという話はあったのですが, とりあえず使ってみるとやはり重い.コトノコに使う事はないですが, 備忘録も兼ねて使い方をまとめておきます.

2008/02/21

mixi widget 1.9.1

今まで通信関係はDashbordが良きに計らってくれたのですが, cURLを使った事によりそうもいかなくなってしまったので修正を行ったmixi widet 1.9.1です.設定画面にproxy serverの欄が追加されているので, 「proxy.mydomain:8080」の様に「サーバアドレス:ポート番号」の書式で入力して下さい.

mixi_widget-1_9_1.dmg.gz(Mac OS X用)

コトノコ 2.0a2

コトノコ2.0a2を公開します.いくつかバグが見つかったのでその修正と不足していた機能を追加した版です.後は外字一覧のウィンドウを作れば, 1.0とほぼ同じ機能になるでしょうか.外字一覧はNSCollectionViewを使うかIKImageBrowserViewにするか思案中ですが.

あと, 今回から 10.5以降専用になっています.

■ kotonoko-2_0-alpha-2.dmg.gz (universal binary)
■ kotonoko-src-2_0-alpha-2.tar.gz (ソースコードのみ)

2008/02/20

レンダリングにWebKitを使う

コトノコのビュー画面にWebViewを使う事を考えてきましたが, うまく結合文字を表示させる事ができないので,コトノコの辞書内容表示としては使えません. 他の用途になら十分なのでしょうけどね.

ただ, HTML + NSURLProtocolの方が便利な事も多い訳で, どうするかなぁと考えていると, NSAttributeStringの initWithHTML: options: documentAttributes:は10.4からレンダリングにWebKitを使っているとの事.使ってみると, NSURLProtocolで定義した独自プロトコルも普通に呼んでくれます. NSTextViewにレンダリングしたテキストを流し込むと結合文字もちゃんと処理してくれています.結局これで行く事にしました.

2008/02/18

mixi widget 1.9.0

httpアクセスをXMLHttpRequestから cURLに変更した mixi widget 1.9.0を公開します.Leopardになって, setRequestHeaderでCookieが設定できなくなってしまい, Leopardでmixi widgetが使えなくなっていた人もいるかと思います. Safariの設定変更でなんとかなるのですけどね. ちょっとまだ不都合が多いかも知れませんがとりあえず公開です.

Vista版はあまり反応がない様なので今回はありません.

mixi_widget-1_9_0.dmg.gz(Mac OS X用)

2008/02/13

画像, 動画を張り込む

WebViewに画像や動画を張り込む場合, ファイルやネット上の画像の場合は素直にHTMLとして記述すればいいのですが, 動的に生成する画像の場合, いちいちファイルに書き出すのも馬鹿らしいです.いままでと同じ様にNSURLProtocolのsubclassを実装して解決します.

結合文字の取扱い

結合文字

WebView版のコトノコを使っていると, 外字の表示が崩れている箇所があったりします.よく調べてみると結合文字の取扱いがおかしい様です.音声記号のI (LATIN LETTER SMALL CAPITAL I) にアクセント記号 (COMBINING ACUTE ACCENT) をつけたものをNSTextViewに表示させたものと, Safariで表示させたものの比較が右の図です.NSTextViewではきちんと上にアクセントがきているのが, Safariでは表示できていないのが分かります.

一番右にあるのは, 合成用記号にある "COMBINING ACUTE TONE MARK"をつけたものです.こちらの方は, Safariでもヒラギノ角ゴ (下) ではきちんと表示されています. 普通のアプリでは問題ないのでしょうが, 辞書アプリであるコトノコではちょっと問題です.

(ちなみに, Safariのデバッグメニューにある「Use ATSUI for All Text」を入れても同じ結果でした.)

検索する

検索結果

Safari 3.0から追加された検索文字列がポップアップするあのインタフェース. WebKitを使えばすぐに実装できるかと思っていたのですが, 現実はそうは甘くはありませんでした.

WebViewで提供されている検索メソッドは, searchFor:direction:caseSensitive:wrap: ただしこれは検索ダイアログ用のメソッドで, コトノコの様なレイアウトだと, ターゲットを持って行かれるので使えません.NSTextViewにはshowFindIndicatorForRange:なんてメソッドが追加されたのにWebViewでは使えないのです.

2008/02/05

スタイルシートを追加する

テキストビューワとして素のWebViewを利用した場合, お世辞にも見やすいとは言えません. そこで, スタイルシートで指定してレイアウトを変更します.

スタイルシートの指定方法は2つ.

  • WebPreferencesのsetUserStyleSheetLocation:で指定
  • HTMLのヘッダで指定

スタイルシート自身は、ファイルを作成して file: プロトコルを使って指定しても良いですし、新しいプロトコルを定義して動的に生成してもかまいません。

2008/02/01

NSTextViewの代わりにWebViewを使う

アプリの中にはテキストを表示するものが多くあります. メールアプリのメール本文, 辞書表示アプリの辞書内容表示部分など. これらの表示部分にはNSTextViewが利用されている事が多いです. フォントや色の変更も自由ですし画像も張り込めますしなんら問題ないのですが, WebViewを代わりに使おうと思って調べてみました.技術的に面白そうという事もありますし, HTMLで自由にレイアウト変更ができるので, 楽になるんじゃないかな? という事もあります. (※NSTextViewはHTMLを読み込めます). 題材としては, 辞書ビューワのコトノコを使います.

通常, NSTextViewをビューワとして使う場合には, 表示するテキストを成形して setAttributedString:で設定という流れです. 一方, WebViewを使う場合には, URLを設定して(正確には NSURLRequestをWebViewに送って)その内容をWebViewが表示するという流れになります.

あらかじめ, HTMLファイルがある場合は file: プロトコルでファイルを直接指定すれば良いのですが, 辞書内容等を全部HTMLで書き出すのは現実的ではありません. そこで, eb: というプロトコルを新たに定義してそれを指定します. そしてそのプロトコルを処理するのが, NSURLProtocolです.