Как получить элемент файла правой кнопкой мыши в Finder на OSX - PullRequest
1 голос
/ 22 декабря 2011

Я пишу плагин через mach_inject, чтобы добавить элемент в контекстное меню Finder. Я успешно добавил его, подключив NSMenu. Но теперь мне нужно, чтобы получить элемент, который щелкнул правой кнопкой мыши. Кто-то сказал, что мы могли бы использовать следующий код, но он может получить только выбранные элементы вместо элемента, по которому щелкнули правой кнопкой мыши (Они разные !!!! В Finder, если вы выберете один элемент и щелкнете правой кнопкой мыши по другому элементу, выбранный выиграет не меняются). Кто-нибудь знает, как получить элемент правой кнопкой мыши в Finder? Спасибо!

SBElementArray * selection = [[finder selection] get];

NSArray * items = [selection arrayByApplyingSelector:@selector(URL)];
for (NSString * item in items) {
    NSURL * url = [NSURL URLWithString:item];
    NSLog(@"selected item url: %@", url);
}

1 Ответ

2 голосов
/ 11 апреля 2013

Прежде чем получить выбранные файлы, вам следует подготовить код справки

struct TFENode {
struct OpaqueNodeRef *fNodeRef;
};

struct TFENodeVector {
    struct TFENode *_begin;
    struct TFENode *_end;
    struct TFENode *_end_cap;
};

- (NSArray *)arrayForNodeVector:(const struct TFENodeVector *)vector
{
    NSInteger capacity = vector->_end - vector->_begin;
    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:capacity];
    struct TFENode *node;
    for (node = vector->_begin; node < vector->_end; ++node) {
        [array addObject: [self pathForNode:node]];
    }
    return array;
}

Вы можете получить такие файлы

// Snow Leopard & Lion
// gNodeHelper is where you put above code
// override_handleContextMenuCommon: is your override function

+ (void)override_handleContextMenuCommon:(unsigned int)context
                                   nodes:(const struct TFENodeVector *)nodes
                                   event:(id)event
                                    view:(id)view
                        windowController:(id)windowController
                              addPlugIns:(BOOL)flag
{
    NSArray *paths = [gNodeHelper arrayForNodeVector:nodes];

    [self override_handleContextMenuCommon:context
                                     nodes:nodes
                                     event:event
                                     view:view
                         windowController:windowController
                               addPlugIns:flag];

}
...