Выражение диапазона (или среза) с помощью ScriptingBridge - PullRequest
0 голосов
/ 14 февраля 2011

Я пытаюсь выразить фрагмент («через AppleScript») в Objective-C, используя Scripting Bridge. Пример кода делает выбор на страницах iWorks. Код AppleScript выглядит следующим образом

 tell application "Pages"
     tell document 1
         select (characters 8 thru 14)
     end tell
 end tell

и код Objective-C здесь. Что мне нужно, так это способ выражения (символы с 8 по 14) в Objective-C.

PagesApplication *app;
app = [SBApplication applicationWithBundleIdentifier:@"com.apple.iWork.Pages"];
SBElementArray *docs = [app documents];
PagesDocument *doc = [docs objectAtIndex:0];

// now we need to express
// "select (characters 8 thru 14)" in obj-c

// ??

Благодарен за любую помощь. Бьорн

1 Ответ

0 голосов
/ 16 февраля 2011

Мне пришлось использовать AppleEvents низкого уровня.Сделал мониторинг Apple Events из командной строки.Вот код, который делает это:

AppleEvent eventToSend, eventToReceive;
OSStatus err;
AEBuildError buildError;

char *bundleID = "com.apple.iWork.Pages";

eventToSend.descriptorType    = 0;
eventToSend.dataHandle        = NULL;

eventToReceive.descriptorType = 0;
eventToReceive.dataHandle     = NULL;        

err = AEBuildAppleEvent(kAEMiscStandards,
                        kAESelect,
                        typeApplicationBundleID,
                        bundleID,
                        strlen(bundleID),
                        kAutoGenerateReturnID,
                        kAnyTransactionID,
                        &eventToSend,
                        &buildError,
                        "'----':'obj '{form:rang, want:type('cha '), seld:'rang' {"
                        "star:'obj '{form:indx, want:type('cha '), seld:long(@), from:ccnt()},"
                        "stop:'obj '{form:indx, want:type('cha '), seld:long(@), from:ccnt()}},"
                        "from:'obj '{form:indx, want:type(docu), seld:long(1), from:()}}", 8, 14);

if (err != noErr) {
    NSLog(@"failed to build Apple Event. Error code %d at pos %d\n", buildError.fError, buildError.fErrorPos);
    exit(1);
}

err = AESendMessage(&eventToSend, &eventToReceive, kAEWaitReply, kAEDefaultTimeout);

if (err != noErr) {
    NSLog(@"failed to send Apple Event\n");    
    exit(1);
}

/* deallocate memory */
AEDisposeDesc(&eventToReceive);
AEDisposeDesc(&eventToSend);
...