ROOT logo

From $ROOTSYS/tutorials/gui/calendar.C

// Author: Valeriy Onuchin   24/08/2007
//
// This macro gives an example of how to use html widget
// to display tabular data.
//
// To run it do either:
// .x calendar.C
// .x calendar.C++


#include "TDatime.h"
#include "TTimeStamp.h"
#include "TGComboBox.h"
#include "TGNumberEntry.h"
#include "TGLabel.h"
#include "TGColorSelect.h"
#include "TGHtml.h"
#include "TApplication.h"
#include "TROOT.h"
#include "TColor.h"


/////////////////////////// HTML calendar //////////////////////////////////////

TString monthNames[12] = {"January", "February", "March", "April", 
                          "May", "June", "July", "August", "September",
                          "October", "November", "December"};

////////////////////////////////////////////////////////////////////////////////
class HtmlDayName {
public:                 // make them public for shorter code
   TString fDay;        // day name, e.g. "Sunday"
   TString fAlign;      // name align inside table cell 
   TString fBgColor;    // cell background color
   TString fFontSize;   // text font size
   TString fFontColor;  // text color
   TString fHtml;       // HTML output code

public:
   HtmlDayName(const char *day);
   virtual ~HtmlDayName() {}

   TString Html() const { return fHtml; }

   ClassDef(HtmlDayName, 0);
};

//______________________________________________________________________________
HtmlDayName::HtmlDayName(const char *day) : fDay(day), fAlign("middle"),
   fBgColor("#000000"), fFontSize("4"), fFontColor("#FFFFFF")
{
   // ctor.

   fHtml += "<TH  width=14%";
   fHtml += " align=" + fAlign;
   fHtml += " bgcolor=" + fBgColor + ">";
   fHtml += "<font size=" + fFontSize;
   fHtml += " color=" + fFontColor + ">";
   fHtml += fDay;
   fHtml += "</font></TH>\n";
}


////////////////////////////////////////////////////////////////////////////////
class HtmlMonthTable {
public:                    // make them public for shorter code
   Int_t    fYear;         // year
   Int_t    fMonth;        // month

   TString  fBorder;       // border width
   TString  fBgColor;      // background color
   TString  fCellpadding;  // cell padding
   TString  fCellFontSize; // cell font size
   TString  fCellBgcolor;  // cell background color
   TString  fTodayColor;   // background color of cell correspondent today date

   TDatime  fToday;        // today's date
   TString  fHtml;         // HTML output code

   void Build();
   void BuildDayNames();
   void BuildDays();

public:
   HtmlMonthTable(Int_t year, Int_t month);
   virtual ~HtmlMonthTable() {}

   void SetDate(Int_t year, Int_t month);
   TString Html() const { return fHtml; }

   ClassDef(HtmlMonthTable, 0);
};

//______________________________________________________________________________
HtmlMonthTable::HtmlMonthTable(Int_t year, Int_t month) : fYear(year),
   fMonth(month), fBorder("2"), fBgColor("#aaaaaa"), fCellpadding("5"),
   fCellFontSize("3"), fCellBgcolor("#eeeeee"), fTodayColor("#ffff00")
{
   // Constructor.

   Build();
}

//______________________________________________________________________________
void HtmlMonthTable::SetDate(Int_t year, Int_t month)
{
   // Set date.

   fYear = year;
   fMonth = month;
   Build();
}

//______________________________________________________________________________
void HtmlMonthTable::Build()
{
   // Build HTML code.

   fHtml = "<TABLE width=100%";
   fHtml += " border=" + fBorder;
   fHtml += " bgcolor=" + fBgColor;
   fHtml += " cellpadding=" + fCellpadding;
   fHtml += "><TBODY>";

   BuildDayNames();
   BuildDays();

   fHtml += "</TBODY></TABLE>\n";
}

//______________________________________________________________________________
void HtmlMonthTable::BuildDayNames()
{
   // Build table header with day names.

   fHtml += "<TR>";
   fHtml += HtmlDayName("Sunday").Html();
   fHtml += HtmlDayName("Monday").Html();
   fHtml += HtmlDayName("Tuesday").Html();
   fHtml += HtmlDayName("Wednesday").Html();
   fHtml += HtmlDayName("Thursday").Html();
   fHtml += HtmlDayName("Friday").Html();
   fHtml += HtmlDayName("Saturday").Html();
   fHtml += "</TR>\n";
}

