今日も記事数が多いです…。2つに分けて送ることにします。どなたか、Majordomoで40KB以上を配信できる方法御存じなら教えて下さい!(けっこうマジ) 前文は次のメールで…。
(新居雅行 msyk@mdonline.jp)
今回も引き続き、CarbonアプリケーションからNibファイルを活用した時の経験談です。Nibファイルを作成するのには、Developer ToolsのInterface Builderを使います。最近発表された最新版のInterface Builderでの問題点を再度まとめてみました。
12/20現在、ADCメンバーサイトには「CarebonLib_1.5f6_SDK」が登録されています。f版になってからもどんどんとリビジョン番号が上がっていますね(笑)。てっきりMac OS 9.2.2に搭載するためにβバージョンをスキップしたのかと思っていたのですが、結局のところ、CarbonLib 1.5はMac OS 9.2.2には搭載されませんでした。この感じでは、以前に予想していた通り年内搭載は無理かもしれません。それから、Apple社からの少し早めのクリスマスプレゼントでしょうか? ADCメンバーサイトに「December 2001 Mac OS X Developer Tools」が登録されました。ADCのOnline会員でもダウンロードしてインストールすることが可能です。とは言っても、容量が200Mバイト以上もありますので、誰でも簡単にと言うわけにはいかないでしょう。当方ではADSL経由でアクセスしたのですが、ダウンロード完了までには20分以上かかりました。
ダウンロードする前に、以前のDeveloper Toolsからの変更点を確認しておきたい方は、以下のApple社サイトをチェックしてください。
◇December 2001 Mac OS X Tools
http://developer.apple.com/tools/macosxtools.html
今回のDeveloper Toolsの目玉は、AppleScriptからCocoaフレームワークを呼ぶことで、ダイアログやコントロールなどのユーザインターフェースを利用可能にすることです。この仕組みを「AppleScript Studio」と呼んでいます。Project Builderもv1.1.1となり、コンパイラやデバッガのパフォーマンスが改善されています。同様に、これから紹介するInterface Builderもv2.2へとバージョンアップされていました。さっそく使ってみたところ、確かにコントロールをレイアウトする時のパフォーマンスが良くなっています。また、配置のためにドラッグしているコントロールが、ガイドライン上で一時停止してくれるのも大きな進歩です。しかし、以前の紹介した「バグ」がひとつも直っていないのにはがっかりしました。現在確認できているバグを再度まとめておきましょう。
(1)タブコントロールのアイテムに日本語が表示できない。
これが一番困っているバグです。聞いたところによると、CocoaベースのNibファイルでは、ちゃんと日本語が表示されるそうです。アップル社では、日本語版Carbonアプリケーションを作る時にInterface Builderを使ったことがないのかもしれません?
(2)ResourceからImportするといくつかのコントロールが正しく変換されない。
例えば、AutoTogleタイプのCheckBox(kControlCheckBoxAutoToggleProc)などがうまく変換できません。全種類のコントロールを試したわけではありませんので、他にも変換不可なコントロールがあるかもしれません。
(3)メニューアイテムの「コマンドキー」が「シフト+コマンドキー」に化ける。
こちらも、ResourceからメニューをImportするときに起きる現象です。Mac OS Xの日本語環境が関係しているのかもしれません。
(4)カットしたコントロールを別ウィンドウにペーストすると位置がずれる。
同じウィンドウ内でコントロールをカット&ペースとすると、オリジナル位置から少しずれて配置されます。この仕組みは理解できます。なぜなら、まったく同じ位置に置かれたらピッタリ重なって判別出来ないからです。しかし、別ウィンドウへペーストする時には、オリジナルと同じ位置に配置してもらいたいものです。でないと、コントロールのレイアウトが似たダイアログを複数作成するような場合に非常に不便です。初期設定のどこかに何らかのオプションがあるのでしょうか?
(5)ガイドラインに従うとコントロールが正しく表示されない。
ガイドラインに従いタブコントロールの下にボタンを配置すると、アプリケーションでボタンが切れて表示されてしまいます。ボタン配置を示すガイドラインの位置がタブコントロールに接近しすぎているのが原因です。誰も実際に使ったことがないのがバレバレではないでしょうか(笑)。
(6)タブコンアイテム用に配置されているUserPaneコントロールがずれる。
Interface Builderで編集している時には大丈夫なのですが、Nibファイルへ保存してアプリケーションで表示してみると、タブアイテム用に配置されているUserPaneコントロールがずれている場合があります。しかし、これがどういった状況やタイミングで起こるのかは把握できていません。謎の現象です。
Interface Builderのこうしたバグや不都合は、すべてアップル社に報告してあります。現状、NibベースのCarbonアプリケーションを作成する時には、Interface Builderに頼るしかありませんので、早急なる対処を望みたいと思います。
今回のバージョンでも、Project Builder経由以外ではImage Tabに画像やアイコンを表示させる方法はないようです。仕方がないので、Metrowerks CodeWarriorのプロジェクトフォルダの中にテンポラリのProject Builder用フォルダを作り、Project Builder経由で編集したNibファイルをアプリケーションパッケージ内に複製することでその場をしのいでいます。
これについては、Metrowerks CodeWarriorが、Nibファイルの取り扱いを強化してくれるまで待つしかないでしょうね。それから、タブコントロールでの内容(Embedしたコントロール)の切り替も自動で実行してくれると嬉しいのですが...。現状だと、Interface Builderではそうなるのですが、アプリケーションにすると、以下のようなソースコードを呼び出して自分で切り替える必要があります。
もうひとつ、これは直接Interface Builderとは関係ないのですが、Aquaコントロールでは背景に影を描画します。ですから、PICT画像の上などにコントロールを配置すると、背景の一部が抜けてしまい、非常にみっともない表示になります。
コントロールに対してEmbed(埋め込み)処理をしてもダメですし、アピアランスマネージャやコントロールマネージャを色々と調べても解決方法が見つかりません。どなたかご存知ないでしょうか?もし、現状では方法が無いとすれば、アピアランスマネージャの改良で何とか対応してもらいたいと思います。どんな背景にコントロールを配置しても美しい見栄えを保つことができれば、アプリケーションでのAquaインターフェースの活用方法がさらに広がるのではないでしょうか?
[小池邦人/オッティモ]
関連リンク:オッティモ
カテゴリ:ProjectBuilder/Interface Builder, 小池邦人のプログラミング日記
―――――ツールバーの初期化
 ̄ ̄ ̄起動時の処理の概要___
