21 #include "servermanager.h"
22 #include "ui_controlprogressindicator.h"
24 #include "selftestdialog_p.h"
25 #include "erroroverlay_p.h"
32 #include <QtCore/QEventLoop>
33 #include <QtCore/QCoreApplication>
34 #include <QtCore/QTimer>
35 #include <QtCore/QPointer>
36 #include <QtGui/QFrame>
38 using namespace Akonadi;
43 class ControlProgressIndicator :
public QFrame
46 ControlProgressIndicator( QWidget *parent = 0 ) :
49 setWindowModality( Qt::ApplicationModal );
51 setWindowFlags( Qt::FramelessWindowHint | Qt::Dialog );
54 setFrameShadow( QFrame::Plain );
55 setFrameShape( QFrame::Box );
58 void setMessage(
const QString &msg )
60 ui.statusLabel->setText( msg );
63 Ui::ControlProgressIndicator ui;
66 class StaticControl :
public Control
69 StaticControl() : Control() {}
74 K_GLOBAL_STATIC( Internal::StaticControl, s_instance )
79 class Control::Private
82 Private( Control *parent )
83 : mParent( parent ), mEventLoop( 0 ),
84 mProgressIndicator( 0 ),
86 mStarting( false ), mStopping( false )
92 delete mProgressIndicator;
95 void setupProgressIndicator(
const QString &msg, QWidget *parent = 0 )
97 if ( !mProgressIndicator )
98 mProgressIndicator =
new Internal::ControlProgressIndicator( parent );
100 mProgressIndicator->setMessage( msg );
103 void createErrorOverlays()
106 foreach ( QWidget* widget, mPendingOverlays )
108 new ErrorOverlay( widget );
110 mPendingOverlays.clear();
115 s_instance.destroy();
119 void serverStateChanged(ServerManager::State state);
121 QPointer<Control> mParent;
122 QEventLoop *mEventLoop;
123 QPointer<Internal::ControlProgressIndicator> mProgressIndicator;
124 QList<QPointer<QWidget> > mPendingOverlays;
131 bool Control::Private::exec()
133 if ( mProgressIndicator )
134 mProgressIndicator->show();
136 kDebug() <<
"Starting/Stopping Akonadi (using an event loop).";
137 mEventLoop =
new QEventLoop( mParent );
139 mEventLoop->deleteLater();
143 kWarning() <<
"Could not start/stop Akonadi!";
145 if ( mProgressIndicator && mStarting ) {
146 QPointer<SelfTestDialog> dlg =
new SelfTestDialog( mProgressIndicator->parentWidget() );
155 delete mProgressIndicator;
156 mProgressIndicator = 0;
160 const bool rv = mSuccess;
165 void Control::Private::serverStateChanged(ServerManager::State state)
168 if ( mEventLoop && mEventLoop->isRunning() ) {
170 mSuccess = (mStarting && state == ServerManager::Running) || (mStopping && state == ServerManager::NotRunning);
175 : d( new Private( this ) )
177 connect( ServerManager::self(), SIGNAL(stateChanged(Akonadi::ServerManager::State)),
178 SLOT(serverStateChanged(Akonadi::ServerManager::State)) );
181 if ( QCoreApplication::instance() )
182 connect( QCoreApplication::instance(), SIGNAL(aboutToQuit()),
this, SLOT(cleanup()) );
190 bool Control::start()
192 if ( ServerManager::state() == ServerManager::Stopping ) {
193 kDebug() <<
"Server is currently being stopped, wont try to start it now";
196 if ( ServerManager::isRunning() || s_instance->d->mEventLoop ) {
197 kDebug() <<
"Server is already running";
200 s_instance->d->mStarting =
true;
201 if ( !ServerManager::start() ) {
202 kDebug() <<
"ServerManager::start failed -> return false";
205 return s_instance->d->exec();
210 if ( ServerManager::state() == ServerManager::Starting )
212 if ( !ServerManager::isRunning() || s_instance->d->mEventLoop )
214 s_instance->d->mStopping =
true;
215 if ( !ServerManager::stop() )
217 return s_instance->d->exec();
220 bool Control::restart()
222 if ( ServerManager::isRunning() ) {
229 bool Control::start(QWidget * parent)
231 s_instance->d->setupProgressIndicator( i18n(
"Starting Akonadi server..." ), parent );
235 bool Control::stop(QWidget * parent)
237 s_instance->d->setupProgressIndicator( i18n(
"Stopping Akonadi server..." ), parent );
241 bool Control::restart(QWidget * parent)
243 if ( ServerManager::isRunning() ) {
244 if ( !stop( parent ) )
247 return start( parent );
250 void Control::widgetNeedsAkonadi(QWidget * widget)
252 s_instance->d->mPendingOverlays.append( widget );
255 QTimer::singleShot( 0, s_instance, SLOT(createErrorOverlays()) );
260 #include "control.moc"