Date Control

// Creates a date control that uses YYYY-MM-DD format.
// Sticking to one standard date format simplifies life immensely.
// You can enter a date directly in YYYY-MM-DD format. You can also use up/down
// buttons. And you can also use the mouse scroll wheel.
// Two SetVariable controls are used - one to display the date and to accept a date string
// and the other to provide the up/down buttons.
// Does not support fractional dates or date and time.
// To try it, execute:
//  DemoDateControlPanel()

static Constant kDebugDateControl = 0   // Set to 1 for debug printouts

Function ConvertYYYYMMDDToIgorDate(dateStr)
    String dateStr      // In YYYY-MM-DD format

    String separatorStr = "-"

    Variable month, day, year
    String formatStr = "%d" + separatorStr + "%d" + separatorStr + "%d"
    sscanf dateStr, formatStr, year, month, day
    Variable dt = date2secs(year, month, day )
    return dt
End

Function/S SetDateControlDate(panelName, controlName, igorDateTimeValue)
    String panelName
    String controlName
    Variable igorDateTimeValue      // In Igor date/time format (seconds since 1904)
   
    String dateStr = Secs2Date(igorDateTimeValue, -2)
    SetVariable $controlName win=$panelName, value=_STR:dateStr
    return dateStr
End

// DateUpDownSetVarProc(sva)
// This is the action procedure for the SetVariable control that provides the
// up and down buttons.
Function DateUpDownSetVarProc(sva) : SetVariableControl
    STRUCT WMSetVariableAction &sva

    switch( sva.eventCode )
        case 1: // mouse up
        case 3: // Live update
            Variable dval = sva.dval
            ControlInfo DateStringSetVar
            String dateStr = S_value        // e.g., "2011-06-19"
            Variable igorDateTimeValue = ConvertYYYYMMDDToIgorDate(dateStr)
            igorDateTimeValue += dval * 86400
            dateStr = SetDateControlDate(sva.win, "DateStringSetVar", igorDateTimeValue)
            SetVariable DateUpDownSetVar value=_NUM:0
            if (kDebugDateControl)
                if (dval > 0)
                    Printf "Up button; Result = %s (Igor date/time value=%d)\r", dateStr, igorDateTimeValue
                else
                    Printf "Down button; Result = %s (Igor date/time value=%d)\r", dateStr, igorDateTimeValue
                endif
            endif
            break
    endswitch

    return 0
End

// DateStringSetVarProc(sva)
// This is the action procedure for the SetVariable control that displays the
// date and accepts manually-entered dates.
Function DateStringSetVarProc(sva) : SetVariableControl
    STRUCT WMSetVariableAction &sva
   
    Variable igorDateTimeValue
    String dateStr

    switch( sva.eventCode )
        case 1: // mouse up
            Printf "Mouse up: text = %s\r", sva.sval
            break
           
        case 2: // Enter key
            igorDateTimeValue = ConvertYYYYMMDDToIgorDate(sva.sval)
            dateStr = Secs2Date(igorDateTimeValue, -2)
            if (kDebugDateControl)
                Printf "Enter key: Result = %s (Igor date/time value=%d)\r", dateStr, igorDateTimeValue
            endif
            break
           
        case 4: // Scroll wheel up
            igorDateTimeValue = ConvertYYYYMMDDToIgorDate(sva.sval)
            igorDateTimeValue += 86400      // Add one day
            dateStr = SetDateControlDate(sva.win, sva.ctrlName, igorDateTimeValue)
            if (kDebugDateControl)
                Printf "Scroll wheel up: Result = %s (Igor date/time value=%d)\r", dateStr, igorDateTimeValue
            endif
            break
           
        case 5: // Scroll wheel down
            igorDateTimeValue = ConvertYYYYMMDDToIgorDate(sva.sval)
            igorDateTimeValue -= 86400      // Subtract one day
            dateStr = SetDateControlDate(sva.win, sva.ctrlName, igorDateTimeValue)
            if (kDebugDateControl)
                Printf "Scroll wheel down: Result = %s (Igor date/time value=%d)\r", dateStr, igorDateTimeValue
            endif
            break
    endswitch

    return 0
End

Window DemoDateControlPanel() : Panel
    PauseUpdate; Silent 1       // building window...
    NewPanel /W=(197,60,639,265) /K=2 as "Demo Date Control"
   
    SetVariable DateStringSetVar,pos={1,2},size={150,19},live=1,proc=DateStringSetVarProc,title="Date:"
    SetVariable DateStringSetVar,fSize=12,value= _STR:"2011-06-19"
   
    Variable hintVPos = 2                   // Works well on Macintosh
    #ifdef WINDOWS
        hintVPos = 3                        // Works better on Windows
    #endif
    TitleBox DateHint,pos={171,3},size={85,16},title="(YYYY-MM-DD)",fSize=12,frame=0
   
    Variable upDownSetVarWidth
    Variable upDownSetVarLeft
    if (CmpStr("Windows",IgorInfo(2)) == 0)
        upDownSetVarLeft = 149          // Works better on Windows
        upDownSetVarWidth = 14          // Works better on Windows
    else
        upDownSetVarLeft = 152          // Works better on Macintosh
        upDownSetVarWidth = 18          // Works well on Macintosh
    endif
    SetVariable DateUpDownSetVar,pos={upDownSetVarLeft,2},size={upDownSetVarWidth,19},proc=DateUpDownSetVarProc,fSize=12
    SetVariable DateUpDownSetVar,value= _NUM:0
EndMacro

Forum

Support

Gallery

Igor Pro 8

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More