21 #include "kmsystemtray.h"
23 #include "kmfoldertree.h"
24 #include "kmfoldermgr.h"
25 #include "kmfolderimap.h"
26 #include "kmmainwidget.h"
27 #include "accountmanager.h"
29 #include "globalsettings.h"
31 #include <kapplication.h>
32 #include <kmainwindow.h>
33 #include <kglobalsettings.h>
34 #include <kiconloader.h>
35 #include <kiconeffect.h>
38 #include <kpopupmenu.h>
40 #include <tqpainter.h>
42 #include <tqtooltip.h>
43 #include <tqwidgetlist.h>
44 #include <tqobjectlist.h>
61 : KSystemTray( parent, name ),
62 mParentVisible( true ),
63 mPosOfMainWin( 0, 0 ),
64 mDesktopOfMainWin( 0 ),
65 mMode( GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread ),
67 mNewMessagePopupId(-1),
70 setAlignment( AlignCenter );
71 kdDebug(5006) <<
"Initting systray" << endl;
73 mLastUpdate = time( 0 );
74 mUpdateTimer =
new TQTimer(
this,
"systraytimer" );
75 connect( mUpdateTimer, TQT_SIGNAL( timeout() ), TQT_SLOT( updateNewMessages() ) );
77 mDefaultIcon = loadIcon(
"kmail" );
78 mLightIconImage = loadIcon(
"kmaillight" ).convertToImage();
80 setPixmap(mDefaultIcon);
82 KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
84 TQWidget * mainWin = mainWidget->topLevelWidget();
86 mDesktopOfMainWin = KWin::windowInfo( mainWin->winId(),
87 NET::WMDesktop ).desktop();
88 mPosOfMainWin = mainWin->pos();
93 kmkernel->registerSystemTrayApplet(
this );
98 connect( kmkernel->folderMgr(), TQT_SIGNAL(changed()), TQT_SLOT(
foldersChanged()));
99 connect( kmkernel->imapFolderMgr(), TQT_SIGNAL(changed()), TQT_SLOT(
foldersChanged()));
100 connect( kmkernel->dimapFolderMgr(), TQT_SIGNAL(changed()), TQT_SLOT(
foldersChanged()));
101 connect( kmkernel->searchFolderMgr(), TQT_SIGNAL(changed()), TQT_SLOT(
foldersChanged()));
103 connect( kmkernel->acctMgr(), TQT_SIGNAL( checkedMail(
bool,
bool,
const TQMap<TQString, int> & ) ),
104 TQT_SLOT( updateNewMessages() ) );
106 connect(
this, TQT_SIGNAL( quitSelected() ), TQT_SLOT( tray_quit() ) );
109 void KMSystemTray::buildPopupMenu()
114 mPopupMenu =
new KPopupMenu();
115 KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
119 mPopupMenu->insertTitle(*(this->pixmap()),
"KMail");
121 if ( ( action = mainWidget->action(
"check_mail") ) )
122 action->plug( mPopupMenu );
123 if ( ( action = mainWidget->action(
"check_mail_in") ) )
124 action->plug( mPopupMenu );
125 if ( ( action = mainWidget->action(
"send_queued") ) )
126 action->plug( mPopupMenu );
127 if ( ( action = mainWidget->action(
"send_queued_via") ) )
128 action->plug( mPopupMenu );
129 mPopupMenu->insertSeparator();
130 if ( ( action = mainWidget->action(
"new_message") ) )
131 action->plug( mPopupMenu );
132 if ( ( action = mainWidget->action(
"kmail_configure_kmail") ) )
133 action->plug( mPopupMenu );
134 mPopupMenu->insertSeparator();
136 KMainWindow *mainWin = ::tqqt_cast<KMainWindow*>(kmkernel->getKMMainWidget()->topLevelWidget());
137 mPopupMenu->insertItem( SmallIcon(
"exit"), i18n(
"&Quit"),
this, TQT_SLOT(maybeQuit()) );
140 void KMSystemTray::tray_quit()
149 kmkernel->unregisterSystemTrayApplet(
this );
155 void KMSystemTray::setMode(
int newMode)
157 if(newMode == mMode)
return;
159 kdDebug(5006) <<
"Setting systray mMode to " << newMode << endl;
163 case GlobalSettings::EnumSystemTrayPolicy::ShowAlways:
167 case GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread:
168 if ( mCount == 0 && !isHidden() )
170 else if ( mCount > 0 && isHidden() )
174 kdDebug(5006) << k_funcinfo <<
" Unknown systray mode " << mMode << endl;
178 int KMSystemTray::mode()
const
192 int oldPixmapWidth = pixmap()->size().width();
193 int oldPixmapHeight = pixmap()->size().height();
195 TQString countString = TQString::number( mCount );
196 TQFont countFont = KGlobalSettings::generalFont();
197 countFont.setBold(
true);
201 float countFontSize = countFont.pointSizeFloat();
202 TQFontMetrics qfm( countFont );
203 int width = qfm.width( countString );
204 if( width > oldPixmapWidth )
206 countFontSize *= float( oldPixmapWidth ) / float( width );
207 countFont.setPointSizeFloat( countFontSize );
227 TQPixmap numberPixmap( oldPixmapWidth, oldPixmapHeight );
228 numberPixmap.fill( TQt::white );
229 TQPainter p( &numberPixmap );
230 p.setFont( countFont );
231 p.setPen( TQt::blue );
232 p.drawText( numberPixmap.rect(), TQt::AlignCenter, countString );
233 numberPixmap.setMask( numberPixmap.createHeuristicMask() );
234 TQImage numberImage = numberPixmap.convertToImage();
237 TQImage iconWithNumberImage = mLightIconImage.copy();
238 KIconEffect::overlay( iconWithNumberImage, numberImage );
240 TQPixmap iconWithNumber;
241 iconWithNumber.convertFromImage( iconWithNumberImage );
242 setPixmap( iconWithNumber );
245 setPixmap( mDefaultIcon );
259 mFoldersWithUnread.clear();
262 if ( mMode == GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread ) {
267 disconnect(
this, TQT_SLOT(updateNewMessageNotification(
KMFolder *)));
269 TQStringList folderNames;
270 TQValueList<TQGuardedPtr<KMFolder> > folderList;
271 kmkernel->folderMgr()->createFolderList(&folderNames, &folderList);
272 kmkernel->imapFolderMgr()->createFolderList(&folderNames, &folderList);
273 kmkernel->dimapFolderMgr()->createFolderList(&folderNames, &folderList);
274 kmkernel->searchFolderMgr()->createFolderList(&folderNames, &folderList);
276 TQStringList::iterator strIt = folderNames.begin();
278 for(TQValueList<TQGuardedPtr<KMFolder> >::iterator it = folderList.begin();
279 it != folderList.end() && strIt != folderNames.end(); ++it, ++strIt)
282 TQString currentName = *strIt;
284 if ( ((!currentFolder->
isSystemFolder() || (currentFolder->name().lower() ==
"inbox")) ||
285 (currentFolder->
folderType() == KMFolderTypeImap)) &&
289 connect(currentFolder, TQT_SIGNAL(numUnreadMsgsChanged(
KMFolder *)),
290 this, TQT_SLOT(updateNewMessageNotification(
KMFolder *)));
293 updateNewMessageNotification(currentFolder);
296 disconnect(currentFolder, TQT_SIGNAL(numUnreadMsgsChanged(
KMFolder *)),
this, TQT_SLOT(updateNewMessageNotification(
KMFolder *)) );
308 if( e->button() == Qt::LeftButton )
310 if( mParentVisible && mainWindowIsOnCurrentDesktop() )
317 if( e->button() == Qt::RightButton )
319 mPopupFolders.clear();
320 mPopupFolders.reserve( mFoldersWithUnread.count() );
326 if(mNewMessagePopupId != -1)
328 mPopupMenu->removeItem(mNewMessagePopupId);
331 if(mFoldersWithUnread.count() > 0)
333 KPopupMenu *newMessagesPopup =
new KPopupMenu();
335 TQMap<TQGuardedPtr<KMFolder>,
int>::Iterator it = mFoldersWithUnread.begin();
336 for(uint i=0; it != mFoldersWithUnread.end(); ++i)
338 kdDebug(5006) <<
"Adding folder" << endl;
339 mPopupFolders.append( it.key() );
340 TQString item =
prettyName(it.key()) +
" (" + TQString::number(it.data()) +
")";
341 newMessagesPopup->insertItem(item,
this, TQT_SLOT(selectedAccount(
int)), 0, i);
345 mNewMessagePopupId = mPopupMenu->insertItem(i18n(
"New Messages In"),
346 newMessagesPopup, mNewMessagePopupId, 3);
348 kdDebug(5006) <<
"Folders added" << endl;
351 mPopupMenu->popup(e->globalPos());
362 TQString rvalue = fldr->
label();
365 KMFolderImap * imap =
dynamic_cast<KMFolderImap*
> (fldr->storage());
368 if((imap->account() != 0) &&
369 (imap->account()->name() != 0) )
371 kdDebug(5006) <<
"IMAP folder, prepend label with type" << endl;
372 rvalue = imap->account()->name() +
"->" + rvalue;
376 kdDebug(5006) <<
"Got label " << rvalue << endl;
382 bool KMSystemTray::mainWindowIsOnCurrentDesktop()
384 KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
388 TQWidget *mainWin = kmkernel->getKMMainWidget()->topLevelWidget();
392 return KWin::windowInfo( mainWin->winId(),
393 NET::WMDesktop ).isOnCurrentDesktop();
402 if (!kmkernel->getKMMainWidget())
404 TQWidget *mainWin = kmkernel->getKMMainWidget()->topLevelWidget();
408 KWin::WindowInfo cur = KWin::windowInfo( mainWin->winId(), NET::WMDesktop );
409 if ( cur.valid() ) mDesktopOfMainWin = cur.desktop();
411 if ( mDesktopOfMainWin != NET::OnAllDesktops )
412 KWin::setCurrentDesktop( mDesktopOfMainWin );
413 if ( !mParentVisible ) {
414 if ( mDesktopOfMainWin == NET::OnAllDesktops )
415 KWin::setOnAllDesktops( mainWin->winId(), true );
416 mainWin->move( mPosOfMainWin );
419 KWin::activateWindow( mainWin->winId() );
420 mParentVisible =
true;
428 void KMSystemTray::hideKMail()
430 if (!kmkernel->getKMMainWidget())
432 TQWidget *mainWin = kmkernel->getKMMainWidget()->topLevelWidget();
436 mDesktopOfMainWin = KWin::windowInfo( mainWin->winId(),
437 NET::WMDesktop ).desktop();
438 mPosOfMainWin = mainWin->pos();
440 KWin::iconifyWindow( mainWin->winId() );
442 mParentVisible =
false;
452 void KMSystemTray::updateNewMessageNotification(
KMFolder * fldr)
463 mPendingUpdates[ fldr ] =
true;
464 if ( time( 0 ) - mLastUpdate > 2 ) {
465 mUpdateTimer->stop();
469 mUpdateTimer->start(150,
true);
473 void KMSystemTray::updateNewMessages()
475 for ( TQMap<TQGuardedPtr<KMFolder>,
bool>::Iterator it = mPendingUpdates.begin();
476 it != mPendingUpdates.end(); ++it)
485 TQMap<TQGuardedPtr<KMFolder>,
int>::Iterator unread_it =
486 mFoldersWithUnread.find(fldr);
487 bool unmapped = (unread_it == mFoldersWithUnread.end());
491 if(unmapped) mCount += unread;
496 int diff = unread - unread_it.data();
503 mFoldersWithUnread.insert(fldr, unread);
515 if(unread == 0)
continue;
518 if ( ( mMode == GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread )
528 kdDebug(5006) <<
"Removing folder from internal store " << fldr->name() << endl;
531 mFoldersWithUnread.remove(fldr);
534 if(mFoldersWithUnread.count() == 0)
536 mPopupFolders.clear();
537 disconnect(
this, TQT_SLOT(selectedAccount(
int)));
541 if ( mMode == GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread ) {
549 mPendingUpdates.clear();
553 TQToolTip::remove(
this);
554 TQToolTip::add(
this, mCount == 0 ?
555 i18n(
"There are no unread messages")
556 : i18n(
"There is 1 unread message.",
557 "There are %n unread messages.",
560 mLastUpdate = time( 0 );
568 void KMSystemTray::selectedAccount(
int id)
572 KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
575 kmkernel->openReader();
576 mainWidget = kmkernel->getKMMainWidget();
582 KMFolder * fldr = mPopupFolders.at(
id);
584 KMFolderTree * ft = mainWidget->folderTree();
586 TQListViewItem * fldrIdx = ft->indexOfFolder(fldr);
589 ft->setCurrentItem(fldrIdx);
590 ft->selectCurrentFolder();
593 bool KMSystemTray::hasUnreadMail()
const
595 return ( mCount != 0 );
598 #include "kmsystemtray.moc"