00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <qcheckbox.h>
00025 #include <qcombobox.h>
00026 #include <qdatetimeedit.h>
00027 #include <qlayout.h>
00028 #include <qobjectlist.h>
00029 #include <qspinbox.h>
00030 #include <qregexp.h>
00031 #include <qtextedit.h>
00032 #include <qwidgetfactory.h>
00033
00034 #include <kdatepicker.h>
00035 #include <kdatetimewidget.h>
00036 #include <kdialog.h>
00037 #include <klineedit.h>
00038 #include <kstandarddirs.h>
00039
00040 #include "customfieldswidget.h"
00041
00042 #include "advancedcustomfields.h"
00043
00044
00045 AdvancedCustomFields::AdvancedCustomFields( const QString &uiFile, KABC::AddressBook *ab,
00046 QWidget *parent, const char *name )
00047 : KAB::ContactEditorWidget( ab, parent, name )
00048 {
00049 initGUI( uiFile );
00050 }
00051
00052 void AdvancedCustomFields::loadContact( KABC::Addressee *addr )
00053 {
00054 QStringList customs = addr->customs();
00055
00056 QString ns;
00057 if ( (mIdentifier.upper() == "KADDRESSBOOK") ||
00058 (QRegExp( "^Form\\d\\d?$").search(mIdentifier) >= 0 )
00059 )
00060 ns = "KADDRESSBOOK";
00061 else
00062 ns = mIdentifier;
00063
00064
00065
00066
00067 QMap<QString, QWidget*>::Iterator widIt;
00068 for ( widIt = mWidgets.begin(); widIt != mWidgets.end(); ++widIt ) {
00069 QString value;
00070 if ( widIt.data()->inherits( "QLineEdit" ) ) {
00071 QLineEdit *wdg = static_cast<QLineEdit*>( widIt.data() );
00072 wdg->setText( QString::null );
00073 } else if ( widIt.data()->inherits( "QSpinBox" ) ) {
00074 QSpinBox *wdg = static_cast<QSpinBox*>( widIt.data() );
00075 wdg->setValue( wdg->minValue() );
00076 } else if ( widIt.data()->inherits( "QCheckBox" ) ) {
00077 QCheckBox *wdg = static_cast<QCheckBox*>( widIt.data() );
00078 wdg->setChecked( false );
00079 } else if ( widIt.data()->inherits( "QDateTimeEdit" ) ) {
00080 QDateTimeEdit *wdg = static_cast<QDateTimeEdit*>( widIt.data() );
00081 wdg->setDateTime( QDateTime::currentDateTime() );
00082 } else if ( widIt.data()->inherits( "KDateTimeWidget" ) ) {
00083 KDateTimeWidget *wdg = static_cast<KDateTimeWidget*>( widIt.data() );
00084 wdg->setDateTime( QDateTime::currentDateTime() );
00085 } else if ( widIt.data()->inherits( "KDatePicker" ) ) {
00086 KDatePicker *wdg = static_cast<KDatePicker*>( widIt.data() );
00087 wdg->setDate( QDate::currentDate() );
00088 } else if ( widIt.data()->inherits( "QComboBox" ) ) {
00089 QComboBox *wdg = static_cast<QComboBox*>( widIt.data() );
00090 wdg->setCurrentItem( 0 );
00091 } else if ( widIt.data()->inherits( "QTextEdit" ) ) {
00092 QTextEdit *wdg = static_cast<QTextEdit*>( widIt.data() );
00093 wdg->setText( QString::null );
00094 }
00095 }
00096
00097 QStringList::ConstIterator it;
00098 for ( it = customs.begin(); it != customs.end(); ++it ) {
00099 QString app, name, value;
00100 splitField( *it, app, name, value );
00101
00102 if ( app == ns ) {
00103 QMap<QString, QWidget*>::Iterator it = mWidgets.find( name );
00104 if ( it != mWidgets.end() ) {
00105 if ( it.data()->inherits( "QLineEdit" ) ) {
00106 QLineEdit *wdg = static_cast<QLineEdit*>( it.data() );
00107 wdg->setText( value );
00108 } else if ( it.data()->inherits( "QSpinBox" ) ) {
00109 QSpinBox *wdg = static_cast<QSpinBox*>( it.data() );
00110 wdg->setValue( value.toInt() );
00111 } else if ( it.data()->inherits( "QCheckBox" ) ) {
00112 QCheckBox *wdg = static_cast<QCheckBox*>( it.data() );
00113 wdg->setChecked( value == "true" || value == "1" );
00114 } else if ( it.data()->inherits( "QDateTimeEdit" ) ) {
00115 QDateTimeEdit *wdg = static_cast<QDateTimeEdit*>( it.data() );
00116 wdg->setDateTime( QDateTime::fromString( value, Qt::ISODate ) );
00117 } else if ( it.data()->inherits( "KDateTimeWidget" ) ) {
00118 KDateTimeWidget *wdg = static_cast<KDateTimeWidget*>( it.data() );
00119 wdg->setDateTime( QDateTime::fromString( value, Qt::ISODate ) );
00120 } else if ( it.data()->inherits( "KDatePicker" ) ) {
00121 KDatePicker *wdg = static_cast<KDatePicker*>( it.data() );
00122 wdg->setDate( QDate::fromString( value, Qt::ISODate ) );
00123 } else if ( it.data()->inherits( "QComboBox" ) ) {
00124 QComboBox *wdg = static_cast<QComboBox*>( it.data() );
00125 wdg->setCurrentText( value );
00126 } else if ( it.data()->inherits( "QTextEdit" ) ) {
00127 QTextEdit *wdg = static_cast<QTextEdit*>( it.data() );
00128 wdg->setText( value );
00129 }
00130 }
00131 }
00132 }
00133 }
00134
00135 void AdvancedCustomFields::storeContact( KABC::Addressee *addr )
00136 {
00137 QMap<QString, QWidget*>::Iterator it;
00138 for ( it = mWidgets.begin(); it != mWidgets.end(); ++it ) {
00139 QString value;
00140 if ( it.data()->inherits( "QLineEdit" ) ) {
00141 QLineEdit *wdg = static_cast<QLineEdit*>( it.data() );
00142 value = wdg->text();
00143 } else if ( it.data()->inherits( "QSpinBox" ) ) {
00144 QSpinBox *wdg = static_cast<QSpinBox*>( it.data() );
00145 value = QString::number( wdg->value() );
00146 } else if ( it.data()->inherits( "QCheckBox" ) ) {
00147 QCheckBox *wdg = static_cast<QCheckBox*>( it.data() );
00148 value = ( wdg->isChecked() ? "true" : "false" );
00149 } else if ( it.data()->inherits( "QDateTimeEdit" ) ) {
00150 QDateTimeEdit *wdg = static_cast<QDateTimeEdit*>( it.data() );
00151 value = wdg->dateTime().toString( Qt::ISODate );
00152 } else if ( it.data()->inherits( "KDateTimeWidget" ) ) {
00153 KDateTimeWidget *wdg = static_cast<KDateTimeWidget*>( it.data() );
00154 value = wdg->dateTime().toString( Qt::ISODate );
00155 } else if ( it.data()->inherits( "KDatePicker" ) ) {
00156 KDatePicker *wdg = static_cast<KDatePicker*>( it.data() );
00157 value = wdg->date().toString( Qt::ISODate );
00158 } else if ( it.data()->inherits( "QComboBox" ) ) {
00159 QComboBox *wdg = static_cast<QComboBox*>( it.data() );
00160 value = wdg->currentText();
00161 } else if ( it.data()->inherits( "QTextEdit" ) ) {
00162 QTextEdit *wdg = static_cast<QTextEdit*>( it.data() );
00163 value = wdg->text();
00164 }
00165
00166 QString ns;
00167 if ( (mIdentifier.upper() == "KADDRESSBOOK") ||
00168 (QRegExp( "^Form\\d\\d?$").search(mIdentifier) >= 0 )
00169 )
00170 ns = "KADDRESSBOOK";
00171 else
00172 ns = mIdentifier;
00173
00174 if ( value.isEmpty() )
00175 addr->removeCustom( ns.latin1(), it.key() );
00176 else
00177 addr->insertCustom( ns.latin1(), it.key(), value );
00178 }
00179 }
00180
00181 void AdvancedCustomFields::setReadOnly( bool readOnly )
00182 {
00183 QMap<QString, QWidget*>::Iterator it;
00184 for ( it = mWidgets.begin(); it != mWidgets.end(); ++it )
00185 if ( mDisabledWidgets.find( it.data() ) == mDisabledWidgets.end() )
00186 it.data()->setEnabled( !readOnly );
00187 }
00188
00189 void AdvancedCustomFields::initGUI( const QString &uiFile )
00190 {
00191 QVBoxLayout *layout = new QVBoxLayout( this, KDialog::marginHint(),
00192 KDialog::spacingHint() );
00193
00194 QWidget *wdg = QWidgetFactory::create( uiFile, 0, this );
00195 if ( !wdg ) {
00196 kdError() << "No ui file found" << endl;
00197 return;
00198 }
00199
00200 mTitle = wdg->caption();
00201 mIdentifier = wdg->name();
00202
00203 layout->addWidget( wdg );
00204
00205 QObjectList *list = wdg->queryList( "QWidget" );
00206 QObjectListIt it( *list );
00207
00208 QStringList allowedTypes;
00209 allowedTypes << "QLineEdit"
00210 << "QTextEdit"
00211 << "QSpinBox"
00212 << "QCheckBox"
00213 << "QComboBox"
00214 << "QDateTimeEdit"
00215 << "KLineEdit"
00216 << "KDateTimeWidget"
00217 << "KDatePicker";
00218
00219 while ( it.current() ) {
00220 if ( allowedTypes.contains( it.current()->className() ) ) {
00221 QString name = it.current()->name();
00222 if ( name.startsWith( "X_" ) ) {
00223 name = name.mid( 2 );
00224
00225 QWidget *widget = static_cast<QWidget*>( it.current() );
00226 if ( !name.isEmpty() )
00227 mWidgets.insert( name, widget );
00228
00229 if ( it.current()->inherits( "QLineEdit" ) )
00230 connect( it.current(), SIGNAL( textChanged( const QString& ) ),
00231 this, SLOT( setModified() ) );
00232 else if ( it.current()->inherits( "QSpinBox" ) )
00233 connect( it.current(), SIGNAL( valueChanged( int ) ),
00234 this, SLOT( setModified() ) );
00235 else if ( it.current()->inherits( "QCheckBox" ) )
00236 connect( it.current(), SIGNAL( toggled( bool ) ),
00237 this, SLOT( setModified() ) );
00238 else if ( it.current()->inherits( "QComboBox" ) )
00239 connect( it.current(), SIGNAL( activated( const QString& ) ),
00240 this, SLOT( setModified() ) );
00241 else if ( it.current()->inherits( "QDateTimeEdit" ) )
00242 connect( it.current(), SIGNAL( valueChanged( const QDateTime& ) ),
00243 this, SLOT( setModified() ) );
00244 else if ( it.current()->inherits( "KDateTimeWidget" ) )
00245 connect( it.current(), SIGNAL( valueChanged( const QDateTime& ) ),
00246 this, SLOT( setModified() ) );
00247 else if ( it.current()->inherits( "KDatePicker" ) )
00248 connect( it.current(), SIGNAL( dateChanged( QDate ) ),
00249 this, SLOT( setModified() ) );
00250 else if ( it.current()->inherits( "QTextEdit" ) )
00251 connect( it.current(), SIGNAL( textChanged() ),
00252 this, SLOT( setModified() ) );
00253
00254 if ( !widget->isEnabled() )
00255 mDisabledWidgets.append( widget );
00256 }
00257 }
00258
00259 ++it;
00260 }
00261
00262 delete list;
00263 }
00264
00265 QString AdvancedCustomFields::pageIdentifier() const
00266 {
00267 return mIdentifier;
00268 }
00269
00270 QString AdvancedCustomFields::pageTitle() const
00271 {
00272 return mTitle;
00273 }
00274
00275 #include "advancedcustomfields.moc"