検索フィールドつきの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 |
More from my site
(Visited 118 times, 1 visits today)
アラートダイアログ上にTable Viewを表示 v8_ソート、並び替え、複数選択 – AppleScriptの穴 says:
[…] v6 […]
Dean says:
Your web site is a really great resource. I was hoping you could point me inthe right direction on this to be able to add +/- rows to the table. I would like to add this table to a dialog I am creating. Also the color menu, would like to be able to add it to a dialog box. It the moment the example is standalone dialog. Any advice would be appreciated!
Thanks
Dean
Takaaki Naganoya says:
Hi Dean,
It is not so difficult to add new row to the table. How to input them will be a headache. Cocoa Scripting on Script Editor is not euqal to writing Cocoa based app on Xcode. So, If you can separate brossing interface and data input view, It will be more easier.
Removing the selected row in the table is not so difficult, too. NSTableView’s selectedRow property will give you the answer.
Clicking a button and receive the event flow is like this script. Each issue is not so difficult…but in combining phase may give us some confusing behavior.
tqbinh says:
Hi Takaaki Naganoya
The script works if run from AppleScript Editor. However, if save and run it as a app, I can not enter text into the search edit box (it takes focus, but no text accepted).
Also, can you make the search edit box get keyboard focus when running the script?
Takaaki Naganoya says:
My macOS 10.14.6, 10.15.7 and 11.0 beta 9 search field on applet accepted text input and search.
Did you clicked search field before text input?
tqbinh says:
Thank you for reply.
The problem is observed on High Sierra (my version is 10.13.3). On Catalina 10.15.6 it’s OK.
Yes, I always click the search field before text input.
The problem arises only when I export and run script as an App. I doesn’t arise when running from Script Editor.
Takaaki Naganoya says:
I ensured your post. My 10.13.6 environment did not accept text input on search field of the applet.
macOS 10.13, “Vista” is a poisonous swamp. It is the worst version of macOS ever.
I can’t help macOS 10.13 users. The only solution is to avoid to use macOS 10.13 (back to 10.12 or update to 10.14 is the only solution).
tqbinh says:
Thank you. I understand the situation.