Mac OS X Finderプラグインを作成するためのガイドまたはサンプルコードを探していますか?いくつかの簡単なアクションの実行方法を知りたいです。
次の2つのリソースが見つかりました。
COM
APIを使用する2002年の古いドキュメント。SCPlugin
コードを確認したくなりますが、より簡単にダイジェストできるサンプルを見つけたいと思っていました。
悲しいことに、実際にFinderプラグインをプログラミングするdoesでも、COMで手を汚す必要があります。 SCPluginプロジェクトのSCFinderPluginサブプロジェクトを見ると、COMのvtableの設定、AddRef/ReleaseRef関数の記述など、最初のリンクで概説されている手法とまったく同じであることがわかります。昔ながらのCarbonメモリ管理、COMスタイルのメモリ管理、Cocoa/NewスタイルのCarbonメモリ管理を同時に管理しているプラグインを作成することは、信じられないほどの痛みになる可能性があります。 3つ以上の根本的に異なるAPIで対話し、異なる命名規則と呼び出しセマンティクスを使用します。状況をヒステリックに貧弱と呼ぶのは、非常に控えめな表現でしょう。
明るい面としては、Mac OS X 10.6 Snow LeopardのFinderがCocoaで完全に書き直されました。これにより、非常に優れたプラグインインターフェースが提供されます。 Snow Leopardのみを対象とすることができる状況に幸運である場合は、ADC Premier以上のメンバーシップを取得し、プレリリースビルドをダウンロードして、それに対してコードを作成する必要があります。その上、Cocoaのリライトなしではプラグインが10.6で動作しない可能性があるため、リリースされる前にSnow Leopardを確認することは理にかなっています。
Finder Icon Overlay のサンプルプロジェクトは、小さくて非常に基本的ですが、実際に機能する以下の回答の例を表しています。
https://github.com/lesnie/Finder-Icon-Overlay
私はこれがとても古いことを知っていますが、一部はまだトピックに興味があるかもしれません(?)
これがLeopard(10.6)で私がやったことです。最初に適切なFinderのヘッダーが必要です。それを得るためにクラスダンプツールを使用してください。次に、コードをSIMBLプラグインとして記述し(ドキュメントの作成方法を参照)、いくつかのメソッドをスウィズルします。たとえば、ListViewのアイコンの上に何かを描画するには、TIconAndTextCellメソッドのdrawIconWithFrame:メソッドをオーバーライドする必要があります。
メソッドのスウィズリングのコードは次のとおりです。
+ (void) Plugin_load
{
Method old, new;
Class self_class = [self class];
Class Finder_class = [objc_getClass("TIconAndTextCell") class];
class_addMethod(Finder_class, @selector(FT_drawIconWithFrame:),
class_getMethodImplementation(self_class, @selector(FT_drawIconWithFrame:)),"v@:{CGRect={CGPoint=dd}{CGSize=dd}}");
old = class_getInstanceMethod(Finder_class, @selector(drawIconWithFrame:));
new = class_getInstanceMethod(Finder_class, @selector(FT_drawIconWithFrame:));
method_exchangeImplementations(old, new);
}
「drawIconWithFrame:」メソッドを「FT_drawIconWithFrame:」メソッドでオーバーライドしています。以下は、このメソッドのサンプル実装です。
- (void) FT_drawIconWithFrame:(struct CGRect)arg1
{
[self FT_drawIconWithFrame:arg1];
if ([self respondsToSelector:@selector(node)]) {
if ([[[[NSClassFromString(@"FINode") nodeWithFENode:[(TNodeIconAndNameCell *)self node]] fullPath] lastPathComponent] hasPrefix:@"A"])
[myPrettyIconOverlayImage drawInRect:NSMakeRect(arg1.Origin.x, arg1.Origin.y, arg1.size.height, arg1.size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
}
}
基本的に、ファイル名が「A」で始まるファイルのすべてのアイコンの上に「myPrettyIconOverlayImage」を描画します。このロジックはあなた次第です。
この行に注意してください:[self FT_drawIconWithFrame:arg1];
これは、通常のアイコンや名前などを取得するために「スーパー」を呼び出す方法です。ループのように奇妙に見えますが、実際にはそうではありません。次に、SIMBLプラグインにラップインし、SIMBLをインストールして...実行します。
Lionの変更により、一部の作業を最初から行う必要があります(必要なすべての宣言を含む新しい「Finder.h」ファイルを作成し、オーバーライドする適切なクラスとメソッドを見つけます)。この手法は引き続き機能します。
ハッキングハッピー!
Yosemite(MacOS 10.10以降)の場合、Appleの FinderSyncフレームワーク を使用できます。
Finder用の公式またはサポートされているプラグインシステムはありません。 OS X 10.6以降では、コードをFinderプロセスに挿入し、FinderプロセスのObjective Cメソッドをオーバーライドする必要があります。
私はプロプライエタリなプロジェクトのためにこれを行いました。このための例やチュートリアルがない理由は、非常に困難で時間のかかる開発タスクであるためです。このため、これを達成した個人または組織には、プロセスの詳細を厳重に保護するインセンティブがたくさんあります。
Services APIを使用して目的を達成できる方法がある場合は、それを実行してください。 Finderプラグインを作成すると、1〜2solidか月の骨の折れる開発と、CおよびObjective-Cの内部に関するかなり深い知識が必要になります。
これを実行する必要があると確信している場合は、 mach_star を取得してください。幸運を。
以下は、Les Nieが説明した手法を使用した、LionおよびMountain LionのFinderアイコンバッジとコンテキストメニューの完成したソリューションです。
Liferay Nativity は、関連するFinderメソッドとJavaアイコンとコンテキストメニューを設定するためのクライアント)をスウィズルするスクリプトバンドルを提供します。これには、WindowsおよびLinuxの同等のプロジェクトも含まれます。
プロジェクトはLGPLのもとでオープンソースであるため、バグの修正や改善に貢献してください!
私の知る限り、Finderには公式のプラグインアーキテクチャはありません。 Finderに接続しなくても、外部アプリケーションを介してアイコンにイメージオーバーレイを追加できる場合がありますが、その場で実行されるわけではありません。フォルダーアクションとAutomator以外にコンテキストメニュー項目を追加する方法はないと思います。 FSEvents API を使用して、ファイルシステムの変更を監視する外部アプリケーションの作成を検討することもできます。
ピッキングはスリムです。 Finderプラグインが実際にサポートされているかどうかは、私にははっきりしていません。ただし、さらにいくつかのリード:
ファインダー/ファイルブラウザーのアイコンオーバーレイとコンテキストメニューをクロスプラットフォームでJavaから追加するには、 Liferay Nativity ライブラリーを参照してください。
これについて another SO post でも言及しています。これには、Appleの「Finder Sync」ドキュメントおよびAPIへのリンクも含まれています。