00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <stdlib.h>
00028
00029 #include <qtooltip.h>
00030 #include <qfile.h>
00031
00032 #include <kapplication.h>
00033 #include <kdebug.h>
00034 #include <klocale.h>
00035 #include <kiconloader.h>
00036 #include <kprocess.h>
00037 #include <kconfig.h>
00038 #include <kmessagebox.h>
00039 #include <kurl.h>
00040 #include <kstandarddirs.h>
00041 #include <dcopclient.h>
00042
00043 #include "alarmgui.h"
00044 #include "alarmdaemoniface_stub.h"
00045
00046 #include "dockwindow.h"
00047 #include "dockwindow.moc"
00048
00049
00050 AlarmDockWindow::AlarmDockWindow(AlarmGui *ag, QWidget *parent, const char *name)
00051 : KSystemTray(parent, name),
00052 mAlarmGui(ag),
00053 mNumClientIds(0L),
00054 mNumCalendarIds(0L),
00055 mSettingDaemonStatus(false)
00056 {
00057
00058 KGlobal::iconLoader()->addAppDir(kapp->aboutData()->appName());
00059 kdDebug() << "kalarmd, icon dir = " << kapp->aboutData()->appName() << endl;
00060 mPixmapEnabled = KGlobal::iconLoader()->loadIcon("kalarmdgui", KIcon::Panel );
00061 mPixmapDisabled = KGlobal::iconLoader()->loadIcon("kalarmdgui_disabled", KIcon::Panel );
00062
00063 if (mPixmapEnabled.isNull() || mPixmapDisabled.isNull())
00064 KMessageBox::sorry(this, i18n("Can't load docking tray icon!"),
00065 i18n("%1 Error").arg(kapp->aboutData()->programName()));
00066
00067
00068 KConfig* config = kapp->config();
00069 config->setGroup("General");
00070 bool mAutostartGui = config->readBoolEntry("Autostart", true);
00071
00072
00073 mAlarmsEnabledId = contextMenu()->insertItem(i18n("Alarms Enabled"),
00074 this, SLOT(toggleAlarmsEnabled()));
00075 mAutostartDaemonId = contextMenu()->insertItem(i18n("Start Alarm Daemon Automatically at Login"),
00076 this, SLOT(toggleDaemonAutostart()));
00077 mAutostartGuiId = contextMenu()->insertItem(i18n("Display this Tray Icon at Login"),
00078 this, SLOT(toggleGuiAutostart()));
00079 contextMenu()->setItemChecked(mAutostartDaemonId, mAlarmGui->autostartDaemon());
00080 contextMenu()->setItemChecked(mAutostartGuiId, mAutostartGui);
00081 setPixmap(mPixmapEnabled);
00082 contextMenu()->setItemChecked(mAlarmsEnabledId, true);
00083
00084 mClientIndex = contextMenu()->count();
00085 updateMenuClients();
00086 updateMenuCalendars(true);
00087
00088 setDaemonStatus(mAlarmGui->isDaemonRunning(false));
00089
00090 addToolTip(QString());
00091 }
00092
00093 AlarmDockWindow::~AlarmDockWindow()
00094 {
00095 }
00096
00097
00098
00099
00100
00101 void AlarmDockWindow::updateMenuClients()
00102 {
00103 KPopupMenu* menu = contextMenu();
00104 if (mNumClientIds)
00105 {
00106
00107 for ( ; mNumClientIds > 0; --mNumClientIds)
00108 menu->removeItemAt(mClientIndex);
00109 }
00110 if (mAlarmGui->clientCount() > 1)
00111 {
00112
00113
00114 int index = mClientIndex;
00115 menu->insertSeparator(index++);
00116 ClientList clients = mAlarmGui->clients();
00117 ClientList::Iterator client;
00118 for ( client = clients.begin(); client != clients.end(); ++client )
00119 {
00120 int id = menu->insertItem(i18n("Click Starts %1").arg((*client).title),
00121 this, SLOT(selectClient(int)), 0, -1, index);
00122 menu->setItemParameter(id, index);
00123 menu->setItemChecked(id, ((*client).appName == mAlarmGui->defaultClient()));
00124 (*client).menuIndex = index++;
00125 }
00126 mNumClientIds = index - mClientIndex;
00127 }
00128 }
00129
00130
00131
00132
00133
00134
00135 void AlarmDockWindow::updateMenuCalendars(bool recreate)
00136 {
00137 bool enable = mAlarmGui->isDaemonRunning(false);
00138 KPopupMenu* menu = contextMenu();
00139 int calendarIndex = mClientIndex + mNumClientIds;
00140 if (recreate)
00141 {
00142
00143 if (mNumCalendarIds)
00144 {
00145
00146 for ( ; mNumCalendarIds > 0; --mNumCalendarIds)
00147 menu->removeItemAt(calendarIndex);
00148 }
00149 if (mAlarmGui->calendarCount() > 0)
00150 {
00151 int index = calendarIndex;
00152 menu->insertSeparator(index++);
00153 CalendarList calendars = mAlarmGui->calendars();
00154 ADCalendarBase *cal;
00155 for( cal = calendars.first(); cal; cal = calendars.next() )
00156 {
00157 int id = menu->insertItem(KURL(cal->urlString()).prettyURL(), this,
00158 SLOT(selectCal(int)), 0, -1, index);
00159 menu->setItemParameter(id, index++);
00160 menu->setItemEnabled(id, enable && cal->available());
00161 menu->setItemChecked(id, cal->enabled());
00162 }
00163 mNumCalendarIds = index - calendarIndex;
00164 }
00165 }
00166 else
00167 {
00168
00169 int index = calendarIndex;
00170 CalendarList calendars = mAlarmGui->calendars();
00171 ADCalendarBase *cal;
00172 for( cal = calendars.first(); cal; cal = calendars.next() )
00173 {
00174 int id = menu->idAt(++index);
00175 menu->setItemEnabled(id, enable && cal->available());
00176 menu->setItemChecked(id, cal->enabled());
00177 }
00178 }
00179 }
00180
00181
00182
00183
00184
00185 void AlarmDockWindow::toggleAlarmsEnabled()
00186 {
00187 bool newstate = !contextMenu()->isItemChecked(mAlarmsEnabledId);
00188 if (newstate)
00189 {
00190
00191 if (!mAlarmGui->isDaemonRunning())
00192 {
00193
00194 QString execStr = locate("exe", DAEMON_APP_NAME);
00195 if (execStr.isEmpty())
00196 {
00197 KMessageBox::error(this, i18n("Alarm Daemon not found"), i18n("%1 Error").arg(kapp->aboutData()->programName()));
00198 kdError() << "AlarmDockWindow::toggleAlarmsEnabled(): kalarmd not found" << endl;
00199 return;
00200 }
00201 system(QFile::encodeName(execStr));
00202 }
00203 }
00204 else
00205 {
00206 AlarmDaemonIface_stub s( DAEMON_APP_NAME, DAEMON_DCOP_OBJECT );
00207 s.quit();
00208 if (!s.ok())
00209 kdDebug() << "AlarmDockWindow::toggleAlarmsEnabled(): quit dcop send failed\n";
00210 }
00211 mAlarmGui->setFastDaemonCheck();
00212 }
00213
00214
00215
00216
00217
00218 void AlarmDockWindow::setDaemonStatus(bool newstatus)
00219 {
00220 bool oldstatus = contextMenu()->isItemChecked(mAlarmsEnabledId);
00221 kdDebug() << "AlarmDockWindow::setDaemonStatus(): "<<(int)oldstatus<<"->"<<(int)newstatus<<endl;
00222 if (newstatus != oldstatus)
00223 {
00224 setPixmap(newstatus ? mPixmapEnabled : mPixmapDisabled);
00225 contextMenu()->setItemChecked(mAlarmsEnabledId, newstatus);
00226 mSettingDaemonStatus = true;
00227 contextMenuAboutToShow(contextMenu());
00228 mSettingDaemonStatus = false;
00229 }
00230 }
00231
00232
00233
00234
00235
00236 void AlarmDockWindow::selectClient(int menuIndex)
00237 {
00238 KPopupMenu* menu = contextMenu();
00239 kdDebug() << "AlarmDockWindow::selectClient(): " << menuIndex << endl;
00240 if (!menu->isItemChecked(menu->idAt(menuIndex)))
00241 {
00242 for (int i = mClientIndex; i < mClientIndex + mNumClientIds; ++i) {
00243 menu->setItemChecked(menu->idAt(i), (i == menuIndex));
00244 }
00245 mAlarmGui->setDefaultClient(menuIndex);
00246 }
00247 }
00248
00249
00250
00251
00252
00253
00254
00255 void AlarmDockWindow::selectCal(int menuIndex)
00256 {
00257 KPopupMenu* menu = contextMenu();
00258 int id = menu->idAt(menuIndex);
00259 bool newstate = !menu->isItemChecked(id);
00260 kdDebug() << "AlarmDockWindow::selectCal(): "<< menuIndex << ": id=" << id << " newstate=" << (int)newstate << endl;
00261 int index = mClientIndex + mNumClientIds;
00262 CalendarList calendars = mAlarmGui->calendars();
00263 ADCalendarBase *cal;
00264 for( cal = calendars.first(); cal; cal = calendars.next() )
00265 {
00266 if (++index == menuIndex)
00267 {
00268 AlarmDaemonIface_stub s( DAEMON_APP_NAME, DAEMON_DCOP_OBJECT );
00269 s.enableCal( cal->urlString(), newstate );
00270 break;
00271 }
00272 }
00273 }
00274
00275
00276
00277
00278 void AlarmDockWindow::setGuiAutostart(bool on)
00279 {
00280 kdDebug()<<"setGuiAutostart()="<<int(on)<<endl;
00281 KConfig* config = kapp->config();
00282 config->setGroup("General");
00283 config->writeEntry("Autostart", on);
00284 config->sync();
00285 contextMenu()->setItemChecked(mAutostartGuiId, on);
00286 }
00287
00288
00289
00290
00291
00292
00293
00294 void AlarmDockWindow::toggleDaemonAutostart()
00295 {
00296 AlarmDaemonIface_stub s( DAEMON_APP_NAME, DAEMON_DCOP_OBJECT );
00297 s.enableAutoStart( !mAlarmGui->autostartDaemon() );
00298 if (!s.ok())
00299 kdDebug() << "AlarmDockWindow::toggleDaemonAutostart(): enableAutoStart dcop send failed\n";
00300 contextMenuAboutToShow(contextMenu());
00301 }
00302
00303
00304
00305
00306
00307
00308 void AlarmDockWindow::contextMenuAboutToShow(KPopupMenu* menu)
00309 {
00310 menu->setItemEnabled(mAutostartDaemonId, mAlarmGui->isDaemonRunning(!mSettingDaemonStatus));
00311 updateMenuCalendars(false);
00312 }
00313
00314
00315
00316
00317 void AlarmDockWindow::mousePressEvent(QMouseEvent* e)
00318 {
00319 if (e->button() == LeftButton)
00320 {
00321
00322 KProcess proc;
00323 proc << mAlarmGui->defaultClient();
00324 proc.start(KProcess::DontCare);
00325 }
00326 else
00327 KSystemTray::mousePressEvent(e);
00328 }
00329
00330 void AlarmDockWindow::closeEvent(QCloseEvent*)
00331 {
00332 kapp->quit();
00333 }
00334
00335 void AlarmDockWindow::addToolTip(const QString& filename)
00336 {
00337 QString apps;
00338 ClientList clients = mAlarmGui->clients();
00339 ClientList::ConstIterator client;
00340 for ( client = clients.begin(); client != clients.end(); ++client )
00341 {
00342 if (!apps.isEmpty())
00343 apps += '/';
00344 apps += (*client).title;
00345 }
00346 apps += i18n(" Alarm Monitor");
00347
00348 if (!filename.isEmpty())
00349 apps += "\n" + filename;
00350 QToolTip::remove(this);
00351 QToolTip::add(this, apps);
00352 }