00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "KWEditPersonnalExpression.h"
00021 #include "KWView.h"
00022
00023 #include <klocale.h>
00024 #include <klineeditdlg.h>
00025 #include <kdebug.h>
00026 #include <kstandarddirs.h>
00027
00028 #include <qfile.h>
00029 #include <qpushbutton.h>
00030 #include <qcombobox.h>
00031 #include <qlineedit.h>
00032 #include <qlabel.h>
00033 #include <qlayout.h>
00034
00035 KWEditPersonnalExpression::KWEditPersonnalExpression( QWidget *parent, const char *name )
00036 : KDialogBase( parent, name , true, i18n("Edit Personal Expression"), Ok|Cancel, Ok, true )
00037 {
00038 resize( 412, 339 );
00039 QWidget *page = new QWidget( this );
00040 setMainWidget(page);
00041 QGridLayout* form1Layout = new QGridLayout( page, 1, 1, 0, KDialog::spacingHint(), "form1Layout");
00042
00043 QHBoxLayout *horlayout1 = new QHBoxLayout( 0, 0, KDialog::spacingHint(), "horlayout1");
00044
00045 QLabel *groupnameLabel = new QLabel(i18n("Group name:"), page, "groupnameLabel" );
00046 horlayout1->addWidget( groupnameLabel );
00047
00048 m_groupLineEdit = new QLineEdit( page, "groupLineEdit" );
00049 horlayout1->addWidget( m_groupLineEdit );
00050
00051 form1Layout->addLayout( horlayout1, 0, 1 );
00052
00053 QGroupBox *expressionGroupBox = new QGroupBox( page, "expressionGroupBox" );
00054 expressionGroupBox->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)5, 1, 0, expressionGroupBox->sizePolicy().hasHeightForWidth() ) );
00055 expressionGroupBox->setTitle( i18n( "Expressions" ) );
00056 expressionGroupBox->setColumnLayout(0, Qt::Vertical );
00057 expressionGroupBox->layout()->setSpacing( KDialog::spacingHint() );
00058 expressionGroupBox->layout()->setMargin( KDialog::marginHint() );
00059 QVBoxLayout *expressionGroupBoxLayout = new QVBoxLayout( expressionGroupBox->layout() );
00060 expressionGroupBoxLayout->setAlignment( Qt::AlignTop );
00061
00062 m_ExpressionsList = new QListBox( expressionGroupBox, "listOfExpressions" );
00063 m_ExpressionsList->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 1, 0, m_ExpressionsList->sizePolicy().hasHeightForWidth() ) );
00064 expressionGroupBoxLayout->addWidget( m_ExpressionsList );
00065
00066 m_expressionLineEdit = new QLineEdit( expressionGroupBox, "expressionLineEdit" );
00067 expressionGroupBoxLayout->addWidget( m_expressionLineEdit );
00068
00069 QHBoxLayout *horlayout2 = new QHBoxLayout( 0, 0, KDialog::spacingHint(), "horlayout2");
00070 QSpacerItem* spacer = new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum );
00071 horlayout2->addItem( spacer );
00072
00073 m_addExpression = new QPushButton( i18n("&New"), expressionGroupBox, "m_addExpression" );
00074 horlayout2->addWidget( m_addExpression );
00075
00076 m_delExpression = new QPushButton( i18n("&Delete"), expressionGroupBox, "m_delExpression" );
00077 horlayout2->addWidget( m_delExpression );
00078 expressionGroupBoxLayout->addLayout( horlayout2 );
00079
00080 form1Layout->addWidget( expressionGroupBox, 1, 1 );
00081
00082 QVBoxLayout *vertlayout = new QVBoxLayout( 0, 0, KDialog::spacingHint(), "vertlayout");
00083
00084 m_groupList = new QListBox( page, "groupList" );
00085 m_groupList->insertItem( "group1" );
00086 m_groupList->setMaximumSize( QSize( 200, 32767 ) );
00087 vertlayout->addWidget( m_groupList );
00088
00089 QHBoxLayout *horlayout3 = new QHBoxLayout( 0, 0, KDialog::spacingHint(), "horlayout3");
00090
00091 m_addGroup = new QPushButton( i18n("New"), page, "m_addGroup" );
00092 horlayout3->addWidget( m_addGroup );
00093
00094 m_delGroup = new QPushButton(i18n("Delete"), page, "m_delGroup" );
00095 horlayout3->addWidget( m_delGroup );
00096 vertlayout->addLayout( horlayout3 );
00097
00098 form1Layout->addMultiCellLayout( vertlayout, 0, 1, 0, 0 );
00099
00100 loadFile();
00101 if(listExpression.count() == 0)
00102 slotAddGroup();
00103 else
00104 initGroupList();
00105
00106 connect(m_groupList,SIGNAL(selectionChanged()), this,SLOT(slotGroupSelected()));
00107 connect(m_ExpressionsList,SIGNAL(selectionChanged()), this,SLOT(slotExpressionSelected()));
00108 if(m_groupList->count() > 0) m_groupList->setSelected(0, true);
00109
00110 connect(m_groupLineEdit,SIGNAL(textChanged(const QString&)), this,SLOT(slotUpdateGroupName(const QString&)));
00111 connect(m_expressionLineEdit,SIGNAL(textChanged(const QString&)), this,SLOT(slotUpdateExpression(const QString&)));
00112 connect(m_addExpression, SIGNAL( clicked() ), this,SLOT( slotAddExpression() ));
00113 connect(m_delExpression, SIGNAL( clicked() ), this,SLOT( slotRemoveExpression() ));
00114 connect(m_addGroup, SIGNAL( clicked() ), this,SLOT( slotAddGroup()));
00115 connect(m_delGroup, SIGNAL( clicked() ), this,SLOT( slotRemoveGroup() ));
00116 updateWidget();
00117
00118 setFocus();
00119 }
00120
00121 void KWEditPersonnalExpression::slotExpressionSelected()
00122 {
00123 m_delExpression->setEnabled(m_ExpressionsList->currentItem()!=-1);
00124 m_expressionLineEdit->setText(m_ExpressionsList->currentText());
00125 }
00126
00127 void KWEditPersonnalExpression::slotGroupSelected()
00128 {
00129 m_groupLineEdit->blockSignals(true);
00130 m_delExpression->setEnabled(m_groupList->currentItem()!=-1);
00131 m_groupLineEdit->setText(m_groupList->currentText());
00132 list::Iterator it= listExpression.find(m_groupList->currentText());
00133 QStringList lst(it.data());
00134 m_ExpressionsList->blockSignals(true);
00135 m_ExpressionsList->clear();
00136 m_ExpressionsList->insertStringList(lst);
00137 m_ExpressionsList->blockSignals(false);
00138 m_delExpression->setEnabled(lst.count()>0);
00139 if(m_ExpressionsList->count() > 0)
00140 m_ExpressionsList->setSelected(0, true);
00141 m_groupLineEdit->blockSignals(false);
00142 }
00143
00144 void KWEditPersonnalExpression::slotUpdateGroupName(const QString &newGroupName)
00145 {
00146 if ( m_groupList->currentItem()==-1 )
00147 return;
00148
00149 m_addGroup->setEnabled( true );
00150 list::Iterator it= listExpression.find(m_groupList->currentText());
00151 QStringList lst(it.data());
00152 listExpression.insert(newGroupName,lst);
00153 listExpression.remove(m_groupList->currentText());
00154 m_groupList->blockSignals(true);
00155 m_groupList->changeItem(newGroupName, m_groupList->currentItem());
00156 m_groupList->blockSignals(false);
00157 m_bChanged=true;
00158 }
00159
00160 void KWEditPersonnalExpression::slotUpdateExpression(const QString &newExpression)
00161 {
00162 if(newExpression.isEmpty() || m_groupList->currentItem()==-1 || m_ExpressionsList->currentText().isEmpty())
00163 return;
00164
00165 list::Iterator it= listExpression.find(m_groupList->currentText());
00166 QStringList lst = it.data();
00167 QStringList::Iterator it2=lst.find(m_ExpressionsList->currentText());
00168 lst.insert(it2,QString(newExpression));
00169 lst.remove(it2);
00170 listExpression.replace(m_groupList->currentText(),lst);
00171
00172 lst.remove(m_ExpressionsList->currentText());
00173 m_ExpressionsList->blockSignals(true);
00174 m_ExpressionsList->changeItem(newExpression, m_ExpressionsList->currentItem());
00175 m_ExpressionsList->blockSignals(false);
00176 m_bChanged=true;
00177 }
00178
00179 void KWEditPersonnalExpression::loadFile()
00180 {
00181 QString file=locateLocal("data","kword/expression/perso.xml");
00182 init( file );
00183 }
00184
00185 void KWEditPersonnalExpression::initGroupList()
00186 {
00187 QStringList lst;
00188 m_groupList->clear();
00189 list::Iterator it;
00190 for( it = listExpression.begin(); it != listExpression.end(); ++it )
00191 lst<<it.key();
00192 m_groupList->insertStringList(lst);
00193 }
00194
00195 void KWEditPersonnalExpression::init(const QString& filename )
00196 {
00197 QFile file( filename );
00198 if ( !file.open( IO_ReadOnly ) )
00199 return;
00200
00201 kdDebug() << "KWEditPersonnalExpression::init parsing " << filename << endl;
00202 QDomDocument doc;
00203 doc.setContent( &file );
00204 file.close();
00205
00206 QString group = "";
00207 QStringList list;
00208 QDomNode n = doc.documentElement().firstChild();
00209 for( ; !n.isNull(); n = n.nextSibling() )
00210 {
00211 if ( n.isElement() )
00212 {
00213 QDomElement e = n.toElement();
00214 if ( e.tagName() == "Type" )
00215 {
00216 list.clear();
00217 group = i18n( e.namedItem( "TypeName" ).toElement().text().utf8() );
00218
00219 QDomNode n2 = e.firstChild();
00220 for( ; !n2.isNull(); n2 = n2.nextSibling() )
00221 {
00222
00223 if ( n2.isElement() )
00224 {
00225 QDomElement e2 = n2.toElement();
00226 if ( e2.tagName() == "Expression" )
00227 {
00228 QString text = i18n( e2.namedItem( "Text" ).toElement().text().utf8() );
00229 list<<text;
00230 }
00231 }
00232 }
00233 listExpression.insert(group,list);
00234
00235 group = "";
00236 }
00237 }
00238 }
00239 }
00240
00241 void KWEditPersonnalExpression::slotOk()
00242 {
00243 if( m_bChanged)
00244 saveFile();
00245 KDialogBase::slotOk();
00246 }
00247
00248 void KWEditPersonnalExpression::slotAddExpression() {
00249 list::Iterator it= listExpression.find(m_groupList->currentText());
00250 QStringList lst(it.data());
00251 QString newWord = i18n("empty");
00252 if ( lst.contains( newWord ))
00253 return;
00254 lst<< newWord;
00255 listExpression.replace(m_groupList->currentText(),lst);
00256
00257 m_ExpressionsList->blockSignals(true);
00258 m_ExpressionsList->insertItem(newWord);
00259 m_ExpressionsList->clearSelection();
00260 m_ExpressionsList->setBottomItem (m_ExpressionsList->count() -1);
00261 m_ExpressionsList->blockSignals(false);
00262 m_ExpressionsList->setSelected(m_ExpressionsList->count() -1, true);
00263 m_expressionLineEdit->selectAll();
00264 m_expressionLineEdit->setFocus();
00265
00266 updateExpression();
00267
00268 m_bChanged=true;
00269 }
00270
00271 void KWEditPersonnalExpression::slotRemoveExpression() {
00272 QString text=m_ExpressionsList->currentText ();
00273 if(!text.isEmpty())
00274 {
00275 list::Iterator it= listExpression.find(m_groupList->currentText());
00276 QStringList lst(it.data());
00277 lst.remove(text);
00278 listExpression.replace(m_groupList->currentText(),lst);
00279
00280 m_ExpressionsList->blockSignals(true);
00281 m_ExpressionsList->clear();
00282 m_ExpressionsList->insertStringList(lst);
00283 m_delExpression->setEnabled(lst.count()>0);
00284 m_ExpressionsList->blockSignals(false);
00285 m_expressionLineEdit->blockSignals(true);
00286 m_expressionLineEdit->clear();
00287 m_expressionLineEdit->blockSignals(false);
00288 m_bChanged=true;
00289 }
00290 }
00291
00292 void KWEditPersonnalExpression::slotAddGroup() {
00293 listExpression.insert(i18n("new group"),QStringList());
00294 initGroupList();
00295 m_groupList->setCurrentItem(m_groupList->count() -1);
00296 updateWidget();
00297 m_bChanged=true;
00298 }
00299
00300 void KWEditPersonnalExpression::slotRemoveGroup() {
00301 QString group=m_groupList->currentText();
00302 if(group.isEmpty())
00303 return;
00304 listExpression.remove( group );
00305 m_groupList->removeItem(m_groupList->currentItem());
00306 updateWidget();
00307 m_bChanged=true;
00308 }
00309
00310 void KWEditPersonnalExpression::updateWidget()
00311 {
00312 bool state = listExpression.count()> 0;
00313 m_delGroup->setEnabled( state );
00314 m_addExpression->setEnabled( state );
00315 m_groupLineEdit->setEnabled( state );
00316
00317 state =state && m_ExpressionsList->count()>0;
00318 m_expressionLineEdit->setEnabled( state );
00319 m_delExpression->setEnabled( state);
00320
00321 }
00322
00323 void KWEditPersonnalExpression::updateExpression()
00324 {
00325 bool state = m_ExpressionsList->count()>0;
00326 m_expressionLineEdit->setEnabled( state );
00327 m_delExpression->setEnabled( state);
00328 }
00329
00330 void KWEditPersonnalExpression::saveFile()
00331 {
00332 QDomDocument doc( "KWordExpression" );
00333 QDomElement begin = doc.createElement( "KWordExpression" );
00334 doc.appendChild( begin );
00335 QStringList lst;
00336 list::Iterator it;
00337 for( it = listExpression.begin(); it != listExpression.end(); ++it )
00338 {
00339 lst=it.data();
00340 if ( !lst.isEmpty() )
00341 {
00342 QDomElement type = doc.createElement( "Type" );
00343 begin.appendChild( type );
00344 QDomElement typeName = doc.createElement( "TypeName" );
00345 type.appendChild( typeName );
00346 typeName.appendChild( doc.createTextNode(it.key() ) );
00347
00348 for( uint i=0;i<lst.count();i++ )
00349 {
00350 QDomElement expr = doc.createElement( "Expression" );
00351 type.appendChild( expr );
00352 QDomElement text = doc.createElement( "Text" );
00353 expr.appendChild( text );
00354 text.appendChild( doc.createTextNode(lst[i] ) );
00355 }
00356 }
00357 }
00358 QCString s = doc.toCString();
00359
00360 QFile file( locateLocal("data","kword/expression/perso.xml") );
00361 if ( !file.open( IO_WriteOnly ) )
00362 {
00363 kdDebug()<<"Error \n";
00364 return;
00365 }
00366 file.writeBlock(s,s.length());
00367 file.close();
00368 }
00369
00370 #include "KWEditPersonnalExpression.moc"