MOSA Developer News[MOSADeN=モサ伝]第114号
2004-05-25
目次
- Cocoaでいこう! Macらしく 第51回 Yoshiki(DreamField)
- 小池邦人の「Carbon API 徒然草」
- 「Behind the WebObjects」 第20回 田畑 英和
- ニュース・解説
- MOSAからのお知らせ
Cocoaでいこう! Macらしく 第51回 Yoshiki(DreamField)
First Responder(後編)
前回は、「Show Info」メニューがAppControllerに投げていたアクションメッセージを、 First Responder に投げるようにnibファイルを変更しました。でも、動作は変わりませんでした。これは何故でしょうか。
実は、First Responderに投げたメッセージは、ある順番に従って、そのメッセージを受け付けるオブジェクトが見つかるまで、様々なオブジェクトにメッセージを投げて行くのです。Cocoa Document-Based Applicationの場合、その順番は次の通りです。
(1)キーウィンドウの選択されているビュー
(2)(1)のsuperビュー(これはキーウィンドウになるまで繰り返す)
(3)キーウィンドウ
(4)キーウィンドウのdelegate
(5)キーウィンドウのNSWindowController
(6)メインウィンドウの選択されているビュー
(7)(6)のsuperビュー(これはメインウィンドウになるまで繰り返す)
(8)メインウィンドウ
(9)メインウィンドウのdelegate
(10)メインウィンドウのNSWindowController
(11)NSDocument
(12)NSApplication
(13)NSApplicationのdelegate
(14)NSDocumentController
キーウィンドウというのは、現在選択されているウィンドウのことです。メインウィンドウというのは、現在選択されているドキュメントのウィンドウのことです。あるドキュメントのウィンドウを選択した場合は、キーウィンドウとメインウィンドウは同じですが、パネルを選択した場合は、キーウィンドウはパネルになり、メインウィンドウはそれまで選択していたドキュメントのウィンドウになります(パネルはメインウィンドウになれません)。上記の順番で受け付けるオブジェクトが見つかるまで、メッセージが投げられますので、メニューは適切なオブジェクトに対してメッセージを投げることができるというわけです。もちろん、メニュー以外がこの仕組みを使ってもかまいません。今回の「Show Info」メニューの場合は、showInfoPanel:メッセージを順番に投げて行き、NSApplicationのdelegateであるAppControllerにたどり着いた時受け付けられ、showInfoPanel:メソッドが実行されたというわけです。つまり、AppControllerに直接メッセージを投げたのと同じ動作になったのです。
このShow Infoの例では、First Responderのメリットは、あまり見えないかもしれません。ですが、Copy、Paste等、選択しているビューに作用しなければならないメニューや、Save、Close等、選択しているウィンドウやそのドキュメントに対して作用しなければならないメニューの場合はどうでしょうか。この場合は、MainMenu.nibの中にはそのオブジェクトが無いので、直接接続することはできませんし、何よりその時々の状況に応じて投げるべき相手のオブジェクトが変化してしまいます。これを管理するのはとても面倒なことです。ですが、CocoaではFirst Responderに投げるだけで良いのです。これは非常に優れた仕組みだと思います。
First Responderについては、次の本が詳しいです。もっと詳しく知りたい方は、一読することをお勧めです。
Mac OS X Cocoa プログラミング
アーロン・ヒレガス(著)
村上雅章(訳)
ピアソン・エデュケーション
ISBN4-89471-440-X
画像を拡大するモードを付けよう(その1)
今回説明したFirst Responderの応用として、各ウィンドウの表示に作用するようなものを実装してみましょう。内容は、メニューから画像の表示サイズを、x0.5、x1、x2から選べるようにすることとします。なお、この値は横幅や縦幅に対する掛け算としますので、面積比で言えば1/4、1、4です。
それでは、まずはメニューを作りましょう。メニューの実装は第41回でやっていますが、今回は既にあるプルダウンメニューに付加するのではなく、新たにプルダウンメニューを増やします。とは言え、やり方は想像がつくと思います。いつも通り、TinyViewのプロジェクトを開き、MainMenu.nibをInterface Builderで開いてください。パレットウィンドウから「Submenu」を選び、「Edit」メニューと「Windows」メニューの間にドラッグ&ドロップします(fig.01)。すると、メニューバーに「Submenu」が追加されます(fig.02)。このプルダウンメニューのタイトルを「View」とし、Itemを追加してそれぞれのタイトルを「x0.5」、「x1」、「x2」として下さい(fig.03)。itemの追加方法やタイトルの変更方法を忘れてしまった方は、第41回を見てください。さらに、infoパネルを開き、「x0.5」、「x1」、「x2」の各メニューアイテムのTagを、それぞれ0、1、2として下さい(fig.04)。これでメニューは出来ましたので、一度ビルドして実行してみましょう。まだ、メニューは選べません。続きは、次回です。
[fig.01] 「Submenu」を「Edit」と「Windows」の間にドラッグ&ドロップ
http://www.remus.dti.ne.jp/~yoshiki/cocoa/ed1/51/images/fig01.jpg
[fig.02] メニューバーに「Submenu」が追加される
http://www.remus.dti.ne.jp/~yoshiki/cocoa/ed1/51/images/fig02.jpg
[fig.03] 「Submenu」の内容を変更する
http://www.remus.dti.ne.jp/~yoshiki/cocoa/ed1/51/images/fig03.jpg
[fig.04] infoパネルから各メニューのTagの値を変更する
http://www.remus.dti.ne.jp/~yoshiki/cocoa/ed1/51/images/fig04.gif
小池邦人の「Carbon API 徒然草」(2004/05/21)
Apple Eventとドキュメントアイコン
今回はApple Eventの話の続きです。前回紹介したmyOpenApp()とは別のもうひとつのイベントハンドラ、myOpenDoc()を解説したいと思います。
AEInstallEventHandler()にパラメータとしてkAEOpenApplicationを指定し、Finderでドキュメントがダブルクリックされた時に呼ばれるイベントハンドラ、myOpenDoc()をインストールします。このハンドラは、Finder上でドキュメントアイコンを選択し、ファイルメニューから「開く」を選んだ時や、アプリケーションアイコン上にドキュメントアイコンをドロップした場合にも呼ばれます。また、Dock上でドキュメントアイコンがクリックされた時にも呼ばれます。
以下が、ドキュメントオープン用イベントハンドラであるmyOpenDoc()ルーチンです。実際にその処理を実装する場合には、このハンドラが呼ばれるのは「アプリケーション起動時とはかぎらない」という点に注意しておいてください。
pascal OSErr myOpenDoc( const AppleEvent *event,AppleEvent *reply,long refcon )
{
WindowRef wptr1,wptr=NULL;
FSSpec fsc,fsc1; // ドキュメントファイル保存場所はFSSpecで得られる
long len,i,ct;
AEDescList dolist; // Eventパラメータのリストが入る
short ret=0;
DescType rtype;
OSType type;
FInfo info; // Finderが保持するファイル情報が入る
AEKeyword key;
if( ! AEGetParamDesc( event,keyDirectObject,typeAEList,&dolist ) )
// Eventパラメータのリストがあるかどうか調べる?
{
AECountItems( &dolist,&ct ); // 受け取るパラメータの個数を調べる
for( i=1;i<=ct;i++ )
{
if( ! AEGetNthPtr( &dolist,i,typeFSS,&key,&rtype,(Ptr)&fsc,
(long)sizeof(FSSpec),&len ) )
// Eventパラメータから対象ファイル(フォルダ)のFSSpecを得る
{
FSpGetFInfo( &fsc,&info ); // 対象となるファイル情報を得る
type=info.fdType; // ドキュメントタイプを調べる
if( type==MY_DOC ) // これは私のドキュメントだ!
{
if( ret=openCatalogWindow( &fsc,&wptr1 ) ) // 新規オープン
break;
}
else // これは画像ファイルかフォルダだ!
{
if( ! wptr ) // もしカタログウィンドウが開いてなければ...
{
if( ret=newCatalogWindow( &wptr ) ) // 先んじてオープン
break;
}
navCheckImportExtention( fsc.name,&type ); // 拡張子を調べる
if( ! navImportCheckTypeList( type ) ) // 表示可能な画像か?
{
if( ! addImageFile( wptr,1,&type,&fsc ) ) //カタログ登録
ret=0;
}
else // ファイルでなければ対象はフォルダと判断する
{
getFolderFSSpec( &fsc,&fsc1 ); // フォルダのFSSpecを得る
ret=addImageFolder( wptr,&fsc1 ); // フォルダ内容を登録
break;
}
}
}
}
AEDisposeDesc( &dolist ); // Eventパラメータリストを削除する
}
return( ret );
}
まずは、AEGetParamDesc()によりApple Eventに添付されている情報(AEDescList)を入手します。オープンを要求されているドキュメントは一度にひとつとはかぎりません。複数の情報がある場合には、それらはリスト形式にまとめられて送られて来ます。続いて、AECountItems()で添付情報がいくつあるかを調べ、その個数を得たら、forループを使いAEGetNthPtr()でリストから順次個別情報を抽出します。Finderから送られてきたドキュメントに関する情報は、ファイルの保存場所を示すFSSpec構造体そのものです。FSSpec構造体の詳しい内容についてはFiles.hを参照してください。
FSSpecが入手できたら、FSpGetFInfo()でファイル情報を得て、先んじてそのファイルタイプを調べます。その後、タイプの種類により以下の3つの処理に分岐させます。
(1)ファイルタイプがアプリケーションのドキュメントならばそれをオープンする
(2)ファイルタイプがリストに登録可能な画像ファイルならばカタログに登録する
(3)それ以外はフォルダがドロップされたと判断し内部ファイルをすべて登録する
最初にファイルタイプと比較しているMY_DOCは、MOSA.hで'MosD'と定義されています。もしこれであれば、本アプリケーションが保存するドキュメントファイルです。よって、カタログウィンドウをオープンし、そこへファイルを読み込みます。それ以外であれば、対象は画像ファイルかフォルダと推測できます。よって、newCatalogWindow()により新規ウィンドウを開き、ファイル登録の準備をします。ちなみに、すでに開いているカタログウィンドウにファイルを登録したい場合には、ハンドラの処理内容を少し変更する必要があります(チャレンジしてみてください)。
続いて、navCheckImportExtention()ルーチンにより、ファイル名の拡張子からファイルタイプ推測します。これは、そのタイプを拡張子からしか判断できないファイルが、Mac OS X環境では多数存在するためです(ファイルタイプには「ゼロ」が代入されてる)。次のnavImportCheckTypeList()では、その画像ファイルがQuickTimeのAPIでオープン(表示)可能なタイプかどうかを判断しています。できるのであれば、addImageFile()により、それを新規カタログウィンドウへ登録します。
それ以外のファイルタイプであれば、対象は「フォルダ」だと判断し(ちょっと手抜きなのですが...)getFolderFSSpec()でフォルダ自身のFSSpecを得てから、addImageFolder()により、その内部に保存されているすべての画像ファイルをカタログウィンドウへと登録しています。addImageFile()やaddImageFolder()に加え、navCheckImportExtention()、navImportCheckTypeList()、getFolderFSSpec()などは、本連載で順次解説していく予定の自作ルーチンです。最後に入手した添付リスト情報(AEDescList)をAEDisposeDesc()により削除し、ハンドラでの作業はすべて終了します。
Mac OS 9のFinderでは、ドキュメントアイコンを選択しファイルメニューから「プリント」を選ぶと、対応するアプリケーションが起動しそれを印刷できました。加えて、アイコンをデスクトッププリンタへドロップしても印刷が可能でした。これらもApple Eventで実現されている機能のひとつです。対応させるためには、AEInstallEventHandler()にkAEPrintDocumentsを渡し、myPrintDoc()などと名付けたイベントハンドラをインストールしておきます。この時のハンドラ側の処理は、ファイル情報を受け取り指定ドキュメントを印刷した後に、アプリ自身を終了させることです。しかし何故か、Mac OS XのFinderからこの機能が外されてしまいました。この機能を使うユーザや対応アプリケーションが少なかったからでしょうか? ついでに(関係ないと思うが)Finderのウィンドウ印刷ができなくなったのも大変不便です(笑)。はてさて、将来的には元に戻る可能性はあるのでしょうか?
次回は、オープン可能なファイルをFinderに認識させるために行うアプリケーション側の手続きについてお話します。具体的には、アプリケーションパッケージのContentsフォルダに保存しておく「Info.plist」についての解説となります。
つづく
「Behind the WebObjects」 第20回 田畑 英和
これまでDirectActionの解説をしてきましたが、今回からは話題を変えてみたいと思います。Project WONDERというWebObjects関連のオープンソースプロジェクトがありますが、これからしばらくこのProject WONDERについてご紹介していきます。
まずProject WONDERとはそもそもなんであるかですが、これはWebObjects向けに開発がおこなわれているオープンソースプロジェクトです。SourceForge上で運営がおこなわれていまして、URLは以下のとおりです。
・Project WONDER SourceForge URL
http://wonder.sourceforge.net/
http://sourceforge.net/projects/wonder
ここの説明によりますと、Project WONDERのWONDERはWebObjects Nodes for Distributing E-Resourcesの略ということになっていますが、このプロジェクトはもともとeResource社の社内プロジェクトから発展してきたものです。
eResource社は現在はすでに解散してしまっているのですが、そこでの成果がオープンソースプロジェクトとなって現在でも引き継がれているわけです。ちなみにeResource社は途中で社名がNetStruxr社に変わりましたが、クラス名のPrefixとしては旧社名に由来するERを使い続けています*。
ではProject WONDERの中身な具体的にどのようなものかといいますと、コアとなる部分はフレームワークです。Project WONDERでは機能別に複数のフレームワークが開発されており、そこには様々な再利用可能コンポーネントが収められています。またフレームワークだけではなくサンプルアプリケーションや他の開発者が寄贈したものなども含まれています。
Project WONDERが最初にOpenSource化されたのは2001年のことで、この年のWWDCでOpenSource化の発表がおこなわれました。2001年の時点ではWO4.5向けのバージョンで、名称もNetstruxr frameworksなどと呼ばれていました。その後バージョンアップを続け、2002年の2月にはWO5.1向けにProject WONDERとしての開発がスタートしています。
最初のPublic Releaseが行われたのが2002年の7月で、このときのバージョンはVer 0.9でした。その後Ver1.0がリリースされ、最新バージョンは2003年4月にリリースされたVer 1.0.1となっています。現在は、2.0のリリースに向けての作業がおこなわれています。
フレームワークですが、Ver 1.0.1では11個のフレームワークが提供されていて、その中にあるコンポーネントの総数はWebObjectsのコンポーネント数を上回るほどの量になっています。具体的にどのようなフレームワークがあるかは次回以降に詳しく解説していく予定ですが、主要なフレームワークの概要をまとめますと以下のようになります。
・ERExtensions
WebObjects(WOF/EOF)の機能拡張
アプリケーションの多国語化、Log4jを利用したロギング、
実行中アプリの動的再コンパイル、JUnitを利用したUnit Test
JavaScriptコンポーネント
・ERDirectToWeb
Direct To Webの機能拡張
ルールキャッシングシステム、追加テンプレート
ローカリゼーションサポートの統合、Validationハンドリングの改善
・ERJars
Log4jやJUnitのラッパーフレームワーク
・ERChangeNotificationJMS
JMSを用いたインスタンス間でのEOの自動同期
・ERJavaMail
E-mail送信フレームワーク
ファイル添付、日本語サポート
また、もともとはProject WONDERで開発が始まったわけではなく、他のデベロッパーからよせられたプロジェクトが含まれるようにもなってきていて、フレームワークをオープンソース化して公開する場を提供するといった役割もはたしています。
さらにソースコードが公開されているWebObjectsのWebサーバアダプタを改良して、デフォルトのパラメータをチューニングしたり、標準では対応していないプラットフォーム向けのビルド済みアダプタの提供などもおこなっています。
・Project WONDER HTTP Server Adaptor URL
http://wonder.sourceforge.net/WOAdaptor.html
以上がProject WONDERの概要になりますが、実際に開発に利用しようとなると色々とノウハウも必要になってきますので、次回からはProject WONDERの機能を紹介しつつ、具体的にどのような使い方をするのかということを紹介していこうと思います。Project WONDERを使いこなせば、ただでさえ開発効率のよいWebObjectsがさらに強化されますので、ぜひご期待ください。
*NSに変更すると某フレームワークと衝突してしまいますね(笑)
ニュース・解説
今週の解説担当:新居雅行
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃オーディオエンコードのAMRやACCはラインセンスが必要
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Technical Q&Aに掲載された文書によると、Windowsで稼働するQuickTimeを利用して、ConvertMovieToFile関数を使ってMPEG-4や3GPP、あるいは3GPP2ファイルへの書き出しをしても、ビデオは正しく出力されているがサウンドがなくなるという症状になる。これは、オーディオのエンコーディング方式のAMRやACCはライセンスを取得したアプリケーションでないと出力できないからである。Windowsでは、QuickTime Playerがライセンスを受けたアプリケーションとなっているので、QuickTime Proを購入すればQuickTime Playerで、サウンドが正しく組み込まれたムービーを出力する事ができる。
QA1347: Movie export with AAC or AMR audio formats
http://developer.apple.com/qa/qa2001/qa1347.html
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃OpenBase開発者向けのカンファレンスがマウイ島で開催
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OpenBase Developers Conferenceが、2004年9月2〜6日の日程で、ハワイのマウイ島にある「シェラトン・マウイ」で開催される。6月1日までの申し込みなら、カファンレンスチケットに、ホテル代金と食事を含めた参加費が$829となっている(それ以後は$929)。SQLデータベースのOpenBaseについての詳細な情報をカンファレンスで得られると当時に、各方面で活躍している開発者との交流も深める事ができる。OpenBaseの管理やプログラミング、OpenScript、REALbasic、JDBC、ODBC、PHP、Qlian、Cocoa、WebObjectsといったテーマが予定されている。セッションのスケジュールは下記のサイトに掲載されている。なお、前記の価格は宿泊を2人が一つの部屋を使う場合で、一人で一部屋を使う場合には$1219となる(通常価格は$1319)。
OpenBase Developers Conference
http://www.openbase.com/maui2004
MOSAからのお知らせと編集後記は割愛します
Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
このメールの再配信、および掲載された記事の無断転載を禁じます。
http://www.mosa.gr.jp/
Copyright (C)2004-2006 MOSA. All rights reserved.