/*************************************************************************** lesson properties dialog page ----------------------------------------------------------------------- begin : Thu Jun 3 22:03:50 1999 copyright : (C) 1999-2001 Ewald Arnold (C) 2001 The KDE-EDU team (C) 2005 Peter Hedlund ----------------------------------------------------------------------- ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "LessOptPage.h" #include #include #include #include #include #include #include #include #define LESS_TAG ". " LessOptPage::LessOptPage ( TQComboBox *lessons, kvoctrainDoc *_doc, TQWidget *parent, const char *name ) : LessOptPageForm( parent, name ) { connect( lessonList, TQ_SIGNAL(highlighted(int)), TQ_SLOT(slotLessonChosen(int)) ); connect( b_new, TQ_SIGNAL(clicked()), TQ_SLOT(slotNewLesson()) ); connect( b_modify, TQ_SIGNAL(clicked()), TQ_SLOT(slotModifyLesson()) ); connect( b_delete, TQ_SIGNAL(clicked()), TQ_SLOT(slotDeleteLesson()) ); connect( b_cleanup, TQ_SIGNAL(clicked()), TQ_SLOT(slotCleanup()) ); doc = _doc; TQString str; for (int i = 1; i < lessons->count(); i++) { str.setNum (i); if (i <= 9) str.insert (0, " "); lessonList->insertItem (str+LESS_TAG+lessons->text(i)); lessonIndex.push_back(i-1); } act_lesson = 0; if (lessonList->count() != 0) lessonList->setCurrentItem (act_lesson); lessonList->setFocus(); b_modify->setEnabled(lessonList->count() != 0); b_delete->setEnabled(lessonList->count() != 0); } void LessOptPage::slotLessonChosen(int index) { act_lesson = index; } void LessOptPage::slotNewLesson() { bool ok; TQString getLesson = KInputDialog::getText( i18n( "Lesson Description" ), i18n( "Enter lesson description:" ), TQString(), &ok ); if( !ok ) return; TQString str; int i = lessonList->count()+1; str.setNum (i); if (i <= 9) str.insert (0, " "); lessonList->insertItem (str+LESS_TAG+getLesson.stripWhiteSpace()); lessonIndex.push_back(-(i-1)); act_lesson = lessonList->count(); lessonList->setCurrentItem (i-1); b_modify->setEnabled(true); b_delete->setEnabled(true); } void LessOptPage::slotModifyLesson() { if (lessonList->count() != 0 && (int) lessonList->count() > act_lesson) { TQString str = lessonList->text (act_lesson); int pos = str.find (LESS_TAG); str.remove (0, pos+strlen (LESS_TAG)); bool ok; TQString getLesson = KInputDialog::getText( i18n( "Lesson Description" ), i18n( "Enter lesson description:" ), str, &ok ); if( !ok ) return; TQString str2; str2.setNum (act_lesson+1); if (act_lesson <= 9) str2.insert (0, " "); lessonList->changeItem (str2+LESS_TAG+getLesson.stripWhiteSpace(), act_lesson); } } void LessOptPage::updateListBox(int start) { TQString str, str2; for (int i = start; i < (int) lessonList->count(); i++) { str = lessonList->text (i); int pos = str.find (LESS_TAG); str.remove (0, pos+strlen (LESS_TAG)); str2.setNum (i+1); if (i <= 9) str2.insert (0, " "); lessonList->changeItem (str2+LESS_TAG+str, i); } } void LessOptPage::slotDeleteLesson() { int act = act_lesson; if (lessonList->count() != 0 && (int) lessonList->count() > act) { for (int ent = 0; ent < doc->numEntries(); ent++) { // FIXME: ProgressDlg here? if (doc->getEntry(ent)->getLesson() == lessonIndex[act_lesson]+1) { KMessageBox::information(this, i18n("This lesson could not be deleted\nbecause it is in use."), kapp->makeStdCaption(i18n("Deleting Lesson"))); return; } } lessonList->removeItem (act); lessonIndex.erase (lessonIndex.begin() + act); if ((int) lessonList->count() <= act) act = lessonList->count()-1; else updateListBox(act); // update items after current if (act >= 0) lessonList->setCurrentItem (act); } b_modify->setEnabled(lessonList->count() != 0); b_delete->setEnabled(lessonList->count() != 0); } void LessOptPage::getLesson (TQComboBox *ret_lesson, vector &ret_Index) { while (ret_lesson->count() > 1) /* first entry is "no lesson" */ ret_lesson->removeItem (1); TQString str; for (int i = 0; i < (int) lessonList->count(); i++) { str = lessonList->text(i); int pos = str.find (LESS_TAG); str.remove (0, pos+strlen (LESS_TAG)); ret_lesson->insertItem (str); } ret_Index = lessonIndex; } void LessOptPage::slotCleanup() { vector used_lesson; for (int i = 0; i < (int) lessonList->count(); i++) used_lesson.push_back(false); for (int i = 0; i < (int) doc->numEntries(); i++) { int idx = doc->getEntry(i)->getLesson(); if ((int) used_lesson.size() < idx) used_lesson.resize(idx); if (idx != 0) used_lesson[idx-1] = true ; } for (int i = used_lesson.size()-1; i >= 0; i--) if (!used_lesson[i]) { for (int u = 0; u < (int) lessonIndex.size() ; u++) { if (lessonIndex[u] == i || lessonIndex[u] < 0) { act_lesson = i; slotDeleteLesson(); break; } } } act_lesson = 0; lessonList->setCurrentItem (act_lesson); } void LessOptPage::cleanUnused (kvoctrainDoc *doc, const TQComboBox * /*lessons*/, const vector &lessonIndex, int old_lessons, vector &lessons_in_query) { vector translate_index; ///////////////////////////////////////////////////// // translate_index contains new index number for each // old index for (int i = 0; i <= TQMAX (old_lessons, (int) lessonIndex.size()); i++) translate_index.push_back(0); // now adjust lesson descriptions to new index for (int i = 0; i < (int) lessonIndex.size(); i++) { if (lessonIndex[i] >= 0) translate_index[lessonIndex[i]+1] = i+1; } // now adjust for query selected lessons to new index for (int i = (int) lessons_in_query.size()-1; i >= 0; i--) { if (translate_index[lessons_in_query[i]] > 0) lessons_in_query[i] = translate_index[lessons_in_query[i]]; else lessons_in_query.erase(lessons_in_query.begin() + i); } // only keep remaining lesson member indices // set lesson index to 0 when not needed any more // and translate to new index for (int i = 0; i < doc->numEntries(); i++) { if (doc->getEntry(i)->getLesson () != 0) doc->getEntry(i)->setLesson (translate_index[doc->getEntry(i)->getLesson ()]); } } #include "LessOptPage.moc"