/* * componentPage.cpp * * Copyright (C) 2004 Waldo Bastian * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "componentPage.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "component.h" #include "kioskdata.h" #include "kioskrun.h" ComponentPage::ComponentPage( ComponentData *data, Component *component, TQWidget* parent, const char* name, WFlags fl ) : ComponentPageUI(parent, name, fl), PageWidget(this), m_data(data), m_component(component) { m_process = 0; connect(pbSetup, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotSetup())); connect(pbPreview, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotPreview())); pbSetup->setText(i18n("&Setup %1").arg(m_data->caption)); pbPreview->setText(i18n("&Preview %1").arg(m_data->caption)); if (m_data->preview.exec.isEmpty()) pbPreview->hide(); if (m_data->setup.exec.isEmpty()) pbSetup->hide(); if (!pbPreview->isHidden() && !pbSetup->isHidden()) { static bool firstTime = true; if (firstTime) { firstTime = false; TQTimer::singleShot(0, this, TQT_SLOT(slotShowNotice())); } } fillActionList(listComponentConfig, m_data); connect(listComponentConfig, TQT_SIGNAL(currentChanged(TQListViewItem *)), this, TQT_SLOT(slotShowAction(TQListViewItem *))); slotShowAction(listComponentConfig->currentItem()); } ComponentPage::~ComponentPage() { delete m_component; } void ComponentPage::slotShowNotice() { KMessageBox::information(this, i18n("Selecting the Setup or Preview option may cause the panel and/or the desktop to be temporarily shut down. " "To prevent data loss please make sure you are not actively using these components."), i18n("Attention"), "shutdown_notice"); } void ComponentPage::load() { } bool ComponentPage::save() { return saveActionListChanges(listComponentConfig); } void ComponentPage::setFocus() { listComponentConfig->setFocus(); } TQString ComponentPage::subCaption() { return i18n("Setup %1").arg(m_data->caption); } void ComponentPage::slotSetup() { if (m_process) { m_process->kill(); delete m_process; } TQCString dcopApp = m_data->setup.dcop.utf8(); TQCString dcopObj = "qt/" + dcopApp; if (!dcopApp.isEmpty() && m_data->setup.hasOption("restart")) DCOPRef(dcopApp, dcopObj).call("quit"); TQApplication::setOverrideCursor( TQCursor(TQt::WaitCursor) ); if (!KioskRun::self()->prepare()) { TQApplication::restoreOverrideCursor(); KMessageBox::sorry(this, i18n("There was an unexpected problem with the runtime environment.")); return; } KioskRun::self()->makeMutable(true); if (!save()) { TQApplication::restoreOverrideCursor(); return; } if (m_component) m_component->slotSetupPrepare(); KioskRun::self()->updateSycoca(); TQApplication::restoreOverrideCursor(); if (!dcopApp.isEmpty()) { KioskRun::self()->dcopClient()->setNotifications(true); connect(KioskRun::self()->dcopClient(), TQT_SIGNAL(applicationRegistered( const TQCString& )), this, TQT_SLOT(slotSetupAppRegistered( const TQCString& ))); } TQStringList args; if (m_data->setup.hasOption("nofork")) args << "--nofork"; args += m_data->setup.args; m_process = KioskRun::self()->run(m_data->setup.exec, args); int result = KMessageBox::questionYesNo(this, i18n("You can now configure %1. " "When you are finished click Save to make the new configuration permanent.") .arg(m_data->caption), i18n("%1 Setup").arg(m_data->caption), KStdGuiItem::save(), KStdGuiItem::discard()); m_saveSettings = (result == KMessageBox::Yes); if (!dcopApp.isEmpty()) KioskRun::self()->dcopRef(dcopApp, dcopObj).call("quit"); if (m_process->isRunning()) { connect(m_process, TQT_SIGNAL(processExited(KProcess *)), this, TQT_SLOT(slotPreviewDone())); } else { slotSetupDone(); } } void ComponentPage::slotSetupDone() { delete m_process; m_process = 0; KioskRun::self()->dcopClient()->setNotifications(false); disconnect(KioskRun::self()->dcopClient(), TQT_SIGNAL(applicationRegistered( const TQCString& )), this, TQT_SLOT(slotSetupAppRegistered( const TQCString& ))); KioskRun::self()->makeMutable(false); if (m_saveSettings) { bool result = true; if (m_component) result = m_component->setupFinished(); if (!result) return; // Find new config files. TQStringList newFiles = KioskRun::self()->newConfigFiles(); for(TQStringList::ConstIterator it = newFiles.begin(); it != newFiles.end(); ++it) { if (m_data->ignoreFiles.contains(*it)) { kdDebug() << "Ignoring new config file " << (*it) << endl; continue; } KioskRun::self()->mergeConfigFile(*it); } } KioskRun::self()->flushConfigCache(); if (m_data->setup.hasOption("restart")) KApplication::kdeinitExec(m_data->setup.exec); } void ComponentPage::slotSetupAppRegistered( const TQCString &appid) { TQCString dcopApp = m_data->setup.dcop.utf8(); if (dcopApp == appid) { kdDebug() << appid << " is up and running" << endl; if (m_component) m_component->slotSetupStarted(); } } void ComponentPage::slotPreview() { if (m_process) { m_process->kill(); delete m_process; } TQCString dcopApp = m_data->preview.dcop.utf8(); TQCString dcopObj = "qt/" + dcopApp; if (!dcopApp.isEmpty() && m_data->preview.hasOption("restart")) DCOPRef(dcopApp, dcopObj).call("quit"); TQApplication::setOverrideCursor( TQCursor(TQt::WaitCursor) ); KioskRun::self()->prepare(); save(); KioskRun::self()->updateSycoca(); TQApplication::restoreOverrideCursor(); if (!dcopApp.isEmpty()) { KioskRun::self()->dcopClient()->setNotifications(true); connect(KioskRun::self()->dcopClient(), TQT_SIGNAL(applicationRegistered( const TQCString& )), this, TQT_SLOT(slotPreviewAppRegistered( const TQCString& ))); } TQStringList args; if (m_data->preview.hasOption("nofork")) args << "--nofork"; args += m_data->preview.args; m_process = KioskRun::self()->run(m_data->preview.exec, args); KMessageBox::information(this, i18n("This is how %1 will behave and look with the new settings. " "Any changes you now make to the settings will not be saved.

" "Click Ok to return to your own personal %2 configuration.") .arg(m_data->caption, m_data->caption), i18n("%1 Preview").arg(m_data->caption)); if (!dcopApp.isEmpty()) KioskRun::self()->dcopRef(dcopApp, dcopObj).call("quit"); if (m_process->isRunning()) { connect(m_process, TQT_SIGNAL(processExited(KProcess *)), this, TQT_SLOT(slotPreviewDone())); } else { slotPreviewDone(); } } void ComponentPage::slotPreviewAppRegistered( const TQCString &appid) { TQCString dcopApp = m_data->preview.dcop.utf8(); if (dcopApp == appid) { kdDebug() << appid << " is up and running" << endl; if (m_component) m_component->slotPreviewStarted(); } } void ComponentPage::slotPreviewDone() { KioskRun::self()->dcopClient()->setNotifications(false); disconnect(KioskRun::self()->dcopClient(), TQT_SIGNAL(applicationRegistered( const TQCString& )), this, TQT_SLOT(slotPreviewAppRegistered( const TQCString& ))); delete m_process; m_process = 0; if (m_data->preview.hasOption("restart")) KApplication::kdeinitExec(m_data->preview.exec); } void ComponentPage::slotShowAction(TQListViewItem *item) { ComponentActionItem *actionItem = dynamic_cast(item); TQString description; if (actionItem) { description = "

"+TQStyleSheet::escape(actionItem->action()->caption)+"

\n"; description += actionItem->action()->description; } componentDescription->setText(description); } #include "componentPage.moc"