diff options
Diffstat (limited to 'kcontrol/componentchooser/componentchooser.cpp')
-rw-r--r-- | kcontrol/componentchooser/componentchooser.cpp | 530 |
1 files changed, 530 insertions, 0 deletions
diff --git a/kcontrol/componentchooser/componentchooser.cpp b/kcontrol/componentchooser/componentchooser.cpp new file mode 100644 index 000000000..9de1a1a7b --- /dev/null +++ b/kcontrol/componentchooser/componentchooser.cpp @@ -0,0 +1,530 @@ +/*************************************************************************** + componentchooser.cpp - description + ------------------- + copyright : (C) 2002 by Joseph Wenninger + email : jowenn@kde.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License verstion 2 as * + * published by the Free Software Foundation * + * * + ***************************************************************************/ + +#include <sys/types.h> +#include <sys/stat.h> + +#include "componentchooser.h" +#include "componentchooser.moc" + +#include <tqcheckbox.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqradiobutton.h> +#include <tqwidgetstack.h> + +#include <dcopclient.h> + +#include <tdeapplication.h> +#include <tdeemailsettings.h> +#include <kipc.h> +#include <tdelocale.h> +#include <tdemessagebox.h> +#include <kopenwith.h> +#include <ksimpleconfig.h> +#include <kstandarddirs.h> +#include <ktrader.h> +#include <kurlrequester.h> + +class MyListBoxItem: public TQListBoxText +{ +public: + MyListBoxItem(const TQString& text, const TQString &file):TQListBoxText(text),File(file){} + virtual ~MyListBoxItem(){;} + TQString File; +}; + + +//BEGIN General kpart based Component selection + +CfgComponent::CfgComponent(TQWidget *parent):ComponentConfig_UI(parent),CfgPlugin(){ + m_lookupDict.setAutoDelete(true); + m_revLookupDict.setAutoDelete(true); + connect(ComponentSelector,TQT_SIGNAL(activated(const TQString&)),this,TQT_SLOT(slotComponentChanged(const TQString&))); +} + +CfgComponent::~CfgComponent(){} + +void CfgComponent::slotComponentChanged(const TQString&) { + emit changed(true); +} + +void CfgComponent::save(TDEConfig *cfg) { + // yes, this can happen if there are NO TDETrader offers for this component + if (!m_lookupDict[ComponentSelector->currentText()]) + return; + + TQString ServiceTypeToConfigure=cfg->readEntry("ServiceTypeToConfigure"); + TDEConfig *store = new TDEConfig(cfg->readPathEntry("storeInFile","null")); + store->setGroup(cfg->readEntry("valueSection")); + store->writePathEntry(cfg->readEntry("valueName","kcm_componenchooser_null"),*m_lookupDict[ComponentSelector->currentText()]); + store->sync(); + delete store; + emit changed(false); +} + +void CfgComponent::load(TDEConfig *cfg) { + + ComponentSelector->clear(); + m_lookupDict.clear(); + m_revLookupDict.clear(); + + TQString ServiceTypeToConfigure=cfg->readEntry("ServiceTypeToConfigure"); + + TQString MimeTypeOfInterest=cfg->readEntry("MimeTypeOfInterest"); + TDETrader::OfferList offers = TDETrader::self()->query(MimeTypeOfInterest, "'"+ServiceTypeToConfigure+"' in ServiceTypes"); + + for (TDETrader::OfferList::Iterator tit = offers.begin(); tit != offers.end(); ++tit) + { + ComponentSelector->insertItem((*tit)->name()); + m_lookupDict.insert((*tit)->name(),new TQString((*tit)->desktopEntryName())); + m_revLookupDict.insert((*tit)->desktopEntryName(),new TQString((*tit)->name())); + } + + TDEConfig *store = new TDEConfig(cfg->readPathEntry("storeInFile","null")); + store->setGroup(cfg->readEntry("valueSection")); + TQString setting=store->readEntry(cfg->readEntry("valueName","kcm_componenchooser_null")); + delete store; + if (setting.isEmpty()) setting=cfg->readEntry("defaultImplementation"); + TQString *tmp=m_revLookupDict[setting]; + if (tmp) + for (int i=0;i<ComponentSelector->count();i++) + if ((*tmp)==ComponentSelector->text(i)) + { + ComponentSelector->setCurrentItem(i); + break; + } + emit changed(false); +} + +void CfgComponent::defaults() +{ + //todo +} + +//END General kpart based Component selection + + + + + + +//BEGIN Email client config +CfgEmailClient::CfgEmailClient(TQWidget *parent):EmailClientConfig_UI(parent),CfgPlugin(){ + pSettings = new KEMailSettings(); + + connect(kmailCB, TQT_SIGNAL(toggled(bool)), TQT_SLOT(configChanged()) ); + connect(txtEMailClient, TQT_SIGNAL(textChanged(const TQString&)), TQT_SLOT(configChanged()) ); + connect(chkRunTerminal, TQT_SIGNAL(clicked()), TQT_SLOT(configChanged()) ); +} + +CfgEmailClient::~CfgEmailClient() { + delete pSettings; +} + +void CfgEmailClient::defaults() +{ + load(0L); +} + +void CfgEmailClient::load(TDEConfig *) +{ + TQString emailClient = pSettings->getSetting(KEMailSettings::ClientProgram); + bool useKMail = (emailClient.isEmpty()); + + kmailCB->setChecked(useKMail); + otherCB->setChecked(!useKMail); + txtEMailClient->setText(emailClient); + txtEMailClient->setFixedHeight(txtEMailClient->sizeHint().height()); + chkRunTerminal->setChecked((pSettings->getSetting(KEMailSettings::ClientTerminal) == "true")); + + emit changed(false); + +} + +void CfgEmailClient::configChanged() +{ + emit changed(true); +} + +void CfgEmailClient::selectEmailClient() +{ + KURL::List urlList; + KOpenWithDlg dlg(urlList, i18n("Select preferred email client:"), TQString::null, this); + // hide "Do not &close when command exits" here, we don't need it for a mail client + dlg.hideNoCloseOnExit(); + if (dlg.exec() != TQDialog::Accepted) return; + TQString client = dlg.text(); + + // get the preferred Terminal Application + TDEConfigGroup confGroup( TDEGlobal::config(), TQString::fromLatin1("General") ); + TQString preferredTerminal = confGroup.readPathEntry("TerminalApplication", TQString::fromLatin1("konsole")); + preferredTerminal += TQString::fromLatin1(" -e "); + + int len = preferredTerminal.length(); + bool b = client.left(len) == preferredTerminal; + if (b) client = client.mid(len); + if (!client.isEmpty()) + { + chkRunTerminal->setChecked(b); + txtEMailClient->setText(client); + } +} + + +void CfgEmailClient::save(TDEConfig *) +{ + if (kmailCB->isChecked()) + { + pSettings->setSetting(KEMailSettings::ClientProgram, TQString::null); + pSettings->setSetting(KEMailSettings::ClientTerminal, "false"); + } + else + { + pSettings->setSetting(KEMailSettings::ClientProgram, txtEMailClient->text()); + pSettings->setSetting(KEMailSettings::ClientTerminal, (chkRunTerminal->isChecked()) ? "true" : "false"); + } + + // insure proper permissions -- contains sensitive data + TQString cfgName(TDEGlobal::dirs()->findResource("config", "emails")); + if (!cfgName.isEmpty()) + ::chmod(TQFile::encodeName(cfgName), 0600); + + kapp->dcopClient()->emitDCOPSignal("KDE_emailSettingsChanged()", TQByteArray()); + + emit changed(false); +} + + +//END Email client config + + + +//BEGIN Terminal Emulator Configuration + +CfgTerminalEmulator::CfgTerminalEmulator(TQWidget *parent):TerminalEmulatorConfig_UI(parent),CfgPlugin(){ + connect(terminalLE,TQT_SIGNAL(textChanged(const TQString &)), this, TQT_SLOT(configChanged())); + connect(terminalCB,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(configChanged())); + connect(otherCB,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(configChanged())); +} + +CfgTerminalEmulator::~CfgTerminalEmulator() { +} + +void CfgTerminalEmulator::configChanged() +{ + emit changed(true); +} + +void CfgTerminalEmulator::defaults() +{ + load(0L); +} + + +void CfgTerminalEmulator::load(TDEConfig *) { + TDEConfig *config = new TDEConfig("kdeglobals", true); + config->setGroup("General"); + TQString terminal = config->readPathEntry("TerminalApplication","konsole"); + if (terminal == "konsole") + { + terminalLE->setText("xterm"); + terminalCB->setChecked(true); + } + else + { + terminalLE->setText(terminal); + otherCB->setChecked(true); + } + delete config; + + emit changed(false); +} + +void CfgTerminalEmulator::save(TDEConfig *) { + + TDEConfig *config = new TDEConfig("kdeglobals"); + config->setGroup("General"); + config->writePathEntry("TerminalApplication",terminalCB->isChecked()?"konsole":terminalLE->text(), true, true); + config->sync(); + delete config; + + KIPC::sendMessageAll(KIPC::SettingsChanged); + kapp->dcopClient()->send("tdelauncher", "tdelauncher","reparseConfiguration()", TQString::null); + + emit changed(false); +} + +void CfgTerminalEmulator::selectTerminalApp() +{ + KURL::List urlList; + KOpenWithDlg dlg(urlList, i18n("Select preferred terminal application:"), TQString::null, this); + // hide "Run in &terminal" here, we don't need it for a Terminal Application + dlg.hideRunInTerminal(); + if (dlg.exec() != TQDialog::Accepted) return; + TQString client = dlg.text(); + + if (!client.isEmpty()) + { + terminalLE->setText(client); + } +} + +//END Terminal Emulator Configuration + +//BEGIN Browser Configuration + +CfgBrowser::CfgBrowser(TQWidget *parent) : BrowserConfig_UI(parent),CfgPlugin(){ + connect(lineExec,TQT_SIGNAL(textChanged(const TQString &)),this,TQT_SLOT(configChanged())); + connect(radioKIO,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(configChanged())); + connect(radioExec,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(configChanged())); +} + +CfgBrowser::~CfgBrowser() { +} + +void CfgBrowser::configChanged() +{ + emit changed(true); +} + +void CfgBrowser::defaults() +{ + load(0L); +} + + +void CfgBrowser::load(TDEConfig *) { + TDEConfig *config = new TDEConfig("kdeglobals", true); + config->setGroup("General"); + TQString exec = config->readEntry("BrowserApplication"); + if (exec.isEmpty()) + { + radioKIO->setChecked(true); + m_browserExec = exec; + m_browserService = 0; + } + else + { + radioExec->setChecked(true); + if (exec.startsWith("!")) + { + m_browserExec = exec.mid(1); + m_browserService = 0; + } + else + { + m_browserService = KService::serviceByStorageId( exec ); + if (m_browserService) + m_browserExec = m_browserService->desktopEntryName(); + else + m_browserExec = TQString::null; + } + } + + lineExec->setText(m_browserExec); + delete config; + + emit changed(false); +} + +void CfgBrowser::save(TDEConfig *) { + + TDEConfig *config = new TDEConfig("kdeglobals"); + config->setGroup("General"); + TQString exec; + if (radioExec->isChecked()) + { + exec = lineExec->text(); + if (m_browserService && (exec == m_browserExec)) + exec = m_browserService->storageId(); // Use service + else + exec = "!" + exec; // Litteral command + } + config->writePathEntry("BrowserApplication", exec, true, true); + config->sync(); + delete config; + + KIPC::sendMessageAll(KIPC::SettingsChanged); + + emit changed(false); +} + +void CfgBrowser::selectBrowser() +{ + KURL::List urlList; + KOpenWithDlg dlg(urlList, i18n("Select preferred Web browser application:"), TQString::null, this); + if (dlg.exec() != TQDialog::Accepted) return; + m_browserService = dlg.service(); + if (m_browserService) + m_browserExec = m_browserService->desktopEntryName(); + else + m_browserExec = dlg.text(); + + lineExec->setText(m_browserExec); +} + +//END Terminal Emulator Configuration + +ComponentChooser::ComponentChooser(TQWidget *parent, const char *name): + ComponentChooser_UI(parent,name), configWidget(0) { + + ComponentChooser_UILayout->setRowStretch(1, 1); + somethingChanged=false; + latestEditedService=""; + + TQStringList dummy; + TQStringList services=TDEGlobal::dirs()->findAllResources( "data","kcm_componentchooser/*.desktop",false,true,dummy); + for (TQStringList::Iterator it=services.begin();it!=services.end();++it) + { + KSimpleConfig cfg(*it); + ServiceChooser->insertItem(new MyListBoxItem(cfg.readEntry("Name",i18n("Unknown")),(*it))); + + } + ServiceChooser->setFixedWidth(ServiceChooser->sizeHint().width()); + ServiceChooser->sort(); + connect(ServiceChooser,TQT_SIGNAL(highlighted(TQListBoxItem*)),this,TQT_SLOT(slotServiceSelected(TQListBoxItem*))); + ServiceChooser->setSelected(0,true); + slotServiceSelected(ServiceChooser->item(0)); + +} + +void ComponentChooser::slotServiceSelected(TQListBoxItem* it) { + if (!it) return; + + if (somethingChanged) { + if (KMessageBox::questionYesNo(this,i18n("<qt>You changed the default component of your choice. Do you want to save that change now?</qt>"),TQString::null,KStdGuiItem::save(),KStdGuiItem::discard())==KMessageBox::Yes) save(); + } + KSimpleConfig cfg(static_cast<MyListBoxItem*>(it)->File); + + ComponentDescription->setText(cfg.readEntry("Comment",i18n("No description available"))); + ComponentDescription->setMinimumSize(ComponentDescription->sizeHint()); + + + TQString cfgType=cfg.readEntry("configurationType"); + TQWidget *newConfigWidget = 0; + if (cfgType.isEmpty() || (cfgType=="component")) + { + if (!(configWidget && configWidget->tqt_cast("CfgComponent"))) + { + CfgComponent* cfgcomp = new CfgComponent(configContainer); + cfgcomp->ChooserDocu->setText(i18n("Choose from the list below which component should be used by default for the %1 service.").arg(it->text())); + newConfigWidget = cfgcomp; + } + else + { + static_cast<CfgComponent*>(configWidget)->ChooserDocu->setText(i18n("Choose from the list below which component should be used by default for the %1 service.").arg(it->text())); + } + } + else if (cfgType=="internal_email") + { + if (!(configWidget && configWidget->tqt_cast("CfgEmailClient"))) + { + newConfigWidget = new CfgEmailClient(configContainer); + } + + } + else if (cfgType=="internal_terminal") + { + if (!(configWidget && configWidget->tqt_cast("CfgTerminalEmulator"))) + { + newConfigWidget = new CfgTerminalEmulator(configContainer); + } + + } + else if (cfgType=="internal_browser") + { + if (!(configWidget && configWidget->tqt_cast("CfgBrowser"))) + { + newConfigWidget = new CfgBrowser(configContainer); + } + + } + + if (newConfigWidget) + { + configContainer->addWidget(newConfigWidget); + configContainer->raiseWidget(newConfigWidget); + configContainer->removeWidget(configWidget); + delete configWidget; + configWidget=newConfigWidget; + connect(configWidget,TQT_SIGNAL(changed(bool)),this,TQT_SLOT(emitChanged(bool))); + configContainer->setMinimumSize(configWidget->sizeHint()); + } + + if (configWidget) + static_cast<CfgPlugin*>(configWidget->tqt_cast("CfgPlugin"))->load(&cfg); + + emitChanged(false); + latestEditedService=static_cast<MyListBoxItem*>(it)->File; +} + + +void ComponentChooser::emitChanged(bool val) { + somethingChanged=val; + emit changed(val); +} + + +ComponentChooser::~ComponentChooser() +{ + delete configWidget; +} + +void ComponentChooser::load() { + if( configWidget ) + { + CfgPlugin * plugin = static_cast<CfgPlugin*>( + configWidget->tqt_cast( "CfgPlugin" ) ); + if( plugin ) + { + KSimpleConfig cfg(latestEditedService); + plugin->load( &cfg ); + } + } +} + +void ComponentChooser::save() { + if( configWidget ) + { + CfgPlugin * plugin = static_cast<CfgPlugin*>( + configWidget->tqt_cast( "CfgPlugin" ) ); + if( plugin ) + { + KSimpleConfig cfg(latestEditedService); + plugin->save( &cfg ); + } + } +} + +void ComponentChooser::restoreDefault() { + if (configWidget) + { + static_cast<CfgPlugin*>(configWidget->tqt_cast("CfgPlugin"))->defaults(); + emitChanged(true); + } + +/* + txtEMailClient->setText("kmail"); + chkRunTerminal->setChecked(false); + + // Check if -e is needed, I do not think so + terminalLE->setText("xterm"); //No need for i18n + terminalCB->setChecked(true); + emitChanged(false); +*/ +} + +// vim: sw=4 ts=4 noet |