ツールバーを初期化するコードは、awakeFromNibに書かれています。アプリケーションが起動した時にMainMenu.nibが読み込みまれますが、その時に、その中に含まれるインスタンスのawakeFromNibが実行されます。
◇Controller.m → awakeFromNib
- (void) awakeFromNib {
: 省略
NSToolbar *toolbar = [ [ [ NSToolbar alloc ]
initWithIdentifier : @"myToolbar" ]
autorelease ]; // ツールバーを作成
// アイテム辞書作成
toolbarItems = [ [ NSMutableDictionary dictionary ] retain ];
// ツールバーアイテムを辞書(toolbarItems)に登録
addToolbarItem( … 省略 … ); // Font Style
addToolbarItem( … 省略 … ); // Font Size
addToolbarItem( … 省略 … ); // Blue Text
// ツールバーの属性をセット
[ toolbar setDelegate : self ]; // デリゲートをセット
[ toolbar setAllowsUserCustomization : YES ]; // 設定パレットを使う
[ toolbar setAutosavesConfiguration : YES ]; // 設定の自動保存をする
[ toolbar setDisplayMode : NSToolbarDisplayModeIconOnly ]; // 表示モード設定
[ theWindow setToolbar : toolbar ]; // ツールバーをウィンドウにセット
: 省略
}
NSToolbar *toolbar = [ [ [ NSToolbar alloc ]
initWithIdentifier : @"myToolbar" ]
autorelease ]; // ツールバーを作成
// アイテム辞書作成
toolbarItems = [ [ NSMutableDictionary dictionary ] retain ];
// ツールバーアイテムを辞書(toolbarItems)に登録
addToolbarItem( … 省略 … ); // Font Style
addToolbarItem( … 省略 … ); // Font Size
addToolbarItem( … 省略 … ); // Blue Text
// ツールバーの属性をセット
[ toolbar setDelegate : self ]; // デリゲートをセット
[ toolbar setAllowsUserCustomization : YES ]; // 設定パレットを使う
[ toolbar setAutosavesConfiguration : YES ]; // 設定の自動保存をする
[ toolbar setDisplayMode : NSToolbarDisplayModeIconOnly ]; // 表示モード設定
[ theWindow setToolbar : toolbar ]; // ツールバーをウィンドウにセット
typedef enum {
NSToolbarDisplayModeDefault,
NSToolbarDisplayModeIconAndLabel, // Icon & Text
NSToolbarDisplayModeIconOnly, // Icon Only
NSToolbarDisplayModeLabelOnly // Text Only
} NSToolbarDisplayMode;
/Users//Library/ToolbarSample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
<key>NSToolbar Configuration myToolbar</key>
<dict>
<key>TB Display Mode</key>
<integer>1</integer>
<key>TB Is Shown</key>
<integer>1</integer>
<key>TB Item Identifiers</key>
<array>
<string>FontStyle</string>
<string>FontSize</string>
<string>NSToolbarSeparatorItem</string>
<string>BlueLetter</string>
<string>NSToolbarPrintItem</string>
</array>
<key>TB Size Mode</key>
<integer>1</integer>
</dict>
<key>NSWindow Frame NSFontPanel</key>
<string>603 269 300 221 0 0 1152 746 </string>
</dict>
</plist>
関連リンク:Cocoaはやっぱり!
カテゴリ:ユーザインタフェース, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
 ̄ ̄ ̄ツールバーアイテム辞書の登録処理___
