2008/05/10 土曜日

プログラムで使用するテンポラリファイルの場所

カテゴリー: Mac, Programming — pine @ 22:24:46

いまさら知った事が有りました。プログラムで一時ファイルを使う必要が有って /tmp に書き込んだりしていたのですが。どうやら、間違っていた様です、場所が。Apple の File Management ドキュメントを眺めていると(決して読んでる訳では無い)一時ファイルの格納場所に /tmp は使わない様に、と書かれているように見えたのです。じゃぁ何処を使えば良いのかと言うと NSTemporaryDirectory() を使えば良いらしいです。でも、また 10.4 と 10.5 で違うのでは無いかと両バージョンで実行してみました。

違いは最後にスラッシュが付くか、付かないか、の違いが有りました。もう少しで、また痛い目を見る所でした。これは NSSTring の stringByAppendingPathComponent を使って両バージョンで同じコーディングが出来ます。

2008/05/03 土曜日

NSSplitView

カテゴリー: Mac, Programming — pine @ 15:02:13

え〜 MailUnreadStatusBar のバグ修正、iPalmMemo のバグ修正とリリースしました。MailUnreadStatusBar は自分が使っているメールサーバと違った結果を返すサーバが有ったりで、中々難産です。
iPalmMemo の方は Intel Mac でのバグでしたが、リリースしてから2人バグレポートが有りました。まぁ iPalmMemo のユーザが少ないのも有りますが、やはり Palm ユーザが減少しているんでしょうかねぇ。

で、NSSplitView をプログラム起動時、前回終了した大きさで分割する方法です。以前から旨く出来なくて、色々調べても自分でスプリットビューを作るか、誰かが作成したのを利用させて貰うしか無いような感じでした。そこで、いつものようにいい加減な対処方法を思いついたので書いてみます。
NSSplitView のサブビューのフレームが保存されているとして、NSSplitView を表示する時に

[self performSelector:@selector(resizeMailIndextableView:) withObject:nil afterDelay:0.01];

なんて書いてみます。これは後で(afterDelay)このメソッド(resizeMailIndextableView:)を呼んでね、と言うやつです。
で、resizeMailIndextableView メソッド内で NSSplitView 内のサブビューのフレームを設定します。

- (void)resizeMailIndextableView:(id)object
{
 NSRect tableRect = [mView1 frame];
 [mView1 setFrame:mTableViewRect];
 [mSplitView adjustSubviews];
 if(tableRect.size.height != mTableViewRect.size.height)
  [self performSelector:@selector(resizeMailIndextableView:) withObject:nil afterDelay:0.01];
}

このメソッドの中でフレームを設定して希望する値になるまで自分自身を呼び続けます。
これを実行すると指定した大きさに、にょろっと変化します。2分割だと出来ましたが、2以上だとどうなるのかは不明です、どなたか実験してみて下さい。旨くいけばもうけもんです。
上記ソースだと高さを調整してますが、多分幅でも、両方でも OK だと思います。数行で出来るので、私はこれで良いです。

2008/04/27 日曜日

Growl

カテゴリー: Mac, Programming — pine @ 15:18:57

アプリケーションでの Growl サポートについて。いつものように、とりあえず動作するには、って感じです。

まず Growl のサイトから SDK (Growl-1.1.2-SDK.dmg) をダウンロードします。dmg をマウントして、色々入ってますが必要なのは Framework なので適当な所へコピーします。後でサポートするアプリケーションにコピーするのでプロジェクトの中とか分かりやすい所が良いと思います。

Xcode でサポートするアプリケーションを開いて Growl の Framework を追加します。Growl の Framework には2種類有るのですがアプリケーションでサポートするだけなら Growl.framework だけで OK です。追加したら今度はターゲットを展開して「新規ビルドフェーズ」「新規ファイルのコピー」と選択して追加します。その時に表示されるダイアログには何も入力しなくても構いません。ダイアログを閉じて、先ほど追加した Growl.framework を追加した「ファイルをコピー」にドラッグします。
準備の最後は Growl にどんな通知を渡すのか、また既定の通知はどれなのかを記述した plist を作成します。作成は Property List Editor で大丈夫です。ファイル名は「Growl Registration Ticket.growlRegDict」です。私は最初 plist と書かれていたので拡張子も plist かと思っていたのですが不要でした。
で、記述する内容は3つのキーとその中身です。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
 <key>AllNotifications</key>
 <array>
  <string>NewMailMailUnreadStatusBarNotification</string>
 </array>
 <key>DefaultNotifications</key>
 <array>
  <string>NewMailMailUnreadStatusBarNotification</string>
 </array>
 <key>TicketVersion</key>
 <integer>1</integer>
</dict>
</plist>

こんな感じです。
AllNotifications には Growl に通知する全ての Notification を記述します。DefaultNotifications には多分既定で通知するのを記述すると思われます。私のは未読通知1個なので1個づつです。

これで準備が整ったので、次はプログラムの方です。
プログラムでは起動した時に framework を探してロードする事、と実際に通知を行う事です。
framework のロードは

NSString *frameworkPath=[
   [[NSBundle bundleForClass:[self class]] privateFrameworksPath]
   stringByAppendingPathComponent:@”Growl.framework”
  ];
NSBundle *growlFramework = [NSBundle bundleWithPath:frameworkPath];
if (growlFramework && [growlFramework load]) {
 // Register ourselves as a Growl delegate
 [GrowlApplicationBridge setGrowlDelegate:self];
} else {
 NSLog(@”Could not load Growl.framework”);
}

こんな感じです。
私の場合メインのコントローラクラスで通知するので self となっています。

次は Growl への通知です

icon = [[NSImage imageNamed:@"NetworkLarge"] TIFFRepresentation];
[GrowlApplicationBridge notifyWithTitle:[mes mailboxname]
 description:[NSString stringWithFormat:@"From:%@\nSubject:%@",[mes sender],[mes subject]]
 notificationName:@”NewMailMailUnreadStatusBarNotification”
 iconData:icon
 priority:0
 isSticky:NO
 clickContext:nil
];

notifyWithTitle と description は NSString で notificationName には準備の所で記述した通知を指定します。iconData は nil でも構わないです、指定する場合は NSData なので NSImage から TIFFRepresentation メソッドを使っています。Growl の通知ウインドウにアイコンが表示されます。後のパラメータは聞かないで下さい。まだ、使ってないので良く分かりません。clickContext は多分 Growl のウインドウをクリックした時に自分のアプリケーションに Notification が通知される様な気もしますが。

以上です。アプリケーションを起動すると「システム環境設定」の Growl に自分のアプリケーションが登録されます。
アプリケーションの場合は Growl.framework をロードするのは簡単なんですが、プラグインの場合はちょっと大変な様です。

次ページへ »

QueueSoft Developing Diary is proudly powered by WordPress
Entries (RSS) and Comments (RSS).