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