diff --git a/Makefile b/Makefile index 0064f9a00..d5f09f176 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ OBJS = swad_account.o swad_action.o swad_announcement.o swad_assignment.o swad_attendance.o \ swad_banner.o \ - swad_centre.o swad_chat.o swad_config.o swad_connected.o swad_country.o swad_course.o swad_cryptography.o \ + swad_calendar.o swad_centre.o swad_chat.o swad_config.o swad_connected.o swad_country.o swad_course.o swad_cryptography.o \ swad_database.o swad_date.o swad_degree.o swad_department.o \ swad_enrollment.o swad_exam.o \ swad_file.o swad_file_browser.o swad_forum.o \ diff --git a/swad_action.c b/swad_action.c index 4007918f0..1fe31e523 100644 --- a/swad_action.c +++ b/swad_action.c @@ -35,6 +35,7 @@ #include "swad_action.h" #include "swad_announcement.h" #include "swad_banner.h" +#include "swad_calendar.h" #include "swad_config.h" #include "swad_country.h" #include "swad_course.h" @@ -1638,7 +1639,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActAdmAsgWrkUsr */{ 792, 2,TabAss,ActAdmAsgWrkUsr ,0x008,0x000,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Brw_ShowFileBrowserOrWorks ,"editfolderuser" }, /* ActReqAsgWrkCrs */{ 899, 3,TabAss,ActReqAsgWrkCrs ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Brw_AskEditWorksCrs ,"folderusers" }, /* ActReqTst */{ 103, 4,TabAss,ActReqTst ,0x118,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Tst_ShowFormAskTst ,"test" }, - /* ActSeeCal */{ 16, 5,TabAss,ActSeeCal ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Dat_DrawCalendar ,"date" }, + /* ActSeeCal */{ 16, 5,TabAss,ActSeeCal ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Cal_DrawCalendar ,"date" }, /* ActSeeExaAnn */{ 85, 6,TabAss,ActSeeExaAnn ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_ListExamAnnouncementsSee ,"announce" }, /* ActSeeAdmMrk */{ 17, 7,TabAss,ActSeeAdmMrk ,0x118,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Brw_ShowFileBrowserOrWorks ,"grades" }, /* ActSeeRecCrs */{ 299, 8,TabAss,ActSeeRecCrs ,0x108,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Rec_ShowFormMyCrsRecord ,"editcard" }, @@ -1769,7 +1770,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActSeeUsrTstExa */{1081,-1,TabAss,ActReqTst ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Tst_ShowUsrsTestResults ,NULL}, /* ActSeeOneTstExaOth*/{1082,-1,TabAss,ActReqTst ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Tst_ShowOneTestExam ,NULL}, - /* ActPrnCal */{ 71,-1,TabAss,ActSeeCal ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Dat_DrawCalendar ,NULL}, + /* ActPrnCal */{ 71,-1,TabAss,ActSeeCal ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Cal_DrawCalendar ,NULL}, /* ActEdiExaAnn */{ 91,-1,TabAss,ActSeeExaAnn ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_PutFrmEditAExamAnnouncement,NULL}, /* ActRcvExaAnn */{ 110,-1,TabAss,ActSeeExaAnn ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_ReceiveExamAnnouncement ,NULL}, diff --git a/swad_calendar.c b/swad_calendar.c new file mode 100644 index 000000000..a25151610 --- /dev/null +++ b/swad_calendar.c @@ -0,0 +1,410 @@ +// swad_calendar.c: Draw month and calendar + +/* + SWAD (Shared Workspace At a Distance), + is a web platform developed at the University of Granada (Spain), + and used to support university teaching. + + This file is part of SWAD core. + Copyright (C) 1999-2015 Antonio Caņas Vargas + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/*****************************************************************************/ +/********************************* Headers ***********************************/ +/*****************************************************************************/ + +#include // For string functions + +#include "swad_exam.h" +#include "swad_global.h" + +/*****************************************************************************/ +/************** External global variables from others modules ****************/ +/*****************************************************************************/ + +extern struct Globals Gbl; + +/*****************************************************************************/ +/**************************** Private constants ******************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private prototypes ****************************/ +/*****************************************************************************/ + +static void Cal_DrawMonth (unsigned RealYear,unsigned RealMonth, + bool DrawingCalendar,bool PutLinkToEvents,bool PrintView); + +/*****************************************************************************/ +/***************************** Draw current month ****************************/ +/*****************************************************************************/ + +void Cal_DrawCurrentMonth (void) + { + /***** Get list of holidays *****/ + if (!Gbl.Hlds.LstIsRead) + { + Gbl.Hlds.SelectedOrderType = Hld_ORDER_BY_START_DATE; + Hld_GetListHolidays (); + } + + /***** Create list of dates of exam announcements *****/ + Exa_CreateListOfExamAnnouncements (); + + /***** Draw the month *****/ + Cal_DrawMonth (Gbl.Now.Date.Year,Gbl.Now.Date.Month,false,true,false); + + /***** Free list of dates of exam announcements *****/ + Exa_FreeListExamAnnouncements (); + } + +/*****************************************************************************/ +/************************ Draw an academic calendar **************************/ +/*****************************************************************************/ +/* Current Starting + month month + 1 -> 9 + 2 -> 9 + 3 -> 9 + 4 -> 9 + + 5 -> 1 + 6 -> 1 + 7 -> 1 + 8 -> 1 + + 9 -> 5 + 10 -> 5 + 11 -> 5 + 12 -> 5 +*/ +void Cal_DrawCalendar (void) + { + static unsigned StartingMonth[1+12] = // Calendar starts one row before current month + { + 0, // Not used + 9, // January --> September + 9, // February --> September + 9, // Mars --> September + 9, // April --> September + 1, // May --> January + 1, // June --> January + 1, // July --> January + 1, // Agoust --> January + 5, // September --> May + 5, // October --> May + 5, // November --> May + 5, // December --> May + }; + unsigned Row,Col; + unsigned Month = StartingMonth[Gbl.Now.Date.Month]; + unsigned Year = (Month < Gbl.Now.Date.Month) ? Gbl.Now.Date.Year : + Gbl.Now.Date.Year - 1; + bool PrintView = (Gbl.CurrentAct == ActPrnCal); + + /***** Get list of holidays *****/ + if (!Gbl.Hlds.LstIsRead) + { + Gbl.Hlds.SelectedOrderType = Hld_ORDER_BY_START_DATE; + Hld_GetListHolidays (); + } + + /***** Start of table and title *****/ + if (!PrintView) + { + /* Link to print view */ + fprintf (Gbl.F.Out,"
"); + Lay_PutLinkToPrintView1 (ActPrnCal); + Lay_PutLinkToPrintView2 (); + fprintf (Gbl.F.Out,"
"); + } + Lay_StartRoundFrameTable10 (NULL,0,NULL); + Lay_WriteHeaderClassPhoto (1,PrintView,false, + Gbl.CurrentIns.Ins.InsCod, + Gbl.CurrentDeg.Deg.DegCod, + Gbl.CurrentCrs.Crs.CrsCod); + + /***** Create list of calls for examination *****/ + Exa_CreateListOfExamAnnouncements (); + + /***** Draw several months *****/ + fprintf (Gbl.F.Out,"" + "" + ""); + for (Row = 0; + Row < 4; + Row++) + { + fprintf (Gbl.F.Out,""); + for (Col = 0; + Col < 4; + Col++) + { + fprintf (Gbl.F.Out,""); + if (++Month == 13) + { + Month = 1; + Year++; + } + } + fprintf (Gbl.F.Out,""); + } + fprintf (Gbl.F.Out,"
"); + Cal_DrawMonth (Year,Month,true,!PrintView,(Gbl.CurrentAct == ActPrnCal)); + fprintf (Gbl.F.Out,"
" + "" + ""); + + /***** Free list of dates of exam announcements *****/ + Exa_FreeListExamAnnouncements (); + + /***** End frame *****/ + Lay_EndRoundFrameTable10 (); + } + +/*****************************************************************************/ +/******************************** Draw a month *******************************/ +/*****************************************************************************/ + +static void Cal_DrawMonth (unsigned RealYear,unsigned RealMonth, + bool DrawingCalendar,bool PutLinkToEvents,bool PrintView) + { + extern const unsigned Dat_NumDaysMonth[1+12]; + extern const char *Txt_Show_calendar; + extern const char *Txt_DAYS_CAPS[7]; + extern const char *Txt_MONTHS_CAPS[12]; + extern const char *Txt_Exam_of_X; + char StrExamOfX[512+Crs_MAX_LENGTH_COURSE_FULL_NAME]; + unsigned Week; + unsigned DayOfWeek; /* 0, 1, 2, 3, 4, 5 ķ 6 */ + unsigned DayOfMonth; + unsigned NumDaysInMonth; + unsigned Year = RealYear; + unsigned Month = RealMonth; + char YYYYMMDD[4+2+2+1]; + unsigned NumHld; + char *ClassForDay; // Class of day depending on type of day + char *TextForDay; // Text associated to a day, for example the name of the holiday + unsigned NumExamAnnouncement; // Number of exam announcement + int ResultOfCmpStartDate; + bool ContinueSearching; + bool PutLinkToCalendar = !DrawingCalendar && Gbl.CurrentCrs.Crs.CrsCod > 0; + bool ThisDayHasEvent = false; + bool IsToday; + + /***** Compute number of day of month for the first box *****/ + /* The initial day of month can be -5, -4, -3, -2, -1, 0, or 1 + If it's -5 then write 6 boxes of the previous month. + If it's -4 then write 5 boxes of the previous month. + If it's -3 then write 4 boxes of the previous month. + If it's -2 then write 3 boxes of the previous month. + If it's -1 then write 2 boxes of the previous month. + If it's 0 then write 1 box of the previous month. + If it's 1 then write 0 boxes of the previous month. */ + + if ((DayOfWeek = Dat_GetDayOfWeek (Year,Month,1)) == 0) + DayOfMonth = 1; + else + { + if (Month <= 1) + { + Month = 12; + Year--; + } + else + Month--; + NumDaysInMonth = (Month == 2) ? Dat_GetNumDaysFebruary (Year) : + Dat_NumDaysMonth[Month]; + DayOfMonth = NumDaysInMonth - DayOfWeek + 1; + } + + /***** Start of month *****/ + fprintf (Gbl.F.Out,"
"); + + /***** Month name *****/ + fprintf (Gbl.F.Out,"
"); + if (PutLinkToCalendar) + { + Act_FormStart (ActSeeCal); + Act_LinkFormSubmit (Txt_Show_calendar,"MONTH"); + } + fprintf (Gbl.F.Out,"%s %u", + Txt_MONTHS_CAPS[RealMonth-1],RealYear); + if (PutLinkToCalendar) + fprintf (Gbl.F.Out,"" + ""); + fprintf (Gbl.F.Out,"
"); + + /***** Month head: first letter for each day of week *****/ + fprintf (Gbl.F.Out,"" + ""); + for (DayOfWeek = 0; + DayOfWeek < 7; + DayOfWeek++) + fprintf (Gbl.F.Out,"", + (DayOfWeek == 6) ? "DAY_NO_WRK_HEAD" : + "DAY_WRK_HEAD", + Txt_DAYS_CAPS[DayOfWeek][0]); + fprintf (Gbl.F.Out,""); + + /***** Draw every week of the month *****/ + for (Week = 0; + Week < 6; + Week++) + { + fprintf (Gbl.F.Out,""); + + /***** Draw every day of the week *****/ + for (DayOfWeek = 0; + DayOfWeek < 7; + DayOfWeek++) + { + /***** Set class for day being drawn *****/ + ClassForDay = (Month == RealMonth) ? "DAY_WRK" : + "DAY_WRK_LIGHT"; + TextForDay = NULL; + + /* Check if day is a holiday or a school day */ + sprintf (YYYYMMDD,"%04u%02u%02u",Year,Month,DayOfMonth); + for (NumHld = 0, ContinueSearching = true; + NumHld < Gbl.Hlds.Num && ContinueSearching; + NumHld++) + if (Gbl.Hlds.Lst[NumHld].PlcCod <= 0 || + Gbl.Hlds.Lst[NumHld].PlcCod == Gbl.CurrentCtr.Ctr.PlcCod) + { + ResultOfCmpStartDate = strcmp (Gbl.Hlds.Lst[NumHld].StartDate.YYYYMMDD,YYYYMMDD); + if (ResultOfCmpStartDate > 0) // List is ordered by start date. If start date is greater than date being drawn, don't continue searching + + ContinueSearching = false; + else // ResultOfCmpStartDate <= 0 <==> start date <= date being drawn + switch (Gbl.Hlds.Lst[NumHld].HldTyp) + { + case Hld_HOLIDAY: + if (ResultOfCmpStartDate == 0) // If start date == date being drawn + { + ClassForDay = (Month == RealMonth) ? "DAY_HLD" : + "DAY_HLD_LIGHT"; + TextForDay = Gbl.Hlds.Lst[NumHld].Name; + ContinueSearching = false; + } + break; + case Hld_NON_SCHOOL_PERIOD: + if (strcmp (Gbl.Hlds.Lst[NumHld].EndDate.YYYYMMDD,YYYYMMDD) >= 0) // If start date <= date being drawn <= end date + { + ClassForDay = (Month == RealMonth) ? "DAY_NO_WORK" : + "DAY_NO_WORK_LIGHT"; + TextForDay = Gbl.Hlds.Lst[NumHld].Name; + } + break; + } + } + + /* Day being drawn is sunday? */ + if (DayOfWeek == 6) // All the sundays are holidays + ClassForDay = (Month == RealMonth) ? "DAY_HLD" : + "DAY_HLD_LIGHT"; + + /* Date being drawn is today? */ + IsToday = (Gbl.CurrentAct != ActPrnCal && Month == RealMonth && + Year == Gbl.Now.Date.Year && + Month == Gbl.Now.Date.Month && + DayOfMonth == Gbl.Now.Date.Day); + + /* Check if day has an exam announcement */ + ThisDayHasEvent = false; + if (!DrawingCalendar || Month == RealMonth) // If drawing calendar and the month is not the real one, don't draw exam announcements + for (NumExamAnnouncement = 0; + NumExamAnnouncement < Gbl.LstExamAnnouncements.NumExamAnnounc; + NumExamAnnouncement++) + if (Year == Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Year && + Month == Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Month && + DayOfMonth == Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Day) + { + ThisDayHasEvent = true; + if (PutLinkToEvents) + { + sprintf (StrExamOfX,Txt_Exam_of_X,Gbl.CurrentCrs.Crs.FullName); + sprintf (Gbl.Title,"%s: %02u/%02u/%04u", + StrExamOfX, + Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Day, + Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Month, + Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Year); + } + break; + } + + /***** Write the box with the day *****/ + fprintf (Gbl.F.Out,""); + + /***** Set the next day *****/ + NumDaysInMonth = (Month == 2) ? Dat_GetNumDaysFebruary (Year) : + Dat_NumDaysMonth[Month]; + if (++DayOfMonth > NumDaysInMonth) + { + if (++Month > 12) + { + Year++; + Month = 1; + } + DayOfMonth = 1; + } + } + fprintf (Gbl.F.Out,""); + } + + /***** End of month *****/ + fprintf (Gbl.F.Out,"
" + "%c" + "
", + IsToday ? (ThisDayHasEvent ? "TODAY_EVENT" : + "TODAY") : + (ThisDayHasEvent ? "DAY_EVENT" : + "DAY" )); + + /* If day has an exam announcement */ + if (PutLinkToEvents && ThisDayHasEvent) + { + Act_FormStart (ActSeeExaAnn); + fprintf (Gbl.F.Out,"" + "" + "" + "" + "
", + ClassForDay); + Act_LinkFormSubmit (Gbl.Title,ClassForDay); + } + else + { + fprintf (Gbl.F.Out,"
"); + } + + /* Write the day of month */ + fprintf (Gbl.F.Out,"%u",DayOfMonth); + + /* If day has an exam announcement */ + if (PutLinkToEvents && ThisDayHasEvent) + fprintf (Gbl.F.Out,"" + "
" + ""); + else + fprintf (Gbl.F.Out,""); + + fprintf (Gbl.F.Out,"
" + "
"); + } diff --git a/swad_calendar.h b/swad_calendar.h new file mode 100644 index 000000000..d943d6763 --- /dev/null +++ b/swad_calendar.h @@ -0,0 +1,45 @@ +// swad_calendar.h: Draw month and calendar + +#ifndef _SWAD_CAL +#define _SWAD_CAL +/* + SWAD (Shared Workspace At a Distance in Spanish), + is a web platform developed at the University of Granada (Spain), + and used to support university teaching. + + This file is part of SWAD core. + Copyright (C) 1999-2015 Antonio Caņas Vargas + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/*****************************************************************************/ +/********************************* Headers ***********************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Public constants ******************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/******************************* Public types ********************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Public prototypes *****************************/ +/*****************************************************************************/ + +void Cal_DrawCurrentMonth (void); +void Cal_DrawCalendar (void); + +#endif diff --git a/swad_changelog.h b/swad_changelog.h index eb89332d6..890a904ac 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -35,11 +35,15 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 14.52.6 (2015/01/04)" +#define Log_PLATFORM_VERSION "SWAD 14.53 (2015/01/04)" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h | tail -1 /* + Version 14.53 :Jan 04, 2014 New module swad_calendar for calendar. (173254 lines) + 1 change necessary in Makefile: +Add swad_calendar.o to list of object files + Version 14.52.6 :Jan 04, 2014 Fixed bugs for HTML5 validation. (173187 lines) Version 14.52.5 :Jan 02, 2014 Changes in CSS. (173170 lines) Version 14.52.4 :Jan 02, 2014 Removed unnecessary titles in statistics. (173169 lines) diff --git a/swad_date.c b/swad_date.c index 179bc6b43..d6e2fc964 100644 --- a/swad_date.c +++ b/swad_date.c @@ -25,12 +25,9 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ -#include // For isdigit -#include // For NULL #include // For string functions -#include // For time -#include "swad_exam.h" +#include "swad_date.h" #include "swad_global.h" #include "swad_parameter.h" @@ -44,7 +41,7 @@ extern struct Globals Gbl; /**************************** Private constants ******************************/ /*****************************************************************************/ -const unsigned NumDaysMonth[1+12] = +const unsigned Dat_NumDaysMonth[1+12] = { 0, 31, // 1: January @@ -171,367 +168,6 @@ void Dat_ShowCurrentDateTime (void) Gbl.Now.Time.Hour,Gbl.Now.Time.Minute); } -/*****************************************************************************/ -/***************************** Draw current month ****************************/ -/*****************************************************************************/ - -void Dat_DrawCurrentMonth (void) - { - /***** Get list of holidays *****/ - if (!Gbl.Hlds.LstIsRead) - { - Gbl.Hlds.SelectedOrderType = Hld_ORDER_BY_START_DATE; - Hld_GetListHolidays (); - } - - /***** Create list of dates of exam announcements *****/ - Exa_CreateListOfExamAnnouncements (); - - /***** Draw the month *****/ - Dat_DrawMonth (Gbl.Now.Date.Year,Gbl.Now.Date.Month,false,true,false); - - /***** Free list of dates of exam announcements *****/ - Exa_FreeListExamAnnouncements (); - } - -/*****************************************************************************/ -/************************ Draw an academic calendar **************************/ -/*****************************************************************************/ -/* Current Starting - month month - 1 -> 9 - 2 -> 9 - 3 -> 9 - 4 -> 9 - - 5 -> 1 - 6 -> 1 - 7 -> 1 - 8 -> 1 - - 9 -> 5 - 10 -> 5 - 11 -> 5 - 12 -> 5 -*/ -void Dat_DrawCalendar (void) - { - static unsigned StartingMonth[1+12] = // Calendar starts one row before current month - { - 0, // Not used - 9, // January --> September - 9, // February --> September - 9, // Mars --> September - 9, // April --> September - 1, // May --> January - 1, // June --> January - 1, // July --> January - 1, // Agoust --> January - 5, // September --> May - 5, // October --> May - 5, // November --> May - 5, // December --> May - }; - unsigned Row,Col; - unsigned Month = StartingMonth[Gbl.Now.Date.Month]; - unsigned Year = (Month < Gbl.Now.Date.Month) ? Gbl.Now.Date.Year : - Gbl.Now.Date.Year - 1; - bool PrintView = (Gbl.CurrentAct == ActPrnCal); - - /***** Get list of holidays *****/ - if (!Gbl.Hlds.LstIsRead) - { - Gbl.Hlds.SelectedOrderType = Hld_ORDER_BY_START_DATE; - Hld_GetListHolidays (); - } - - /***** Start of table and title *****/ - if (!PrintView) - { - /* Link to print view */ - fprintf (Gbl.F.Out,"
"); - Lay_PutLinkToPrintView1 (ActPrnCal); - Lay_PutLinkToPrintView2 (); - fprintf (Gbl.F.Out,"
"); - } - Lay_StartRoundFrameTable10 (NULL,0,NULL); - Lay_WriteHeaderClassPhoto (1,PrintView,false, - Gbl.CurrentIns.Ins.InsCod, - Gbl.CurrentDeg.Deg.DegCod, - Gbl.CurrentCrs.Crs.CrsCod); - - /***** Create list of calls for examination *****/ - Exa_CreateListOfExamAnnouncements (); - - /***** Draw several months *****/ - fprintf (Gbl.F.Out,"" - "" - ""); - for (Row = 0; - Row < 4; - Row++) - { - fprintf (Gbl.F.Out,""); - for (Col = 0; - Col < 4; - Col++) - { - fprintf (Gbl.F.Out,""); - if (++Month == 13) - { - Month = 1; - Year++; - } - } - fprintf (Gbl.F.Out,""); - } - fprintf (Gbl.F.Out,"
"); - Dat_DrawMonth (Year,Month,true,!PrintView,(Gbl.CurrentAct == ActPrnCal)); - fprintf (Gbl.F.Out,"
" - "" - ""); - - /***** Free list of dates of exam announcements *****/ - Exa_FreeListExamAnnouncements (); - - /***** End frame *****/ - Lay_EndRoundFrameTable10 (); - } - -/*****************************************************************************/ -/******************************** Draw a month *******************************/ -/*****************************************************************************/ - -void Dat_DrawMonth (unsigned RealYear,unsigned RealMonth, - bool DrawingCalendar,bool PutLinkToEvents,bool PrintView) - { - extern const char *Txt_Show_calendar; - extern const char *Txt_DAYS_CAPS[7]; - extern const char *Txt_MONTHS_CAPS[12]; - extern const char *Txt_Exam_of_X; - char StrExamOfX[512+Crs_MAX_LENGTH_COURSE_FULL_NAME]; - unsigned Week; - unsigned DayOfWeek; /* 0, 1, 2, 3, 4, 5 ķ 6 */ - unsigned DayOfMonth; - unsigned NumDaysInMonth; - unsigned Year = RealYear; - unsigned Month = RealMonth; - char YYYYMMDD[4+2+2+1]; - unsigned NumHld; - char *ClassForDay; // Class of day depending on type of day - char *TextForDay; // Text associated to a day, for example the name of the holiday - unsigned NumExamAnnouncement; // Number of exam announcement - int ResultOfCmpStartDate; - bool ContinueSearching; - bool PutLinkToCalendar = !DrawingCalendar && Gbl.CurrentCrs.Crs.CrsCod > 0; - bool ThisDayHasEvent = false; - bool IsToday; - - /***** Compute number of day of month for the first box *****/ - /* The initial day of month can be -5, -4, -3, -2, -1, 0, or 1 - If it's -5 then write 6 boxes of the previous month. - If it's -4 then write 5 boxes of the previous month. - If it's -3 then write 4 boxes of the previous month. - If it's -2 then write 3 boxes of the previous month. - If it's -1 then write 2 boxes of the previous month. - If it's 0 then write 1 box of the previous month. - If it's 1 then write 0 boxes of the previous month. */ - - if ((DayOfWeek = Dat_GetDayOfWeek (Year,Month,1)) == 0) - DayOfMonth = 1; - else - { - if (Month <= 1) - { - Month = 12; - Year--; - } - else - Month--; - NumDaysInMonth = (Month == 2) ? Dat_GetNumDaysFebruary (Year) : - NumDaysMonth[Month]; - DayOfMonth = NumDaysInMonth - DayOfWeek + 1; - } - - /***** Start of month *****/ - fprintf (Gbl.F.Out,"
"); - - /***** Month name *****/ - fprintf (Gbl.F.Out,"
"); - if (PutLinkToCalendar) - { - Act_FormStart (ActSeeCal); - Act_LinkFormSubmit (Txt_Show_calendar,"MONTH"); - } - fprintf (Gbl.F.Out,"%s %u", - Txt_MONTHS_CAPS[RealMonth-1],RealYear); - if (PutLinkToCalendar) - fprintf (Gbl.F.Out,"" - ""); - fprintf (Gbl.F.Out,"
"); - - /***** Month head: first letter for each day of week *****/ - fprintf (Gbl.F.Out,"" - ""); - for (DayOfWeek = 0; - DayOfWeek < 7; - DayOfWeek++) - fprintf (Gbl.F.Out,"", - (DayOfWeek == 6) ? "DAY_NO_WRK_HEAD" : - "DAY_WRK_HEAD", - Txt_DAYS_CAPS[DayOfWeek][0]); - fprintf (Gbl.F.Out,""); - - /***** Draw every week of the month *****/ - for (Week = 0; - Week < 6; - Week++) - { - fprintf (Gbl.F.Out,""); - - /***** Draw every day of the week *****/ - for (DayOfWeek = 0; - DayOfWeek < 7; - DayOfWeek++) - { - /***** Set class for day being drawn *****/ - ClassForDay = (Month == RealMonth) ? "DAY_WRK" : - "DAY_WRK_LIGHT"; - TextForDay = NULL; - - /* Check if day is a holiday or a school day */ - sprintf (YYYYMMDD,"%04u%02u%02u",Year,Month,DayOfMonth); - for (NumHld = 0, ContinueSearching = true; - NumHld < Gbl.Hlds.Num && ContinueSearching; - NumHld++) - if (Gbl.Hlds.Lst[NumHld].PlcCod <= 0 || - Gbl.Hlds.Lst[NumHld].PlcCod == Gbl.CurrentCtr.Ctr.PlcCod) - { - ResultOfCmpStartDate = strcmp (Gbl.Hlds.Lst[NumHld].StartDate.YYYYMMDD,YYYYMMDD); - if (ResultOfCmpStartDate > 0) // List is ordered by start date. If start date is greater than date being drawn, don't continue searching - - ContinueSearching = false; - else // ResultOfCmpStartDate <= 0 <==> start date <= date being drawn - switch (Gbl.Hlds.Lst[NumHld].HldTyp) - { - case Hld_HOLIDAY: - if (ResultOfCmpStartDate == 0) // If start date == date being drawn - { - ClassForDay = (Month == RealMonth) ? "DAY_HLD" : - "DAY_HLD_LIGHT"; - TextForDay = Gbl.Hlds.Lst[NumHld].Name; - ContinueSearching = false; - } - break; - case Hld_NON_SCHOOL_PERIOD: - if (strcmp (Gbl.Hlds.Lst[NumHld].EndDate.YYYYMMDD,YYYYMMDD) >= 0) // If start date <= date being drawn <= end date - { - ClassForDay = (Month == RealMonth) ? "DAY_NO_WORK" : - "DAY_NO_WORK_LIGHT"; - TextForDay = Gbl.Hlds.Lst[NumHld].Name; - } - break; - } - } - - /* Day being drawn is sunday? */ - if (DayOfWeek == 6) // All the sundays are holidays - ClassForDay = (Month == RealMonth) ? "DAY_HLD" : - "DAY_HLD_LIGHT"; - - /* Date being drawn is today? */ - IsToday = (Gbl.CurrentAct != ActPrnCal && Month == RealMonth && - Year == Gbl.Now.Date.Year && - Month == Gbl.Now.Date.Month && - DayOfMonth == Gbl.Now.Date.Day); - - /* Check if day has an exam announcement */ - ThisDayHasEvent = false; - if (!DrawingCalendar || Month == RealMonth) // If drawing calendar and the month is not the real one, don't draw exam announcements - for (NumExamAnnouncement = 0; - NumExamAnnouncement < Gbl.LstExamAnnouncements.NumExamAnnounc; - NumExamAnnouncement++) - if (Year == Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Year && - Month == Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Month && - DayOfMonth == Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Day) - { - ThisDayHasEvent = true; - if (PutLinkToEvents) - { - sprintf (StrExamOfX,Txt_Exam_of_X,Gbl.CurrentCrs.Crs.FullName); - sprintf (Gbl.Title,"%s: %02u/%02u/%04u", - StrExamOfX, - Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Day, - Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Month, - Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Year); - } - break; - } - - /***** Write the box with the day *****/ - fprintf (Gbl.F.Out,""); - - /***** Set the next day *****/ - NumDaysInMonth = (Month == 2) ? Dat_GetNumDaysFebruary (Year) : - NumDaysMonth[Month]; - if (++DayOfMonth > NumDaysInMonth) - { - if (++Month > 12) - { - Year++; - Month = 1; - } - DayOfMonth = 1; - } - } - fprintf (Gbl.F.Out,""); - } - - /***** End of month *****/ - fprintf (Gbl.F.Out,"
" - "%c" - "
", - IsToday ? (ThisDayHasEvent ? "TODAY_EVENT" : - "TODAY") : - (ThisDayHasEvent ? "DAY_EVENT" : - "DAY" )); - - /* If day has an exam announcement */ - if (PutLinkToEvents && ThisDayHasEvent) - { - Act_FormStart (ActSeeExaAnn); - fprintf (Gbl.F.Out,"" - "" - "" - "" - "
", - ClassForDay); - Act_LinkFormSubmit (Gbl.Title,ClassForDay); - } - else - { - fprintf (Gbl.F.Out,"
"); - } - - /* Write the day of month */ - fprintf (Gbl.F.Out,"%u",DayOfMonth); - - /* If day has an exam announcement */ - if (PutLinkToEvents && ThisDayHasEvent) - fprintf (Gbl.F.Out,"" - "
" - ""); - else - fprintf (Gbl.F.Out,""); - - fprintf (Gbl.F.Out,"
" - "
"); - } - /*****************************************************************************/ /***************** Compute local time, adjusting day of week *****************/ /*****************************************************************************/ @@ -669,7 +305,7 @@ void Dat_WriteFormDate (unsigned FirstYear,unsigned LastYear, fprintf (Gbl.F.Out,">"); NumDaysSelectedMonth = (DateSelected->Month == 0) ? 31 : ((DateSelected->Month == 2) ? Dat_GetNumDaysFebruary (DateSelected->Year) : - NumDaysMonth[DateSelected->Month]); + Dat_NumDaysMonth[DateSelected->Month]); for (Day = 1; Day <= NumDaysSelectedMonth; Day++) @@ -732,7 +368,6 @@ void Dat_WriteFormDate (unsigned FirstYear,unsigned LastYear, ""); } - /*****************************************************************************/ /*************** Show a form to enter a hour-minute time *********************/ /*****************************************************************************/ @@ -964,7 +599,7 @@ void Dat_GetDateBefore (struct Date *Date,struct Date *PrecedingDate) PrecedingDate->Year = Date->Year; PrecedingDate->Month = Date->Month - 1; PrecedingDate->Day = (PrecedingDate->Month == 2) ? Dat_GetNumDaysFebruary (PrecedingDate->Year) : - NumDaysMonth[PrecedingDate->Month]; + Dat_NumDaysMonth[PrecedingDate->Month]; } } else @@ -982,7 +617,7 @@ void Dat_GetDateBefore (struct Date *Date,struct Date *PrecedingDate) void Dat_GetDateAfter (struct Date *Date,struct Date *SubsequentDate) { unsigned NumDaysInMonth = (Date->Month == 2) ? Dat_GetNumDaysFebruary (Date->Year) : - NumDaysMonth[Date->Month]; + Dat_NumDaysMonth[Date->Month]; if (Date->Day == NumDaysInMonth) { @@ -1188,7 +823,7 @@ unsigned Dat_GetDayOfYear (struct Date *Date) Month < Date->Month; Month++) DayYear += (Month == 2) ? Dat_GetNumDaysFebruary (Date->Year) : - NumDaysMonth[Month]; + Dat_NumDaysMonth[Month]; DayYear += Date->Day; return DayYear; diff --git a/swad_date.h b/swad_date.h index a56beffe8..96debd14a 100644 --- a/swad_date.h +++ b/swad_date.h @@ -73,10 +73,6 @@ bool Dat_GetDateFromYYYYMMDD (struct Date *Date,const char *YYYYMMDDString); bool Dat_GetDateTimeFromYYYYMMDDHHMMSS (struct DateTime *DateTime,const char *YYYYMMDDHHMMSS); void Dat_ShowCurrentDateTime (void); -void Dat_DrawCurrentMonth (void); -void Dat_DrawCalendar (void); -void Dat_DrawMonth (unsigned RealYear,unsigned RealMonth, - bool DrawingCalendar,bool PutLinkToEvents,bool PrintView); void Dat_GetLocalTimeFromClock (const time_t *clock); void Dat_WriteDateTimeFromtblock (void); diff --git a/swad_layout.c b/swad_layout.c index 784f21a8a..6441c315a 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -30,6 +30,7 @@ #include // For string functions #include "swad_action.h" +#include "swad_calendar.h" #include "swad_changelog.h" #include "swad_config.h" #include "swad_connected.h" @@ -1464,7 +1465,7 @@ static void Lay_ShowLeftColumn (void) /***** Month *****/ fprintf (Gbl.F.Out,"" ""); - Dat_DrawCurrentMonth (); + Cal_DrawCurrentMonth (); fprintf (Gbl.F.Out,"" ""); diff --git a/swad_menu.c b/swad_menu.c index cf48df660..acfc85320 100644 --- a/swad_menu.c +++ b/swad_menu.c @@ -26,12 +26,9 @@ /*****************************************************************************/ #include // For fprintf, etc. -// #include -// #include "swad_config.h" #include "swad_database.h" #include "swad_global.h" -// #include "swad_icon.h" #include "swad_layout.h" #include "swad_menu.h" #include "swad_parameter.h" diff --git a/swad_statistic.c b/swad_statistic.c index bc051a9ca..c95131015 100644 --- a/swad_statistic.c +++ b/swad_statistic.c @@ -728,7 +728,7 @@ static void Sta_WriteSelectorAction (void) void Sta_SetIniEndDates (void) { - extern const unsigned NumDaysMonth[1+12]; // Declaration in swad_date.c + extern const unsigned Dat_NumDaysMonth[1+12]; // Declaration in swad_date.c Gbl.DateRange.DateEnd.Day = Gbl.Now.Date.Day; Gbl.DateRange.DateEnd.Month = Gbl.Now.Date.Month; @@ -747,7 +747,7 @@ void Sta_SetIniEndDates (void) Gbl.DateRange.DateIni.Month = (Gbl.DateRange.DateEnd.Month == 1) ? 12 : Gbl.DateRange.DateEnd.Month - 1; Gbl.DateRange.DateIni.Day = ((Gbl.DateRange.DateIni.Month == 2) ? Dat_GetNumDaysFebruary (Gbl.DateRange.DateIni.Year) : - NumDaysMonth[Gbl.DateRange.DateIni.Month]) + + Dat_NumDaysMonth[Gbl.DateRange.DateIni.Month]) + Gbl.DateRange.DateEnd.Day - (Cfg_DAYS_IN_RECENT_LOG-1); }