Back to index

fet  5.18.0
Public Slots | Public Member Functions | Protected Member Functions
TimetableViewTeachersForm Class Reference

#include <timetableviewteachersform.h>

List of all members.

Public Slots

void lockTime ()
void lockSpace ()
void lockTimeSpace ()
void updateTeachersTimetableTable ()
void teacherChanged (const QString &teacherName)
void currentItemChanged (QTableWidgetItem *current, QTableWidgetItem *previous)
void help ()

Public Member Functions

 TimetableViewTeachersForm (QWidget *parent)
 ~TimetableViewTeachersForm ()
void lock (bool lockTime, bool lockSpace)
void resizeRowsAfterShow ()
void detailActivity (QTableWidgetItem *item)

Protected Member Functions

void resizeEvent (QResizeEvent *event)

Detailed Description

Definition at line 25 of file timetableviewteachersform.h.


Constructor & Destructor Documentation

Definition at line 78 of file timetableviewteachersform.cpp.

                                                                   : QDialog(parent)
{
       setupUi(this);
       
       closePushButton->setDefault(true);
       
       detailsTextEdit->setReadOnly(true);

       //columnResizeModeInitialized=false;

       QList<int> tmpList;
       tmpList<<5000<<5000;
       verticalSplitter->setSizes(tmpList);

       QList<int> tmpList2;
       tmpList2<<3000<<10000;
       horizontalSplitter->setSizes(tmpList2);

       teachersTimetableTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
       
       teachersListWidget->setSelectionMode(QAbstractItemView::SingleSelection);

       connect(closePushButton, SIGNAL(clicked()), this, SLOT(close()));
       connect(teachersListWidget, SIGNAL(currentTextChanged(const QString&)), this, SLOT(teacherChanged(const QString&)));
       connect(teachersTimetableTable, SIGNAL(currentItemChanged(QTableWidgetItem*, QTableWidgetItem*)), this, SLOT(currentItemChanged(QTableWidgetItem*, QTableWidgetItem*)));
       connect(lockTimePushButton, SIGNAL(clicked()), this, SLOT(lockTime()));
       connect(lockSpacePushButton, SIGNAL(clicked()), this, SLOT(lockSpace()));
       connect(lockTimeSpacePushButton, SIGNAL(clicked()), this, SLOT(lockTimeSpace()));

       connect(helpPushButton, SIGNAL(clicked()), this, SLOT(help()));

       centerWidgetOnScreen(this);
       restoreFETDialogGeometry(this);

       //restore vertical splitter state
       QSettings settings(COMPANY, PROGRAM);
       if(settings.contains(this->metaObject()->className()+QString("/vertical-splitter-state")))
              verticalSplitter->restoreState(settings.value(this->metaObject()->className()+QString("/vertical-splitter-state")).toByteArray());

       //restore horizontal splitter state
       //QSettings settings(COMPANY, PROGRAM);
       if(settings.contains(this->metaObject()->className()+QString("/horizontal-splitter-state")))
              horizontalSplitter->restoreState(settings.value(this->metaObject()->className()+QString("/horizontal-splitter-state")).toByteArray());

       QSet<int> backupLockedTime;
       QSet<int> backupPermanentlyLockedTime;
       QSet<int> backupLockedSpace;
       QSet<int> backupPermanentlyLockedSpace;
       
       backupLockedTime=idsOfLockedTime;
       backupPermanentlyLockedTime=idsOfPermanentlyLockedTime;
       backupLockedSpace=idsOfLockedSpace;
       backupPermanentlyLockedSpace=idsOfPermanentlyLockedSpace;
       
       //added by Volker Dirr
       //these 2 lines are not really needed - just to be safer
       LockUnlock::computeLockedUnlockedActivitiesTimeSpace();
       
       assert(backupLockedTime==idsOfLockedTime);
       assert(backupPermanentlyLockedTime==idsOfPermanentlyLockedTime);
       assert(backupLockedSpace==idsOfLockedSpace);
       assert(backupPermanentlyLockedSpace==idsOfPermanentlyLockedSpace);

       LockUnlock::increaseCommunicationSpinBox();
       
       teachersTimetableTable->setRowCount(gt.rules.nHoursPerDay);
       teachersTimetableTable->setColumnCount(gt.rules.nDaysPerWeek);
       for(int j=0; j<gt.rules.nDaysPerWeek; j++){
              QTableWidgetItem* item=new QTableWidgetItem(gt.rules.daysOfTheWeek[j]);
              teachersTimetableTable->setHorizontalHeaderItem(j, item);
       }
       for(int i=0; i<gt.rules.nHoursPerDay; i++){
              QTableWidgetItem* item=new QTableWidgetItem(gt.rules.hoursOfTheDay[i]);
              teachersTimetableTable->setVerticalHeaderItem(i, item);
       }

       for(int j=0; j<gt.rules.nHoursPerDay; j++){
              for(int k=0; k<gt.rules.nDaysPerWeek; k++){
                     QTableWidgetItem* item= new QTableWidgetItem();
                     item->setTextAlignment(Qt::AlignCenter);
                     item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);

                     teachersTimetableTable->setItem(j, k, item);
                     
                     //if(j==0 && k==0)
                            //teachersTimetableTable->setCurrentItem(item);
              }
       }
       
       //resize columns
       //if(!columnResizeModeInitialized){
       teachersTimetableTable->horizontalHeader()->setMinimumSectionSize(teachersTimetableTable->horizontalHeader()->defaultSectionSize());
       //     columnResizeModeInitialized=true;
       teachersTimetableTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
       //}
       
       teachersListWidget->clear();

       if(gt.rules.nInternalTeachers!=gt.rules.teachersList.count()){
              QMessageBox::warning(this, tr("FET warning"), tr("Cannot display the timetable, because you added or removed some teachers. Please regenerate the timetable and then view it"));
       }
       else{
              for(int i=0; i<gt.rules.nInternalTeachers; i++)
                     teachersListWidget->addItem(gt.rules.internalTeachersList[i]->name);
       }

       if(teachersListWidget->count()>0)
              teachersListWidget->setCurrentRow(0);

       //added by Volker Dirr
       connect(&communicationSpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateTeachersTimetableTable()));
}

