2009-08-18 17 views
45

Estoy buscando una guía o código de muestra para escribir los complementos de Mac OS X Finder? Se le gustaría saber cómo hacer algunas acciones simples:Cómo escribir el complemento de OS X Finder

  1. añadiendo capas superpuestas de imágenes a iconos
  2. añadiendo elementos del menú contextual
  3. Escuchar archivo cambia

me pareció que los dos recursos siguientes:

Estoy tentado de revisar el código SCPlugin, pero esperaba encontrar una muestra más fácil de digerir.

+2

Ha pasado un tiempo desde esta publicación, con 10.6 disponibles. ¿Has logrado lo que intentabas? ¿Fuiste con las tácticas del complemento Finder? – epologee

+1

¿Alguna actualización sobre esto para el león? – Tony

+0

@LesNie debajo de los enlaces a su proyecto [Finder Icon Overlay] (https://github.com/lesnie/Finder-Icon-Overlay). Vinculación en caso de que alguien más tenga dificultades para encontrar un ejemplo de complemento de OS X Finder de código abierto (como yo lo hice). – pkamb

Respuesta

16

Lamentablemente, la programación de un plug-in Buscador realidad qué todavía requieren ensuciarse las manos con el COM. Si observa el subproyecto SCFinderPlugin del proyecto SCPlugin, encontrará que sigue exactamente las mismas técnicas descritas en su primer enlace, incluida la configuración de un vtable para COM, la escritura de funciones AddRef/ReleaseRef, y así sucesivamente. Escribir un complemento, en el que simultáneamente está administrando la gestión de memoria Carbon de la vieja escuela, la gestión de memoria estilo COM y la gestión de memoria Carbon de Cocoa/estilo nuevo, puede ser un dolor increíble — y eso ignora por completo el hecho de que estará interactuando en tres o más API radicalmente diferentes, con diferentes convenciones de nomenclatura y semántica de llamadas. Llamar a la situación histéricamente pobre sería una gran subestimación.

Del lado positivo, el Finder en Mac OS X 10.6 Snow Leopard ha sido completamente reescrito en Cocoa, y con eso vienen interfaces de plugins enormemente superiores. Si tienes la suerte de estar en una situación en la que solo puedes apuntar a Snow Leopard, probablemente deberías obtener un ADC Premier o una membresía superior, descargar las compilaciones preliminares y codificar contra eso. Además, su plugin puede no funcionar en 10.6 de todos modos sin una reescritura de Cocoa, por lo que podría tener sentido echar un vistazo a Snow Leopard antes de que se lance, independientemente.

+0

gracias por la explicación. Voy a esperar el lanzamiento público de Snow Leopard. – notnoop

+1

¿Alguna idea de dónde puedo encontrar información sobre las interfaces del complemento Finder mencionadas (para OS X Lion)? – jsherk

+0

Desafortunadamente no se menciona. Los complementos que conozco (por ejemplo, los de Dropbox) funcionan inyectándose en el Finder a través de llamadas a Mach —, no exactamente en la dirección en la que creía que iba Apple en ese momento. –

1

Las selecciones son escasas; nunca ha sido realmente claro para mí si Finder Plugins es realmente compatible. Algunas pistas más:

  • SampleCMPlugIn - De carbono, por supuesto, ya que también lo es Finder. Tenga en cuenta que casi cualquier complemento de Finder probablemente dejará de funcionar con 10.6.
  • Automator puede guardar cosas como un "complemento de Finder". Es una versión más compatible de lo que está discutiendo, pero por supuesto menos flexible.
2

Por lo que yo sé, no hay una arquitectura de complemento oficial para el Finder. Es posible que pueda agregar superposiciones de imágenes a iconos a través de una aplicación externa sin tener que enganchar en el Finder, aunque no sería sobre la marcha. No creo que haya una manera de agregar elementos de menú contextual aparte de Acciones de carpeta y Automator. También puede buscar escribir una aplicación externa para monitorear los cambios del Sistema de archivos usando el FSEvents API.

14

No hay un sistema de complemento oficial o compatible para Finder. Comenzando con OS X 10.6, necesitará inyectar código en el proceso del Finder y anular los métodos del objetivo C en el proceso del Finder.

He hecho esto para un proyecto propietario. Puedo decirte que la razón por la que no hay ejemplos o tutoriales para esto es porque es una tarea de desarrollo significativamente difícil y que requiere mucho tiempo. Por esta razón, hay muchos incentivos para que las personas u organizaciones que lo hayan logrado guarden estrechamente los detalles de su proceso.

Si hay alguna manera de que pueda lograr su objetivo utilizando la API de servicios, hágalo. Escribir un complemento Finder le llevará 1-2 sólido meses de desarrollo minucioso y un conocimiento razonablemente profundo de los elementos internos C y Objective-C.

Si todavía está convencido de que desea hacer esto, tome mach_star. Buena suerte.

28

El proyecto de ejemplo Finder Icon Overlay representa un ejemplo pequeño y muy básico pero realmente funcional de la respuesta a continuación.

https://github.com/lesnie/Finder-Icon-Overlay

Sé que esto es tan viejo, pero algunos pueden ser todavía está interesado en el tema (?)

Aquí es lo que he hecho que bajo Leopard (10.6). Al principio se necesitan los encabezados adecuados de Finder. Use la herramienta de volcado de clase para obtenerlo. Luego, escriba su código como un complemento SIMBL (consulte la documentación sobre cómo hacerlo), modificando algunos métodos. Por ejemplo, para dibujar algo sobre un ícono en ListView, drawIconWithFrame: el método de TIconAndTextCell debe ser reemplazado.

Aquí está el código para el método 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:)),"[email protected]:{CGRect={CGPoint=dd}{CGSize=dd}}"); 

    old = class_getInstanceMethod(finder_class, @selector(drawIconWithFrame:)); 
    new = class_getInstanceMethod(finder_class, @selector(FT_drawIconWithFrame:)); 
    method_exchangeImplementations(old, new); 

} 

