void KstVectorDialogI::edit_I() { int index; KstFilePtr file; KstRVectorPtr vector; index = Select->currentItem(); KstRVectorList vectorList = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); if (index < 0) { KMessageBox::sorry(0L, i18n("You need to select an active vector to edit.")); return; } if (unsigned(index) >= vectorList.count()) { new_I(); } else { /* verify that the vector name is unique */ if (Select->currentText() != vectorList[index]->tagName()) { if (KST::dataTagNameNotUnique(Select->currentText())) return; } /* if there is not an active KstFile, create one */ KstFileList::Iterator it = KST::fileList.findFileName(FileName->url()); if (it == KST::fileList.end()) { file = new KstFile(FileName->url()); if (file->numFrames() < 1) { // No data in file KMessageBox::sorry(0L, i18n("The requested file does not contain data.")); return; } KST::fileList.append(file); } else { file = *it; } if (!file->isValidField(Field->currentText())) { KMessageBox::sorry(0L, i18n("The requested field is not defined for the requested file\n")); return; } vector = vectorList[index]; /* change the vector */ vector->change(file, Field->currentText(), Select->currentText(), (CountFromEnd->isChecked() ? -1 : F0->value()), (ReadToEnd->isChecked() ? -1 : N->value()), Skip->value(), DoSkip->isChecked(), DoFilter->isChecked()); /** purge unused files */ //doc->fileList.Purge(); vector = 0L; vectorList.clear(); emit modified(); } }
void KstVectorDialogI::delete_I() { int index; KstRVectorPtr vector; KstRVectorList vectorList = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); index = Select->currentItem(); if (index < 0) { KMessageBox::sorry(0L, i18n("You need to select an active vector to delete.")); return; } if (unsigned(index) >= vectorList.count()) { return; } vector = vectorList[index]; if (vector->getUsage() > 2) { KMessageBox::sorry(0L, i18n("Cannot delete: Selected vector is used by at least one curve. Delete curves first.")); return; } KST::vectorList.lock().writeLock(); KST::vectorList.remove(vectorList[index].data()); KST::vectorList.lock().writeUnlock(); /** purge unused files */ //doc->fileList.Purge(); vector = 0L; vectorList.clear(); emit modified(); }
void KstVectorDefaults::sync() { KST::vectorList.lock().readLock(); KstRVectorList vl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); KST::vectorList.lock().unlock(); int j = vl.count() - 1; // Find a non-stdin source while (j >= 0) { vl[j]->readLock(); KstDataSourcePtr dsp = vl[j]->dataSource(); vl[j]->unlock(); if (dsp && !kst_cast<KstStdinSource>(dsp)) { break; } --j; } if (j >= 0) { vl[j]->readLock(); _f0 = vl[j]->reqStartFrame(); _n = vl[j]->reqNumFrames(); _dataSource = vl[j]->filename(); _skip = vl[j]->skip(); _doAve = vl[j]->doAve(); _doSkip = vl[j]->doSkip(); vl[j]->unlock(); } }
void KstChangeNptsDialogI::updateDefaults(int index) { KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); if (rvl.isEmpty() || index >= (int)rvl.count() || index < 0) { return; } KstRVectorPtr vector = rvl[index]; vector->readLock(); disconnect(_kstDataRange, SIGNAL(changed()), this, SLOT(modifiedRange())); _kstDataRange->_startUnits->setCurrentItem(0); _kstDataRange->_rangeUnits->setCurrentItem(0); /* fill the vector range entries */ _kstDataRange->CountFromEnd->setChecked(vector->countFromEOF()); _kstDataRange->setF0Value(vector->reqStartFrame()); /* fill number of frames entries */ _kstDataRange->ReadToEnd->setChecked(vector->readToEOF()); _kstDataRange->setNValue(vector->reqNumFrames()); /* fill in frames to skip box */ _kstDataRange->Skip->setValue(vector->skip()); _kstDataRange->DoSkip->setChecked(vector->doSkip()); _kstDataRange->DoFilter->setChecked(vector->doAve()); _kstDataRange->updateEnables(); connect(_kstDataRange, SIGNAL(changed()), this, SLOT(modifiedRange())); vector->unlock(); }
KstRVector *GetOrCreateVector(QString field, KstDataSourcePtr file, struct InType &in) { int i_v = 0, n_v; KstRVector *V; KstRVectorList vectorList = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); n_v = vectorList.count(); for (i_v=0; i_v<n_v; i_v++) { V = *vectorList.at(i_v); if (V->getField() == field) { if (V->filename() == file->fileName()) { return (V); } } } V = new KstRVector(file, field, QString("V") + QString::number(1 + i_v++) + "-" + field, in.f, in.n, in.skip, in.doskip, in.doave); if (!V->isValid()) { kdError() << I18N_NOOP("Error: Invalid field: ") << V->getField() << endl << I18N_NOOP("File: ") << V->filename() << endl; exit(0); // fixme: this can cause crashes } return V; }
static KstRVector *GetOrCreateVector(const QString& field, KstDataSourcePtr file, InType &in) { int i_v = 0, n_v; KstRVector *V; KstRVectorList vectorList = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); n_v = vectorList.count(); for (i_v=0; i_v<n_v; i_v++) { V = *vectorList.at(i_v); if (V->field() == field && V->filename() == file->fileName()) { return V; } } V = new KstRVector(file, field, KstObjectTag(KST::suggestVectorName(field), file->tag(), false), in.f, in.n, in.skip, in.doskip, in.doave); if (!V->isValid()) { if (file->fileType() == "stdin") { startupErrors.append(i18n("Failed to create vector '%1' from file '%2'. Trying again later.").arg(field).arg(file->fileName())); } else { startupErrors.append(i18n("Failed to create vector '%1' from file '%2'.").arg(field).arg(file->fileName())); V = 0L; } } else { } return V; }
void KstChangeFileDialog::updateChangeFileDialog() { KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); KstRMatrixList rml = kstObjectSubList<KstMatrix,KstRMatrix>(KST::matrixList); QMap<QString, QString> filesUsed; int i; // clear list ChangeFileCurveList->clear(); // first add vectors for (i = 0; i < (int)rvl.count(); i++) { rvl[i]->readLock(); ChangeFileCurveList->insertItem(rvl[i]->tag().displayString()); filesUsed.insert(rvl[i]->filename(), rvl[i]->filename()); rvl[i]->unlock(); } // then add matrices for (i = 0; i < (int)rml.count(); i++) { rml[i]->readLock(); ChangeFileCurveList->insertItem(rml[i]->tag().displayString()); filesUsed.insert(rml[i]->filename(), rml[i]->filename()); rml[i]->unlock(); } QString currentFile = _files->currentText(); _files->clear(); KstReadLocker ml(&KST::dataSourceList.lock()); for (KstDataSourceList::Iterator it = KST::dataSourceList.begin(); it != KST::dataSourceList.end(); ++it) { if (filesUsed.contains((*it)->fileName())) { _files->insertItem((*it)->fileName()); } } if (_files->contains(currentFile)) { _files->setCurrentText(currentFile); } _allFromFile->setEnabled(_files->count() > 0); _files->setEnabled(_files->count() > 0); if (_first) { _dataFile->setURL(KST::vectorDefaults.dataSource()); _first = false; } }
void KstChangeFileDialogI::updateChangeFileDialog() { int i; ChangeFileCurveList->clear(); ChangeFileName->clear(); KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); /* insert vectors into ChangeFileCurveList */ for (i = 0; i < (int)rvl.count(); i++) { ChangeFileCurveList->insertItem(rvl[i]->tagName(), -1); } /* insert file names into ChangeFileName list */ KST::dataSourceList.lock().readLock(); for (i = 0; i < (int)KST::dataSourceList.count(); i++) { ChangeFileName->insertItem(KST::dataSourceList[i]->fileName()); } KST::dataSourceList.lock().readUnlock(); }
void KstVectorDialogI::_fillFieldsForNew() { KstRVectorList vectorList = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); int n_v = vectorList.count(); if (n_v < 1) { Field->insertItem("INDEX"); } else { Field->setCurrentText(QString::null); } QString new_label; new_label.sprintf("V%d-", n_v+1); new_label += "<New_Vector>"; _tagName->setText(new_label); /* set defaults with vectorDefaults */ KST::vectorDefaults.sync(); FileName->setURL(KST::vectorDefaults.dataSource()); updateCompletion(); _kstDataRange->update(); Field->setFocus(); }
void KstVectorDialogI::update(int new_index) { int i_vector, index, n_v; KstRVectorPtr vector; bool isNew = false; KstRVectorList vectorList = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); if (new_index == -1) { if (vectorList.findTag(Select->currentText()) != vectorList.end()) { QString save = Select->currentText(); Select->blockSignals(true); Select->clear(); for (KstRVectorList::iterator i = vectorList.begin(); i != vectorList.end(); ++i) { Select->insertItem((*i)->tagName()); } Select->setCurrentText(save); Select->blockSignals(false); return; } } n_v = vectorList.count(); if (n_v < 1) { Select->clear(); Select->insertItem("V1-" + i18n("<New_Vector>")); Delete->setEnabled(false); return; } if (new_index == -2) { isNew = true; new_index = n_v-1; } if (new_index >= 0) { index = new_index; } else if (n_v > 0) { index = Select->currentItem(); } else { index = n_v-1; } /** fill VectorListBox with vector tags */ Select->clear(); for (KstRVectorList::iterator i = vectorList.begin(); i != vectorList.end(); ++i) { Select->insertItem((*i)->tagName()); } if (index >= 0 && index < n_v) { Select->setCurrentItem(index); } else if (n_v > 0) { Select->setCurrentItem(n_v - 1); } i_vector = Select->currentItem(); vector = vectorList[i_vector]; /* fill the fields */ Field->clear(); _fieldCompletion->clear(); KstDataSourcePtr tf; { KST::dataSourceList.lock().readLock(); KstDataSourceList::Iterator it = KST::dataSourceList.findFileName(vector->filename()); if (it != KST::dataSourceList.end()) { tf = *it; Field->insertStringList(tf->fieldList()); _fieldCompletion->insertItems(tf->fieldList()); //std::cout << "inserting string list: " << tf->fieldList().count() << "\n"; } KST::dataSourceList.lock().readUnlock(); } if (isNew) { Field->setCurrentText(QString::null); } else { Field->setCurrentText(vector->getField()); } /* select the proper file */ FileName->setURL(vector->filename()); /* fill the vector range entries */ if (vector->countFromEOF()) { CountFromEnd->setChecked(true); } else { CountFromEnd->setChecked(false); } F0->setValue(vector->reqStartFrame()); /* fill number of frames entries */ if (vector->readToEOF()) { ReadToEnd->setChecked(true); } else { ReadToEnd->setChecked(false); } N->setValue(vector->reqNumFrames()); /* fill in frames to skip box */ Skip->setValue(vector->skip()); DoSkip->setChecked(vector->doSkip()); DoFilter->setChecked(vector->doAve()); if (isNew) { QString new_label; new_label.sprintf("V%d-", n_v+1); new_label += i18n("<New_Vector>"); Select->insertItem(new_label); Select->setCurrentItem(n_v); Delete->setEnabled(false); } else { Delete->setEnabled(vector->getUsage() == 2); } }
bool KstChangeFileDialog::applyFileChange() { KstDataSourcePtr file; KST::dataSourceList.lock().writeLock(); KstDataSourceList::Iterator it = KST::dataSourceList.findReusableFileName(_dataFile->url()); QString invalidSources; int invalid = 0; if (it == KST::dataSourceList.end()) { file = KstDataSource::loadSource(_dataFile->url()); if (!file || !file->isValid()) { KST::dataSourceList.lock().unlock(); QMessageBox::warning(this, tr("Kst"), tr("The file could not be loaded.")); return false; } if (file->isEmpty()) { KST::dataSourceList.lock().unlock(); QMessageBox::warning(this, tr("Kst"), tr("The file does not contain data.")); return false; } KST::dataSourceList.append(file); } else { file = *it; } KST::dataSourceList.lock().unlock(); KstApp *app = KstApp::inst(); KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); KstRMatrixList rml = kstObjectSubList<KstMatrix,KstRMatrix>(KST::matrixList); int selected = 0; int handled = 0; int count = (int)ChangeFileCurveList->count(); for (int i = 0; i < count; i++) { if (ChangeFileCurveList->isSelected(i)) { ++selected; } } // a map to keep track of which objects have been duplicated, and mapping // old object -> new object KstDataObjectDataObjectMap duplicatedMap; QMap<KstVectorPtr, KstVectorPtr> duplicatedVectors; QMap<KstMatrixPtr, KstMatrixPtr> duplicatedMatrices; KstDataSourceList oldSources; // go through the vectors for (int i = 0; i < (int)rvl.count(); i++) { if (ChangeFileCurveList->isSelected(i)) { KstRVectorPtr vector = rvl[i]; vector->writeLock(); file->readLock(); bool valid = file->isValidField(vector->field()); file->unlock(); if (!valid) { if (invalid > 0) { invalidSources = tr("%1, %2").arg(invalidSources).arg(vector->field()); } else { invalidSources = vector->field(); } ++invalid; } else { if (_duplicateSelected->isChecked()) { // block vector updates until vector is setup properly KST::vectorList.lock().writeLock(); // create a new vector KstRVectorPtr newVector = vector->makeDuplicate(); if (!oldSources.contains(newVector->dataSource())) { oldSources << newVector->dataSource(); } newVector->changeFile(file); KST::vectorList.lock().unlock(); // duplicate dependents if (_duplicateDependents->isChecked()) { duplicatedVectors.insert(KstVectorPtr(vector), KstVectorPtr(newVector)); KST::duplicateDependents(KstVectorPtr(vector), duplicatedMap, duplicatedVectors); } } else { if (!oldSources.contains(vector->dataSource())) { oldSources << vector->dataSource(); } vector->changeFile(file); } } vector->unlock(); app->slotUpdateProgress(selected, ++handled, tr("Updating vectors...")); } } // go through the matrices for (int i = (int)rvl.count(); i < (int)ChangeFileCurveList->count(); i++) { if (ChangeFileCurveList->isSelected(i)) { KstRMatrixPtr matrix = rml[i-rvl.count()]; matrix->writeLock(); file->readLock(); bool valid = file->isValidMatrix(matrix->field()); file->unlock(); if (!valid) { if (invalid > 0) { invalidSources = tr("%1, %2").arg(invalidSources).arg(matrix->field()); } else { invalidSources = matrix->field(); } ++invalid; } else { if (_duplicateSelected->isChecked()) { // block matrix updates until matrix is setup properly KST::matrixList.lock().writeLock(); // create a new matrix KstRMatrixPtr newMatrix = matrix->makeDuplicate(); if (!oldSources.contains(newMatrix->dataSource())) { oldSources << newMatrix->dataSource(); } newMatrix->changeFile(file); KST::matrixList.lock().unlock(); // duplicate dependents if (_duplicateDependents->isChecked()) { duplicatedMatrices.insert(KstMatrixPtr(matrix), KstMatrixPtr(newMatrix)); KST::duplicateDependents(KstMatrixPtr(matrix), duplicatedMap, duplicatedMatrices); } } else { if (!oldSources.contains(matrix->dataSource())) { oldSources << matrix->dataSource(); } matrix->changeFile(file); } } matrix->unlock(); app->slotUpdateProgress(selected, ++handled, tr("Updating matrices...")); } } app->slotUpdateProgress(0, 0, QString::null); file = 0L; // now add any curves and images to plots if they were duplicated if (_duplicateSelected->isChecked() && _duplicateDependents->isChecked()) { KstApp *app = KstApp::inst(); QList<QMdiSubWindow*> windows; QList<QMdiSubWindow*>::const_iterator i; windows = app->subWindowList( CreationOrder ); for (i = windows.constBegin(); i != windows.constEnd(); ++i) KstViewWindow *viewWindow = dynamic_cast<KstViewWindow*>(*i); if (viewWindow) { KstTopLevelViewPtr view = kst_cast<KstTopLevelView>(viewWindow->view()); if (view) { Kst2DPlotList plots = view->findChildrenType<Kst2DPlot>(true); for (Kst2DPlotList::Iterator plotIter = plots.begin(); plotIter != plots.end(); ++plotIter) { for (KstDataObjectDataObjectMap::ConstIterator iter = duplicatedMap.begin(); iter != duplicatedMap.end(); ++iter) { if (KstBaseCurvePtr curve = kst_cast<KstBaseCurve>(iter.data())) { if ((*plotIter)->Curves.contains(kst_cast<KstBaseCurve>(iter.key())) && !(*plotIter)->Curves.contains(kst_cast<KstBaseCurve>(curve))) { (*plotIter)->addCurve(curve); } } } } } } } }
void KstQuickPSDDialogI::update() { unsigned int i, j_v; KstRVectorPtr v0; int j; KstPSDCurveList curves = kstObjectSubList<KstDataObject,KstPSDCurve>(KST::dataObjectList); KST::vectorList.lock().readLock(); j_v = KST::vectorList.count(); if (j_v > 0) { SourceVector->setEnabled(true); j_v--; /* fill the vectors list */ Vectors->clear(); for (i = 0; i <= j_v; i++) { Vectors->insertItem(KST::vectorList[i]->tagName()); } Vectors->setCurrentItem(j_v); /* update filename list */ KST::dataSourceList.lock().readLock(); j = KST::dataSourceList.count() - 1; if (j >= 0) { FileName->setURL(KST::dataSourceList[j]->fileName()); } KST::dataSourceList.lock().readUnlock(); /* clear the field entry */ Field->clear(); } KST::vectorList.lock().readUnlock(); KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); j_v = rvl.count(); if (j_v > 0) { j_v--; /* set the file range defaults to those of the last RVector */ v0 = rvl[j_v]; CountFromEnd->setChecked(v0->countFromEOF()); ReadToEnd->setChecked(v0->readToEOF()); F0->setValue(v0->reqStartFrame()); N->setValue(v0->reqNumFrames()); Skip->setValue(v0->skip()); DoSkip->setChecked(v0->doSkip()); DoFilter->setChecked(v0->doAve()); } else { SourceVector->setChecked(false); SourceVector->setEnabled(false); SourceDataFile->setChecked(true); VectorEntry->setEnabled(false); DataFileEntry->setEnabled(true); } /* Fill the plot list with options */ PlotList->clear(); if (KST::plotList.count()>0) { for (i = 0; i < KST::plotList.count(); i++) { PlotList->insertItem(KST::plotList.at(i)->tagName()); } PlotList->setCurrentItem(0); } PlotCols->setValue(KST::plotList.getPlotCols()); /* set the color*/ _curveAppearance->setColor(KstColorSequence::next()); setCurveColor( _curveAppearance->color() ); }
void KstQuickPSDDialogI::apply(bool autolabel) { KstDataSourcePtr file; KstVectorPtr vx; KstRVectorPtr trv; KstPlot *plot; int i_v; QString v_name, c_name; bool x_is_new; KstPSDCurvePtr curve; double new_freq; int new_len; if (KST::plotList.count() < 1) { addPlot(); return; } if (SourceVector->isChecked()) { // set vx from existing vectors i_v = Vectors->currentItem(); KstReadLocker ml(&KST::vectorList.lock()); if (i_v >= (int)KST::vectorList.count()) { return; } vx = KST::vectorList[i_v]; } else { // set vx from data file specification KstReadLocker ml(&KST::dataSourceList.lock()); /* generate or find the kstfile */ KstDataSourceList::Iterator it = KST::dataSourceList.findFileName(FileName->url()); if (it == KST::dataSourceList.end()) { file = KstDataSource::loadSource(FileName->url()); if (!file || !file->isValid()) { KMessageBox::sorry(0L, i18n("The file could not be loaded.")); return; } if (file->frameCount() < 1) { KMessageBox::sorry(0L, i18n("The file does not contain data.")); return; } KST::dataSourceList.append(file); } else { file = *it; } KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); x_is_new = true; /**** Build the XVector ***/ /* make sure there are no vectors with the current vectors props */ for (i_v = 0; unsigned(i_v) < rvl.count(); i_v++) { trv = rvl[i_v]; if ((trv->filename() == FileName->url()) && (trv->getField() == Field->text()) && (trv->reqStartFrame() == F0->value()) && (trv->reqNumFrames() == N->value()) && (trv->skip() == Skip->value()) && (trv->doSkip() == DoSkip->isChecked()) && (trv->doAve() == DoFilter->isChecked()) && (trv->readToEOF() == ReadToEnd->isChecked()) && (trv->countFromEOF() == CountFromEnd->isChecked())) { x_is_new = false; i_v = rvl.count(); vx = trv; } } if (x_is_new) { KST::vectorList.lock().readLock(); /* If not, Generate a unique vector name */ v_name = "V" + QString::number(KST::vectorList.count()+1)+"-" + Field->text(); while (KST::vectorList.findTag(v_name) != KST::vectorList.end()) { v_name += "'"; } KST::vectorList.lock().readUnlock(); KST::dataObjectList.lock().readLock(); while (KST::dataObjectList.findTag(v_name) != KST::dataObjectList.end()) { v_name += "'"; } KST::dataObjectList.lock().readUnlock(); if (!file->isValidField(Field->text())) { KMessageBox::sorry(0L, i18n("The requested field is not defined for the requested file.")); return; } /* generate and append the vector */ trv = new KstRVector(file, Field->text(), v_name, (CountFromEnd->isChecked() ? -1 : F0->value()), (ReadToEnd->isChecked() ? -1 : N->value()), Skip->value(), DoSkip->isChecked(), DoFilter->isChecked()); KST::addVectorToList(KstVectorPtr(trv)); vx = trv; } } /**** Build the PSD ***/ /* find new_freq */ new_freq = PSDSampRate->text().toDouble(); if (new_freq <= 0) { KMessageBox::sorry(0L, i18n("The sample rate must be greater than 0.")); return; } /* find new_len */ new_len = PSDFFTLen->text().toInt(); if (new_len < 2) { KMessageBox::sorry(0L, i18n("The FFT length must be greater than 2^2.")); return; } /* create the psd curve name */ KST::dataObjectList.lock().writeLock(); c_name = "PSD"+QString::number(KST::dataObjectList.count()+1) + "-" + vx->tagName(); while (KST::dataObjectList.findTag(c_name) != KST::dataObjectList.end()) { c_name+="'"; } KST::vectorList.lock().readLock(); while (KST::vectorList.findTag(c_name) != KST::vectorList.end()) { c_name+="'"; } KST::vectorList.lock().readUnlock(); /* create the psd curve */ curve = new KstPSDCurve(c_name, vx, new_freq, new_len, PSDVectorUnits->text(), PSDRateUnits->text(), _curveAppearance->color()); curve->setHasPoints(_curveAppearance->showPoints()); curve->setHasLines(_curveAppearance->showLines()); curve->setLineWidth(_curveAppearance->lineWidth()); curve->setLineStyle(_curveAppearance->lineStyle()); curve->Point.setType(_curveAppearance->pointType()); KST::dataObjectList.append(curve.data()); KST::dataObjectList.lock().writeUnlock(); /* assign curve to plot */ plot = KST::plotList.FindKstPlot(PlotList->currentText()); plot->addCurve(curve); if (autolabel) plot->GenerateDefaultLabels(); close(); emit docChanged(); update(); }
bool KstChangeFileDialogI::applyFileChange() { KstDataSourcePtr file; KST::dataSourceList.lock().writeLock(); KstDataSourceList::Iterator it = KST::dataSourceList.findReusableFileName(_dataFile->url()); QString invalidSources; int invalid = 0; if (it == KST::dataSourceList.end()) { file = KstDataSource::loadSource(_dataFile->url()); if (!file || !file->isValid()) { KST::dataSourceList.lock().unlock(); KMessageBox::sorry(this, i18n("The file could not be loaded.")); return false; } if (file->isEmpty()) { KST::dataSourceList.lock().unlock(); KMessageBox::sorry(this, i18n("The file does not contain data.")); return false; } KST::dataSourceList.append(file); } else { file = *it; } KST::dataSourceList.lock().unlock(); KstApp *app = KstApp::inst(); KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); KstRMatrixList rml = kstObjectSubList<KstMatrix,KstRMatrix>(KST::matrixList); int selected = 0; int handled = 0; int count = (int)ChangeFileCurveList->count(); for (int i = 0; i < count; i++) { if (ChangeFileCurveList->isSelected(i)) { ++selected; } } // a map to keep track of which objects have been duplicated, and mapping // old object -> new object KstDataObjectDataObjectMap duplicatedMap; QMap<KstVectorPtr, KstVectorPtr> duplicatedVectors; QMap<KstMatrixPtr, KstMatrixPtr> duplicatedMatrices; KstDataSourceList oldSources; // go through the vectors for (int i = 0; i < (int)rvl.count(); i++) { if (ChangeFileCurveList->isSelected(i)) { KstRVectorPtr vector = rvl[i]; vector->writeLock(); file->readLock(); bool valid = file->isValidField(vector->field()); file->unlock(); if (!valid) { if (invalid > 0) { // FIXME: invalid list construction for i18n invalidSources = i18n("%1, %2").arg(invalidSources).arg(vector->field()); } else { invalidSources = vector->field(); } ++invalid; } else { if (_duplicateSelected->isChecked()) { // block vector updates until vector is setup properly KST::vectorList.lock().writeLock(); // create a new vector KstRVectorPtr newVector = vector->makeDuplicate(); if (!oldSources.contains(newVector->dataSource())) { oldSources << newVector->dataSource(); } newVector->changeFile(file); KST::vectorList.lock().unlock(); // duplicate dependents if (_duplicateDependents->isChecked()) { duplicatedVectors.insert(KstVectorPtr(vector), KstVectorPtr(newVector)); KST::duplicateDependents(KstVectorPtr(vector), duplicatedMap, duplicatedVectors); } } else { if (!oldSources.contains(vector->dataSource())) { oldSources << vector->dataSource(); } vector->changeFile(file); } } vector->unlock(); app->slotUpdateProgress(selected, ++handled, i18n("Updating vectors...")); } } // go through the matrices for (int i = (int)rvl.count(); i < (int)ChangeFileCurveList->count(); i++) { if (ChangeFileCurveList->isSelected(i)) { KstRMatrixPtr matrix = rml[i-rvl.count()]; matrix->writeLock(); file->readLock(); bool valid = file->isValidMatrix(matrix->field()); file->unlock(); if (!valid) { if (invalid > 0) { // FIXME: invalid list construction for i18n invalidSources = i18n("%1, %2").arg(invalidSources).arg(matrix->field()); } else { invalidSources = matrix->field(); } ++invalid; } else { if (_duplicateSelected->isChecked()) { // block matrix updates until matrix is setup properly KST::matrixList.lock().writeLock(); // create a new matrix KstRMatrixPtr newMatrix = matrix->makeDuplicate(); if (!oldSources.contains(newMatrix->dataSource())) { oldSources << newMatrix->dataSource(); } newMatrix->changeFile(file); KST::matrixList.lock().unlock(); // duplicate dependents if (_duplicateDependents->isChecked()) { duplicatedMatrices.insert(KstMatrixPtr(matrix), KstMatrixPtr(newMatrix)); KST::duplicateDependents(KstMatrixPtr(matrix), duplicatedMap, duplicatedMatrices); } } else { if (!oldSources.contains(matrix->dataSource())) { oldSources << matrix->dataSource(); } matrix->changeFile(file); } } matrix->unlock(); app->slotUpdateProgress(selected, ++handled, i18n("Updating matrices...")); } } app->slotUpdateProgress(0, 0, QString::null); file = 0L; // now add any curves and images to plots if they were duplicated if (_duplicateSelected->isChecked() && _duplicateDependents->isChecked()) { KstApp *app = KstApp::inst(); KMdiIterator<KMdiChildView*> *it = app->createIterator(); while (it->currentItem()) { KstViewWindow *w = dynamic_cast<KstViewWindow*>(it->currentItem()); if (w) { KstTopLevelViewPtr view = kst_cast<KstTopLevelView>(w->view()); if (view) { Kst2DPlotList plots = view->findChildrenType<Kst2DPlot>(true); for (Kst2DPlotList::Iterator plotIter = plots.begin(); plotIter != plots.end(); ++plotIter) { for (KstDataObjectDataObjectMap::ConstIterator iter = duplicatedMap.begin(); iter != duplicatedMap.end(); ++iter) { if (KstBaseCurvePtr curve = kst_cast<KstBaseCurve>(iter.data())) { if ((*plotIter)->Curves.contains(kst_cast<KstBaseCurve>(iter.key())) && !(*plotIter)->Curves.contains(kst_cast<KstBaseCurve>(curve))) { (*plotIter)->addCurve(curve); } } } } } } it->next(); } app->deleteIterator(it); } // clean up unused data sources // kstdDebug() << "cleaning up data sources" << endl; KST::dataSourceList.lock().writeLock(); for (KstDataSourceList::Iterator it = oldSources.begin(); it != oldSources.end(); ++it) { // kstdDebug() << "DATA SOURCE: " << (*it)->tag().displayString() << " (" << (void*)(*it) << ") USAGE: " << (*it)->getUsage() << endl; if ((*it)->getUsage() == 1) { // kstdDebug() << " -> REMOVED" << endl; KST::dataSourceList.remove((*it).data()); } } KST::dataSourceList.lock().unlock(); if (!invalidSources.isEmpty()) { if (invalid == 1) { KMessageBox::sorry(this, i18n("The following field is not defined for the requested file:\n%1").arg(invalidSources)); } else { KMessageBox::sorry(this, i18n("The following fields are not defined for the requested file:\n%1").arg(invalidSources)); } } emit docChanged(); // force an update in case we're in paused mode KstApp::inst()->forceUpdate(); return true; }