検索フィールドつきのTable View表示ダイアログを表示するAppleScriptです。項目選択を行う簡易ユーザーインタフェース(ダイアログ)で、選択肢の数が多い場合に備えて項目のキーワード抽出機能を付加したものです。
サーチフィールドの実装は無理かと思っていたのですが、単体でアラートダイアログ上に表示してみたら、予想外にキーボード入力イベントと検索語のクリアのイベントを簡単に拾えたので、Table Viewと組み合わせて試してみました。
AppleScript名:アラートダイアログ上にTable Viewを表示 v6_サーチフィールドつき |
— Created 2019-12-23 by Takaaki Naganoya — 2019 Piyomaru Software set aRes to displayCondTable() of filterTableDialogView –> {field3:"3.0GHz 6コア Intel Core i5(Turbo Boost使用時最大4.1GHz)", field2:198800, field1:"iMac 5K 27"} script filterTableDialogView use scripting additions use framework "Foundation" use framework "AppKit" property parent : AppleScript property NSView : a reference to current application’s NSView property NSAlert : a reference to current application’s NSAlert property NSIndexSet : a reference to current application’s NSIndexSet property NSPredicate : a reference to current application’s NSPredicate property NSScrollView : a reference to current application’s NSScrollView property NSTableView : a reference to current application’s NSTableView property NSSearchField : a reference to current application’s NSSearchField property NSTableColumn : a reference to current application’s NSTableColumn property NSMutableArray : a reference to current application’s NSMutableArray property NSRunningApplication : a reference to current application’s NSRunningApplication property NSModalPanelWindowLevel : a reference to current application’s NSModalPanelWindowLevel property theResult : 0 property returnCode : 0 property theDataSource : {} property tView : missing value property aDataList : {} on displayCondTable() set (my theResult) to 0 –initialize set aDataList to {{field1:"MacBook Air", field2:119800, field3:"1.6GHzデュアルコアIntel Core i5(Turbo Boost使用時最大3.6GHz)、4MB L3キャッシュ"}, {field1:"MacBook Pro 13", field2:139800, field3:"1.4GHzクアッドコアIntel Core i5(Turbo Boost使用時最大3.9GHz)、128MB eDRAM"}, {field1:"MacBook Pro 15", field2:258800, field3:"2.6GHz 6コアIntel Core i7(Turbo Boost使用時最大4.5GHz)、12MB共有L3キャッシュ"}, {field1:"Mac mini", field2:122800, field3:"3.0GHz 6コアIntel Core i5 Turbo Boost使用時最大4.1GHz 9MB共有L3キャッシュ"}, {field1:"iMac 21.5", field2:120800, field3:"2.3GHzデュアルコアIntel Core i5(Turbo Boost使用時最大3.6GHz)"}, {field1:"iMac 4K 21.5", field2:142800, field3:"3.6GHzクアッドコアIntel Core i3"}, {field1:"iMac 5K 27", field2:198800, field3:"3.0GHz 6コア Intel Core i5(Turbo Boost使用時最大4.1GHz)"}, {field1:"iMac Pro", field2:558800, field3:"3.2GHz Intel Xeon W Turbo Boost使用時最大4.2GHz 19MBキャッシュ"}, {field1:"Mac Pro 2019", field2:599800, field3:"3.5GHz 8コアIntel Xeon Wプロセッサ(Turbo Boost使用時最大4.0GHz)"}} set paramObj to {myMessage:"項目の選択", mySubMessage:"適切なものを以下からえらんでください", aTableList:aDataList, aSortOrder:{"field1", "field2", "field3"}} –my chooseItemByTableView:paramObj –for debug my performSelectorOnMainThread:"chooseItemByTableView:" withObject:paramObj waitUntilDone:true return (my theResult) end displayCondTable on chooseItemByTableView:paramObj set aMainMes to myMessage of paramObj set aSubMes to mySubMessage of paramObj set aTList to (aTableList of paramObj) as list set labelSortList to (aSortOrder of paramObj) as list set aWidth to 800 set aHeight to 300 –Viewをつくる set parentView to NSView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aWidth, aHeight)) set aTextInput to makeNSSearchField(0, aHeight – 20, 300, 20) of me set aScroll to makeTableView(aTList, aWidth, aHeight – 80, labelSortList) of me parentView’s setSubviews:{aTextInput, aScroll} — set up alert set theAlert to NSAlert’s alloc()’s init() tell theAlert its setMessageText:aMainMes its setInformativeText:aSubMes its addButtonWithTitle:"OK" its addButtonWithTitle:"Cancel" its setAccessoryView:(parentView) set myWindow to its |window| end tell myWindow’s setLevel:(NSModalPanelWindowLevel) — show alert in modal loop NSRunningApplication’s currentApplication()’s activateWithOptions:0 my performSelectorOnMainThread:"doModal:" withObject:(theAlert) waitUntilDone:true if (my returnCode) = 1001 then error number -128 set tmpResult to (aScroll’s documentView’s selectedRow()) + 1 set (my theResult) to contents of item tmpResult of ((my theDataSource) as list) end chooseItemByTableView: on doModal:aParam set (my returnCode) to (aParam’s runModal()) as number end doModal: –TableView Event Handlers on numberOfRowsInTableView:aView return (my theDataSource)’s |count|() end numberOfRowsInTableView: on tableView:aView objectValueForTableColumn:aColumn row:aRow set aRec to (my theDataSource)’s objectAtIndex:(aRow as number) set aTitle to (aColumn’s headerCell()’s title()) as string set aRes to (aRec’s valueForKey:aTitle) return aRes end tableView:objectValueForTableColumn:row: on makeTableView(aDicList, aWidth, aHeight, labelSortList) set aOffset to 40 set theDataSource to NSMutableArray’s alloc()’s init() theDataSource’s addObjectsFromArray:aDicList –TextField set aTextInput to makeNSSearchField(0, 0, 300, 20) of me set aScroll to NSScrollView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, aOffset, aWidth, aHeight)) set tView to NSTableView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, aOffset, aWidth, aHeight)) set aLen to length of labelSortList repeat with i in labelSortList set j to contents of i set aColumn to (NSTableColumn’s alloc()’s initWithIdentifier:j) (aColumn’s setWidth:(aWidth div aLen)) (aColumn’s headerCell()’s setStringValue:j) (tView’s addTableColumn:aColumn) end repeat tView’s setDelegate:me tView’s setDataSource:me tView’s reloadData() aScroll’s setDocumentView:tView tView’s enclosingScrollView()’s setHasVerticalScroller:true aScroll’s setVerticalLineScroll:(30.0 as real) –1行目を選択 set aIndexSet to NSIndexSet’s indexSetWithIndex:0 tView’s selectRowIndexes:aIndexSet byExtendingSelection:false –強制的にトップにスクロール set aDBounds to aScroll’s documentView()’s |bounds|() if class of aDBounds = list then –macOS 10.13 or later set maxHeight to item 2 of item 1 of aDBounds else –macOS 10.10….10.12 set maxHeight to height of |size| of aDBounds end if set aPT to current application’s NSMakePoint(0.0, -1 * (maxHeight as real)) aScroll’s documentView()’s scrollPoint:aPT return aScroll end makeTableView on alertShowHelp:aNotification display dialog "Help Me!" buttons {"OK"} default button 1 with icon 1 return false –trueを返すと親ウィンドウ(アラートダイアログ)がクローズする end alertShowHelp: on makeNSSearchField(xPos as integer, yPos as integer, myWidth as integer, myHeight as integer) set aSearchF to NSSearchField’s alloc()’s initWithFrame:(current application’s NSMakeRect(xPos, yPos, myWidth, myHeight)) aSearchF’s setDelegate:(me) return aSearchF end makeNSSearchField –検索クエリ入力時 on searchFieldDidStartSearching:(aField) set aStr to (aField’s stringValue()) as string set predicStr to "field1 contains[cd] ’" & aStr & "’ OR field3 contains[cd] ’" & aStr & "’" set filteredArray to filterRecListByLabel1((my aDataList), predicStr) of me set (my theDataSource) to filteredArray tView’s reloadData() end searchFieldDidStartSearching: –Search Fieldの「x」ボタンを押したイベント on searchFieldDidEndSearching:(aField) set (my theDataSource) to NSMutableArray’s arrayWithArray:(my aDataList) tView’s reloadData() end searchFieldDidEndSearching: –リストに入れたレコードを、指定の属性ラベルの値で抽出 on filterRecListByLabel1(aRecList as list, aPredicate as string) set aArray to NSMutableArray’s arrayWithArray:aRecList set aPredicate to NSPredicate’s predicateWithFormat:aPredicate set filteredArray to aArray’s filteredArrayUsingPredicate:aPredicate return filteredArray end filterRecListByLabel1 end script |