Version 16.187.1

This commit is contained in:
Antonio Cañas Vargas 2017-04-24 13:39:55 +02:00
parent 1b25600327
commit cbe46c38ba
4 changed files with 138 additions and 124 deletions

View File

@ -219,13 +219,14 @@
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.187 (2017-04-24)" #define Log_PLATFORM_VERSION "SWAD 16.187.1 (2017-04-24)"
#define CSS_FILE "swad16.185.3.css" #define CSS_FILE "swad16.185.3.css"
#define JS_FILE "swad16.181.js" #define JS_FILE "swad16.181.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // 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 sql/swad*.sql | tail -1 // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/* /*
Version 16.187.1: Apr 24, 2017 Changes in timetable. Not finished. (217958 lines)
Version 16.187: Apr 24, 2017 Changes in timetable. Not finished. (217947 lines) Version 16.187: Apr 24, 2017 Changes in timetable. Not finished. (217947 lines)
35 changes necessary in database. 35 changes necessary in database.
ALTER TABLE timetable_crs CHANGE COLUMN Day DayOld ENUM('L','M','X','J','V','S','D') NOT NULL; ALTER TABLE timetable_crs CHANGE COLUMN Day DayOld ENUM('L','M','X','J','V','S','D') NOT NULL;

View File

@ -626,7 +626,7 @@ struct Globals
unsigned Day; unsigned Day;
unsigned HourOld; unsigned HourOld;
unsigned Column; unsigned Column;
TT_ClassTypeOld_t ClassTypeOld; TT_ClassType_t ClassType;
unsigned DurationOld; unsigned DurationOld;
char Place[TT_MAX_BYTES_PLACE + 1]; char Place[TT_MAX_BYTES_PLACE + 1];
char Group[Grp_MAX_BYTES_GROUP_NAME + 1]; char Group[Grp_MAX_BYTES_GROUP_NAME + 1];

View File