//______________________________________________________________________________
void HtmlMonthTable::BuildDays()
{
   // Build part of table with day numbers.

   static Int_t maxdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

   Int_t maxday = maxdays[fMonth-1];
   if ((fMonth == 2) && TTimeStamp::IsLeapYear(fYear)) maxday = 29;

   Int_t first = TTimeStamp::GetDayOfWeek(1, fMonth, fYear);

   // fill html table
   for (int week = 0; week < 6; week++) {
      fHtml += "<TR>";

      for (int weekday = 0; weekday < 7; weekday++) {//
         Int_t day = week*7 + weekday - first + 1;

         if ((day > maxday) && !weekday) break; //

         fHtml += "<TD align=left width=14% ";

         // hightlight today's cell
         if ((fToday.GetYear() == fYear) && 
             (fToday.GetMonth() == fMonth) && 
             (fToday.GetDay() == day)) {
            fHtml += " bgcolor=" + fTodayColor;
         } else {
            fHtml += " bgcolor=" + fCellBgcolor;
         }
         fHtml += ">";

         //skip week days which are not of this month
         if ((day <= 0) || (day > maxday)) {
            fHtml += "&nbsp;</TD>";
            continue;
         }

         fHtml += "<font size=" + fCellFontSize + ">";
         fHtml += Form("%d", day);
         fHtml += "</font></TD>\n";
      }
      fHtml += "</TR>\n";
   }
}


////////////////////////////////////////////////////////////////////////////////
class HtmlCalendar {
public:                          // make them public for shorter code
   Int_t          fYear;         // year
   Int_t          fMonth;        // month
   HtmlMonthTable fMonthTable;   // HTML table presenting month days
   TString        fHeader;       // HTML header
   TString        fFooter;       // HTML footer
   TString        fHtml;         // output HTML string
   TString        fTitle;        // page title

   void MakeHeader();
   void MakeFooter();

public:
   HtmlCalendar(Int_t year, Int_t month);
   virtual ~HtmlCalendar() {}

   void SetDate(Int_t year, Int_t month);
   TString Html() const { return fHtml; }

   ClassDef(HtmlCalendar, 0);
};

//______________________________________________________________________________
HtmlCalendar::HtmlCalendar(Int_t year, Int_t month) : fMonthTable(year, month)
{
   // Constructor.
   
   fYear = year;
   fMonth = month;

   MakeHeader();
   MakeFooter();

   fHtml = fHeader;
   fHtml += fMonthTable.Html();
   fHtml += fFooter;
}

//______________________________________________________________________________
void HtmlCalendar::SetDate(Int_t year, Int_t month)
{
   // Create calendar for month/year. 
 
   fYear = year;
   fMonth = month;

   fMonthTable.SetDate(year, month);
   MakeHeader();
   MakeFooter();
   fHtml = fHeader;
   fHtml += fMonthTable.Html();
   fHtml += fFooter;
}

//______________________________________________________________________________
void HtmlCalendar::MakeHeader()
{
   // Make HTML header.

   fTitle = monthNames[fMonth-1] + Form(" %d", fYear);
   fHeader = "<html><head><title>";
   fHeader += fTitle;
   fHeader += "</title></head><body>\n";
   fHeader += "<center><H2>" + fTitle + "</H2></center>";
}

//______________________________________________________________________________
void HtmlCalendar::MakeFooter()
{
   // Make HTML footer.

   fFooter = "<br><p><br><center><strong><font size=2 color=#2222ee>";
   fFooter += "Example of using Html widget to display tabular data.";
   fFooter += "</font></strong></center></body></html>";
}

//////////////////////// end of HTML calendar //////////////////////////////////



class CalendarWindow {
private:
   TGMainFrame    *fMain;       // main frame
   HtmlCalendar   *fHtmlText;   // calendar HTML table
   TGHtml         *fHtml;       // html widget to display HTML calendar
   TGComboBox     *fMonthBox;   // month selector
   TGNumberEntry  *fYearEntry;  // year selector
   TGNumberEntry  *fFontEntry;  // font size selector
   TGColorSelect  *fTableColor; // selector of background color of table 
   TGColorSelect  *fCellColor;  // selector of background color of table's cells

public:
   CalendarWindow();
   virtual ~CalendarWindow();

