Archive for the 'NSDatePicker' Category

2015/08/20 ASOCでdate pickerによる日付選択

Shane StanleyのScript Library「BridgePlus」の機能を用いた日付/時刻選択インタフェース「date picker」による日付/時刻選択を行うAppleScriptです。実行には、あらかじめBridgePlusをインストールしておく必要があります。

datepicker1.png
▲ASObjC Explorer 4での実行画面

datepicker2.png
▲Script Editorでの実行画面(Control-Command-R)

そうそう、こういうのが(OS標準で)欲しかったんですよね〜。あと、開始日と終了日の選択とか、休日を選択できないようにできるといいかも。

AppleScript名:ASOCでdate pickerによる日付選択
– Created 2015-08-20 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
use script “BridgePlus” – for pre-10.11 compatibility

if not (current application’s NSThread’s isMainThread()) as boolean then
  display alert “This script must be run from the main thread.” buttons {“Cancel”} as critical
  
error number -128
end if

– create a view
set theView to current application’s NSView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, 100, 200))

– create date picker
set datePicker to current application’s NSDatePicker’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, 100, 100))

– set style: choices are NSTextFieldAndStepperDatePickerStyle, NSClockAndCalendarDatePickerStyle, or NSTextFieldDatePickerStyle
datePicker’s setDatePickerStyle:(current application’s NSClockAndCalendarDatePickerStyle)

– set elements: choices include NSHourMinuteDatePickerElementFlag, NSHourMinuteSecondDatePickerElementFlag, NSTimeZoneDatePickerElementFlag, NSYearMonthDatePickerElementFlag, and NSEraDatePickerElementFlag
datePicker’s setDatePickerElements:((current application’s NSYearMonthDayDatePickerElementFlag) + (current application’s NSHourMinuteSecondDatePickerElementFlag as integer))

– set initial date
datePicker’s setDateValue:(current application’s NSDate’s |date|())

– get the size it needs
set theSize to datePicker’s fittingSize()

–resize the picker and view accordingly
theView’s setFrameSize:theSize
datePicker’s setFrameSize:theSize

– add the picker to the view
theView’s setSubviews:{datePicker}

– create an alert
set theAlert to current application’s NSAlert’s alloc()’s init()

– set up alert
tell theAlert
  its setMessageText:“Pick a date”
  
its setInformativeText:“Any date”
  
its addButtonWithTitle:“OK”
  
its addButtonWithTitle:“Cancel”
  
its setAccessoryView:theView
end tell

– show alert in modal loop
set returnCode to theAlert’s runModal()
if returnCode = (current application’s NSAlertSecondButtonReturn) then error number -128

– retrieve date
set theDate to ASify from (datePicker’s dateValue()) – or simply coerce to date in 10.11

–>  date “2015年8月20日木曜日 19:43:58″

★Click Here to Open This Script 

2013/11/17 AppleScriptObjCでNSDatePickerに値を設定、取得

AppleScriptObjCで、ウィンドウ上に設置したNSDatePickerに日付の値を設定したり、NSDatePickerから値を取得するサンプルです。

NSDatePicker(以下、DatePicker)は、日付情報を入力するための標準GUI部品。最近は、カレンダー.appで使われているようなカレンダー表示付きのDatePickerなどもあり、これも普通に利用できるとよいでしょう(最悪、自前でカレンダー表示インタフェースを実装してカレンダーから日付を選択してもいいですし)。

DatePickerから値を取得するサンプルは海外のBBSにもあったのですが、DatePickerに日付情報を設定する処理が見つからなかったので、そこを補ってみました。

date1.png
▲起動時にDatePickerに現在の日付を設定

date2.png
▲ボタンをクリックすると、DatePickerから各種日付情報を取り出してダイアログにテスト表示

本サンプルでは、GMT(グリニッジ標準時)との時差を+0000で指定していますが、本来の意味においては正しくないような気がします。日本標準時(JST)はGMT+9.0なので、そのあたりを正しく指定して大丈夫なようにタイムゾーンを考慮してNSDateを指定できるとよいだろうか、と(ぼんやり)考えています。

AppleScriptのdateオブジェクトにはタイムゾーンの要素はないので、AppleScript的な処理の方法とCocoa的な価値観の間で揺れている「どちらから見ても中途半端」な感じのコードになっていますが、AppleScriptObjCのサンプルコードがAppleから出ているわけでもないので、とりあえずは「こうやれば動く」的なコードを出してみて、「ここはこうすべき」的な意見が出れば変えていく、というところでしょうか。

このサンプルが「とりあえず動く」レベルであることを認識する必要があり、同時に複数のタイムゾーン上の日付を扱うと(このレベルの実装だと)混乱するよ、ということを参考までに書いておきます(滅多にないんですけれども)。

本掲載リストは、Xcodeから選択中のAppleScriptファイル(テキストファイル)を取得して、AppleScriptObjC Explorer 2をコントロールしてテキストエディットに書式つきデータでコピペして、テキストエディットからHTML書き出し(AppleScriptで自動処理)しているのですが……Xcodeの外部エディタのAppleScriptObjC Explorer 2を経由するために、ハンドラの書式が「setString_(aVar)」スタイルから、「setString:aVar」スタイルに書き換えられてしまっています。

添付のXcodeプロジェクト中では「setString_(aVar)」スタイルで記述していますので、OS X 10.8上でも編集、実行できるはずです。

→ Xcodeプロジェクトのダウンロード(50KBytes)

AppleScriptObjCファイル名:datePickAppDelegate.applescript

– datePickAppDelegate.applescript
– datePick

– Created by Takaaki Naganoya on 09/11/22.
– Copyright 2009 Takaaki Naganoya. All rights reserved.


script datePickAppDelegate
  property parent : class “NSObject”
  
property datePicker : missing value
  
  
  
  on applicationWillFinishLaunching:aNotification
    
    tell current application
      set aCurDate to current date
      
set aYear to (year of aCurDate) as string
      
set aMonth to (month of aCurDate as number) as string
      
set aDay to (day of aCurDate) as string
      
    end tell
    
    set dStr to aYear & “-” & aMonth & “-” & aDay & ” 00:00:00 +0000″
    
log dStr
    
    set aDate to current application’s NSDate’s dateWithString:dStr
    
log aDate
    
    datePicker’s setDateValue:aDate
    
  end applicationWillFinishLaunching:
  
  on applicationShouldTerminate:sender
    return true
  end applicationShouldTerminate:
  
  
  
  
on clicked:sender
    
    set theDate to my datePicker’s dateValue()
    
set theCal to current application’s class “NSCalendar”’s currentCalendar()
    
set theComponents to theCal’s components:254 fromDate:theDate
    
    –Get Date properties
    
set theYear to theComponents’s |year|()
    
set theMonth to theComponents’s |month|()
    
set theDay to theComponents’s |day|()
    
set theHour to theComponents’s hour()
    
set theMinute to theComponents’s minute()
    
set theSecond to theComponents’s |second|()
    
    display dialog ((theYear as text) & return & theMonth as text) & return & theDay as text
    
  end clicked:
  
end script

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に