@ -50,9 +50,9 @@ extern struct Globals Gbl;
/*************************** Internal constants ******************************/ /*************************** Internal constants ******************************/
/*****************************************************************************/ /*****************************************************************************/
#define TT_START_HOUR 6 // Day starts at 6:00 #define TT_START_HOUR 6 // Day starts at 6:00
#define TT_HOURS_PER_DAY 18 // From 6:00 to 24:00 #define TT_END_HOUR 24 // Day ends at 24:00
// #define TT_HOURS_PER_DAY 2 // From 6:00 to 24:00 #define TT_HOURS_PER_DAY (TT_END_HOUR - TT_START_HOUR) // From 6:00 to 24:00
#define TT_DAYS 7 // Seven days per week #define TT_DAYS 7 // Seven days per week
#define TT_MAX_COLUMNS_PER_CELL 3 // Maximum number of items (i.e. classes) in a timetable cell (1, 2, 3 or 4) #define TT_MAX_COLUMNS_PER_CELL 3 // Maximum number of items (i.e. classes) in a timetable cell (1, 2, 3 or 4)
@ -74,7 +74,22 @@ extern struct Globals Gbl;
/************************* Internal global variables *************************/ /************************* Internal global variables *************************/
/*****************************************************************************/ /*****************************************************************************/
char TimeTableCharsDays[TT_DAYS] = // TODO: Change from Spanish to numbers, also in database char *TimeTableStrsClassTypeDB[TT_NUM_CLASS_TYPES] =
{
"free",
"lecture",
"practical",
"tutoring",
};
char *TimeTableStrsClassTypeOldDB[TT_NUM_CLASS_TYPES] = // TODO: Remove
{
"libre",
"teoria",
"practicas",
"tutorias",
};
char TimeTableCharsDaysOld[TT_DAYS] = // TODO: Remove
{ {
'L', // Monday 'L', // Monday
'M', // Tuesday 'M', // Tuesday
@ -85,36 +100,30 @@ char TimeTableCharsDays[TT_DAYS] = // TODO: Change from Spanish to numbers, also
'D', // Sunday 'D', // Sunday
}; };
char *TimeTableStrsClassTypeOldDB[TT_NUM_CLASS_TYPES] =
{
"free",
"lecture",
"practical",
"tutoring",
};
char *TimeTableStrsClassTypeOldDBOld[TT_NUM_CLASS_TYPES] = // TODO: Remove
{
"libre",
"teoria",
"practicas",
"tutorias",
};
struct TimeTableColumn struct TimeTableColumn
{ {
long CrsCod; // Course code (-1 if no course selected) long CrsCod; // Course code (-1 if no course selected)
long GrpCod; // Group code (-1 if no group selected) long GrpCod; // Group code (-1 if no group selected)
TT_HourType_t HourType; TT_HourType_t HourType;
TT_ClassTypeOld_t ClassTypeOld; TT_ClassType_t ClassType;
unsigned DurationOld; unsigned DurationMinutes;
unsigned DurationOld; // TODO: Remove
char Place[TT_MAX_BYTES_PLACE + 1]; char Place[TT_MAX_BYTES_PLACE + 1];
char Group[Grp_MAX_BYTES_GROUP_NAME + 1]; char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
}; };
struct struct
{ {
unsigned NumColumns; unsigned NumColumns;
struct TimeTableColumn Columns[TT_MAX_COLUMNS_PER_CELL]; struct TimeTableColumn Columns[TT_MAX_COLUMNS_PER_CELL];
} TimeTable[TT_DAYS][TT_HOURS_PER_DAY * 12]; } TimeTableOld[TT_DAYS][TT_HOURS_PER_DAY * 12];
struct
{
unsigned NumColumns;
struct TimeTableColumn Columns[TT_MAX_COLUMNS_PER_CELL];
} TT_TimeTable[TT_DAYS][TT_HOURS_PER_DAY * 12];
bool TimeTableHoursChecked[TT_HOURS_PER_DAY * 12]; bool TimeTableHoursChecked[TT_HOURS_PER_DAY * 12];
/*****************************************************************************/ /*****************************************************************************/
@ -140,7 +149,7 @@ static void TT_TimeTableDrawHourCell (unsigned HourOld,unsigned Min,const char *
static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned HourOld); static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned HourOld);
static void TT_DrawCellAlignTimeTable (void); static void TT_DrawCellAlignTimeTable (void);
static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,unsigned ColSpan, static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,unsigned ColSpan,
long CrsCod,TT_HourType_t HourType,TT_ClassTypeOld_t ClassTypeOld, long CrsCod,TT_HourType_t HourType,TT_ClassType_t ClassType,
unsigned DurationOld,char *Group,long GrpCod,char *Place); unsigned DurationOld,char *Group,long GrpCod,char *Place);
/*****************************************************************************/ /*****************************************************************************/
@ -200,12 +209,12 @@ static void TT_GetParamsTimeTable (void)
/***** Get class type *****/ /***** Get class type *****/
Par_GetParToText ("ModTTClassTypeOld",StrClassTypeOld,TT_MAX_BYTES_STR_CLASS_TYPE); Par_GetParToText ("ModTTClassTypeOld",StrClassTypeOld,TT_MAX_BYTES_STR_CLASS_TYPE);
for (Gbl.TimeTable.ClassTypeOld = (TT_ClassTypeOld_t) 0; for (Gbl.TimeTable.ClassType = (TT_ClassType_t) 0;
Gbl.TimeTable.ClassTypeOld < (TT_ClassTypeOld_t) TT_NUM_CLASS_TYPES; Gbl.TimeTable.ClassType < (TT_ClassType_t) TT_NUM_CLASS_TYPES;
Gbl.TimeTable.ClassTypeOld++) Gbl.TimeTable.ClassType++)
if (!strcmp (StrClassTypeOld,TimeTableStrsClassTypeOldDB[Gbl.TimeTable.ClassTypeOld])) if (!strcmp (StrClassTypeOld,TimeTableStrsClassTypeOldDB[Gbl.TimeTable.ClassType]))
break; break;
if (Gbl.TimeTable.ClassTypeOld == (TT_ClassTypeOld_t) TT_NUM_CLASS_TYPES) if (Gbl.TimeTable.ClassType == (TT_ClassType_t) TT_NUM_CLASS_TYPES)
Lay_ShowErrorAndExit ("Type of timetable cell is missing."); Lay_ShowErrorAndExit ("Type of timetable cell is missing.");
/***** Get class duration *****/ /***** Get class duration *****/
@ -470,8 +479,10 @@ static void TT_WriteCrsTimeTableIntoDB (long CrsCod)
char Query[512 + char Query[512 +
TT_MAX_BYTES_PLACE + TT_MAX_BYTES_PLACE +
Grp_MAX_BYTES_GROUP_NAME]; Grp_MAX_BYTES_GROUP_NAME];
unsigned HourOld; unsigned Interval5Minutes;
unsigned Day; unsigned Day;
unsigned Hour;
unsigned Min;
unsigned Column; unsigned Column;
/***** Remove former timetable *****/ /***** Remove former timetable *****/
@ -483,27 +494,29 @@ static void TT_WriteCrsTimeTableIntoDB (long CrsCod)
for (Day = 0; for (Day = 0;
Day < TT_DAYS; Day < TT_DAYS;
Day++) Day++)
for (HourOld = 0; for (Interval5Minutes = 0, Hour = TT_START_HOUR, Min = 0;
HourOld < TT_HOURS_PER_DAY * 2; Hour < TT_END_HOUR;
HourOld++) Interval5Minutes++, Hour += (Min + 5) / 60, Min = (Min + 5) % 60)
for (Column = 0; for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
if (TimeTable[Day][HourOld].Columns[Column].HourType == TT_FIRST_HOUR && if (TT_TimeTable[Day][Interval5Minutes].Columns[Column].HourType == TT_FIRST_HOUR &&
TimeTable[Day][HourOld].Columns[Column].DurationOld > 0) TT_TimeTable[Day][Interval5Minutes].Columns[Column].DurationOld > 0)
{ {
sprintf (Query,"INSERT INTO timetable_crs" sprintf (Query,"INSERT INTO timetable_crs"
" (CrsCod,GrpCod,DayOld,HourOld,DurationOld,ClassTypeOld,Place,GroupName)" " (CrsCod,GrpCod,Weekday,StartTime,Duration,"
"ClassType,Place,GroupName)"
" VALUES" " VALUES"
" (%ld,%ld,'%c',%u,%d,'%s','%s','%s')", " (%ld,%ld,%u,'%02u:%02u:00',SEC_TO_TIME(%u),"
"'%s','%s','%s')",
CrsCod, CrsCod,
TimeTable[Day][HourOld].Columns[Column].GrpCod, TT_TimeTable[Day][Interval5Minutes].Columns[Column].GrpCod,
TimeTableCharsDays[Day], Day,
HourOld, Hour,Min,
TimeTable[Day][HourOld].Columns[Column].DurationOld, TT_TimeTable[Day][Interval5Minutes].Columns[Column].DurationMinutes * 60,
TimeTableStrsClassTypeOldDB[TimeTable[Day][HourOld].Columns[Column].ClassTypeOld], TimeTableStrsClassTypeOldDB[TT_TimeTable[Day][Interval5Minutes].Columns[Column].ClassType],
TimeTable[Day][HourOld].Columns[Column].Place, TT_TimeTable[Day][Interval5Minutes].Columns[Column].Place,
TimeTable[Day][HourOld].Columns[Column].Group); TT_TimeTable[Day][Interval5Minutes].Columns[Column].Group);
DB_QueryINSERT (Query,"can not create course timetable"); DB_QueryINSERT (Query,"can not create course timetable");
} }
} }
@ -535,16 +548,16 @@ static void TT_WriteTutTimeTableIntoDB (long UsrCod)
for (Column = 0; for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
if (TimeTable[Day][HourOld].Columns[Column].HourType == TT_FIRST_HOUR && if (TimeTableOld[Day][HourOld].Columns[Column].HourType == TT_FIRST_HOUR &&
TimeTable[Day][HourOld].Columns[Column].DurationOld > 0) TimeTableOld[Day][HourOld].Columns[Column].DurationOld > 0)
{ {
sprintf (Query,"INSERT INTO timetable_tut" sprintf (Query,"INSERT INTO timetable_tut"
" (UsrCod,DayOld,HourOld,DurationOld,Place)" " (UsrCod,DayOld,HourOld,DurationOld,Place)"
" VALUES" " VALUES"
" (%ld,'%c',%u,%d,'%s')", " (%ld,'%c',%u,%d,'%s')",
UsrCod,TimeTableCharsDays[Day],HourOld, UsrCod,TimeTableCharsDaysOld[Day],HourOld,
TimeTable[Day][HourOld].Columns[Column].DurationOld, TimeTableOld[Day][HourOld].Columns[Column].DurationOld,
TimeTable[Day][HourOld].Columns[Column].Place); TimeTableOld[Day][HourOld].Columns[Column].Place);
DB_QueryINSERT (Query,"can not create office timetable"); DB_QueryINSERT (Query,"can not create office timetable");
} }
} }
@ -568,7 +581,7 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
unsigned DurationOld; unsigned DurationOld;
unsigned H; unsigned H;
long GrpCod; long GrpCod;
TT_ClassTypeOld_t ClassTypeOld = TT_FREE; // Initialized to avoid warning TT_ClassType_t ClassType = TT_FREE; // Initialized to avoid warning
bool TimeTableIsIncomplete = false; bool TimeTableIsIncomplete = false;
bool TimeTableHasSpaceForThisClass; bool TimeTableHasSpaceForThisClass;
bool Found; bool Found;
@ -581,18 +594,18 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
HourOld < TT_HOURS_PER_DAY * 2; HourOld < TT_HOURS_PER_DAY * 2;
HourOld++) HourOld++)
{ {
TimeTable[Day][HourOld].NumColumns = 0; TimeTableOld[Day][HourOld].NumColumns = 0;
for (Column = 0; for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
{ {
TimeTable[Day][HourOld].Columns[Column].CrsCod = -1L; TimeTableOld[Day][HourOld].Columns[Column].CrsCod = -1L;
TimeTable[Day][HourOld].Columns[Column].GrpCod = -1L; TimeTableOld[Day][HourOld].Columns[Column].GrpCod = -1L;
TimeTable[Day][HourOld].Columns[Column].HourType = TT_FREE_HOUR; TimeTableOld[Day][HourOld].Columns[Column].HourType = TT_FREE_HOUR;
TimeTable[Day][HourOld].Columns[Column].ClassTypeOld = TT_FREE; TimeTableOld[Day][HourOld].Columns[Column].ClassType = TT_FREE;
TimeTable[Day][HourOld].Columns[Column].DurationOld = 0; TimeTableOld[Day][HourOld].Columns[Column].DurationOld = 0;
TimeTable[Day][HourOld].Columns[Column].Group[0] = '\0'; TimeTableOld[Day][HourOld].Columns[Column].Group[0] = '\0';
TimeTable[Day][HourOld].Columns[Column].Place[0] = '\0'; TimeTableOld[Day][HourOld].Columns[Column].Place[0] = '\0';
} }
} }
@ -695,7 +708,7 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
for (Day = 0; for (Day = 0;
Day < TT_DAYS; Day < TT_DAYS;
Day++) Day++)
if (Str_ConvertToUpperLetter (row[0][0]) == TimeTableCharsDays[Day]) if (Str_ConvertToUpperLetter (row[0][0]) == TimeTableCharsDaysOld[Day])
break; break;
if (Day == TT_DAYS) if (Day == TT_DAYS)
Lay_ShowErrorAndExit ("Wrong day of week in timetable."); Lay_ShowErrorAndExit ("Wrong day of week in timetable.");
@ -713,10 +726,10 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
{ {
case TT_COURSE_TIMETABLE: case TT_COURSE_TIMETABLE:
case TT_MY_TIMETABLE: case TT_MY_TIMETABLE:
for (ClassTypeOld = TT_LECTURE, Found = false; for (ClassType = TT_LECTURE, Found = false;
ClassTypeOld <= TT_TUTORING; ClassType <= TT_TUTORING;
ClassTypeOld++) ClassType++)
if (!strcmp (row[4],TimeTableStrsClassTypeOldDB[ClassTypeOld])) if (!strcmp (row[4],TimeTableStrsClassTypeOldDB[ClassType]))
{ {
Found = true; Found = true;
break; break;
@ -725,19 +738,19 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
Lay_ShowErrorAndExit ("Wrong type of class in timetable."); Lay_ShowErrorAndExit ("Wrong type of class in timetable.");
break; break;
case TT_TUTORING_TIMETABLE: case TT_TUTORING_TIMETABLE:
ClassTypeOld = TT_TUTORING; ClassType = TT_TUTORING;
break; break;
} }
/* Cell has been read without errors. */ /* Cell has been read without errors. */
if (TimeTable[Day][HourOld].NumColumns < TT_MAX_COLUMNS_PER_CELL) // If there's place for another column in this cell... if (TimeTableOld[Day][HourOld].NumColumns < TT_MAX_COLUMNS_PER_CELL) // If there's place for another column in this cell...
{ {
/* Find the first free column for this day-hour */ /* Find the first free column for this day-hour */
FirstFreeColumn = TT_MAX_COLUMNS_PER_CELL; FirstFreeColumn = TT_MAX_COLUMNS_PER_CELL;
for (Column = 0; for (Column = 0;
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
if (TimeTable[Day][HourOld].Columns[Column].HourType == TT_FREE_HOUR) if (TimeTableOld[Day][HourOld].Columns[Column].HourType == TT_FREE_HOUR)
{ {
FirstFreeColumn = Column; FirstFreeColumn = Column;
break; break;
@ -749,7 +762,7 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
for (H = HourOld + 1; for (H = HourOld + 1;
H < HourOld + DurationOld && H < TT_HOURS_PER_DAY * 2; H < HourOld + DurationOld && H < TT_HOURS_PER_DAY * 2;
H++) H++)
if (TimeTable[Day][H].Columns[FirstFreeColumn].HourType != TT_FREE_HOUR) if (TimeTableOld[Day][H].Columns[FirstFreeColumn].HourType != TT_FREE_HOUR)
{ {
TimeTableIsIncomplete = true; TimeTableIsIncomplete = true;
TimeTableHasSpaceForThisClass = false; TimeTableHasSpaceForThisClass = false;
@ -757,15 +770,15 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
} }
if (TimeTableHasSpaceForThisClass) if (TimeTableHasSpaceForThisClass)
{ {
TimeTable[Day][HourOld].Columns[FirstFreeColumn].ClassTypeOld = ClassTypeOld; TimeTableOld[Day][HourOld].Columns[FirstFreeColumn].ClassType = ClassType;
TimeTable[Day][HourOld].Columns[FirstFreeColumn].DurationOld = DurationOld; TimeTableOld[Day][HourOld].Columns[FirstFreeColumn].DurationOld = DurationOld;
TimeTable[Day][HourOld].Columns[FirstFreeColumn].HourType = TT_FIRST_HOUR; TimeTableOld[Day][HourOld].Columns[FirstFreeColumn].HourType = TT_FIRST_HOUR;
for (H = HourOld + 1; for (H = HourOld + 1;
H < HourOld + DurationOld && H < TT_HOURS_PER_DAY * 2; H < HourOld + DurationOld && H < TT_HOURS_PER_DAY * 2;
H++) H++)
{ {
TimeTable[Day][H].Columns[FirstFreeColumn].HourType = TT_NEXT_HOUR; TimeTableOld[Day][H].Columns[FirstFreeColumn].HourType = TT_NEXT_HOUR;
TimeTable[Day][H].NumColumns++; TimeTableOld[Day][H].NumColumns++;
} }
/* Group and place */ /* Group and place */
@ -773,23 +786,23 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
{ {
case TT_MY_TIMETABLE: case TT_MY_TIMETABLE:
case TT_COURSE_TIMETABLE: case TT_COURSE_TIMETABLE:
TimeTable[Day][HourOld].Columns[FirstFreeColumn].CrsCod = TimeTableOld[Day][HourOld].Columns[FirstFreeColumn].CrsCod =
(Gbl.TimeTable.Type == TT_MY_TIMETABLE ? Str_ConvertStrCodToLongCod (row[7]) : (Gbl.TimeTable.Type == TT_MY_TIMETABLE ? Str_ConvertStrCodToLongCod (row[7]) :
Gbl.CurrentCrs.Crs.CrsCod); Gbl.CurrentCrs.Crs.CrsCod);
Str_Copy (TimeTable[Day][HourOld].Columns[FirstFreeColumn].Group, Str_Copy (TimeTableOld[Day][HourOld].Columns[FirstFreeColumn].Group,
row[5], row[5],
Grp_MAX_BYTES_GROUP_NAME); Grp_MAX_BYTES_GROUP_NAME);
TimeTable[Day][HourOld].Columns[FirstFreeColumn].GrpCod = GrpCod; TimeTableOld[Day][HourOld].Columns[FirstFreeColumn].GrpCod = GrpCod;
// no break; // no break;
case TT_TUTORING_TIMETABLE: case TT_TUTORING_TIMETABLE:
Str_Copy (TimeTable[Day][HourOld].Columns[FirstFreeColumn].Place, Str_Copy (TimeTableOld[Day][HourOld].Columns[FirstFreeColumn].Place,
row[3], row[3],
TT_MAX_BYTES_PLACE); TT_MAX_BYTES_PLACE);
break; break;
} }
/* Increment number of items in this cell */ /* Increment number of items in this cell */
TimeTable[Day][HourOld].NumColumns++; TimeTableOld[Day][HourOld].NumColumns++;
} }
} }
else else
@ -812,31 +825,31 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
static void TT_ModifTimeTable (void) static void TT_ModifTimeTable (void)
{ {
if (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType == TT_FIRST_HOUR) if (TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType == TT_FIRST_HOUR)
{ {
/***** Free this cell *****/ /***** Free this cell *****/
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].GrpCod = -1; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].GrpCod = -1;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType = TT_FREE_HOUR; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType = TT_FREE_HOUR;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].ClassTypeOld = TT_FREE; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].ClassType = TT_FREE;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].DurationOld = 0; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].DurationOld = 0;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Group[0] = '\0'; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Group[0] = '\0';
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Place[0] = '\0'; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Place[0] = '\0';
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns--; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns--;
} }
if (Gbl.TimeTable.ClassTypeOld != TT_FREE && Gbl.TimeTable.DurationOld > 0 && if (Gbl.TimeTable.ClassType != TT_FREE && Gbl.TimeTable.DurationOld > 0 &&
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns < TT_MAX_COLUMNS_PER_CELL) TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns < TT_MAX_COLUMNS_PER_CELL)
{ {
/***** Change this cell *****/ /***** Change this cell *****/
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns++; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns++;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].GrpCod = Gbl.TimeTable.GrpCod; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].GrpCod = Gbl.TimeTable.GrpCod;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType = TT_FIRST_HOUR; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType = TT_FIRST_HOUR;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].ClassTypeOld = Gbl.TimeTable.ClassTypeOld; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].ClassType = Gbl.TimeTable.ClassType;
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].DurationOld = Gbl.TimeTable.DurationOld; TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].DurationOld = Gbl.TimeTable.DurationOld;
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Group, Str_Copy (TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Group,
Gbl.TimeTable.Group, Gbl.TimeTable.Group,
Grp_MAX_BYTES_GROUP_NAME); Grp_MAX_BYTES_GROUP_NAME);
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Place, Str_Copy (TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Place,
Gbl.TimeTable.Place, Gbl.TimeTable.Place,
TT_MAX_BYTES_PLACE); TT_MAX_BYTES_PLACE);
} }
@ -943,7 +956,7 @@ static void TT_DrawTimeTable (void)
for (Column = 0, ContinuousFreeMinicolumns = 0; for (Column = 0, ContinuousFreeMinicolumns = 0;
Column < ColumnsToDrawIncludingExtraColumn; Column < ColumnsToDrawIncludingExtraColumn;
Column++) Column++)
if (TimeTable[Day][HourOld].Columns[Column].HourType == TT_FREE_HOUR) if (TimeTableOld[Day][HourOld].Columns[Column].HourType == TT_FREE_HOUR)
ContinuousFreeMinicolumns += TT_NUM_MINICOLUMNS_PER_DAY / ColumnsToDrawIncludingExtraColumn; ContinuousFreeMinicolumns += TT_NUM_MINICOLUMNS_PER_DAY / ColumnsToDrawIncludingExtraColumn;
else else
{ {
@ -954,13 +967,13 @@ static void TT_DrawTimeTable (void)
ContinuousFreeMinicolumns = 0; ContinuousFreeMinicolumns = 0;
} }
TT_TimeTableDrawCell (Day,HourOld,Column,TT_NUM_MINICOLUMNS_PER_DAY/ColumnsToDrawIncludingExtraColumn, TT_TimeTableDrawCell (Day,HourOld,Column,TT_NUM_MINICOLUMNS_PER_DAY/ColumnsToDrawIncludingExtraColumn,
TimeTable[Day][HourOld].Columns[Column].CrsCod, TimeTableOld[Day][HourOld].Columns[Column].CrsCod,
TimeTable[Day][HourOld].Columns[Column].HourType, TimeTableOld[Day][HourOld].Columns[Column].HourType,
TimeTable[Day][HourOld].Columns[Column].ClassTypeOld, TimeTableOld[Day][HourOld].Columns[Column].ClassType,
TimeTable[Day][HourOld].Columns[Column].DurationOld, TimeTableOld[Day][HourOld].Columns[Column].DurationOld,
TimeTable[Day][HourOld].Columns[Column].Group, TimeTableOld[Day][HourOld].Columns[Column].Group,
TimeTable[Day][HourOld].Columns[Column].GrpCod, TimeTableOld[Day][HourOld].Columns[Column].GrpCod,
TimeTable[Day][HourOld].Columns[Column].Place); TimeTableOld[Day][HourOld].Columns[Column].Place);
} }
if (ContinuousFreeMinicolumns) if (ContinuousFreeMinicolumns)
TT_TimeTableDrawCell (Day,HourOld,Column-1,ContinuousFreeMinicolumns, TT_TimeTableDrawCell (Day,HourOld,Column-1,ContinuousFreeMinicolumns,
@ -1089,7 +1102,7 @@ static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned HourOld)
unsigned FirstHour; unsigned FirstHour;
unsigned Cols; unsigned Cols;
ColumnsToDraw = TimeTable[Day][HourOld].NumColumns; ColumnsToDraw = TimeTableOld[Day][HourOld].NumColumns;
if (!TimeTableHoursChecked[HourOld]) if (!TimeTableHoursChecked[HourOld])
{ {
@ -1098,14 +1111,14 @@ static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned HourOld)
Column < TT_MAX_COLUMNS_PER_CELL; Column < TT_MAX_COLUMNS_PER_CELL;
Column++) Column++)
{ {
switch (TimeTable[Day][HourOld].Columns[Column].HourType) switch (TimeTableOld[Day][HourOld].Columns[Column].HourType)
{ {
case TT_FREE_HOUR: case TT_FREE_HOUR:
break; break;
case TT_FIRST_HOUR: case TT_FIRST_HOUR:
/* Check from first hour (this one) to last hour searching maximum number of columns */ /* Check from first hour (this one) to last hour searching maximum number of columns */
for (H = HourOld + 1; for (H = HourOld + 1;
H < HourOld + TimeTable[Day][HourOld].Columns[Column].DurationOld; H < HourOld + TimeTableOld[Day][HourOld].Columns[Column].DurationOld;
H++) H++)
if (!TimeTableHoursChecked[H]) if (!TimeTableHoursChecked[H])
{ {
@ -1117,11 +1130,11 @@ static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned HourOld)
case TT_NEXT_HOUR: case TT_NEXT_HOUR:
/* Find first hour for this item (class) */ /* Find first hour for this item (class) */
for (FirstHour = HourOld; for (FirstHour = HourOld;
TimeTable[Day][FirstHour].Columns[Column].HourType == TT_NEXT_HOUR; TimeTableOld[Day][FirstHour].Columns[Column].HourType == TT_NEXT_HOUR;
FirstHour--); FirstHour--);
/* Check from first hour to last hour searching maximum number of columns */ /* Check from first hour to last hour searching maximum number of columns */
for (H = FirstHour; for (H = FirstHour;
H < FirstHour + TimeTable[Day][FirstHour].Columns[Column].DurationOld; H < FirstHour + TimeTableOld[Day][FirstHour].Columns[Column].DurationOld;
H++) H++)
if (!TimeTableHoursChecked[H]) if (!TimeTableHoursChecked[H])
{ {
@ -1153,7 +1166,7 @@ static void TT_DrawCellAlignTimeTable (void)
/*****************************************************************************/ /*****************************************************************************/
static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,unsigned ColSpan, static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,unsigned ColSpan,
long CrsCod,TT_HourType_t HourType,TT_ClassTypeOld_t ClassTypeOld, long CrsCod,TT_HourType_t HourType,TT_ClassType_t ClassType,
unsigned DurationOld,char *Group,long GrpCod,char *Place) unsigned DurationOld,char *Group,long GrpCod,char *Place)
{ {
extern const char *Txt_unknown_removed_course; extern const char *Txt_unknown_removed_course;
@ -1183,7 +1196,7 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,
unsigned Dur; unsigned Dur;
unsigned MaxDuration; unsigned MaxDuration;
unsigned RowSpan = 0; unsigned RowSpan = 0;
TT_ClassTypeOld_t CT; TT_ClassType_t CT;
struct Course Crs; struct Course Crs;
/***** Compute row span and background color depending on hour type *****/ /***** Compute row span and background color depending on hour type *****/
@ -1234,8 +1247,8 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,
/***** Cell start *****/ /***** Cell start *****/
fprintf (Gbl.F.Out,"<td rowspan=\"%u\" colspan=\"%u\" class=\"%s", fprintf (Gbl.F.Out,"<td rowspan=\"%u\" colspan=\"%u\" class=\"%s",
RowSpan,ColSpan,TimeTableClasses[ClassTypeOld]); RowSpan,ColSpan,TimeTableClasses[ClassType]);
if (ClassTypeOld == TT_FREE) if (ClassType == TT_FREE)
fprintf (Gbl.F.Out,"%u",HourOld % 4); fprintf (Gbl.F.Out,"%u",HourOld % 4);
fprintf (Gbl.F.Out," CENTER_MIDDLE DAT_SMALL\">"); fprintf (Gbl.F.Out," CENTER_MIDDLE DAT_SMALL\">");
@ -1257,14 +1270,14 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,
{ {
Crs.CrsCod = CrsCod; Crs.CrsCod = CrsCod;
Crs_GetDataOfCourseByCod (&Crs); Crs_GetDataOfCourseByCod (&Crs);
if (ClassTypeOld == TT_LECTURE || if (ClassType == TT_LECTURE ||
ClassTypeOld == TT_PRACTICAL) ClassType == TT_PRACTICAL)
fprintf (Gbl.F.Out,"%s<br />", fprintf (Gbl.F.Out,"%s<br />",
Crs.ShrtName[0] ? Crs.ShrtName : Crs.ShrtName[0] ? Crs.ShrtName :
Txt_unknown_removed_course); Txt_unknown_removed_course);
} }
fprintf (Gbl.F.Out,"%s (%dh%s)", fprintf (Gbl.F.Out,"%s (%dh%s)",
Txt_TIMETABLE_CLASS_TYPES[ClassTypeOld], Txt_TIMETABLE_CLASS_TYPES[ClassType],
DurationOld / 2, DurationOld / 2,
DurationOld % 2 ? "30'" : DurationOld % 2 ? "30'" :
""); "");
@ -1297,15 +1310,15 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,
fprintf (Gbl.F.Out,"<select name=\"ModTTClassTypeOld\" style=\"width:68px;\"" fprintf (Gbl.F.Out,"<select name=\"ModTTClassTypeOld\" style=\"width:68px;\""
" onchange=\"document.getElementById('%s').submit();\">", " onchange=\"document.getElementById('%s').submit();\">",
Gbl.Form.Id); Gbl.Form.Id);
for (CT = (TT_ClassTypeOld_t) 0; for (CT = (TT_ClassType_t) 0;
CT < (TT_ClassTypeOld_t) TT_NUM_CLASS_TYPES; CT < (TT_ClassType_t) TT_NUM_CLASS_TYPES;
CT++) CT++)
if ((CT == TT_FREE) || if ((CT == TT_FREE) ||
((TimeTableView == TT_CRS_EDIT) && (CT == TT_LECTURE || CT == TT_PRACTICAL)) || ((TimeTableView == TT_CRS_EDIT) && (CT == TT_LECTURE || CT == TT_PRACTICAL)) ||
((TimeTableView == TT_TUT_EDIT) && (CT == TT_TUTORING))) ((TimeTableView == TT_TUT_EDIT) && (CT == TT_TUTORING)))
{ {
fprintf (Gbl.F.Out,"<option"); fprintf (Gbl.F.Out,"<option");
if (CT == ClassTypeOld) if (CT == ClassType)
fprintf (Gbl.F.Out," selected=\"selected\""); fprintf (Gbl.F.Out," selected=\"selected\"");
fprintf (Gbl.F.Out," value=\"%s\">%s</option>", fprintf (Gbl.F.Out," value=\"%s\">%s</option>",
TimeTableStrsClassTypeOldDB[CT], TimeTableStrsClassTypeOldDB[CT],
@ -1318,7 +1331,7 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,
for (H = HourOld + 1; for (H = HourOld + 1;
H < TT_HOURS_PER_DAY * 2; H < TT_HOURS_PER_DAY * 2;
H++) H++)
if (TimeTable[Day][H].NumColumns == TT_MAX_COLUMNS_PER_CELL) if (TimeTableOld[Day][H].NumColumns == TT_MAX_COLUMNS_PER_CELL)
break; break;
MaxDuration = H - HourOld; MaxDuration = H - HourOld;
if (MaxDuration > 1) if (MaxDuration > 1)
@ -1333,14 +1346,14 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,
fprintf (Gbl.F.Out,"<select name=\"ModTTDur\" style=\"width:57px;\"" fprintf (Gbl.F.Out,"<select name=\"ModTTDur\" style=\"width:57px;\""
" onchange=\"document.getElementById('%s').submit();\">", " onchange=\"document.getElementById('%s').submit();\">",
Gbl.Form.Id); Gbl.Form.Id);
for (H = HourOld + TimeTable[Day][HourOld].Columns[Column].DurationOld; for (H = HourOld + TimeTableOld[Day][HourOld].Columns[Column].DurationOld;
H < TT_HOURS_PER_DAY * 2; H < TT_HOURS_PER_DAY * 2;
H++) H++)
if (TimeTable[Day][H].NumColumns == TT_MAX_COLUMNS_PER_CELL) if (TimeTableOld[Day][H].NumColumns == TT_MAX_COLUMNS_PER_CELL)
break; break;
MaxDuration = H - HourOld; MaxDuration = H - HourOld;
if (TimeTable[Day][HourOld].Columns[Column].DurationOld > MaxDuration) if (TimeTableOld[Day][HourOld].Columns[Column].DurationOld > MaxDuration)
MaxDuration = TimeTable[Day][HourOld].Columns[Column].DurationOld; MaxDuration = TimeTableOld[Day][HourOld].Columns[Column].DurationOld;
for (Dur = 0; for (Dur = 0;
Dur <= MaxDuration; Dur <= MaxDuration;
Dur++) Dur++)

View File

@ -58,7 +58,7 @@ typedef enum
TT_LECTURE = 1, TT_LECTURE = 1,
TT_PRACTICAL = 2, TT_PRACTICAL = 2,
TT_TUTORING = 3, TT_TUTORING = 3,
} TT_ClassTypeOld_t; } TT_ClassType_t;
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public prototypes ****************************/ /****************************** Public prototypes ****************************/