   void UpdateHTML();

   ClassDef(CalendarWindow, 0);
};


//______________________________________________________________________________
CalendarWindow::~CalendarWindow()
{
   // Destructor.

   delete fHtmlText;
   delete fMain;
}

//______________________________________________________________________________
CalendarWindow::CalendarWindow() 
{
   // Main  window.

   fMain = new TGMainFrame(gClient->GetRoot(), 10, 10, kVerticalFrame);
   fMain->SetCleanup(kDeepCleanup); // delete all subframes on exit

   // Controls 
   TGHorizontalFrame *controls = new TGHorizontalFrame(fMain);
   fMain->AddFrame(controls, new TGLayoutHints(kLHintsCenterX, 1, 1, 1, 1));

   // generate HTML calendar table
   TDatime today;
   fHtmlText = new HtmlCalendar(today.GetYear(), today.GetMonth());

   // create HTML widget
   fHtml = new TGHtml(fMain, 1, 1);
   fMain->AddFrame(fHtml, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,
                                            5, 5, 2, 2));

   // parse HTML context of HTML calendar table
   fHtml->ParseText((char*)fHtmlText->Html().Data());

   TGLabel *dateLabel = new TGLabel(controls, "Date:");
   controls->AddFrame(dateLabel, new TGLayoutHints(kLHintsLeft|kLHintsCenterY,
                                                   5, 2, 2, 2));

   // 
   fMonthBox = new TGComboBox(controls);
   for (int i = 0; i < 12; i++) {
      fMonthBox->AddEntry(monthNames[i].Data(), i+1);
   }
   fMonthBox->Select(today.GetMonth());
   controls->AddFrame(fMonthBox, new TGLayoutHints(kLHintsLeft, 5, 5, 2, 2));

   fYearEntry = new TGNumberEntry(controls, today.GetYear(), 5, -1, 
                                  TGNumberFormat::kNESInteger, 
                                  TGNumberFormat::kNEAPositive,
                                  TGNumberFormat::kNELLimitMin, 1995);
   controls->AddFrame(fYearEntry, new TGLayoutHints(kLHintsLeft, 5, 5, 2, 2));

   fMonthBox->Resize(100, fYearEntry->GetHeight());

   TGLabel *fontLabel = new TGLabel(controls, "Font Size:");
   controls->AddFrame(fontLabel, new TGLayoutHints(kLHintsLeft|kLHintsCenterY,
                                                   30, 2, 2, 2));  

   Int_t fontsize = atoi(fHtmlText->fMonthTable.fCellFontSize.Data());
   fFontEntry = new TGNumberEntry(controls, fontsize, 2, -1,
                                  TGNumberFormat::kNESInteger, 
                                  TGNumberFormat::kNEAPositive,
                                  TGNumberFormat::kNELLimitMax, 0, 7);
   controls->AddFrame(fFontEntry, new TGLayoutHints(kLHintsLeft, 5, 5, 2, 2));

   TGLabel *tableLabel = new TGLabel(controls, "Table:");
   controls->AddFrame(tableLabel, new TGLayoutHints(kLHintsLeft|kLHintsCenterY,
                                                    5, 2, 2, 2));

   Pixel_t color;

   gClient->GetColorByName(fHtmlText->fMonthTable.fBgColor.Data(), color);
   fTableColor = new TGColorSelect(controls, color);
   controls->AddFrame(fTableColor, new TGLayoutHints(kLHintsLeft|kLHintsCenterY,
                                                     5, 2, 2, 2));

   TGLabel *cellLabel = new TGLabel(controls, "Cell:");
   controls->AddFrame(cellLabel, new TGLayoutHints(kLHintsLeft|kLHintsCenterY,
                                                   5, 2, 2, 2));

   gClient->GetColorByName(fHtmlText->fMonthTable.fCellBgcolor.Data(), color);
   fCellColor = new TGColorSelect(controls, color);
   controls->AddFrame(fCellColor, new TGLayoutHints(kLHintsLeft|kLHintsCenterY,
                                                    5, 2, 2, 2));

   // connect signals
   fMonthBox->Connect("Selected(Int_t)", "CalendarWindow", this, 
                      "UpdateHTML()");
   fYearEntry->GetNumberEntry()->Connect("TextChanged(char*)", "CalendarWindow",
                                         this, "UpdateHTML()");
   fFontEntry->GetNumberEntry()->Connect("TextChanged(char*)", "CalendarWindow",
                                         this, "UpdateHTML()");
   fTableColor->Connect("ColorSelected(Pixel_t)", "CalendarWindow", this,
                        "UpdateHTML()");
   fCellColor->Connect("ColorSelected(Pixel_t)", "CalendarWindow", this,
                       "UpdateHTML()");

   // terminate ROOT session when window is closed
   fMain->Connect("CloseWindow()", "TApplication", gApplication, "Terminate()");
   fMain->DontCallClose();

   fMain->MapSubwindows();
   fMain->Resize(600, 333);

   // set  minimum size of main window
   fMain->SetWMSizeHints(controls->GetDefaultWidth(), fMain->GetDefaultHeight(),
                         1000, 1000, 0 ,0);

   TString title = "Calendar for ";
   title += fHtmlText->fTitle;
   fMain->SetWindowName(title.Data());
   fMain->MapRaised();
}