estoy superior "drawIconWithFrame:" método con mi método "FT_drawIconWithFrame:". A continuación se muestra la implementación de este método.

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

Esencialmente empates "myPrettyIconOverlayImage" sobre cada icono de archivo con nombre comienza con la letra "A". Esta lógica depende de ti.

Preste atención a esta línea: [self FT_drawIconWithFrame:arg1]; esta es la forma de llamar a 'super' para obtener el icono y el nombre normal, etc. Lo sé, se ve raro, como bucle, pero en realidad no lo es. Luego envuelve el plugin SIMBL, instala SIMBL y ... ejecuta.

Debido a los cambios en Lion algunos trabajos deben realizarse desde cero (haga un nuevo archivo "Finder.h" con todas las declaraciones necesarias, encuentre la clase y los métodos adecuados para anular), pero esta técnica aún funciona.

Happy hacking!

+0

Después de usar este código, no puede vender su producto en la tienda de aplicaciones de Apple. –

+0

Sí, yo también estoy de acuerdo con @jennifer ... lo que estás haciendo no parece totalmente legal –

+4

Sí, probablemente. Sin embargo, este es el único método que puede alcanzar dicha funcionalidad (superposiciones de iconos) en Finder. Puede ser la razón por la que Dropbox no está disponible en AppStore. –

2

Aquí hay una solución completa para las insignias de iconos de Finder y los menús contextuales en León y León de montaña usando las técnicas descritas por Les Nie.

Liferay Nativity proporciona un paquete de secuencias de comandos que encandilará los métodos de búsqueda relevantes y un cliente de Java para configurar los iconos y los menús de contexto. También incluye proyectos equivalentes para Windows y Linux.

El proyecto es de código abierto bajo LGPL, así que no dude en contribuir con cualquier corrección de errores o mejoras.

21

Para Yosemite (MacOS 10.10 & más reciente), se puede usar de Apple FinderSync framework, lo que permite que las extensiones del Finder para:

  • expreso interés en carpeta específica jerarquías
  • proporcionar "insignias" a indican el estado de los elementos dentro de esas jerarquías
  • Proporcionar elementos de menú dinámicos en los menús contextuales del Finder, cuando los elementos seleccionados (o el objetivo de la ventana) están en esas jerarquías
  • Proporcione un elemento de barra de herramientas que muestra un menú con elementos dinámicos (incluso si la selección es no relacionado)
+0

¡pulgar arriba para esta información! –

0

Para añadir Buscador/Archivo superposiciones icono del navegador y menús de contexto, de manera multiplataforma, desde Java, miren la biblioteca Liferay Nativity.

También menciono esto en another SO post, que también contiene enlaces a los documentos y API 'Finder Sync' de Apple.

Cuestiones relacionadas