さて、先程説明をとばしたaddToolbarItemのところに戻ります。パラメータが沢山ありますので、まずはパラメータの説明から行います。addToolbarItem関数の先頭部分を見ていただきましょう。
◇Controller.m → addToolbarItem
static void addToolbarItem (
NSMutableDictionary *theDict, // 登録先のツールバーアイテム辞書
NSString *identifier, // 識別子
NSString *label, // ラベル
NSString *paletteLabel, // パレットラベル
NSString *toolTip, // ツールチップ
id target, // イメージアイテム用のターゲット
SEL settingSelector, // ツールバーにセットする時のメソッド名
id itemContent, // ツールバーにセットする画像かビュー
SEL action, // イメージアイテム用のアクション
NSMenu *menu // メニュー
) {
// Font StyleとFont Sizeを辞書に登録 ( ビューアイテム )
addToolbarItem( toolbarItems,
@"FontStyle", @"Font Style", @"Font Style",
@"Change your font style",
self, @selector(setView:), popUpView, NULL,
fontStyleMenu );
addToolbarItem( … 省略 … );
// Blue Textを辞書に追加 ( イメージアイテム )
addToolbarItem( toolbarItems,
@"BlueLetter", @"Blue Text", @"Blue Text",
@"This toggles blue text on/off",
self, @selector(setImage:),
[ NSImage imageNamed : @"blueLetter.tif" ],
@selector(blueText:), fontSizeMenu );
static void addToolbarItem (
: 省略
) {
NSMenuItem *mItem;
NSToolbarItem *item = [ [ [ NSToolbarItem alloc ]
initWithItemIdentifier : identifier ]
autorelease ]; // ツールバーアイテム作成
[ item setLabel : label ]; // ラベルを設定
[ item setPaletteLabel : paletteLabel ]; // パレットラベルを設定
[ item setToolTip : toolTip ]; // ツールチップを設定
[ item setTarget : target ]; // ターゲットを設定
[ item performSelector : settingSelector
withObject : itemContent ]; // アイテムに画像かビューをセット
[ item setAction : action ]; // アクションを設定
if ( menu != NULL ) { // メニューを設定
mItem = [ [ [ NSMenuItem alloc ] init ] autorelease ];
[ mItem setSubmenu : menu ];
[ mItem setTitle : [ menu title ] ];
[ item setMenuFormRepresentation : mItem ];
}
[ theDict setObject : item
forKey : identifier ]; // アイテム辞書に登録
}
[ item performSelector : settingSelector
withObject : itemContent ]; // アイテムに画像かビューをセット
[ item setImage : itemContent ];
[ item setView : itemContent ];
関連リンク:Cocoaはやっぱり!
カテゴリ:ユーザインタフェース, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
では、ここで出てきたメソッドを一気に紹介します。
★ NSToolbarItem : ラベル名を取得する
[書式] - (NSString *) label
[出力] 返り値 : ラベル名
[備考] ラベル名とは、ツールバー上の各アイテムの下部に表示されるの名称
★ NSToolbarItem : ラベル名を変更する
[書式] - (void) setLabel : (NSString *) label
[入力] label : 変更するラベル名
[出力] 返り値 :
★ NSToolbarItem : パレットラベル名を取得する
[書式] - (NSString *) paletteLabel
[出力] 返り値 : パレットラベル名
[備考] パレットラベル名とは、設定パネル上の各アイテムの
下部に表示される名称
★ NSToolbarItem : パレットラベル名を変更する
[書式] - (void) setPaletteLabel : (NSString *) paletteLabel
[入力] paletteLabel : 変更するパレットラベル名
★ NSToolbarItem : ツールチップを取得する
[書式] - (NSString *) toolTip
[出力] 返り値 : ツールチップ
[備考] ツールチップとは、ツールバー上の各アイテムにマウスを重ねた時に
表示される簡易ヘルプのこと
★ NSToolbarItem : ツールチップを変更する
[書式] - (void) setToolTip : (NSString *) toolTip
[入力] toolTip : 変更するツールチップ
★ NSToolbarItem : ターゲットを取得する
[書式] - (id) target
[出力] 返り値 : ターゲット
★ NSToolbarItem : ターゲットを変更する
[書式] - (void) setTarget : (id) target
[入力] target : 変更するターゲット
[備考] イメージアイテムにのみ有効
★ NSToolbarItem : アクションを取得する
[書式] - (SEL) action
[出力] 返り値 : アクション
★ NSToolbarItem : アクションを変更する
[書式] - (void) setAction : (SEL) action
[入力] action : 変更するアクション
[備考] イメージアイテムにのみ有効
★ NSToolbarItem : メニューを取得する
[書式] - (NSMenuItem *) menuFormRepresentation
[出力] 返り値 : メニュー
★ NSToolbarItem : メニューを変更する
[書式] - (void) seMenuFormRepresentation : (NSMenuItem *) menuItem
[入力] menuItem : 変更するメニュー
★ NSToolbarItem : 画像を取得する
[書式] - (NSImage *) image
[出力] 返り値 : 画像
[備考] イメージアイテムにのみ有効
★ NSToolbarItem : 画像を変更する
[書式] - (void) setImage : (NSImage *) image
[入力] image : 変更する画像
[備考] このメソッドを実行することによってイメージアイテムになる
★ NSToolbarItem :ビューを取得する
[書式] - (NSView *) view
[出力] 返り値 : ビュー
[備考] ビューアイテムにのみ有効
★ NSToolbarItem : ビューを変更する
[書式] - (void) setView : (NSView *) view
[入力] image : 変更するビュー
[備考] このメソッドを実行することによってビューアイテムになる
―――――インスタンス取得メソッドの詳細
これで、ツールバーアイテムの辞書が出来ましたので、この辞書を主に使うインスタンス取得メソッドの toolbar : itemForItemIdentifier : willBeInsertedIntoToolbar : を詳しく見ていきましょう。
◇Controller.m → toolbar : itemForItemIdentifier : willBeInsertedIntoToolbar :
- (NSToolbarItem *) toolbar : (NSToolbar *) toolbar
itemForItemIdentifier : (NSString *) itemIdentifier
willBeInsertedIntoToolbar : (BOOL ) flag {
NSToolbarItem *newItem = [ [ [ NSToolbarItem alloc ]
initWithItemIdentifier : itemIdentifier ]
autorelease ]; // アイテムを作成
// アイテム辞書から取り出し
NSToolbarItem *item = [ toolbarItems objectForKey : itemIdentifier ];
// 以降でコピーする
[ newItem setLabel : [ item label ] ]; // ラベルをコピー
[ newItem setPaletteLabel : [ item paletteLabel ] ]; // パレットラベルをコピー
// ビューと画像をコピー
if ( [ item view ] != NULL ) { [ newItem setView : [ item view ] ]; }
else { [ newItem setImage : [ item image ] ]; }
[ newItem setToolTip : [ item toolTip ] ]; // ツールチップをコピー
[ newItem setTarget : [ item target ] ]; // ターゲットをコピー
[ newItem setAction : [ item action ] ]; // アクションをコピー
// メニューをコピー
[ newItem setMenuFormRepresentation : [ item menuFormRepresentation ] ];
if ( [ newItem view ] != NULL ) { // ビューアイテムならサイズを設定
[ newItem setMinSize : [ [ item view ] bounds ].size ];
[ newItem setMaxSize : [ [ item view ] bounds ].size ];
}
return newItem;
}
- (NSToolbarItem *) toolbar : (NSToolbar *) toolbar
itemForItemIdentifier : (NSString *) itemIdentifier
willBeInsertedIntoToolbar : (BOOL ) flag {
return [ toolbarItems objectForKey : itemIdentifier ];
}
関連リンク:Cocoaはやっぱり!
カテゴリ:ユーザインタフェース, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版