//______________________________________________________________________________
void CalendarWindow::UpdateHTML()
{
   // Update HTML table on user's input.

   Int_t month = fMonthBox->GetSelected();
   Int_t year = atoi(fYearEntry->GetNumberEntry()->GetText());
   fHtmlText->fMonthTable.fCellFontSize = fFontEntry->GetNumberEntry()->GetText();

   Pixel_t pixel = 0;
   TColor *color = 0;

   // table background
   pixel = fTableColor->GetColor();
   color = gROOT->GetColor(TColor::GetColor(pixel));

   if (color) {
      fHtmlText->fMonthTable.fBgColor = color->AsHexString();
   }

   // cell background
   pixel = fCellColor->GetColor();
   color = gROOT->GetColor(TColor::GetColor(pixel));

   if (color) {
      fHtmlText->fMonthTable.fCellBgcolor = color->AsHexString();
   }

   // update HTML context
   fHtmlText->SetDate(year, month);

   // parse new HTML context of HTML calendar table
   fHtml->Clear();
   fHtml->ParseText((char*)fHtmlText->Html().Data());
   fHtml->Layout();

   // update window title
   TString title = "Calendar for ";
   title += fHtmlText->fTitle;
   fMain->SetWindowName(title.Data());
}

////////////////////////////////////////////////////////////////////////////////
void calendar()
{
   // Main program.

   new CalendarWindow();
}



 calendar.C:1
 calendar.C:2
 calendar.C:3
 calendar.C:4
 calendar.C:5
 calendar.C:6
 calendar.C:7
 calendar.C:8
 calendar.C:9
 calendar.C:10
 calendar.C:11
 calendar.C:12
 calendar.C:13
 calendar.C:14
 calendar.C:15
 calendar.C:16
 calendar.C:17
 calendar.C:18
 calendar.C:19
 calendar.C:20
 calendar.C:21
 calendar.C:22
 calendar.C:23
 calendar.C:24
 calendar.C:25
 calendar.C:26
 calendar.C:27
 calendar.C:28
 calendar.C:29
 calendar.C:30
 calendar.C:31
 calendar.C:32
 calendar.C:33
 calendar.C:34
 calendar.C:35
 calendar.C:36
 calendar.C:37
 calendar.C:38
 calendar.C:39
 calendar.C:40
 calendar.C:41
 calendar.C:42
 calendar.C:43
 calendar.C:44
 calendar.C:45
 calendar.C:46
 calendar.C:47
 calendar.C:48
 calendar.C:49
 calendar.C:50
 calendar.C:51
 calendar.C:52
 calendar.C:53
 calendar.C:54
 calendar.C:55
 calendar.C:56
 calendar.C:57
 calendar.C:58
 calendar.C:59
 calendar.C:60
 calendar.C:61
 calendar.C:62
 calendar.C:63
 calendar.C:64
 calendar.C:65
 calendar.C:66
 calendar.C:67
 calendar.C:68
 calendar.C:69
 calendar.C:70
 calendar.C:71
 calendar.C:72
 calendar.C:73
 calendar.C:74
 calendar.C:75
 calendar.C:76
 calendar.C:77
 calendar.C:78
 calendar.C:79
 calendar.C:80
 calendar.C:81
 calendar.C:82
 calendar.C:83
 calendar.C:84
 calendar.C:85
 calendar.C:86
 calendar.C:87
 calendar.C:88
 calendar.C:89
 calendar.C:90
 calendar.C:91
 calendar.C:92
 calendar.C:93
 calendar.C:94
 calendar.C:95
 calendar.C:96
 calendar.C:97
 calendar.C:98
 calendar.C:99
 calendar.C:100
 calendar.C:101
 calendar.C:102
 calendar.C:103
 calendar.C:104
 calendar.C:105
 calendar.C:106
 calendar.C:107
 calendar.C:108
 calendar.C:109
 calendar.C:110
 calendar.C:111
 calendar.C:112
 calendar.C:113
 calendar.C:114
 calendar.C:115
 calendar.C:116
 calendar.C:117
 calendar.C:118
 calendar.C:119
 calendar.C:120
 calendar.C:121
 calendar.C:122
 calendar.C:123
 calendar.C:124
 calendar.C:125
 calendar.C:126
 calendar.C:127
 calendar.C:128
 calendar.C:129
 calendar.C:130
 calendar.C:131
 calendar.C:132
 calendar.C:133
 calendar.C:134
 calendar.C:135
 calendar.C:136
 calendar.C:137
 calendar.C:138
 calendar.C:139
 calendar.C:140
 calendar.C:141
 calendar.C:142
 calendar.C:143
 calendar.C:144
 calendar.C:145
 calendar.C:146
 calendar.C:147
 calendar.C:148
 calendar.C:149
 calendar.C:150
 calendar.C:151
 calendar.C:152
 calendar.C:153
 calendar.C:154
 calendar.C:155
 calendar.C:156
 calendar.C:157
 calendar.C:158
 calendar.C:159
 calendar.C:160
 calendar.C:161
 calendar.C:162
 calendar.C:163
 calendar.C:164
 calendar.C:165
 calendar.C:166
 calendar.C:167
 calendar.C:168
 calendar.C:169
 calendar.C:170
 calendar.C:171
 calendar.C:172
 calendar.C:173
 calendar.C:174
 calendar.C:175
 calendar.C:176
 calendar.C:177
 calendar.C:178
 calendar.C:179
 calendar.C:180
 calendar.C:181
 calendar.C:182
 calendar.C:183
 calendar.C:184
 calendar.C:185
 calendar.C:186
 calendar.C:187
 calendar.C:188
 calendar.C:189
 calendar.C:190
 calendar.C:191
 calendar.C:192
 calendar.C:193
 calendar.C:194
 calendar.C:195
 calendar.C:196
 calendar.C:197
 calendar.C:198
 calendar.C:199
 calendar.C:200
 calendar.C:201
 calendar.C:202
 calendar.C:203
 calendar.C:204
 calendar.C:205
 calendar.C:206
 calendar.C:207
 calendar.C:208
 calendar.C:209
 calendar.C:210
 calendar.C:211
 calendar.C:212
 calendar.C:213
 calendar.C:214
 calendar.C:215
 calendar.C:216
 calendar.C:217
 calendar.C:218
 calendar.C:219
 calendar.C:220
 calendar.C:221
 calendar.C:222
 calendar.C:223
 calendar.C:224
 calendar.C:225
 calendar.C:226
 calendar.C:227
 calendar.C:228
 calendar.C:229
 calendar.C:230
 calendar.C:231
 calendar.C:232
 calendar.C:233
 calendar.C:234
 calendar.C:235
 calendar.C:236
 calendar.C:237
 calendar.C:238
 calendar.C:239
 calendar.C:240
 calendar.C:241
 calendar.C:242
 calendar.C:243
 calendar.C:244
 calendar.C:245
 calendar.C:246
 calendar.C:247
 calendar.C:248
 calendar.C:249
 calendar.C:250
 calendar.C:251
 calendar.C:252
 calendar.C:253
 calendar.C:254
 calendar.C:255
 calendar.C:256
 calendar.C:257
 calendar.C:258
 calendar.C:259
 calendar.C:260
 calendar.C:261
 calendar.C:262
 calendar.C:263
 calendar.C:264
 calendar.C:265
 calendar.C:266
 calendar.C:267
 calendar.C:268
 calendar.C:269
 calendar.C:270
 calendar.C:271
 calendar.C:272
 calendar.C:273
 calendar.C:274
 calendar.C:275
 calendar.C:276
 calendar.C:277
 calendar.C:278
 calendar.C:279
 calendar.C:280
 calendar.C:281
 calendar.C:282
 calendar.C:283
 calendar.C:284
 calendar.C:285
 calendar.C:286
 calendar.C:287
 calendar.C:288
 calendar.C:289
 calendar.C:290
 calendar.C:291
 calendar.C:292
 calendar.C:293
 calendar.C:294
 calendar.C:295
 calendar.C:296
 calendar.C:297
 calendar.C:298
 calendar.C:299
 calendar.C:300
 calendar.C:301
 calendar.C:302
 calendar.C:303
 calendar.C:304
 calendar.C:305
 calendar.C:306
 calendar.C:307
 calendar.C:308
 calendar.C:309
 calendar.C:310
 calendar.C:311
 calendar.C:312
 calendar.C:313
 calendar.C:314
 calendar.C:315
 calendar.C:316
 calendar.C:317
 calendar.C:318
 calendar.C:319
 calendar.C:320
 calendar.C:321
 calendar.C:322
 calendar.C:323
 calendar.C:324
 calendar.C:325
 calendar.C:326
 calendar.C:327
 calendar.C:328
 calendar.C:329
 calendar.C:330
 calendar.C:331
 calendar.C:332
 calendar.C:333
 calendar.C:334
 calendar.C:335
 calendar.C:336
 calendar.C:337
 calendar.C:338
 calendar.C:339
 calendar.C:340
 calendar.C:341
 calendar.C:342
 calendar.C:343
 calendar.C:344
 calendar.C:345
 calendar.C:346
 calendar.C:347
 calendar.C:348
 calendar.C:349
 calendar.C:350
 calendar.C:351
 calendar.C:352
 calendar.C:353
 calendar.C:354
 calendar.C:355
 calendar.C:356
 calendar.C:357
 calendar.C:358
 calendar.C:359
 calendar.C:360
 calendar.C:361
 calendar.C:362
 calendar.C:363
 calendar.C:364
 calendar.C:365
 calendar.C:366
 calendar.C:367
 calendar.C:368
 calendar.C:369
 calendar.C:370
 calendar.C:371
 calendar.C:372
 calendar.C:373
 calendar.C:374
 calendar.C:375
 calendar.C:376
 calendar.C:377
 calendar.C:378
 calendar.C:379
 calendar.C:380
 calendar.C:381
 calendar.C:382
 calendar.C:383
 calendar.C:384
 calendar.C:385
 calendar.C:386
 calendar.C:387
 calendar.C:388
 calendar.C:389
 calendar.C:390
 calendar.C:391
 calendar.C:392
 calendar.C:393
 calendar.C:394
 calendar.C:395
 calendar.C:396
 calendar.C:397
 calendar.C:398
 calendar.C:399
 calendar.C:400
 calendar.C:401
 calendar.C:402
 calendar.C:403
 calendar.C:404
 calendar.C:405
 calendar.C:406
 calendar.C:407
 calendar.C:408
 calendar.C:409
 calendar.C:410
 calendar.C:411
 calendar.C:412
 calendar.C:413
 calendar.C:414
 calendar.C:415
 calendar.C:416
 calendar.C:417
 calendar.C:418
 calendar.C:419
 calendar.C:420
 calendar.C:421
 calendar.C:422
 calendar.C:423
 calendar.C:424
 calendar.C:425
 calendar.C:426
 calendar.C:427
 calendar.C:428
 calendar.C:429
 calendar.C:430
 calendar.C:431
 calendar.C:432
 calendar.C:433
 calendar.C:434
 calendar.C:435
 calendar.C:436
 calendar.C:437
 calendar.C:438
 calendar.C:439
 calendar.C:440
 calendar.C:441
 calendar.C:442
 calendar.C:443
 calendar.C:444
 calendar.C:445
 calendar.C:446
 calendar.C:447
 calendar.C:448
 calendar.C:449
 calendar.C:450
 calendar.C:451
 calendar.C:452
 calendar.C:453
 calendar.C:454
 calendar.C:455
 calendar.C:456
 calendar.C:457
 calendar.C:458
 calendar.C:459
 calendar.C:460
 calendar.C:461
 calendar.C:462
 calendar.C:463