/*! This function constructs a dialog which contains a label and a linedit for every variable that is stored in the given map except the double-delimiter entry It return true if everything was ok and false if the user hit cancel */ bool SnippetWidget::showMultiVarDialog(QMap<QString, QString> * map, QMap<QString, QString> * mapSave, int & iWidth, int & iBasicHeight, int & iOneHeight) { //if no var -> no need to show if (map->count() == 0) return true; //if only var is the double-delimiter -> no need to show QMap<QString, QString>::Iterator it = map->begin(); if ( map->count() == 1 && it.data()==_SnippetConfig.getDelimiter()+_SnippetConfig.getDelimiter() ) return true; QMap<QString, KTextEdit *> mapVar2Te; //this map will help keeping track which TEXTEDIT goes with which variable QMap<QString, QCheckBox *> mapVar2Cb; //this map will help keeping track which CHECKBOX goes with which variable // --BEGIN-- building a dynamic dialog QDialog dlg(this); dlg.setCaption(i18n("Enter Values for Variables")); QGridLayout * layout = new QGridLayout( &dlg, 1, 1, 11, 6, "layout"); QGridLayout * layoutTop = new QGridLayout( 0, 1, 1, 0, 6, "layoutTop"); QGridLayout * layoutVar = new QGridLayout( 0, 1, 1, 0, 6, "layoutVar"); QGridLayout * layoutBtn = new QGridLayout( 0, 1, 1, 0, 6, "layoutBtn"); KTextEdit *te = NULL; QLabel * labTop = NULL; QCheckBox * cb = NULL; labTop = new QLabel( &dlg, "label" ); labTop->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, 0, 0, labTop->sizePolicy().hasHeightForWidth() ) ); labTop->setText(i18n("Enter the replacement values for these variables:")); layoutTop->addWidget(labTop, 0, 0); layout->addMultiCellLayout( layoutTop, 0, 0, 0, 1 ); int i = 0; //walk through the variable map and add for ( it = map->begin(); it != map->end(); ++it ) { //a checkbox, a lable and a lineedit to the main layout if (it.key() == _SnippetConfig.getDelimiter() + _SnippetConfig.getDelimiter()) continue; cb = new QCheckBox( &dlg, "cbVar" ); cb->setChecked( FALSE ); cb->setText(it.key()); layoutVar->addWidget( cb, i ,0, Qt::AlignTop ); te = new KTextEdit( &dlg, "teVar" ); layoutVar->addWidget( te, i, 1, Qt::AlignTop ); if ((*mapSave)[it.key()].length() > 0) { cb->setChecked( TRUE ); te->setText((*mapSave)[it.key()]); } mapVar2Te[it.key()] = te; mapVar2Cb[it.key()] = cb; QToolTip::add( cb, i18n("Enable this to save the value entered to the right as the default value for this variable") ); QWhatsThis::add( cb, i18n("If you enable this option, the value entered to the right will be saved. " "If you use the same variable later, even in another snippet, the value entered to the right " "will be the default value for that variable.") ); i++; } layout->addMultiCellLayout( layoutVar, 1, 1, 0, 1 ); KPushButton * btn1 = new KPushButton( &dlg, "pushButton1" ); btn1->setText(i18n("&Cancel")); btn1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, 0, 0, btn1->sizePolicy().hasHeightForWidth() ) ); layoutBtn->addWidget( btn1, 0, 0 ); KPushButton * btn2 = new KPushButton( &dlg, "pushButton2" ); btn2->setText(i18n("&Apply")); btn2->setDefault( TRUE ); btn2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, 0, 0, btn2->sizePolicy().hasHeightForWidth() ) ); layoutBtn->addWidget( btn2, 0, 1 ); layout->addMultiCellLayout( layoutBtn, 2, 2, 0, 1 ); // --END-- building a dynamic dialog //connect the buttons to the QDialog default slots connect(btn1, SIGNAL(clicked()), &dlg, SLOT(reject()) ); connect(btn2, SIGNAL(clicked()), &dlg, SLOT(accept()) ); //prepare to execute the dialog bool bReturn = false; //resize the textedits if (iWidth > 1) { QRect r = dlg.geometry(); r.setHeight(iBasicHeight + iOneHeight*mapVar2Te.count()); r.setWidth(iWidth); dlg.setGeometry(r); } if ( i > 0 && // only if there are any variables dlg.exec() == QDialog::Accepted ) { QMap<QString, KTextEdit *>::Iterator it2; for ( it2 = mapVar2Te.begin(); it2 != mapVar2Te.end(); ++it2 ) { if (it2.key() == _SnippetConfig.getDelimiter() + _SnippetConfig.getDelimiter()) continue; (*map)[it2.key()] = it2.data()->text(); //copy the entered values back to the given map if (mapVar2Cb[it2.key()]->isChecked()) //if the checkbox is on; save the values for later (*mapSave)[it2.key()] = it2.data()->text(); else (*mapSave).erase(it2.key()); } bReturn = true; iBasicHeight = dlg.geometry().height() - layoutVar->geometry().height(); iOneHeight = layoutVar->geometry().height() / mapVar2Te.count(); iWidth = dlg.geometry().width(); } //do some cleanup QMap<QString, KTextEdit *>::Iterator it1; for (it1 = mapVar2Te.begin(); it1 != mapVar2Te.end(); ++it1) delete it1.data(); mapVar2Te.clear(); QMap<QString, QCheckBox *>::Iterator it2; for (it2 = mapVar2Cb.begin(); it2 != mapVar2Cb.end(); ++it2) delete it2.data(); mapVar2Cb.clear(); delete layoutTop; delete layoutVar; delete layoutBtn; delete layout; if (i==0) //if nothing happened this means, that there are no variables to translate return true; //.. so just return OK return bReturn; }