00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "kconfigdialog.h"
00023
00024 #include <kconfigskeleton.h>
00025 #include <kconfigdialogmanager.h>
00026 #include <klocale.h>
00027 #include <kiconloader.h>
00028 #include <kdebug.h>
00029
00030 #include <qlayout.h>
00031 #include <qvbox.h>
00032 #include <qmap.h>
00033
00034 QAsciiDict<KConfigDialog> KConfigDialog::openDialogs;
00035
00036
00037 class KConfigDialog::KConfigDialogPrivate
00038 {
00039 public:
00040 KConfigDialogPrivate(KDialogBase::DialogType t)
00041 : shown(false), type(t), manager(0) { }
00042
00043 bool shown;
00044 KDialogBase::DialogType type;
00045 KConfigDialogManager *manager;
00046 QMap<QWidget *, KConfigDialogManager *> managerForPage;
00047 };
00048
00049 KConfigDialog::KConfigDialog( QWidget *parent, const char *name,
00050 KConfigSkeleton *config,
00051 DialogType dialogType,
00052 int dialogButtons,
00053 ButtonCode defaultButton,
00054 bool modal ) :
00055 KDialogBase( dialogType, Qt::WStyle_DialogBorder,
00056 parent, name, modal, i18n("Configure"), dialogButtons, defaultButton ),
00057 d(new KConfigDialogPrivate(dialogType))
00058 {
00059 if ( name ) {
00060 openDialogs.insert(name, this);
00061 } else {
00062 QCString genericName;
00063 genericName.sprintf("SettingsDialog-%p", this);
00064 openDialogs.insert(genericName, this);
00065 setName(genericName);
00066 }
00067
00068 connect(this, SIGNAL(okClicked()), this, SLOT(updateSettings()));
00069 connect(this, SIGNAL(applyClicked()), this, SLOT(updateSettings()));
00070 connect(this, SIGNAL(applyClicked()), this, SLOT(updateButtons()));
00071 connect(this, SIGNAL(defaultClicked()), this, SLOT(updateWidgetsDefault()));
00072 connect(this, SIGNAL(defaultClicked()), this, SLOT(updateButtons()));
00073
00074 d->manager = new KConfigDialogManager(this, config);
00075 setupManagerConnections(d->manager);
00076
00077 enableButton(Apply, false);
00078 }
00079
00080 KConfigDialog::~KConfigDialog()
00081 {
00082 openDialogs.remove(name());
00083 delete d;
00084 }
00085
00086 void KConfigDialog::addPage(QWidget *page,
00087 const QString &itemName,
00088 const QString &pixmapName,
00089 const QString &header,
00090 bool manage)
00091 {
00092 addPageInternal(page, itemName, pixmapName, header);
00093 if(manage)
00094 d->manager->addWidget(page);
00095 }
00096
00097 void KConfigDialog::addPage(QWidget *page,
00098 KConfigSkeleton *config,
00099 const QString &itemName,
00100 const QString &pixmapName,
00101 const QString &header)
00102 {
00103 addPageInternal(page, itemName, pixmapName, header);
00104 d->managerForPage[page] = new KConfigDialogManager(page, config);
00105 setupManagerConnections(d->managerForPage[page]);
00106 }
00107
00108 void KConfigDialog::addPageInternal(QWidget *page,
00109 const QString &itemName,
00110 const QString &pixmapName,
00111 const QString &header)
00112 {
00113 if(d->shown)
00114 {
00115 kdDebug(240) << "KConfigDialog::addPage: can not add a page after the dialog has been shown.";
00116 return;
00117 }
00118 switch(d->type)
00119 {
00120 case TreeList:
00121 case IconList:
00122 case Tabbed: {
00123 QVBox *frame = addVBoxPage(itemName, header, SmallIcon(pixmapName, 32));
00124 frame->setSpacing( 0 );
00125 frame->setMargin( 0 );
00126 page->reparent(((QWidget*)frame), 0, QPoint());
00127 }
00128 break;
00129
00130 case Swallow:
00131 {
00132 page->reparent(this, 0, QPoint());
00133 setMainWidget(page);
00134 }
00135 break;
00136
00137 case Plain:
00138 {
00139 QFrame *main = plainPage();
00140 QVBoxLayout *topLayout = new QVBoxLayout( main, 0, 0 );
00141 page->reparent(((QWidget*)main), 0, QPoint());
00142 topLayout->addWidget( page );
00143 }
00144 break;
00145
00146 default:
00147 kdDebug(240) << "KConfigDialog::addpage: unknown type.";
00148 }
00149 }
00150
00151 void KConfigDialog::setupManagerConnections(KConfigDialogManager *manager)
00152 {
00153 connect(manager, SIGNAL(settingsChanged()), this, SLOT(settingsChangedSlot()));
00154 connect(manager, SIGNAL(widgetModified()), this, SLOT(updateButtons()));
00155
00156 connect(this, SIGNAL(okClicked()), manager, SLOT(updateSettings()));
00157 connect(this, SIGNAL(applyClicked()), manager, SLOT(updateSettings()));
00158 connect(this, SIGNAL(defaultClicked()), manager, SLOT(updateWidgetsDefault()));
00159 }
00160
00161 KConfigDialog* KConfigDialog::exists(const char* name)
00162 {
00163 return openDialogs.find(name);
00164 }
00165
00166 bool KConfigDialog::showDialog(const char* name)
00167 {
00168 KConfigDialog *dialog = exists(name);
00169 if(dialog)
00170 dialog->show();
00171 return (dialog != NULL);
00172 }
00173
00174 void KConfigDialog::updateButtons()
00175 {
00176 static bool only_once = false;
00177 if (only_once) return;
00178 only_once = true;
00179
00180 QMap<QWidget *, KConfigDialogManager *>::iterator it;
00181
00182 bool has_changed = d->manager->hasChanged() || hasChanged();
00183 for (it = d->managerForPage.begin();
00184 it != d->managerForPage.end() && !has_changed;
00185 ++it)
00186 {
00187 has_changed |= (*it)->hasChanged();
00188 }
00189
00190 enableButton(Apply, has_changed);
00191
00192 bool is_default = d->manager->isDefault() && isDefault();
00193 for (it = d->managerForPage.begin();
00194 it != d->managerForPage.end() && is_default;
00195 ++it)
00196 {
00197 is_default &= (*it)->isDefault();
00198 }
00199
00200 enableButton(Default, !is_default);
00201
00202 emit widgetModified();
00203 only_once = false;
00204 }
00205
00206 void KConfigDialog::settingsChangedSlot()
00207 {
00208
00209 updateButtons();
00210 emit settingsChanged();
00211 emit settingsChanged(name());
00212 }
00213
00214 void KConfigDialog::show()
00215 {
00216 QMap<QWidget *, KConfigDialogManager *>::iterator it;
00217
00218 updateWidgets();
00219 d->manager->updateWidgets();
00220 for (it = d->managerForPage.begin(); it != d->managerForPage.end(); ++it)
00221 (*it)->updateWidgets();
00222
00223 bool has_changed = d->manager->hasChanged() || hasChanged();
00224 for (it = d->managerForPage.begin();
00225 it != d->managerForPage.end() && !has_changed;
00226 ++it)
00227 {
00228 has_changed |= (*it)->hasChanged();
00229 }
00230
00231 enableButton(Apply, has_changed);
00232
00233 bool is_default = d->manager->isDefault() && isDefault();
00234 for (it = d->managerForPage.begin();
00235 it != d->managerForPage.end() && is_default;
00236 ++it)
00237 {
00238 is_default &= (*it)->isDefault();
00239 }
00240
00241 enableButton(Default, !is_default);
00242 d->shown = true;
00243 KDialogBase::show();
00244 }
00245
00246 void KConfigDialog::updateSettings()
00247 {
00248 }
00249
00250 void KConfigDialog::updateWidgets()
00251 {
00252 }
00253
00254 void KConfigDialog::updateWidgetsDefault()
00255 {
00256 }
00257
00258
00259 #include "kconfigdialog.moc"