アラートダイアログを作成し、その上にDate Pickerを表示して日付の選択を行うAppleScriptです。
スクリプトエディタ、Script Debugger、Appletなどでは正常に動作しますが、スクリプトメニュー上から呼び出すとアラートダイアログが最前面に表示されず、前に出す操作が必要になります。
もともとはShane Stanleyが作成したカレンダー選択ダイアログでしたが、メインスレッドでの実行を強制しなくてはならなかったのと、汎用的に使える構造になっていなかったので、機能を整理しました。
このDate Pickerダイアログをもとに、さまざまなGUI部品を配置してちょっとしたユーザーの操作を受け付ける汎用ダイアログとして整備してみました。最終的には、SDEF(AppleScript用語辞書)をつけたAppleScript Librariesに仕上げるといい感じでしょうか。
アラートダイアログという、サイズ固定のダイアログウィンドウ上に各種GUI部品を表示するのは、使いにくいんじゃないかと疑問を持っていたのですが、表示後のリサイズはできないものの、中に入れるViewのサイズ次第でダイアログの大きさも可変なので、予想よりも使えそうです。
AppleScript名:アラートダイアログ上のDate Pickerで日付選択 |
— Created 2019-02-14 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" property NSAlert : a reference to current application’s NSAlert property NSDate : a reference to current application’s NSDate property NSView : a reference to current application’s NSView property NSDatePicker : a reference to current application’s NSDatePicker property NSRunningApplication : a reference to current application’s NSRunningApplication property NSClockAndCalendarDatePickerStyle : a reference to current application’s NSClockAndCalendarDatePickerStyle property NSYearMonthDayDatePickerElementFlag : a reference to current application’s NSYearMonthDayDatePickerElementFlag property NSHourMinuteSecondDatePickerElementFlag : a reference to current application’s NSHourMinuteSecondDatePickerElementFlag property theResult : missing value property returnCode : 0 set paramObj to {myMessage:"月選択", mySubMessage:"作成対象の月を選択してください。日付はどれでもけっこうです。"} set {targYear, targMonth, targDate} to my chooseDate:((paramObj) of me) –> {2018, 10, 8} on chooseDate:paramObj set aMainMes to myMessage of paramObj set aSubMes to mySubMessage of paramObj — create a view set theView to NSView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, 200, 300)) set datePicker to NSDatePicker’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, 300, 200)) datePicker’s setDatePickerStyle:(NSClockAndCalendarDatePickerStyle) datePicker’s setDatePickerElements:((NSYearMonthDayDatePickerElementFlag) + (NSHourMinuteSecondDatePickerElementFlag as integer)) datePicker’s setDateValue:(NSDate’s |date|()) set theSize to datePicker’s fittingSize() theView’s setFrameSize:theSize datePicker’s setFrameSize:theSize theView’s setSubviews:{datePicker} set theAlert to NSAlert’s alloc()’s init() — set up alert tell theAlert its setMessageText:aMainMes its setInformativeText:aSubMes its addButtonWithTitle:"OK" its addButtonWithTitle:"Cancel" its setAccessoryView:theView end tell — show alert in modal loop NSRunningApplication’s currentApplication()’s activateWithOptions:0 my performSelectorOnMainThread:"doModal:" withObject:(theAlert) waitUntilDone:true if (my returnCode as number) = 1001 then error number -128 set (my theResult) to (datePicker’s dateValue()) as date set aYear to year of theResult set aMonth to month of theResult as number set aDate to day of theResult return {aYear, aMonth, aDate} end chooseDate: on doModal:aParam set (my returnCode) to aParam’s runModal() end doModal: |