3月 01
JavaScriptでXMLHttpRequestを使うと、外部ファイルを読み込めますが、ClipMenuから実行する文字列処理には必要ありません。そこで、WebKitが外部リソースにアクセスできないような変更を加えてみました。
まず、webViewをインスタンス化した後に、delegateを設定。
[webView setPolicyDelegate:self];
WebPolicyDelegateプロトコルのメソッドを実装します。
- (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener
{
[listener ignore];
}
これで、ClipMenuで実行したJavaScriptでXMLHttpRequestを使ったhttpアクセスを行うと、”Permission denied”と、エラーになるようにできました。
2月 23
次のような動作を、ClipMenuで実現しようと思いました。
- ブラウザでURL (例: http://www.apple.com/)をクリップボードにコピー。
- エディタを起動。
- ClipMenuを呼び出して、さっきコピーしたURLを履歴から選び、JavaScriptで記述したアクションを実行。
- JavaScript内に書かれた、prompt()メソッドで表示されたダイアローグボックスに、タイトル (例: アップル)を入力。
- エディタに、JavaScriptで処理した結果 (例: <a href=”http://www.apple.com/” title=”アップル”>アップル</a>)をペースト。
JavaScript内に、prompt()などの、ウィンドウを表示させるメソッドを使わなければ、特に問題はありませんでした。ただ、クリップボードの文字列と、ユーザー入力の文字列を組み合わせた文字列処理を行いたかったので、いくつかの問題を解決する必要がありました。
最前面に、エディタのウィンドウが表示されている状態で、バックグラウンド専用(LSUIElement = 1)で動いているClipMenuからウィンドウを開くと、最前面にあったエディタのウィンドウの下に表示されてしまいます。
これを避けるために、Cocoaでは以下のメソッドを実行すれば、自分のウィンドウを最前面にすることができました。
[NSApp activateIgnoringOtherApps:YES];
ただ、この後にClipMenuが表示したウィンドウを閉じると、はじめに最前面にあったエディタのウィンドウが一番手前になりますが、フォーカスはあたっていません。そのため、このウィンドウにペーストすることができない状態になってしまいます。
ClipMenuが最前面になる前に、
- 最前面のウィンドウのIDを記憶
- ClipMenuを最前面に切り替え
- ClipMenuのウィンドウを閉じる
- さっき記憶したIDのウィンドウを最前面に切り替え
を行えば良さそうだと考えましたが、方法が分かりません。唯一思い浮かんだのは、AppleScriptを使ったものです。ただ、「AppleScriptで解決するのは最後の手段」と、メーリングリストで言っていた人もいたので、やはり他の方法を探すことに。
Xcodeのドキュメントで見当たらなかったため、例によって、Cocoabuilderで検索。見つかった方法は、Carbonの関数を利用するものでした。
» Cocoabuilder – (Edison Thomaz) Bring app to foreground in 10.5
ClipMenuを表示する直前に、GetFrontProcess()関数で記憶したProcessSerialNumberを、ClipMenuを閉じる際に、SetFrontProcess()関数で最前面に設定することで、望み通りの動作をさせることができました。
結構、Carbon APIを使わないと実現できない処理がありますね。
2月 20
JavaScriptを使って、クリップボード履歴にある文字列を加工するテストがうまくいったので、環境設定パネルに、使用するマクロを選択できるインターフェイスを作成することにしました。
まず考えた方法が、チェックボックスの付いたリスト表示。Gmailなどでも使われていますね。チェックボックスを個別にチェックしたり、「すべてを選択」や「選択を解除」で、まとめてオン/オフすることもできます。
ただ、チェックボックスを連続してチェックしていくような単純作業は、数が多くなると苦痛なものです。見た目も、ちょっと野暮ったいですね。
次に考えたのが、TableView。NSTableViewは使ったこともあるし、二つのTableView間でドラッグ&ドロップすれば、チェックボックスも不要になります。
難点は、階層表示ができないこと。表示するマクロの数が少なければ問題ありませんが、そうでない場合に、一階層で多くのファイルを表示するのは見づらく感じます。
最終的には、OutlineViewを採用することになりました。これなら、階層表示ができますし、それをそのままメニュー内のフォルダとして利用することもできるからです。
ただ、これが思いの外大変で、予定よりずいぶん時間がかかる作業になってしまいました。
『Cocoa Programming』と「Theocacao: NSTreeController and Drag and Drop」を参考に始めて見たものの、なかなか思うような結果になりません。だいたい、ダミーのコードを使ったハックが必要だったり、非公開クラスの_NSArrayControllerTreeNodeを使用しないと、目的を達成できないというのも、何か変な気がします。Leopardでは改善されたようですが、Tigerでは結局中途半端な実装のままですし。
何とか望みの結果を達成できたのは、CocoabuilderのMLアーカイブのおかげです。
あと助かったのが、こちらの書き込み。
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は他にも使い道があるので、これで良かったことにしておきます。定型文の管理インターフェイスも、これを使えそうです。
有用な情報を公開してくださっている方達に感謝です。
1月 20
CLCLで重宝している機能の一つが、クリップボード内のテキストを整形するテキスト処理機能です。正確には、tool_textというプラグインをインストールすることで、利用できるようになるものです。
履歴メニューを右クリックすると、さらにメニューが表示され、様々なテキスト処理を行えます。
- 日時変換
- 大文字/小文字変換
- 日本語文字コード変換
- 引用符付加/除去
- テキスト整形
- テキストの挟み込み
- 改行の除去
- テキストの連結
- テキスト編集
エディタの置き換え機能などを使わずに、定型作業を行えるというのは、大変便利なものです。PTHPasteboardでは、おそらくフィルタがこれに該当するのでしょう。
こういった機能をClipMenuでも実現する方法を、いくつか考えてみました。
1番目は、ユーザーの手で自由に追加できないので却下。
2番目は、正規表現だけですべてをこなすというのは難しそうなので、同じく却下。
3番が、本当は望ましかったんですが、二つの理由で残念ながら却下になりました。
まず、ドキュメントをざっと見て、実現可能かどうかが分からなかったこと。RubyやPythonからCocoaを利用する例ばかりで、Objective-Cからオブジェクトをスクリプト言語に渡して、結果をまた受け取る方法を見つけられませんでした。
また、RubyCocoaやPyObjCの両方が標準搭載されているのが、Mac OS X v10.5だけというのもネックでした。両方とも、オープンソースで誰でもダウンロードして入手できますが、わざわざインストールしてもらう訳にもいきません。
そういう理由もあり、WebKitのJavaScriptエンジンを利用してみることにしました。Mac OS v10.3.9以降なら、何の追加インストールも必要ないのも魅力です。
それに、思いのほか便利にできています。Objective-CとJavaScriptの間でオブジェクトをやり取りする際は、自動的に型変換を行ってくれます。さらに、JavaScriptに渡したオブジェクトの、Objective-Cで書かれたメソッドを、JavaScript側から呼び出すこともできるようです。Dashboardのプラグインを思い出しました。
「ユーザーが、自由にテキスト加工コマンドを追加可能」をコンセプトに、今後のバージョンアップで実装する予定です。
1月 15
複数のクリップボード履歴をとるソフト、ClipMenuのバージョン0.1.1をリリースしました。
変更点はこちら:
- メニューのフォントサイズ変更に対応。
- メニューに表示する文字列を、トリムしてから表示するように変更。
- メニューの表示文字数に、小さすぎる値を入れた際に、正常に動作しない問題を修正。
ご要望のあった、メニューのフォントの大きさを変えられるようにしてみました。メニューのアイコンサイズに合わせてフォントサイズを変える方法と、ポップアップメニューから好きなサイズを選ぶ方法の2種類の設定を用意しました。
サイズは、最小9ポイントから、最大96ポイントの範囲から選べます。
ただし、初期状態ではオフになってますから、サイズを変更したい方は、設定画面でチェックボックスにチェックを入れてください。
フリーウェアですから、お気軽に試してみてください。
ダウンロードはこちらです。
» ClipMenu
1月 07
各所で、ClipMenuをご紹介していただきました。どうもありがとうございます!
搭載したい機能も、まだまだありますし、これからも着実にバージョンアップしていきたいと思います。
1月 03
複数のクリップボード履歴をとるソフト、ClipMenu v0.1をリリースしました。Mac OS X v10.3移行で動作します。
Mac用のクリップボードユーティリティも、PTHPasteboard -> Butler -> Clipper -> PTHPasteboard と、いろいろ試してきました。結局気づいたのは、既存のソフトに不満があるわけではなくて、CLCLっぽいのが欲しかったのだということでした。もう数年もWindowsでCLCLを愛用しているので、こういう使い勝手でないと、どうもしっくりきません。
まだ履歴をとることしかできませんし、機能的には、CLCLに遠く及びませんが、CLCL好きなMacユーザーの方は一度試してみてください。
» ClipMenu

Recent Comments