47 votes

Comment écrire le plugin OS X Finder

Je suis à la recherche d'un guide ou d'un exemple de code pour l'écriture de Mac OS X Finder plugins? Il souhaiterait savoir comment faire certaines actions simples:

  1. ajout d'image overlayers d'icônes
  2. l'ajout d'éléments de menu contextuel
  3. écouter des modifications de fichiers

J'ai trouvé les deux ressources:

Je suis tenté d'examiner l' SCPlugin code, mais en espérant trouver plus facilement un échantillon à digérer.

28voto

Les Nie Points 436

Je sais que c'est vieux, mais certains peuvent être encore intéressé par le sujet (?)

Voici ce que j'ai fait sous Leopard (10.6). À première bonne Finder les en-têtes sont nécessaires. Utilisation en classe-outil de vidage pour l'obtenir. Ensuite, écrivez votre code comme un SIMBL plugin (se référer à la documentation comment faire), swizzling certaines méthodes. Par exemple pour dessiner quelque chose sur l'icône dans la vue liste, drawIconWithFrame: méthode de TIconAndTextCell méthode doit être surchargée.

Voici le code pour la méthode swizzling:

+ (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);

}

Je suis primordial "drawIconWithFrame:" avec ma méthode "FT_drawIconWithFrame:". Ci-dessous un exemple de mise en œuvre de cette méthode.

- (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];
    }
}

Essentiellement, il dessine "myPrettyIconOverlayImage" sur chaque icône pour le fichier avec le nom de fichier commence par la lettre "A". Cette logique est à vous.

Attention à cette ligne: [self FT_drawIconWithFrame:arg1]; c'est la façon de l'appeler "super" afin d'obtenir la normale icône et le nom de etc. Je sais, un peu bizarre, comme la boucle, mais en réalité il ne l'est pas. Puis les envelopper dans dans SIMBL plugin, installer SIMBL et ...courir.

En raison de changements dans Lion de quelques travaux sont à faire à partir de zéro (faire de nouveaux "du Finder.h" fichier avec toutes les déclarations nécessaires, trouver bon classess et de méthodes pour le remplacer), mais cette technique fonctionne encore.

Happy hacking!

18voto

Benjamin Pollack Points 10458

Malheureusement, la programmation d'un Finder plugin en fait ne nécessitent encore de vous salir les mains avec COM. Si vous regardez la SCFinderPlugin sous-projet de la SCPlugin projet, vous trouverez qu'il suit exactement les mêmes techniques décrites dans votre premier lien, y compris l'établissement d'une vtable pour COM, écrit AddRef/ReleaseRef fonctions, et ainsi de suite. L'écriture d'un plugin, d'où vous venez simultanément la gestion de la vieille école de Carbone de gestion de la mémoire, COM-style de gestion de la mémoire et de Cacao/new-style Carbone de gestion de la mémoire, peut être d'une incroyable douleur, et qui ignore totalement le fait que vous serez en interaction dans trois ou plus radicalement différentes Api, avec les différentes conventions de nommage et de l'appel de la sémantique. L'appel de la situation hystérique pauvres serait une grande sobriété.

Sur le côté positif, le Finder de Mac OS X 10.6 Snow Leopard a été entièrement réécrit en Cocoa, et qui viennent d'une qualité nettement supérieure plugin interfaces. Si vous êtes assez chanceux pour être dans une situation où vous pouvez réellement seule cible de Snow Leopard, vous devriez probablement prendre un ADC Premier supérieur ou de l'adhésion, de télécharger les versions bêta, et le code contre. En outre, votre plugin ne peut pas travailler sur 10.6 de toute façon sans Cacao, de réécriture, de sorte qu'il pourrait faire de bon sens pour prendre un coup d'oeil à Snow Leopard avant qu'il soit publié, peu importe.

14voto

anthony Points 15067

Il n'y a aucun fonctionnaire ou pris en charge système de plugin pour le Finder. Départ avec OS X 10.6, vous aurez besoin d'injecter du code dans le Finder processus et remplacer objective-C méthodes dans le Finder processus.

Je l'ai fait pour un propriétaire de projet. Je peux vous dire que la raison pour laquelle il n'y a pas des exemples ou des tutoriels pour c'est parce qu'il est très difficile et fastidieuse tâche de développement. Pour cette raison, il ya beaucoup d'encouragement pour les personnes ou les organisations qui ont accompli ce pour garder la spécificité de leur processus de près.

Si il n'y a aucun moyen que vous pouvez accomplir votre objectif à l'aide de l'API de Services, de le faire. L'écriture d'un Finder plugin va vous prendre 1-2 solide mois de développement méticuleux et raisonnablement profonde connaissance de C et Objective-C intérieurs.

Si vous êtes toujours convaincu que vous voulez faire pour cela, prenez mach_star. Bonne chance.

2voto

Martin Gordon Points 19587

Autant que je sache, il n'y a aucun officiel de l'architecture de plugin pour le Finder. Vous pouvez être en mesure d'ajouter des superpositions d'image pour les icônes par l'intermédiaire d'une application sans avoir à brancher dans le Finder, même si ça ne peut pas être à la volée. Je ne pense pas qu'il existe un moyen d'ajouter le menu contextuel des éléments à part les Actions de Dossiers et d'Automator. Vous pouvez aussi rechercher dans l'écriture d'une application externe pour surveiller les modifications du Système de Fichiers à l'aide de la FSEvents API.

2voto

dejuknow Points 459

Voici une solution finale pour l'icône Finder, des badges et des menus contextuels en Lion et Mountain Lion à l'aide des techniques décrites par Les Nie.

Liferay Nativité fournit un script bundle qui va swizzle pertinentes Finder méthodes et un client Java pour fixer les icônes et les menus contextuels. Il comprend également des projets équivalents pour Windows et Linux.

Le projet est open source sous licence LGPL, donc n'hésitez pas à apporter toutes les corrections de bugs ou des améliorations!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X