/* Marcion
Copyright (C) 2009 - 2011 Milan Konvicka
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; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program */
#include "addword.h"
//
unsigned int CAddWord::count=0;
CAddWord::CAddWord( CMessages * const messages,
QComboBox *const* crum,
int key,
Mode mode)
: QWidget(0),messages(messages),
crum(crum),_key(key),_mode(mode),
dd(),dmdiw()
{
setupUi(this);
QString wtit;
switch(mode)
{
case InsertWord :
{
wtit=tr("Insert Word");
break;
}
case UpdateWord :
{
wtit=tr("Update Word");
break;
}
case InsertDeriv :
{
wtit=tr("Insert Derivation");
break;
}
case UpdateDeriv :
{
wtit=tr("Update Derivation");
break;
}
}
setWindowTitle(wtit+" ("+QString::number(++count)+")");
dd.setWindowTitle(windowTitle()+tr(" / edit"));
dmdiw.setWidget(&dd);
messages->settings().mdiArea()->addSubWindow(&dmdiw)->setWindowIcon(QIcon(":/new/icons/icons/addw.png"));
QFont font(messages->settings().copticFont());
font.setPointSize(messages->settings().copticFontSize());
dd.setFont(font);
dd.lstChooser->setCurrentRow(0);
QFont cf(messages->settings().copticFont());
cf.setPointSize(messages->settings().copticFontSize());
txtAWcoptTr->setFont(cf);
txtAWgrTr->setFont(cf);
for(int x=0;x<=COUNT_QUALITY;x++)
cmbAWquality->addItem(QString(get_quality_item(x).t),QVariant(get_quality_item(x).n));
for(int x=0;x<CTranslit::CWClass.count();x++)
cmbAWtype->addItem(CTranslit::CWClass.at(x).first,QVariant(CTranslit::CWClass.at(x).second));
connect(&dd,SIGNAL(finished(int)),this,SLOT(ddialog_finished(int)));
switch(_mode)
{
case InsertDeriv :
{
rbNewW->setVisible(false);
cmbAWquality->setVisible(false);
lblQuality->setVisible(false);
}
case InsertWord :
{
cbUpdQual->setVisible(false);
cbUpdType->setVisible(false);
cbUpdCrum->setVisible(false);
cbUpdEn->setVisible(false);
cbUpdGr->setVisible(false);
cbUpdCz->setVisible(false);
cbUpdCopt->setVisible(false);
cbDrvKey->setVisible(false);
break;
}
case UpdateWord :
{
rbNewW->setVisible(false);
rbNewD->setVisible(false);
cbDrvKey->setVisible(false);
txtDrvKey->setVisible(false);
readword();
break;
}
case UpdateDeriv :
{
rbNewW->setVisible(false);
rbNewD->setVisible(false);
cmbAWquality->setVisible(false);
lblQuality->setVisible(false);
cbUpdQual->setVisible(false);
readderiv();
break;
}
}
adjustSize();
}
CAddWord::~CAddWord()
{
dmdiw.setWidget(0);
messages->settings().mdiArea()->removeSubWindow(&dmdiw);
}
//
void CAddWord::on_txtAWcopt_textChanged(QString )
{
txtAWcoptTr->setText(CTranslit::to(txtAWcopt->text(),CTranslit::Copt));
}
void CAddWord::on_txtAWgr_textChanged(QString )
{
txtAWgrTr->setText(CTranslit::to(txtAWgr->text(),CTranslit::Greek));
}
void CAddWord::on_btAWgetcrum_clicked()
{
txtAWcrum->setText(QString::number(
(*crum)->currentIndex()-CRUM_FIRST+3));
}
void CAddWord::on_btAWsave_clicked()
{
switch (_mode)
{
case InsertWord :{
int wordkey=addword();
if(wordkey!=-1)
{
if(rbNewW->isChecked())
{
clear_fields();
txtAWcopt->setFocus();
}
else if(rbNewD->isChecked())
{
*(int*)&_key=wordkey;
*(Mode*)&_mode=InsertDeriv;
rbNewW->setVisible(false);
lblQuality->setVisible(false);
cmbAWquality->setVisible(false);
clear_fields();
txtAWcopt->setFocus();
}
else if(rbClose->isChecked())
messages->settings().mdiArea()->removeSubWindow(parentWidget());
break;
}
break;
}
case UpdateWord :{
updateword();
messages->settings().mdiArea()->removeSubWindow(parentWidget());
break;
}
case InsertDeriv :{
addderiv();
if(rbNewD->isChecked())
{
clear_fields();
txtAWcopt->setFocus();
}
else if(rbClose->isChecked())
messages->settings().mdiArea()->removeSubWindow(parentWidget());
break;
}
case UpdateDeriv :{
updatederiv();
messages->settings().mdiArea()->removeSubWindow(parentWidget());
break;
}
}
}
int CAddWord::addword()
{
QString query("select max(`key`) from coptwrd");
CMySql q(query);
messages->MsgMsg("getting next key by query "+query+" ...");
if(!q.exec())
{
messages->MsgErr(q.lastError());
return -1;
}
if(!q.first())
{
messages->MsgErr("something wrong");
return -1;
}
int key=q.value(0).toInt();
QString query2="insert into `coptwrd` (`key`,`word`,`type`,`cz`,`en`,`gr`,`crum`,`quality`,`added`,`updated`,`created_by`,`updated_by`) values ("+QString::number(++key)+",'"+txtAWcopt->text()+"',"+cmbAWtype->itemData(cmbAWtype->currentIndex()).toString()+",'"+txtAWcz->text()+"','"+txtAWeng->text()+"','"+txtAWgr->text()+"','"+txtAWcrum->text()+(rbAWA->isChecked()?"a":"b")+"',"+cmbAWquality->itemData(cmbAWquality->currentIndex()).toString()+",curdate(),'0','"+messages->settings().nick()+"','')";
CMySql q2(query2);
messages->MsgMsg(QString("inserting new word with key "+QString::number(key)+" by query "+query2+" ..."));
if(!q2.exec())
{
messages->MsgErr(q2.lastError());
return -1;
}
messages->MsgOk();
return key;
}
void CAddWord::updateword()
{
QString query("update `coptwrd` set ");
if(cbUpdCopt->isChecked())
query.append(" `word`='"+txtAWcopt->text()+"',");
if(cbUpdType->isChecked())
query.append(" `type`="+cmbAWtype->itemData(cmbAWtype->currentIndex()).toString()+",");
if(cbUpdCz->isChecked())
query.append(" `cz`='"+txtAWcz->text()+"',");
if(cbUpdEn->isChecked())
query.append(" `en`='"+txtAWeng->text()+"',");
if(cbUpdGr->isChecked())
query.append(" `gr`='"+txtAWgr->text()+"',");
if(cbUpdCrum->isChecked())
query.append(" `crum`='"+txtAWcrum->text()+(rbAWA->isChecked()?"a":"b")+"',");
if(cbUpdQual->isChecked())
query.append(" `quality`="+cmbAWquality->itemData(cmbAWquality->currentIndex()).toString()+",");
query.append(" `updated`=curdate(),");
query.append(" `updated_by`='"+messages->settings().nick()+"',");
query.chop(1);
query.append(" where `key`="+QString::number(_key));
messages->MsgMsg("updating word with key "+QString::number(_key)+" by query "+query+" ...");
CMySql q(query);
if(!q.exec())
{
messages->MsgErr(q.lastError());
return;
}
messages->MsgOk();
}
void CAddWord::readword()
{
QString query("select `word`,`cz`,`en`,`gr`,`crum`,`type`,`quality` from `coptwrd` where `key`="+QString::number(_key));
CMySql q(query);
messages->MsgMsg("reading row by query "+query+" ...");
if(!q.exec())
{
messages->MsgErr(q.lastError());
return;
}
if(!q.first())
{
messages->MsgErr("something wrong");
return;
}
txtAWcopt->setText(q.value(0));
txtAWcz->setText(q.value(1));
txtAWeng->setText(q.value(2));
txtAWgr->setText(q.value(3));
QString crum(q.value(4));
rbAWB->setChecked(true);
rbAWA->setChecked(crum.right(1)=="a");
crum.chop(1);
txtAWcrum->setText(crum);
cmbAWtype->setCurrentIndex(cmbAWtype->findData(
q.value(5).toInt()
));
cmbAWquality->setCurrentIndex(cmbAWquality->findData(
q.value(6).toInt()
));
messages->MsgOk();
on_cbUpdQual_stateChanged(0 );
on_cbUpdCrum_stateChanged(0 );
on_cbUpdCopt_stateChanged(0 );
on_cbUpdCz_stateChanged(0 );
on_cbUpdEn_stateChanged(0 );
on_cbUpdGr_stateChanged(0 );
on_cbUpdType_stateChanged(0 );
on_cbDrvKey_stateChanged(0 );
}
void CAddWord::on_cbUpdType_stateChanged(int )
{
if(cbUpdType->isChecked())
cmbAWtype->setEnabled(true);
else
cmbAWtype->setEnabled(false);
}
void CAddWord::on_cbUpdQual_stateChanged(int )
{
if(cbUpdQual->isChecked())
cmbAWquality->setEnabled(true);
else
cmbAWquality->setEnabled(false);
}
void CAddWord::on_cbUpdCrum_stateChanged(int )
{
if(cbUpdCrum->isChecked())
{
rbAWA->setEnabled(true);
rbAWB->setEnabled(true);
btAWgetcrum->setEnabled(true);
txtAWcrum->setEnabled(true);
}
else
{
rbAWA->setEnabled(false);
rbAWB->setEnabled(false);
btAWgetcrum->setEnabled(false);
txtAWcrum->setEnabled(false);
}
}
void CAddWord::on_cbUpdCopt_stateChanged(int )
{
if(cbUpdCopt->isChecked())
txtAWcopt->setEnabled(true);
else
txtAWcopt->setEnabled(false);
}
void CAddWord::on_cbUpdCz_stateChanged(int )
{
if(cbUpdCz->isChecked())
txtAWcz->setEnabled(true);
else
txtAWcz->setEnabled(false);
}
void CAddWord::on_cbUpdEn_stateChanged(int )
{
if(cbUpdEn->isChecked())
txtAWeng->setEnabled(true);
else
txtAWeng->setEnabled(false);
}
void CAddWord::on_cbUpdGr_stateChanged(int )
{
if(cbUpdGr->isChecked())
txtAWgr->setEnabled(true);
else
txtAWgr->setEnabled(false);
}
void CAddWord::on_cbDrvKey_stateChanged(int )
{
if(cbDrvKey->isChecked())
txtDrvKey->setEnabled(true);
else
txtDrvKey->setEnabled(false);
}
void CAddWord::addderiv()
{
QString query2="insert into `coptdrv` (`key_word`,`key_deriv`,`word`,`type`,`cz`,`en`,`gr`,`crum`,`added`,`updated`,`created_by`,`updated_by`) values ("+QString::number(_key)+","+txtDrvKey->text()+",'"+txtAWcopt->text()+"',"+cmbAWtype->itemData(cmbAWtype->currentIndex()).toString()+",'"+txtAWcz->text()+"','"+txtAWeng->text()+"','"+txtAWgr->text()+"','"+txtAWcrum->text()+(rbAWA->isChecked()?"a":"b")+"',curdate(),'0','"+messages->settings().nick()+"','')";
CMySql q2(query2);
messages->MsgMsg(QString("inserting new derivation with key "+QString::number(_key)+" by query "+query2+" ..."));
if(!q2.exec())
{
messages->MsgErr(q2.lastError());
return;
}
messages->MsgOk();
}
void CAddWord::readderiv()
{
QString query("select `word`,`cz`,`en`,`gr`,`crum`,`type`,`key_deriv` from `coptdrv` where `key`="+QString::number(_key));
CMySql q(query);
messages->MsgMsg("reading row by query "+query+" ...");
if(!q.exec())
{
messages->MsgErr(q.lastError());
return;
}
if(!q.first())
{
messages->MsgErr("something wrong");
return;
}
txtAWcopt->setText(q.value(0));
txtAWcz->setText(q.value(1));
txtAWeng->setText(q.value(2));
txtAWgr->setText(q.value(3));
txtDrvKey->setText(q.value(6));
QString crum(q.value(4));
rbAWB->setChecked(true);
rbAWA->setChecked(crum.right(1)=="a");
crum.chop(1);
txtAWcrum->setText(crum);
cmbAWtype->setCurrentIndex(cmbAWtype->findData(
q.value(5).toInt()
));
messages->MsgOk();
on_cbUpdCrum_stateChanged(0 );
on_cbUpdCopt_stateChanged(0 );
on_cbUpdCz_stateChanged(0 );
on_cbUpdEn_stateChanged(0 );
on_cbUpdGr_stateChanged(0 );
on_cbUpdType_stateChanged(0 );
on_cbDrvKey_stateChanged(0 );
}
void CAddWord::updatederiv()
{
QString query("update `coptdrv` set ");
if(cbUpdCopt->isChecked())
query.append(" `word`='"+txtAWcopt->text()+"',");
if(cbUpdType->isChecked())
query.append(" `type`="+cmbAWtype->itemData(cmbAWtype->currentIndex()).toString()+",");
if(cbUpdCz->isChecked())
query.append(" `cz`='"+txtAWcz->text()+"',");
if(cbUpdEn->isChecked())
query.append(" `en`='"+txtAWeng->text()+"',");
if(cbUpdGr->isChecked())
query.append(" `gr`='"+txtAWgr->text()+"',");
if(cbUpdCrum->isChecked())
query.append("`crum`='"+txtAWcrum->text()+(rbAWA->isChecked()?"a":"b")+"',");
if(cbDrvKey->isChecked())
query.append(" `key_deriv`="+txtDrvKey->text()+",");
query.append("`updated`=curdate(),");
query.append(" `updated_by`='"+messages->settings().nick()+"',");
query.chop(1);
query.append(" where `key`="+QString::number(_key));
messages->MsgMsg("updating derivation with key "+QString::number(_key)+" by query "+query+" ...");
CMySql q(query);
if(!q.exec())
{
messages->MsgErr(q.lastError());
return;
}
messages->MsgOk();
}
void CAddWord::clear_fields()
{
txtAWcopt->clear();
txtAWeng->clear();
txtAWgr->clear();
txtAWcz->clear();
//txtAWcrum->clear();
cmbAWquality->setCurrentIndex(0);
cmbAWtype->setCurrentIndex(0);
//rbAWA->setChecked(true);
}
void CAddWord::on_btEdit_clicked()
{
dd.setText(txtAWcopt->text().trimmed(),
txtAWeng->text(),txtAWgr->text());
dd.show();
if(dmdiw.isVisible())
dmdiw.raise();
else
dmdiw.show();
}
void CAddWord::ddialog_finished(int result)
{
switch(result)
{
case CDialects3::Accepted :
{
txtAWcopt->setText(dd.makeRecord());
txtAWeng->setText(dd.txtEnglish->text());
txtAWgr->setText(dd.widgetGreek->text());
break;
}
case CDialects3::Rejected :
{
break;
}
}
dmdiw.hide();
}
void CAddWord::on_btTemplTr_clicked()
{
cmbAWtype->setCurrentIndex(23);
txtAWeng->setText("tr :");
}
void CAddWord::on_btTemplIntrQ_clicked()
{
cmbAWtype->setCurrentIndex(23);
txtAWeng->setText("intr (qual):");
}
void CAddWord::on_btTemplIntr_clicked()
{
cmbAWtype->setCurrentIndex(23);
txtAWeng->setText("intr :");
}
void CAddWord::on_btTemplRefl_clicked()
{
txtAWeng->setText(txtAWeng->text().replace(":","(refl):"));
}
void CAddWord::on_btTemplAdvb_clicked()
{
cmbAWtype->setCurrentIndex(23);
txtAWeng->setText("With following adverb:");
}
void CAddWord::on_btTemplPrep_clicked()
{
cmbAWtype->setCurrentIndex(23);
txtAWeng->setText("With following preposition:");
}