; $Id: calendar.pro,v 1.2 1993/10/18 16:13:29 doug Exp $ ;+ ; NAME: ; CALENDAR ; ; PURPOSE: ; Display a calandar for a month or an entire year using IDL's ; plotting subsystem. This IDL routine imitates the Unix cal ; command. ; ; CATEGORY: ; Misc. ; ; CALLING SEQUENCE: ; CALENDAR ; CALENDAR, YEAR ; CALENDAR, MONTH, YEAR ; ; INPUTS: ; If called without arguments, CALENDAR draws a calendar for the ; current month. ; ; MONTH: The number of the month for which a calandar is ; desired (1 is January, 2 is February, ..., 12 is December). ; ; YEAR: The number of the year for which a calendar should be ; drawn. If YEAR is provided without MONTH, a calendar ; for the entire year is drawn. ; ; OPTIONAL INPUT PARAMETERS: ; None. ; ; OUTPUTS: ; The specified calandar is drawn on the current graphics device. ; ; COMMON BLOCKS: ; None. ; ; SIDE EFFECTS: ; None. ; ; RESTRICTIONS: ; None. ; ; MODIFICATION HISTORY: ; AB, September, 1988 ;- ; pro CAL_INFO, MONTH, YEAR, START_SQUARE, NUM_DAYS L_MONTH = MONTH - 1 MONTHS = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] DAY = (JULDAY(1, 1, YEAR) + 1) MOD 7 DAY1_NEXT_YEAR = (JULDAY(1, 1, YEAR+1) + 1) MOD 7 case ((DAY1_NEXT_YEAR + 7 - DAY) mod 7) of 2 : 1 : MONTHS(1) = 28 ; Not a leap year else: MONTHS(8) = 19 ; 1752 endcase for I = 0, L_MONTH - 1 do DAY = DAY + MONTHS(I) START_SQUARE = (DAY MOD 7) NUM_DAYS = MONTHS(L_MONTH) end pro DRAW_CAL, XR, YR, MONTH, YEAR, SMALL MONTHS = ['January','February','March','April','May','June','July','August', $ 'September','October','November','December'] x_range = xr(1) - xr(0) y_range = yr(1) - yr(0) if (SMALL) then y_div = 7. else y_div = 6. x_delta = x_range / 7. y_delta = y_range / y_div TSIZE = 2.5 * x_range if (SMALL) then TSIZE = TSIZE * 1.75 if (not SMALL) then begin ; Frame plots,/norm,[xr(0),xr(1),xr(1),xr(0),xr(0)],[yr(0),yr(0),yr(1),yr(1),yr(0)] ; Draw Vertical lines y = yr(1) - y_delta for i = 1,6 do begin x=xr(0)+ i*x_delta & plots,[x,x],[yr(0),y],/norm & end ; Draw Horizontal lines for i=0,y_div do begin y=yr(0)+i*y_delta & plots,[xr(0),xr(1)],[y,y], $ /norm & end endif ; Month and year title if (SMALL) then begin x = xr(0) + 3.5 * x_delta y = yr(0) + 6.6 * y_delta xyouts,/norm,size=TSIZE*1.6, align=.5, x, y, MONTHS(MONTH-1) endif else begin x = xr(0) + 1.5 * x_delta y = yr(0) + 5.5 * y_delta xyouts,/norm,size=TSIZE*.9, align=.5, x, y, MONTHS(MONTH-1) x = xr(0) + 5.5 * x_delta xyouts,/norm,size=TSIZE*.9,align=.5, x, y, $ strcompress(string(YEAR),/rem) endelse ; Day titles if (SMALL) then begin DAYS = ['S', 'M', 'T', 'W', 'T', 'F', 'S'] DAYSIZE = TSIZE * .75 y = yr(0) + 5.8 * y_delta y_factor = .25 endif else begin DAYS = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'] DAYSIZE = TSIZE * .6 y = yr(0) + 5.1 * y_delta endelse for I = 0, 6 do xyouts,/norm,size=DAYSIZE, align=.5, $ xr(0) + (I + .5) * x_delta , y, DAYS(I) ; Calculate Horizontal and Vertical positions X = fltarr(7) Y = fltarr(y_div) if (SMALL) then begin for i = 0, 5 do Y(I) = yr(0) + (5-I) * y_delta for i = 0, 6 do X(I) = xr(0) + (I - .5) * x_delta NALIGN = .5 ; Center numbers NSIZE = TSIZE endif else begin J = 0 for i = 4.65, .5, -1 do begin Y(J) = i J = J + 1 endfor Y(5) = .3 for i = 0, 5 do Y(I) = yr(0) + Y(I) * y_delta for i = 0, 6 do X(I) = xr(0) + (I + .95) * x_delta NALIGN = 1. ; Right justify NSIZE = TSIZE endelse ; Get starting square and number of days in month CAL_INFO, MONTH, YEAR, COL, NUM_DAYS ROW = 0 ; Numbers for I = 1, NUM_DAYS do begin if (COL gt 6) then begin ROW = ROW + 1 & COL = 0 & endif xyouts, /norm, size=TSIZE, align = NALIGN, X(COL), Y(ROW), I COL = COL + 1 endfor end pro CALENDAR , MONTH, YEAR ON_ERROR, 2 ; Return to caller if errors MONTHS = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG', $ 'SEP','OCT','NOV','DEC'] ; Process the input NP = n_params() case NP of 0: begin DATE = systime() L_MONTH = long(where(strupcase(strmid(DATE, 4, 3)) eq MONTHS)) L_MONTH = L_MONTH(0) + 1 ; Scalarize it... L_YEAR = long(strmid(DATE, 20, 4)) end 1: begin L_YEAR=LONG(MONTH) ; Only 1 parm, take it as year DO_ALL_YEAR = 1 end 2: begin L_MONTH = LONG(MONTH) L_YEAR=LONG(YEAR) end else: message, 'Wrong number of parameters.' endcase erase if (NP eq 1) then begin x_delta = .2325 y_delta = .28 l = .025 r = .975 plots,/norm,[l,r,r,l,l],[l,l,r,r,l] ; plots,/norm,[l,r],[.9,.9] xyouts,/norm,size=2.75,align=.5, .5, .9, $ strcompress(string(L_YEAR),/rem) cur = 1 for i = 2, 0, -1 do for j = 0, 3 do begin DRAW_CAL, [l + (j+.1)*x_delta, l + (j+1)*x_delta], $ [l + l + i*y_delta, l + (i+1)*y_delta], cur, L_YEAR, 1 CUR = CUR + 1 endfor endif else begin DRAW_CAL, [.025, 0.975], [.025, .975], L_MONTH, L_YEAR, 0 endelse end