ABPersonPickerでアドレスブックに登録のあるPerson(人)をダイアログ選択するAppleScriptです。
ずいぶんと前に作ってあったものの、活用できる機会がまったくなくて埃をかぶっていました。Alertダイアログ上に表示できないかと修正してみたものの、ABPersonPickerがWindowを要求するようで、書き換えてもうまく動かなかったために「誰か改良してくれるかもしれないし、掲載しとくかー」と、引っ張り出してきたものです。
本Scriptは人物(Person)1人を選択するものであるため、正確にいえば、Person Pickerですね。
人物の選択を行うための機能はAppleScriptには提供されていないため、一般的にはアドレスブックに登録されている全員の氏名を一括で取得してchoose from listで選択するといった話になることでしょう。
それよりは幾分マシではあるものの、使い勝手という面ではさっぱりです。アドレスブック(連絡先)でAppleScriptプラグインが(macOS 10.14で)使えなくなりましたが、このような代替案だったり、使い物にならない連作先.appの代わりにAddressBookフレームワークにアクセスしてPerson情報をしぼりこんでScriptを実行するようなプログラムを作ることになるでしょう。
連絡先(旧称アドレスブック)、カレンダー(旧称iCal)は「ただ動けばいい」ぐらいのぞんざいな作りなのが本当に残念です。
▲macOS 10.14.5(Dark Mode)上で実行したところ
▲ ABPersonPicker上でキーワードによる絞り込みもリアルタイムに行える
AppleScript名:People Picker |
— Created 2017-12-20 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" use framework "AddressBook" property NSView : a reference to current application’s NSView property NSScreen : a reference to current application’s NSScreen property NSButton : a reference to current application’s NSButton property NSWindow : a reference to current application’s NSWindow property ABPersonPicker : a reference to current application’s ABPersonPicker property NSRectEdgeMaxX : a reference to current application’s NSRectEdgeMaxX property NSWindowController : a reference to current application’s NSWindowController property NSTitledWindowMask : a reference to current application’s NSTitledWindowMask property NSRoundedBezelStyle : a reference to current application’s NSRoundedBezelStyle property NSNormalWindowLevel : a reference to current application’s NSNormalWindowLevel property NSBackingStoreBuffered : a reference to current application’s NSBackingStoreBuffered property NSMomentaryLightButton : a reference to current application’s NSMomentaryLightButton property windisp : false property selectedPerson : missing value on run set (my selectedPerson) to missing value my performSelectorOnMainThread:"dispPeoplePicker:" withObject:(missing value) waitUntilDone:true if (my selectedPerson) = missing value then return false set firstName to (my selectedPerson’s |First|) as string set lastName to (my selectedPerson’s |Last|) as string return {lastName, firstName} end run on dispPeoplePicker:aParam set aWidth to 300 set aHeight to 100 choosePeople(aWidth, aHeight, "Result", "OK", 180) of me end dispPeoplePicker: on choosePeople(aWidth as integer, aHeight as integer, aTitle as text, aButtonMSG as text, timeOutSecs as number) set (my windisp) to true –Buttonをつくる set bButton to (NSButton’s alloc()’s initWithFrame:(current application’s NSMakeRect(aWidth / 4, 0, aWidth / 2, 40))) bButton’s setTitle:aButtonMSG bButton’s setButtonType:(NSMomentaryLightButton) bButton’s setBezelStyle:(NSRoundedBezelStyle) bButton’s setKeyEquivalent:(return) bButton’s setTarget:me bButton’s setAction:("clicked:") –NSViewをつくる set aNSV to NSView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aHeight, aWidth)) aNSV’s addSubview:bButton aNSV’s setNeedsDisplay:true –NSWindowをつくる set aWin to makeWinWithView(aNSV, aWidth, aHeight, aTitle, 1.0) –NSWindowControllerをつくる set wController to NSWindowController’s alloc() wController’s initWithWindow:aWin wController’s showWindow:me –People Pickerをつくる set anAB to ABPersonPicker’s alloc()’s init() anAB’s showRelativeToRect:(current application’s NSMakeRect(0, 0, 200, 200)) ofView:aNSV preferredEdge:(NSRectEdgeMaxX) anAB’s setDelegate:(me) –NSWindowの最前面表示 aWin’s makeKeyAndOrderFront:me set aCount to timeOutSecs * 10 –timeout seconds * 10 repeat aCount times if (my windisp) = false then exit repeat end if delay 0.1 end repeat my closeWin:aWin end choosePeople –Button Clicked Event Handler on clicked:aSender set (my windisp) to false end clicked: –make Window for Input on makeWinWithView(aView, aWinWidth, aWinHeight, aTitle, alphaV) set aScreen to NSScreen’s mainScreen() set aFrame to {{0, 0}, {aWinWidth, aWinHeight}} set aBacking to NSTitledWindowMask set aDefer to NSBackingStoreBuffered — Window set aWin to NSWindow’s alloc() (aWin’s initWithContentRect:aFrame styleMask:aBacking backing:aDefer defer:false screen:aScreen) aWin’s setTitle:aTitle aWin’s setDelegate:me aWin’s setDisplaysWhenScreenProfileChanges:true aWin’s setHasShadow:true aWin’s setIgnoresMouseEvents:false aWin’s setLevel:(NSNormalWindowLevel) aWin’s setOpaque:false aWin’s setAlphaValue:alphaV –append aWin’s setReleasedWhenClosed:true aWin’s |center|() aWin’s makeKeyAndOrderFront:(me) — Set Custom View aWin’s setContentView:aView return aWin end makeWinWithView –close win on closeWin:aWindow repeat with n from 10 to 1 by -1 (aWindow’s setAlphaValue:n / 10) delay 0.02 end repeat aWindow’s |close|() end closeWin: on personPicker:(aPicker) didChoosePerson:(aPerson) |property|:(aProperty) identifier:(anID) log {"personPicker:didChoosePerson:"} log aPicker log aPerson log aProperty log anID copy aPerson to my selectedPerson end personPicker:didChoosePerson:|property|:identifier: on personPickerDidClose:(aPicker) log {"personPickerDidClose"} set (my windisp) to false end personPickerDidClose: |
More from my site
(Visited 66 times, 1 visits today)