Here is the call graph for this function:

Definition at line 194 of file timetableviewteachersform.cpp.

{
       saveFETDialogGeometry(this);

       //save vertical splitter state
       QSettings settings(COMPANY, PROGRAM);
       settings.setValue(this->metaObject()->className()+QString("/vertical-splitter-state"), verticalSplitter->saveState());

       //save horizontal splitter state
       //QSettings settings(COMPANY, PROGRAM);
       settings.setValue(this->metaObject()->className()+QString("/horizontal-splitter-state"), horizontalSplitter->saveState());
}

Here is the call graph for this function:


Member Function Documentation

void TimetableViewTeachersForm::currentItemChanged ( QTableWidgetItem *  current,
QTableWidgetItem *  previous 
) [slot]

Definition at line 361 of file timetableviewteachersform.cpp.

{
       Q_UNUSED(previous);
       
       detailActivity(current);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void TimetableViewTeachersForm::detailActivity ( QTableWidgetItem *  item)

Definition at line 368 of file timetableviewteachersform.cpp.

                                                                    {
       if(item==NULL){
              detailsTextEdit->setPlainText(QString(""));
              return;
       }

       if(item->row()>=gt.rules.nHoursPerDay || item->column()>=gt.rules.nDaysPerWeek){
              QMessageBox::warning(this, tr("FET warning"), tr("Timetable not available in view teachers timetable dialog - please generate a new timetable "
              "or close the timetable view teachers dialog"));
              return;
       }

       if(!(students_schedule_ready && teachers_schedule_ready)){
              QMessageBox::warning(this, tr("FET warning"), tr("Timetable not available in view teachers timetable dialog - please generate a new timetable"));
              return;
       }
       assert(students_schedule_ready && teachers_schedule_ready);

       if(gt.rules.nInternalRooms!=gt.rules.roomsList.count()){
              QMessageBox::warning(this, tr("FET warning"), tr("Cannot display the timetable, because you added or removed some rooms. Please regenerate the timetable and then view it"));
              return;
       }

       QString s;
       QString teachername;

       if(teachersListWidget->currentRow()<0 || teachersListWidget->currentRow()>=teachersListWidget->count())
              return;

       teachername = teachersListWidget->currentItem()->text();

       s = teachername;

       teacherNameTextLabel->setText(s);

       int teacher=gt.rules.searchTeacher(teachername);
       if(teacher<0){
              QMessageBox::warning(this, tr("FET warning"), tr("The teacher is invalid - please close this dialog and open a new view teachers timetable"));
              return;
       }
       else{
              int j=item->row();
              int k=item->column();
              s = "";
              if(j>=0 && k>=0){
                     int ai=teachers_timetable_weekly[teacher][k][j]; //activity index
                     //Activity* act=gt.rules.activitiesList.at(ai);
                     if(ai!=UNALLOCATED_ACTIVITY){
                            Activity* act=&gt.rules.internalActivitiesList[ai];
                            assert(act!=NULL);
                            //s += act->getDetailedDescriptionWithConstraints(gt.rules);
                            s += act->getDetailedDescription(gt.rules);

                            //int r=rooms_timetable_weekly[teacher][k][j];
                            int r=best_solution.rooms[ai];
                            if(r!=UNALLOCATED_SPACE && r!=UNSPECIFIED_ROOM){
                                   s+="\n";
                                   s+=tr("Room: %1").arg(gt.rules.internalRoomsList[r]->name);
                            }
                            //added by Volker Dirr (start)
                            QString descr="";
                            QString t="";
                            if(idsOfPermanentlyLockedTime.contains(act->id)){
                                   descr+=QCoreApplication::translate("TimetableViewForm", "permanently locked time", "refers to activity");
                                   t=", ";
                            }
                            else if(idsOfLockedTime.contains(act->id)){
                                   descr+=QCoreApplication::translate("TimetableViewForm", "locked time", "refers to activity");
                                   t=", ";
                            }
                            if(idsOfPermanentlyLockedSpace.contains(act->id)){
                                   descr+=t+QCoreApplication::translate("TimetableViewForm", "permanently locked space", "refers to activity");
                            }
                            else if(idsOfLockedSpace.contains(act->id)){
                                   descr+=t+QCoreApplication::translate("TimetableViewForm", "locked space", "refers to activity");
                            }
                            if(descr!=""){
                                   descr.prepend("\n(");
                                   descr.append(")");
                            }
                            s+=descr;
                            //added by Volker Dirr (end)
                     }
                     else{
                            if(teacherNotAvailableDayHour[teacher][k][j]){
                                   s+=tr("Teacher is not available 100% in this slot");
                                   s+="\n";
                            }
                            if(breakDayHour[k][j]){
                                   s+=tr("Break with weight 100% in this slot");
                                   s+="\n";
                            }
                     }
              }
              detailsTextEdit->setPlainText(s);
       }
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 760 of file timetableviewteachersform.cpp.

{
       QString s="";
       //s+=QCoreApplication::translate("TimetableViewForm", "You can drag sections to increase/decrease them.");
       //s+="\n\n";
       s+=QCoreApplication::translate("TimetableViewForm", "Lock/unlock: you can select one or more activities in the table and toggle lock/unlock in time, space or both.");
       s+=" ";
       s+=QCoreApplication::translate("TimetableViewForm", "There will be added or removed locking constraints for the selected activities (they can be unlocked only if they are not permanently locked).");
       s+="\n\n";
       s+=QCoreApplication::translate("TimetableViewForm", "Locking time constraints are constraints of type activity preferred starting time. Locking space constraints are constraints of type"
              " activity preferred room. You can see these constraints in the corresponding constraints dialogs. New locking constraints are added at the end of the list of constraints.");
       s+="\n\n";
       s+=QCoreApplication::translate("TimetableViewForm", "If a cell is (permanently) locked in time or space, it contains abbreviations to show that: PLT (permanently locked time), LT (locked time), "
              "PLS (permanently locked space) or LS (locked space).", "Translate the abbreviations also. Make sure the abbreviations in your language are different between themselves "
              "and the user can differentiate easily between them. These abbreviations may appear also in other places, please use the same abbreviations.");

       LongTextMessageBox::largeInformation(this, tr("FET help"), s);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void TimetableViewTeachersForm::lock ( bool  lockTime,
bool  lockSpace 
)

Definition at line 481 of file timetableviewteachersform.cpp.

{
       //cout<<"teachers begin, isc="<<gt.rules.internalStructureComputed<<endl;

       if(simulation_running){
              QMessageBox::information(this, tr("FET information"),
                     tr("Allocation in course.\nPlease stop simulation before this."));
              return;
       }

       if(!(students_schedule_ready && teachers_schedule_ready)){
              QMessageBox::warning(this, tr("FET warning"), tr("Timetable not available in view teachers timetable dialog - please generate a new timetable"));
              return;
       }
       assert(students_schedule_ready && teachers_schedule_ready);

       if(gt.rules.nInternalRooms!=gt.rules.roomsList.count()){
              QMessageBox::warning(this, tr("FET warning"), tr("Cannot display the timetable, because you added or removed some rooms. Please regenerate the timetable and then view it"));
              return;
       }

       //find teacher index
       QString teachername;

       if(teachersListWidget->currentRow()<0 || teachersListWidget->currentRow()>=teachersListWidget->count()){
              QMessageBox::information(this, tr("FET information"), tr("Please select a teacher"));
              return;
       }

       teachername = teachersListWidget->currentItem()->text();
       int i=gt.rules.searchTeacher(teachername);
       
       if(i<0){
              QMessageBox::warning(this, tr("FET warning"), tr("Invalid teacher - please close this dialog and open a new view teachers dialog"));
              return;
       }

       Solution* tc=&best_solution;
       
       bool report=false; //the messages are annoying
       
       int addedT=0, unlockedT=0;
       int addedS=0, unlockedS=0;

       //lock selected activities
       QSet <int> careAboutIndex;         //added by Volker Dirr. Needed, because of activities with duration > 1
       careAboutIndex.clear();
       for(int j=0; j<gt.rules.nHoursPerDay && j<teachersTimetableTable->rowCount(); j++){
              for(int k=0; k<gt.rules.nDaysPerWeek && k<teachersTimetableTable->columnCount(); k++){
                     if(teachersTimetableTable->item(j, k)->isSelected()){
                            int ai=teachers_timetable_weekly[i][k][j];
                            if(ai!=UNALLOCATED_ACTIVITY && !careAboutIndex.contains(ai)){  //modified, because of activities with duration > 1
                                   careAboutIndex.insert(ai);                              //Needed, because of activities with duration > 1
                                   int a_tim=tc->times[ai];
                                   int hour=a_tim/gt.rules.nDaysPerWeek;
                                   int day=a_tim%gt.rules.nDaysPerWeek;
                                   //Activity* act=gt.rules.activitiesList.at(ai);
                                   Activity* act=&gt.rules.internalActivitiesList[ai];

                                   if(lockTime){
                                          ConstraintActivityPreferredStartingTime* ctr=new ConstraintActivityPreferredStartingTime(100.0, act->id, day, hour, false);
                                          bool t=gt.rules.addTimeConstraint(ctr);
                                          QString s;
                                          if(t){ //modified by Volker Dirr, so you can also unlock (start)
                                                 addedT++;
                                                 idsOfLockedTime.insert(act->id);
                                                 s+=tr("Added the following constraint:")+"\n"+ctr->getDetailedDescription(gt.rules);
                                          }
                                          else{
                                                 delete ctr;
                                          
                                                 QList<TimeConstraint*> tmptc;
                                                 tmptc.clear();
                                                 int count=0;
                                                 foreach(TimeConstraint* tc, gt.rules.timeConstraintsList){
                                                        if(tc->type==CONSTRAINT_ACTIVITY_PREFERRED_STARTING_TIME){
                                                               ConstraintActivityPreferredStartingTime* c=(ConstraintActivityPreferredStartingTime*) tc;
                                                               if(c->activityId==act->id && c->weightPercentage==100.0 && c->active && c->day>=0 && c->hour>=0){
                                                                      count++;
                                                                      if(c->permanentlyLocked){
                                                                             if(idsOfLockedTime.contains(c->activityId) || !idsOfPermanentlyLockedTime.contains(c->activityId)){
                                                                                    QMessageBox::warning(this, tr("FET warning"), tr("Small problem detected")
                                                                                     +"\n\n"+tr("A possible problem might be that you have 2 or more constraints of type activity preferred starting time with weight 100% related to activity id %1, please leave only one of them").arg(act->id)
                                                                                     +"\n\n"+tr("A possible problem might be synchronization - so maybe try to close the timetable view dialog and open it again")
                                                                                     +"\n\n"+tr("Please report possible bug")
                                                                                     );
                                                                             }
                                                                             else{
                                                                                    s+=tr("Constraint %1 will not be removed, because it is permanently locked. If you want to unlock it you must go to the constraints menu.").arg("\n"+c->getDetailedDescription(gt.rules)+"\n");
                                                                             }
                                                                      }
                                                                      else{
                                                                             if(!idsOfLockedTime.contains(c->activityId) || idsOfPermanentlyLockedTime.contains(c->activityId)){
                                                                                    QMessageBox::warning(this, tr("FET warning"), tr("Small problem detected")
                                                                                     +"\n\n"+tr("A possible problem might be that you have 2 or more constraints of type activity preferred starting time with weight 100% related to activity id %1, please leave only one of them").arg(act->id)
                                                                                     +"\n\n"+tr("A possible problem might be synchronization - so maybe try to close the timetable view dialog and open it again")
                                                                                     +"\n\n"+tr("Please report possible bug")
                                                                                     );
                                                                             }
                                                                             else{
                                                                                    tmptc.append(tc);
                                                                             }
                                                                      }
                                                               }
                                                        }
                                                 }
                                                 if(count!=1)
                                                        QMessageBox::warning(this, tr("FET warning"), tr("You may have a problem, because FET expected to delete 1 constraint, but will delete %1 constraints").arg(tmptc.size()));

                                                 foreach(TimeConstraint* deltc, tmptc){
                                                        s+=tr("The following constraint will be deleted:")+"\n"+deltc->getDetailedDescription(gt.rules)+"\n";
                                                        gt.rules.removeTimeConstraint(deltc);
                                                        idsOfLockedTime.remove(act->id);
                                                        unlockedT++;
                                                        //delete deltc; - done by rules.removeTim...
                                                 }
                                                 tmptc.clear();
                                                 //gt.rules.internalStructureComputed=false;
                                          }  //modified by Volker Dirr, so you can also unlock (end)
                                          
                                          if(report){
                                                 int k;
                                                 if(t)
                                                        k=QMessageBox::information(this, tr("FET information"), s,
                                                         tr("Skip information"), tr("See next"), QString(), 1, 0 );
                                                 else
                                                        k=QMessageBox::information(this, tr("FET information"), s,
                                                         tr("Skip information"), tr("See next"), QString(), 1, 0 );
                                                                                                                                                                        
                                                 if(k==0)
                                                        report=false;
                                          }
                                   }
                                   
                                   int ri=tc->rooms[ai];
                                   if(ri!=UNALLOCATED_SPACE && ri!=UNSPECIFIED_ROOM && lockSpace){
                                          ConstraintActivityPreferredRoom* ctr=new ConstraintActivityPreferredRoom(100, act->id, (gt.rules.internalRoomsList[ri])->name, false);
                                          bool t=gt.rules.addSpaceConstraint(ctr);

                                          QString s;
                                          
                                          if(t){ //modified by Volker Dirr, so you can also unlock (start)
                                                 addedS++;
                                                 idsOfLockedSpace.insert(act->id);
                                                 s+=tr("Added the following constraint:")+"\n"+ctr->getDetailedDescription(gt.rules);
                                          }
                                          else{
                                                 delete ctr;
                                          
                                                 QList<SpaceConstraint*> tmpsc;
                                                 tmpsc.clear();
                                                 int count=0;
                                                 foreach(SpaceConstraint* sc, gt.rules.spaceConstraintsList){
                                                        if(sc->type==CONSTRAINT_ACTIVITY_PREFERRED_ROOM){
                                                               ConstraintActivityPreferredRoom* c=(ConstraintActivityPreferredRoom*) sc;
                                                               if(c->activityId==act->id && c->weightPercentage==100.0 && c->active){
                                                                      count++;
                                                                      if(c->permanentlyLocked){
                                                                             if(idsOfLockedSpace.contains(c->activityId) || !idsOfPermanentlyLockedSpace.contains(c->activityId)){
                                                                                    QMessageBox::warning(this, tr("FET warning"), tr("Small problem detected")
                                                                                     +"\n\n"+tr("A possible problem might be that you have 2 or more constraints of type activity preferred room with weight 100% related to activity id %1, please leave only one of them").arg(act->id)
                                                                                     +"\n\n"+tr("A possible problem might be synchronization - so maybe try to close the timetable view dialog and open it again")
                                                                                     +"\n\n"+tr("Please report possible bug")
                                                                                     );
                                                                             }
                                                                             else{
                                                                                    s+=tr("Constraint %1 will not be removed, because it is permanently locked. If you want to unlock it you must go to the constraints menu.").arg("\n"+c->getDetailedDescription(gt.rules)+"\n");
                                                                             }
                                                                      }
                                                                      else{
                                                                             if(!idsOfLockedSpace.contains(c->activityId) || idsOfPermanentlyLockedSpace.contains(c->activityId)){
                                                                                    QMessageBox::warning(this, tr("FET warning"), tr("Small problem detected")
                                                                                     +"\n\n"+tr("A possible problem might be that you have 2 or more constraints of type activity preferred room with weight 100% related to activity id %1, please leave only one of them").arg(act->id)
                                                                                     +"\n\n"+tr("A possible problem might be synchronization - so maybe try to close the timetable view dialog and open it again")
                                                                                     +"\n\n"+tr("Please report possible bug")
                                                                                     );
                                                                             }
                                                                             else{
                                                                                    tmpsc.append(sc);
                                                                             }
                                                                      }
                                                               }
                                                        }
                                                 }
                                                 if(count!=1)
                                                        QMessageBox::warning(this, tr("FET warning"), tr("You may have a problem, because FET expected to delete 1 constraint, but will delete %1 constraints").arg(tmpsc.size()));

                                                 foreach(SpaceConstraint* delsc, tmpsc){
                                                        s+=tr("The following constraint will be deleted:")+"\n"+delsc->getDetailedDescription(gt.rules)+"\n";
                                                        gt.rules.removeSpaceConstraint(delsc);
                                                        idsOfLockedSpace.remove(act->id);
                                                        unlockedS++;
                                                        //delete delsc; done by rules.removeSpa...
                                                 }
                                                 tmpsc.clear();
                                                 //gt.rules.internalStructureComputed=false;
                                          }  //modified by Volker Dirr, so you can also unlock (end)
                                          
                                          if(report){
                                                 int k;
                                                 if(t)
                                                        k=QMessageBox::information(this, tr("FET information"), s,
                                                         tr("Skip information"), tr("See next"), QString(), 1, 0 );
                                                 else
                                                        k=QMessageBox::information(this, tr("FET information"), s,
                                                         tr("Skip information"), tr("See next"), QString(), 1, 0 );
                                                        
                                                 if(k==0)
                                                        report=false;
                                          }
                                   }
                            }
                     }
              }
       }

       QStringList added;
       QStringList removed;
       if(addedT>0){
              if(addedT==1)
                     added << QCoreApplication::translate("TimetableViewForm", "Added 1 locking time constraint.", "constraint is singular (only 1 constraint)");
              else
                     added << QCoreApplication::translate("TimetableViewForm", "Added %1 locking time constraints.", "%1 is >= 2, so constraints is plural").arg(addedT);
       }
       if(addedS>0){
              if(addedS==1)
                     added << QCoreApplication::translate("TimetableViewForm", "Added 1 locking space constraint.", "constraint is singular (only 1 constraint)");
              else
                     added << QCoreApplication::translate("TimetableViewForm", "Added %1 locking space constraints.", "%1 is >= 2, so constraints is plural").arg(addedS);
       }
       if(unlockedT>0){
              if(unlockedT==1)
                     removed << QCoreApplication::translate("TimetableViewForm", "Removed 1 locking time constraint.", "constraint is singular (only 1 constraint)");
              else
                     removed << QCoreApplication::translate("TimetableViewForm", "Removed %1 locking time constraints.", "%1 is >= 2, so constraints is plural").arg(unlockedT);
       }
       if(unlockedS>0){
              if(unlockedS==1)
                     removed << QCoreApplication::translate("TimetableViewForm", "Removed 1 locking space constraint.", "constraint is singular (only 1 constraint)");
              else
                     removed << QCoreApplication::translate("TimetableViewForm", "Removed %1 locking space constraints.", "%1 is >= 2, so constraints is plural").arg(unlockedS);
       }
       QString ad=added.join("\n");
       QString re=removed.join("\n");
       QStringList all;
       if(!ad.isEmpty())
              all<<ad;
       if(!re.isEmpty())
              all<<re;
       QString s=all.join("\n\n");
       if(s.isEmpty())
              s=QCoreApplication::translate("TimetableViewForm", "No locking constraints added or removed.");
       QMessageBox::information(this, tr("FET information"), s);

       QSet<int> backupLockedTime;
       QSet<int> backupPermanentlyLockedTime;
       QSet<int> backupLockedSpace;
       QSet<int> backupPermanentlyLockedSpace;
       
       backupLockedTime=idsOfLockedTime;
       backupPermanentlyLockedTime=idsOfPermanentlyLockedTime;
       backupLockedSpace=idsOfLockedSpace;
       backupPermanentlyLockedSpace=idsOfPermanentlyLockedSpace;
       
       LockUnlock::computeLockedUnlockedActivitiesTimeSpace(); //not needed, just for testing
       
       assert(backupLockedTime==idsOfLockedTime);
       assert(backupPermanentlyLockedTime==idsOfPermanentlyLockedTime);
       assert(backupLockedSpace==idsOfLockedSpace);
       assert(backupPermanentlyLockedSpace==idsOfPermanentlyLockedSpace);

       LockUnlock::increaseCommunicationSpinBox();
       
       //cout<<"teachers end, isc="<<gt.rules.internalStructureComputed<<endl;
       //cout<<endl;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 471 of file timetableviewteachersform.cpp.

{
       this->lock(false, true);
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 466 of file timetableviewteachersform.cpp.

{
       this->lock(true, false);
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 476 of file timetableviewteachersform.cpp.

{
       this->lock(true, true);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void TimetableViewTeachersForm::resizeEvent ( QResizeEvent *  event) [protected]

Definition at line 354 of file timetableviewteachersform.cpp.

{
       QDialog::resizeEvent(event);

       teachersTimetableTable->resizeRowsToContents();
}

Definition at line 207 of file timetableviewteachersform.cpp.

{
       teachersTimetableTable->resizeRowsToContents();
//     tableWidgetUpdateBug(teachersTimetableTable);
}

Here is the caller graph for this function:

void TimetableViewTeachersForm::teacherChanged ( const QString &  teacherName) [slot]

Definition at line 213 of file timetableviewteachersform.cpp.

{
       if(!(students_schedule_ready && teachers_schedule_ready)){
              QMessageBox::warning(this, tr("FET warning"), tr("Timetable not available in view teachers timetable dialog - please generate a new timetable"));
              return;
       }
       assert(students_schedule_ready && teachers_schedule_ready);

       if(teacherName==QString())
              return;

       int teacherId=gt.rules.searchTeacher(teacherName);
       if(teacherId<0){
              QMessageBox::warning(this, tr("FET warning"), tr("Invalid teacher - please close this dialog and open a new view teachers dialog"));
              return;
       }

       updateTeachersTimetableTable();
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 233 of file timetableviewteachersform.cpp.

                                                            {
       if(!(students_schedule_ready && teachers_schedule_ready)){
              QMessageBox::warning(this, tr("FET warning"), tr("Timetable not available in view teachers timetable dialog - please generate a new timetable "
              "or close the timetable view teachers dialog"));
              return;
       }
       assert(students_schedule_ready && teachers_schedule_ready);

       if(gt.rules.nInternalRooms!=gt.rules.roomsList.count()){
              QMessageBox::warning(this, tr("FET warning"), tr("Cannot display the timetable, because you added or removed some rooms. Please regenerate the timetable and then view it"));
              return;
       }

       QString s;
       QString teachername;

       if(teachersListWidget->currentRow()<0 || teachersListWidget->currentRow()>=teachersListWidget->count())
              return;

       teachername = teachersListWidget->currentItem()->text();
       
       if(gt.rules.searchTeacher(teachername)<0){
              QMessageBox::warning(this, tr("FET warning"), tr("You have an old timetable view teachers dialog opened - please close it"));
              return;
       }

       s = teachername;
       teacherNameTextLabel->setText(s);

       assert(gt.rules.initialized);
/*     teachersTimetableTable->setNumRows(gt.rules.nHoursPerDay);
       teachersTimetableTable->setNumCols(gt.rules.nDaysPerWeek);
       for(int j=0; j<gt.rules.nDaysPerWeek; j++)
              teachersTimetableTable->horizontalHeader()->setLabel(j, gt.rules.daysOfTheWeek[j]);
       for(int i=0; i<gt.rules.nHoursPerDay; i++)
              teachersTimetableTable->verticalHeader()->setLabel(i, gt.rules.hoursOfTheDay[i]);*/

       int teacher=gt.rules.searchTeacher(teachername);
       if(teacher<0){
              QMessageBox::warning(this, tr("FET information"),
                     tr("The teacher's timetable cannot be printed, because the teacher is invalid"));
              return;
       }

       for(int j=0; j<gt.rules.nHoursPerDay && j<teachersTimetableTable->rowCount(); j++){
              for(int k=0; k<gt.rules.nDaysPerWeek && k<teachersTimetableTable->columnCount(); k++){
                     s = "";
                     int ai=teachers_timetable_weekly[teacher][k][j]; //activity index
                     //Activity* act=gt.rules.activitiesList.at(ai);
                     if(ai!=UNALLOCATED_ACTIVITY){
                            Activity* act=&gt.rules.internalActivitiesList[ai];
                            assert(act!=NULL);
                            
                            QString ats=act->activityTagsNames.join(", ");
                            s += act->subjectName+" "+ats;
                            
                            //students
                            if(act->studentsNames.count()>0){
                                   s+="\n";
                                   s+=act->studentsNames.join(", ");
                            }

                            int r=best_solution.rooms[ai];
                            if(r!=UNALLOCATED_SPACE && r!=UNSPECIFIED_ROOM){
                                   //s+=" ";
                                   //s+=tr("R:%1", "Room").arg(gt.rules.internalRoomsList[r]->name);
                                   s+="\n";
                                   s+=gt.rules.internalRoomsList[r]->name;
                            }
                            
                            //added by Volker Dirr (start)
                            QString descr="";
                            QString t="";
                            if(idsOfPermanentlyLockedTime.contains(act->id)){
                                   descr+=QCoreApplication::translate("TimetableViewForm", "PLT", "Abbreviation for permanently locked time. There are 4 string: permanently locked time, permanently locked space, "
                                          "locked time, locked space. Make sure their abbreviations contain different letters and are visually different, so user can easily differentiate between them."
                                          " These abbreviations may appear also in other places, please use the same abbreviations.");
                                   t=", ";
                            }
                            else if(idsOfLockedTime.contains(act->id)){
                                   descr+=QCoreApplication::translate("TimetableViewForm", "LT", "Abbreviation for locked time. There are 4 string: permanently locked time, permanently locked space, "
                                          "locked time, locked space. Make sure their abbreviations contain different letters and are visually different, so user can easily differentiate between them."
                                          " These abbreviations may appear also in other places, please use the same abbreviations.");
                                   t=", ";
                            }
                            if(idsOfPermanentlyLockedSpace.contains(act->id)){
                                   descr+=t+QCoreApplication::translate("TimetableViewForm", "PLS", "Abbreviation for permanently locked space. There are 4 string: permanently locked time, permanently locked space, "
                                          "locked time, locked space. Make sure their abbreviations contain different letters and are visually different, so user can easily differentiate between them."
                                          " These abbreviations may appear also in other places, please use the same abbreviations.");
                            }
                            else if(idsOfLockedSpace.contains(act->id)){
                                   descr+=t+QCoreApplication::translate("TimetableViewForm", "LS", "Abbreviation for locked space. There are 4 string: permanently locked time, permanently locked space, "
                                          "locked time, locked space. Make sure their abbreviations contain different letters and are visually different, so user can easily differentiate between them."
                                          " These abbreviations may appear also in other places, please use the same abbreviations.");
                            }
                            if(descr!=""){
                                   descr.prepend("\n(");
                                   descr.append(")");
                            }
                            s+=descr;
                            //added by Volker Dirr (end)
                     }
                     else{
                            if(teacherNotAvailableDayHour[teacher][k][j] && PRINT_NOT_AVAILABLE_TIME_SLOTS)
                                   s+="-x-";
                            else if(breakDayHour[k][j] && PRINT_BREAK_TIME_SLOTS)
                                   s+="-X-";
                     }
                     teachersTimetableTable->item(j, k)->setText(s);
              }
       }
       //     for(int i=0; i<gt.rules.nHoursPerDay; i++) //added in version 3_9_16, on 16 Oct. 2004
       //            teachersTimetableTable->adjustRow(i);

       teachersTimetableTable->resizeRowsToContents();
       
       tableWidgetUpdateBug(teachersTimetableTable);
       
       detailActivity(teachersTimetableTable->currentItem());
}

Here is the call graph for this function:

Here is the caller graph for this function:


The documentation for this class was generated from the following files: