summaryrefslogtreecommitdiffstats
path: root/kcontrol/kcontrol/proxywidget.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit4aed2c8219774f5d797760606b8489a92ddc5163 (patch)
tree3f8c130f7d269626bf6a9447407ef6c35954426a /kcontrol/kcontrol/proxywidget.cpp
downloadtdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz
tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kcontrol/kcontrol/proxywidget.cpp')
-rw-r--r--kcontrol/kcontrol/proxywidget.cpp323
1 files changed, 323 insertions, 0 deletions
diff --git a/kcontrol/kcontrol/proxywidget.cpp b/kcontrol/kcontrol/proxywidget.cpp
new file mode 100644
index 000000000..6654bfe14
--- /dev/null
+++ b/kcontrol/kcontrol/proxywidget.cpp
@@ -0,0 +1,323 @@
+/*
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <unistd.h> // for getuid()
+
+#include <kpushbutton.h>
+#include <qlayout.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kcmodule.h>
+#include <kseparator.h>
+#include <kdialog.h>
+#include <kstdguiitem.h>
+#include <dcopclient.h>
+
+#include <qwhatsthis.h>
+#include <qlabel.h>
+
+#include "global.h"
+#include "proxywidget.h"
+#include "proxywidget.moc"
+
+#include <kdebug.h>
+#include <qtimer.h>
+
+class WhatsThis : public QWhatsThis
+{
+public:
+ WhatsThis( ProxyWidget* parent )
+ : QWhatsThis( parent ), proxy( parent ) {}
+ ~WhatsThis(){};
+
+
+ QString text( const QPoint & ) {
+ if ( !proxy->quickHelp().isEmpty() )
+ return proxy->quickHelp();
+ else
+ return i18n("The currently loaded configuration module.");
+ }
+
+private:
+ ProxyWidget* proxy;
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void setVisible(QPushButton *btn, bool vis)
+{
+ if (vis)
+ btn->show();
+ else
+ btn->hide();
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+class RootInfoWidget : public QLabel
+{
+public:
+ RootInfoWidget(QWidget *parent, const char *name);
+ void setRootMsg(const QString& s) { setText(s); }
+};
+
+RootInfoWidget::RootInfoWidget(QWidget *parent, const char *name = 0)
+ : QLabel(parent, name)
+{
+ setFrameShape(QFrame::Box);
+ setFrameShadow(QFrame::Raised);
+
+ setText(i18n("<b>Changes in this module require root access.</b><br>"
+ "Click the \"Administrator Mode\" button to "
+ "allow modifications in this module."));
+
+ QWhatsThis::add(this, i18n("This module requires special permissions, probably "
+ "for system-wide modifications; therefore, it is "
+ "required that you provide the root password to be "
+ "able to change the module's properties. If you "
+ "do not provide the password, the module will be "
+ "disabled."));
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+class ProxyView : public QScrollView
+{
+public:
+ ProxyView(KCModule *client, const QString& title, QWidget *parent, bool run_as_root, const char *name);
+
+private:
+ virtual void resizeEvent(QResizeEvent *);
+
+ QWidget *contentWidget;
+ KCModule *client;
+ bool scroll;
+};
+
+class ProxyContentWidget : public QWidget
+{
+public:
+ ProxyContentWidget( QWidget* parent ) : QWidget( parent ) {}
+ ~ProxyContentWidget(){}
+
+ // this should be really done by qscrollview in AutoOneFit mode!
+ QSize sizeHint() const { return minimumSizeHint(); }
+};
+
+
+ProxyView::ProxyView(KCModule *_client, const QString&, QWidget *parent, bool run_as_root, const char *name)
+ : QScrollView(parent, name), client(_client)
+{
+ setResizePolicy(QScrollView::AutoOneFit);
+ setFrameStyle( NoFrame );
+ contentWidget = new ProxyContentWidget( viewport() );
+
+ QVBoxLayout* vbox = new QVBoxLayout( contentWidget );
+
+ if (run_as_root && _client->useRootOnlyMsg()) // notify the user
+ {
+ RootInfoWidget *infoBox = new RootInfoWidget(contentWidget);
+ vbox->addWidget( infoBox );
+ QString msg = _client->rootOnlyMsg();
+ if (!msg.isEmpty())
+ infoBox->setRootMsg(msg);
+ vbox->setSpacing(KDialog::spacingHint());
+ }
+ client->reparent(contentWidget,0,QPoint(0,0),true);
+ vbox->addWidget( client );
+ vbox->activate(); // make sure we have a proper minimumSizeHint
+ addChild(contentWidget);
+}
+
+void ProxyView::resizeEvent(QResizeEvent *e)
+{
+ QScrollView::resizeEvent(e);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+ProxyWidget::ProxyWidget(KCModule *client, QString title, const char *name,
+ bool run_as_root)
+ : QWidget(0, name)
+ , _client(client)
+{
+ setCaption(title);
+
+ if (getuid()==0 ) {
+ // Make root modules look as similar as possible...
+ QCString replyType;
+ QByteArray replyData;
+
+ if (kapp->dcopClient()->call("kcontrol", "moduleIface", "getPalette()", QByteArray(),
+ replyType, replyData))
+ if ( replyType == "QPalette") {
+ QDataStream reply( replyData, IO_ReadOnly );
+ QPalette pal;
+ reply >> pal;
+ setPalette(pal);
+ }
+/* // Doesn't work ...
+ if (kapp->dcopClient()->call("kcontrol", "moduleIface", "getStyle()", QByteArray(),
+ replyType, replyData))
+ if ( replyType == "QString") {
+ QDataStream reply( replyData, IO_ReadOnly );
+ QString style;
+ reply >> style;
+ setStyle(style);
+ }
+*/
+ if (kapp->dcopClient()->call("kcontrol", "moduleIface", "getFont()", QByteArray(),
+ replyType, replyData))
+ if ( replyType == "QFont") {
+ QDataStream reply( replyData, IO_ReadOnly );
+ QFont font;
+ reply >> font;
+ setFont(font);
+ }
+ }
+
+ view = new ProxyView(client, title, this, run_as_root, "proxyview");
+ (void) new WhatsThis( this );
+
+ connect(_client, SIGNAL(changed(bool)), SLOT(clientChanged(bool)));
+ connect(_client, SIGNAL(quickHelpChanged()), SIGNAL(quickHelpChanged()));
+
+ _sep = new KSeparator(KSeparator::HLine, this);
+
+ _handbook= new KPushButton( KGuiItem(KStdGuiItem::help().text(),"contents"), this );
+ _default = new KPushButton( KStdGuiItem::defaults(), this );
+ _apply = new KPushButton( KStdGuiItem::apply(), this );
+ _reset = new KPushButton( KGuiItem( i18n( "&Reset" ), "undo" ), this );
+ _root = new KPushButton( KGuiItem(i18n( "&Administrator Mode" )), this );
+
+ bool mayModify = (!run_as_root || !_client->useRootOnlyMsg()) && !KCGlobal::isInfoCenter();
+
+ // only enable the requested buttons
+ int b = _client->buttons();
+ setVisible(_handbook, (b & KCModule::Help));
+ setVisible(_default, mayModify && (b & KCModule::Default));
+ setVisible(_apply, mayModify && (b & KCModule::Apply));
+ setVisible(_reset, mayModify && (b & KCModule::Apply));
+ setVisible(_root, run_as_root);
+
+ // disable initial buttons
+ _apply->setEnabled( false );
+ _reset->setEnabled( false );
+
+ connect(_handbook, SIGNAL(clicked()), SLOT(handbookClicked()));
+ connect(_default, SIGNAL(clicked()), SLOT(defaultClicked()));
+ connect(_apply, SIGNAL(clicked()), SLOT(applyClicked()));
+ connect(_reset, SIGNAL(clicked()), SLOT(resetClicked()));
+ connect(_root, SIGNAL(clicked()), SLOT(rootClicked()));
+
+ QVBoxLayout *top = new QVBoxLayout(this, KDialog::marginHint(),
+ KDialog::spacingHint());
+ top->addWidget(view);
+ top->addWidget(_sep);
+
+ QHBoxLayout *buttons = new QHBoxLayout(top, 4);
+ buttons->addWidget(_handbook);
+ buttons->addWidget(_default);
+ if (run_as_root)
+ {
+ buttons->addWidget(_root);
+ }
+
+ buttons->addStretch(1);
+ if (mayModify)
+ {
+ buttons->addWidget(_apply);
+ buttons->addWidget(_reset);
+ }
+
+ top->activate();
+}
+
+ProxyWidget::~ProxyWidget()
+{
+ delete _client;
+}
+
+QString ProxyWidget::quickHelp() const
+{
+ if (_client)
+ return _client->quickHelp();
+ else
+ return "";
+}
+
+void ProxyWidget::handbookClicked()
+{
+ if (getuid()!=0)
+ emit handbookRequest();
+ else
+ kapp->dcopClient()->send("kcontrol", "moduleIface", "invokeHandbook()", QByteArray());
+}
+
+void ProxyWidget::helpClicked()
+{
+ if (getuid()!=0)
+ emit helpRequest();
+ else
+ kapp->dcopClient()->send("kcontrol", "moduleIface", "invokeHelp()", QByteArray());
+}
+
+void ProxyWidget::defaultClicked()
+{
+ clientChanged(true);
+ _client->defaults();
+}
+
+void ProxyWidget::applyClicked()
+{
+ _client->save();
+ clientChanged(false);
+}
+
+void ProxyWidget::resetClicked()
+{
+ _client->load();
+ clientChanged(false);
+}
+
+void ProxyWidget::rootClicked()
+{
+ emit runAsRoot();
+}
+
+void ProxyWidget::clientChanged(bool state)
+{
+ _apply->setEnabled(state);
+ _reset->setEnabled(state);
+
+ // forward the signal
+ emit changed(state);
+}
+
+const KAboutData *ProxyWidget::aboutData() const
+{
+ return _client->aboutData();
+}
+
+// vim: sw=2 sts=2 et