karm

kaccelmenuwatch.cpp

00001 /*
00002 * kaccelmenuwatch.cpp -- Implementation of class KAccelMenuWatch.
00003 * Author:    Sirtaj Singh Kang
00004 * Generated: Thu Jan  7 15:05:26 EST 1999
00005 */
00006 
00007 #include <assert.h>
00008 #include <qpopupmenu.h>
00009 
00010 #include "kaccelmenuwatch.h"
00011 
00012 KAccelMenuWatch::KAccelMenuWatch( KAccel *accel, QObject *parent )
00013   : QObject( parent ),
00014   _accel( accel ),
00015   _menu ( 0 )
00016 {
00017   _accList.setAutoDelete( true );
00018   _menuList.setAutoDelete( false );
00019 }
00020 
00021 void KAccelMenuWatch::setMenu( QPopupMenu *menu )
00022 {
00023   assert( menu );
00024 
00025   // we use  _menuList to ensure that the signal is
00026   // connected only once per menu.
00027 
00028   if ( !_menuList.findRef( menu ) ) {
00029     _menuList.append( menu );
00030     connect( menu, SIGNAL(destroyed()), this, SLOT(removeDeadMenu()) );
00031   }
00032 
00033   _menu = menu;
00034 }
00035 
00036 void KAccelMenuWatch::connectAccel( int itemId, const char *action )
00037 {
00038   AccelItem *item = newAccelItem( _menu, itemId, StringAccel ) ;
00039   item->action  = QString::fromLocal8Bit( action );
00040 }
00041 
00042 void KAccelMenuWatch::connectAccel( int itemId, KStdAccel::StdAccel accel )
00043 {
00044   AccelItem *item = newAccelItem( _menu, itemId, StdAccel ) ;
00045   item->stdAction  = accel;
00046 }
00047 
00048 void KAccelMenuWatch::updateMenus()
00049 {
00050   assert( _accel != 0 );
00051 
00052   QPtrListIterator<AccelItem> iter( _accList );
00053   AccelItem *item;
00054 
00055   for( ; (item = iter.current()) ; ++iter ) {
00056     // These setAccel calls were converted from all changeMenuAccel calls
00057     // as descibed in KDE3PORTING.html
00058     switch( item->type ) {
00059       case StringAccel:
00060         item->menu->setAccel( _accel->shortcut( item->action ).keyCodeQt(), item->itemId );
00061         break;
00062       case StdAccel:
00063         item->menu->setAccel( KStdAccel::shortcut( item->stdAction ).keyCodeQt(), item->itemId );
00064         break;
00065       default:
00066         break;
00067     }
00068   }
00069 
00070 }
00071 
00072 void KAccelMenuWatch::removeDeadMenu()
00073 {
00074   QPopupMenu *sdr = (QPopupMenu *) sender();
00075   assert( sdr );
00076 
00077   if ( !_menuList.findRef( sdr ) )
00078     return;
00079 
00080   // remove all accels
00081 
00082   AccelItem *accel;
00083   for ( accel = _accList.first(); accel; accel = _accList.next() )
00084   {
00085 loop:
00086     if( accel && accel->menu == sdr ) {
00087       _accList.remove();
00088       accel = _accList.current();
00089       goto loop;
00090     }
00091   }
00092 
00093   // remove from menu list
00094   _menuList.remove( sdr );
00095 
00096   return;
00097 }
00098 
00099 KAccelMenuWatch::AccelItem *KAccelMenuWatch::newAccelItem( QPopupMenu *,
00100     int itemId, AccelType type )
00101 {
00102   AccelItem *item = new AccelItem;
00103 
00104   item->menu  = _menu;
00105   item->itemId  = itemId;
00106   item->type  = type;
00107 
00108   _accList.append( item );
00109 
00110   return item;
00111 }
00112 
00113 #include "kaccelmenuwatch.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys