web-dev-qa-db-ja.com

OS X Finderプラグインの作成方法

Mac OS X Finderプラグインを作成するためのガイドまたはサンプルコードを探していますか?いくつかの簡単なアクションの実行方法を知りたいです。

  1. アイコンに画像オーバーレイを追加する
  2. コンテキストメニュー項目の追加
  3. ファイルの変更を聞く

次の2つのリソースが見つかりました。

SCPluginコードを確認したくなりますが、より簡単にダイジェストできるサンプルを見つけたいと思っていました。

47
notnoop

悲しいことに、実際に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を確認することは理にかなっています。

18

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」ファイルを作成し、オーバーライドする適切なクラスとメソッドを見つけます)。この手法は引き続き機能します。

ハッキングハッピー!

28
Les Nie

Yosemite(MacOS 10.10以降)の場合、Appleの FinderSyncフレームワーク を使用できます。

  • 特定のフォルダ階層に関心を表明する
  • それらの階層内のアイテムのステータスを示す「バッジ」を提供する
  • 選択したアイテム(またはウィンドウターゲット)がそれらの階層にある場合、Finderコンテキストメニューに動的メニューアイテムを提供する
  • 動的な項目を含むメニューを表示するツールバー項目を提供します(選択が無関係であっても)
24

Finder用の公式またはサポートされているプラ​​グインシステムはありません。 OS X 10.6以降では、コードをFinderプロセスに挿入し、FinderプロセスのObjective Cメソッドをオーバーライドする必要があります。

私はプロプライエタリなプロジェクトのためにこれを行いました。このための例やチュートリアルがない理由は、非常に困難で時間のかかる開発タスクであるためです。このため、これを達成した個人または組織には、プロセスの詳細を厳重に保護するインセンティブがたくさんあります。

Services APIを使用して目的を達成できる方法がある場合は、それを実行してください。 Finderプラグインを作成すると、1〜2solidか月の骨の折れる開発と、CおよびObjective-Cの内部に関するかなり深い知識が必要になります。

これを実行する必要があると確信している場合は、 mach_star を取得してください。幸運を。

14
anthony

以下は、Les Nieが説明した手法を使用した、LionおよびMountain LionのFinderアイコンバッジとコンテキストメニューの完成したソリューションです。

Liferay Nativity は、関連するFinderメソッドとJavaアイコンとコンテキストメニューを設定するためのクライアント)をスウィズルするスクリプトバンドルを提供します。これには、WindowsおよびLinuxの同等のプロジェクトも含まれます。

プロジェクトはLGPLのもとでオープンソースであるため、バグの修正や改善に貢献してください!

2
dejuknow

私の知る限り、Finderには公式のプラグインアーキテクチャはありません。 Finderに接続しなくても、外部アプリケーションを介してアイコンにイメージオーバーレイを追加できる場合がありますが、その場で実行されるわけではありません。フォルダーアクションとAutomator以外にコンテキストメニュー項目を追加する方法はないと思います。 FSEvents API を使用して、ファイルシステムの変更を監視する外部アプリケーションの作成を検討することもできます。

2
Martin Gordon

ピッキングはスリムです。 Finderプラグインが実際にサポートされているかどうかは、私にははっきりしていません。ただし、さらにいくつかのリード:

  • SampleCMPlugIn -もちろんFinderなので、カーボンベースです。ほとんどのFinderプラグインは10.6で動作しなくなる可能性があることに注意してください。
  • Automatorは「Finderプラグイン」として保存できます。それはあなたが議論しているもののよりサポートされたバージョンですが、もちろん柔軟性は低くなります。
1
Rob Napier

ファインダー/ファイルブラウザーのアイコンオーバーレイとコンテキストメニューをクロスプラットフォームでJavaから追加するには、 Liferay Nativity ライブラリーを参照してください。

これについて another SO post でも言及しています。これには、Appleの「Finder Sync」ドキュメントおよびAPIへのリンクも含まれています。

0
Big Rich