Pop-up Calendar

Is there any way I can have a calendar popup to help me choose the correct date in a macro? As it is now I have to open my calendar while I am filling in macro fields.

1 Like

Try this AppleScript:

# 06/04/16 09:35:02
# Author: Shane Stanley
# Adapted by Christopher Stone
# Modified 2018-08-18 by Michael Grant: use current date as initial date

#use AppleScript version "2.3.1"
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

my datePicker()

on datePicker()

set theApp to path to frontmost application as text
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, 175))

-- 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)
#datePicker's setDatePickerStyle:(current application's NSTextFieldAndStepperDatePickerStyle)
#datePicker's setDatePickerStyle:(current application's NSTextFieldDatePickerStyle)

-- 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|())

--set theCal var to a new(empty) instance of the calendar
set theCal to current application's class "NSCalendar"'s currentCalendar()

-- unpack the components of theCal to a variable
set theComponents to theCal's components:254 fromDate:(current application's NSDate's |date|())
theComponents's setSecond:0
theComponents's setMinute:0
theComponents's setHour:12
--theComponents's setYear:2015
--theComponents's setMonth:4
--theComponents's setDay:1
theComponents's setYear:(year of (current date) as integer)
theComponents's setMonth:(month of (current date) as integer)
theComponents's setDay:(day of (current date) as integer)
datePicker's setDateValue:(theCal's dateFromComponents:theComponents)

-- 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 and time"
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 datePicker's dateValue() as date

# Shane Stanley
# http://macscripter.net/viewtopic.php?pid=119633#p119633

set theDate to datePicker's dateValue()
#set theCal to current application's class "NSCalendar"'s currentCalendar()

-- unpack the components of theDate to a variable
set theComponents to theCal's components:254 fromDate:theDate
set theDate to current date
set day of theDate to 1 -- important
set seconds of theDate to theComponents's |second|()
set year of theDate to theComponents's |year|()
set month of theDate to theComponents's |month|()
set day of theDate to theComponents's |day|()
set hours of theDate to theComponents's hour()
set minutes of theDate to theComponents's minute()
return (theDate as text)

#return (theDate)
end datePicker
2 Likes

If you just want to see the date and time, you could use this:

1 Like