Re: Calendar Recipe?
- To: mathgroup at smc.vnet.net
- Subject: [mg112649] Re: Calendar Recipe?
- From: dr DanW <dmaxwarren at gmail.com>
- Date: Fri, 24 Sep 2010 04:11:20 -0400 (EDT)
- References: <i7f2mv$ctt$1@smc.vnet.net>
This isn't quite what you are looking for, but the techniques you need
are here. I think you can extend the MonthMatrix function into a
QuarterMatrix function with a few simple changes. This is code I
wrote to create a Dynamic control for choosing dates out of a
calendar, similar to a JavaScript or ActiveX control you would see on
a travel web site:
WeekDayNumber[d_] := DateString[d, "DayNameShort"] /.
{"Sun" -> 1, "Mon" -> 2, "Tue" -> 3, "Wed" -> 4, "Thu" -> 5, "Fri" -
> 6, "Sat" -> 7}
QuarterStartMonth[d_] := DateString[d, "Quarter"] /. {"1" -> 1, "2" ->
4, "3" -> 7,
"4" -> 10}
DateSameQ[d1_, d2_] := d1[[1 ;; 3]] === d2[[1 ;; 3]]
FirstDayOf[d_, "Week"] := DatePlus[d, {1 - WeekDayNumber[d], "Day"}];
FirstDayOf[d_, "Month"] := DateList[d[[1 ;; 2]]];
FirstDayOf[d_, "Quarter"] := DateList[{d[[1]],
QuarterStartMonth[d]}];
FirstDayOf[d_, "Year"] := DateList[d[[{1}]]];
MonthMatrix[d_] := Partition[(DatePlus[FirstDayOf[FirstDayOf[d,
"Month"], "Week"],
{#1, "Day"}] & ) /@ (Range[1, 6*7] - 1), 7]
Attributes[CalendarControl] = HoldFirst;
CalendarControl[date_, init_:DateList[]] := (date =
DateList[init[[1 ;; 3]]];
Dynamic[Panel[Grid[Join[{{Button[Style["\[FirstPage]", Large],
If[DateSameQ[date, FirstDayOf[date, "Quarter"]],
date = DatePlus[date, {-3, "Month"}], date =
FirstDayOf[date, "Quarter"]],
Appearance -> "None"], Button[Style["\[LeftPointer]",
Large],
date = DatePlus[date, {-1, "Month"}], Appearance ->
"None"],
Dynamic[DateString[date, {"MonthNameShort", " ", "Year"}]], \
[SpanFromLeft], \[SpanFromLeft],
Button[Style["\[RightPointer]", Large], date = DatePlus[date,
{1, "Month"}],
Appearance -> "None"], Button[Style["\[LastPage]", Large],
If[DateSameQ[date, FirstDayOf[date, "Quarter"]],
date = DatePlus[date, {3, "Month"}], date =
DatePlus[FirstDayOf[date,
"Quarter"], {3, "Month"}]], Appearance -> "None"]}},
{{"S", "M", "T", "W", "T", "F", "S"}},
Map[Button[If[#1[[2]] === date[[2]], Style[#1[[3]]],
Style[#1[[3]],
Opacity[0.3]]], date = #1, Appearance -> "None",
If[#1[[1 ;; 3]] === date[[1 ;; 3]], Background ->
ColorData["Legacy"][
"PaleGreen"], Background -> Automatic], BaseStyle ->
{FontSize -> 10}] & , MonthMatrix[date], {2}]],
Dividers -> {None, {3 -> True}}]]])
CalendarControl[sd]
Dynamic[DateString[sd]]
Enjoy.
Daniel