00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "kconfigdialogmanager.h"
00023
00024 #include <qlabel.h>
00025 #include <qobjectlist.h>
00026 #include <qbuttongroup.h>
00027 #include <qcombobox.h>
00028 #include <qsqlpropertymap.h>
00029 #include <qmetaobject.h>
00030
00031 #include <kapplication.h>
00032 #include <kconfigskeleton.h>
00033 #include <kdebug.h>
00034 #include <kglobal.h>
00035
00036 #include <assert.h>
00037
00038 class KConfigDialogManager::Private {
00039
00040 public:
00041 Private() { }
00042
00043 public:
00044 QDict<QWidget> knownWidget;
00045 QDict<QWidget> buddyWidget;
00046 };
00047
00048 KConfigDialogManager::KConfigDialogManager(QWidget *parent, KConfigSkeleton *conf, const char *name)
00049 : QObject(parent, name), m_conf(conf), m_dialog(parent)
00050 {
00051 d = new Private();
00052
00053 kapp->installKDEPropertyMap();
00054 propertyMap = QSqlPropertyMap::defaultMap();
00055
00056 init(true);
00057 }
00058
00059 KConfigDialogManager::~KConfigDialogManager()
00060 {
00061 delete d;
00062 }
00063
00064 void KConfigDialogManager::init(bool trackChanges)
00065 {
00066 if(trackChanges)
00067 {
00068
00069 changedMap.insert("QButton", SIGNAL(stateChanged(int)));
00070 changedMap.insert("QCheckBox", SIGNAL(stateChanged(int)));
00071 changedMap.insert("QPushButton", SIGNAL(stateChanged(int)));
00072 changedMap.insert("QRadioButton", SIGNAL(stateChanged(int)));
00073 changedMap.insert("QButtonGroup", SIGNAL(clicked(int)));
00074 changedMap.insert("QComboBox", SIGNAL(activated (int)));
00075
00076
00077 changedMap.insert("QDateEdit", SIGNAL(valueChanged(const QDate &)));
00078 changedMap.insert("QDateTimeEdit", SIGNAL(valueChanged(const QDateTime &)));
00079 changedMap.insert("QDial", SIGNAL(valueChanged (int)));
00080 changedMap.insert("QLineEdit", SIGNAL(textChanged(const QString &)));
00081 changedMap.insert("QSlider", SIGNAL(valueChanged(int)));
00082 changedMap.insert("QSpinBox", SIGNAL(valueChanged(int)));
00083 changedMap.insert("QTimeEdit", SIGNAL(valueChanged(const QTime &)));
00084 changedMap.insert("QTextEdit", SIGNAL(textChanged()));
00085 changedMap.insert("QTextBrowser", SIGNAL(sourceChanged(const QString &)));
00086 changedMap.insert("QMultiLineEdit", SIGNAL(textChanged()));
00087 changedMap.insert("QListBox", SIGNAL(selectionChanged()));
00088 changedMap.insert("QTabWidget", SIGNAL(currentChanged(QWidget *)));
00089
00090
00091 changedMap.insert( "KComboBox", SIGNAL(activated (int)));
00092 changedMap.insert( "KFontCombo", SIGNAL(activated (int)));
00093 changedMap.insert( "KFontRequester", SIGNAL(fontSelected(const QFont &)));
00094 changedMap.insert( "KFontChooser", SIGNAL(fontSelected(const QFont &)));
00095 changedMap.insert( "KHistoryCombo", SIGNAL(activated (int)));
00096
00097 changedMap.insert( "KColorButton", SIGNAL(changed(const QColor &)));
00098 changedMap.insert( "KDatePicker", SIGNAL(dateSelected (QDate)));
00099 changedMap.insert( "KEditListBox", SIGNAL(changed()));
00100 changedMap.insert( "KListBox", SIGNAL(selectionChanged()));
00101 changedMap.insert( "KLineEdit", SIGNAL(textChanged(const QString &)));
00102 changedMap.insert( "KPasswordEdit", SIGNAL(textChanged(const QString &)));
00103 changedMap.insert( "KRestrictedLine", SIGNAL(textChanged(const QString &)));
00104 changedMap.insert( "KTextBrowser", SIGNAL(sourceChanged(const QString &)));
00105 changedMap.insert( "KTextEdit", SIGNAL(textChanged()));
00106 changedMap.insert( "KURLRequester", SIGNAL(textChanged (const QString& )));
00107 changedMap.insert( "KIntNumInput", SIGNAL(valueChanged (int)));
00108 changedMap.insert( "KIntSpinBox", SIGNAL(valueChanged (int)));
00109 changedMap.insert( "KDoubleNumInput", SIGNAL(valueChanged (double)));
00110 }
00111
00112
00113 (void) parseChildren(m_dialog, trackChanges);
00114 }
00115
00116 void KConfigDialogManager::addWidget(QWidget *widget)
00117 {
00118 (void) parseChildren(widget, true);
00119 }
00120
00121 void KConfigDialogManager::setupWidget(QWidget *widget, KConfigSkeletonItem *item)
00122 {
00123 QVariant minValue = item->minValue();
00124 if (minValue.isValid())
00125 {
00126 if (widget->metaObject()->findProperty("minValue", true) != -1)
00127 widget->setProperty("minValue", minValue);
00128 }
00129 QVariant maxValue = item->maxValue();
00130 if (maxValue.isValid())
00131 {
00132 if (widget->metaObject()->findProperty("maxValue", true) != -1)
00133 widget->setProperty("maxValue", maxValue);
00134 }
00135 }
00136
00137 bool KConfigDialogManager::parseChildren(const QWidget *widget, bool trackChanges)
00138 {
00139 bool valueChanged = false;
00140 const QObjectList *listOfChildren = widget->children();
00141 if(!listOfChildren)
00142 return valueChanged;
00143
00144 QObject *object;
00145 for( QPtrListIterator<QObject> it( *listOfChildren );
00146 (object = it.current()); ++it )
00147 {
00148 if(!object->isWidgetType())
00149 continue;
00150
00151 QWidget *childWidget = (QWidget *)object;
00152
00153 const char *widgetName = childWidget->name(0);
00154 bool bParseChildren = true;
00155
00156 if (widgetName && (strncmp(widgetName, "kcfg_", 5) == 0))
00157 {
00158
00159 QString configId = widgetName+5;
00160 KConfigSkeletonItem *item = m_conf->findItem(configId);
00161 if (item)
00162 {
00163 d->knownWidget.insert(configId, childWidget);
00164
00165 setupWidget(childWidget, item);
00166
00167 QMap<QString, QCString>::const_iterator changedIt = changedMap.find(childWidget->className());
00168 if (changedIt == changedMap.end())
00169 {
00170 kdWarning(178) << "Don't know how to monitor widget '" << childWidget->className() << "' for changes!" << endl;
00171 }
00172 else
00173 {
00174 connect(childWidget, *changedIt,
00175 this, SIGNAL(widgetModified()));
00176
00177 QButtonGroup *bg = dynamic_cast<QButtonGroup *>(childWidget);
00178 if (!bg)
00179 bParseChildren = false;
00180
00181 QComboBox *cb = dynamic_cast<QComboBox *>(childWidget);
00182 if (cb && cb->editable())
00183 connect(cb, SIGNAL(textChanged(const QString &)),
00184 this, SIGNAL(widgetModified()));
00185 }
00186 }
00187 else
00188 {
00189 kdWarning(178) << "A widget named '" << widgetName << "' was found but there is no setting named '" << configId << "'" << endl;
00190 assert(false);
00191 }
00192 }
00193 else if (childWidget->inherits("QLabel"))
00194 {
00195 QLabel *label = static_cast<QLabel *>(childWidget);
00196 QWidget *buddy = label->buddy();
00197 if (!buddy)
00198 continue;
00199 const char *buddyName = buddy->name(0);
00200 if (buddyName && (strncmp(buddyName, "kcfg_", 5) == 0))
00201 {
00202
00203 QString configId = buddyName+5;
00204 d->buddyWidget.insert(configId, childWidget);
00205 }
00206 }
00207 else if (widgetName)
00208 {
00209 QMap<QString, QCString>::const_iterator changedIt = changedMap.find(childWidget->className());
00210 if (changedIt != changedMap.end())
00211 kdDebug(178) << "Widget '" << widgetName << "' (" << childWidget->className() << ") remains unmanaged." << endl;
00212 }
00213
00214 if(bParseChildren)
00215 {
00216
00217
00218 valueChanged |= parseChildren(childWidget, trackChanges);
00219 }
00220 }
00221 return valueChanged;
00222 }
00223
00224 void KConfigDialogManager::updateWidgets()
00225 {
00226 bool bSignalsBlocked = signalsBlocked();
00227 blockSignals(true);
00228
00229 QWidget *widget;
00230 for( QDictIterator<QWidget> it( d->knownWidget );
00231 (widget = it.current()); ++it )
00232 {
00233 KConfigSkeletonItem *item = m_conf->findItem(it.currentKey());
00234 if (!item)
00235 {
00236 kdWarning(178) << "The setting '" << it.currentKey() << "' has disappeared!" << endl;
00237 continue;
00238 }
00239
00240 QVariant p = item->property();
00241 if (p != property(widget))
00242 {
00243 setProperty(widget, p);
00244 }
00245 if (item->isImmutable())
00246 {
00247 widget->setEnabled(false);
00248 QWidget *buddy = d->buddyWidget.find(it.currentKey());
00249 if (buddy)
00250 buddy->setEnabled(false);
00251 }
00252 }
00253 blockSignals(bSignalsBlocked);
00254 }
00255
00256 void KConfigDialogManager::updateWidgetsDefault()
00257 {
00258 bool bUseDefaults = m_conf->useDefaults(true);
00259 updateWidgets();
00260 m_conf->useDefaults(bUseDefaults);
00261 }
00262
00263 void KConfigDialogManager::updateSettings()
00264 {
00265 bool changed = false;
00266
00267 QWidget *widget;
00268 for( QDictIterator<QWidget> it( d->knownWidget );
00269 (widget = it.current()); ++it )
00270 {
00271 KConfigSkeletonItem *item = m_conf->findItem(it.currentKey());
00272 if (!item)
00273 {
00274 kdWarning(178) << "The setting '" << it.currentKey() << "' has disappeared!" << endl;
00275 continue;
00276 }
00277
00278 QVariant p = property(widget);
00279 if (p != item->property())
00280 {
00281 item->setProperty(p);
00282 changed = true;
00283 }
00284 }
00285 if (changed)
00286 {
00287 m_conf->writeConfig();
00288 emit settingsChanged();
00289 }
00290 }
00291
00292 void KConfigDialogManager::setProperty(QWidget *w, const QVariant &v)
00293 {
00294 QButtonGroup *bg = dynamic_cast<QButtonGroup *>(w);
00295 if (bg)
00296 {
00297 bg->setButton(v.toInt());
00298 return;
00299 }
00300
00301 QComboBox *cb = dynamic_cast<QComboBox *>(w);
00302 if (cb && cb->editable())
00303 {
00304 cb->setCurrentText(v.toString());
00305 return;
00306 }
00307
00308 propertyMap->setProperty(w, v);
00309 }
00310
00311 QVariant KConfigDialogManager::property(QWidget *w)
00312 {
00313 QButtonGroup *bg = dynamic_cast<QButtonGroup *>(w);
00314 if (bg)
00315 return QVariant(bg->selectedId());
00316
00317 QComboBox *cb = dynamic_cast<QComboBox *>(w);
00318 if (cb && cb->editable())
00319 return QVariant(cb->currentText());
00320
00321 return propertyMap->property(w);
00322 }
00323
00324 bool KConfigDialogManager::hasChanged()
00325 {
00326
00327 QWidget *widget;
00328 for( QDictIterator<QWidget> it( d->knownWidget );
00329 (widget = it.current()); ++it )
00330 {
00331 KConfigSkeletonItem *item = m_conf->findItem(it.currentKey());
00332 if (!item)
00333 {
00334 kdWarning(178) << "The setting '" << it.currentKey() << "' has disappeared!" << endl;
00335 continue;
00336 }
00337
00338 QVariant p = property(widget);
00339 if (p != item->property())
00340 {
00341
00342 return true;
00343 }
00344 }
00345 return false;
00346 }
00347
00348 bool KConfigDialogManager::isDefault()
00349 {
00350 bool bUseDefaults = m_conf->useDefaults(true);
00351 bool result = !hasChanged();
00352 m_conf->useDefaults(bUseDefaults);
00353 return result;
00354 }
00355
00356 #include "kconfigdialogmanager.moc"
00357