tdeaccelmenuwatch.cpp
00001 /* 00002 * tdeaccelmenuwatch.cpp -- Implementation of class TDEAccelMenuWatch. 00003 * Author: Sirtaj Singh Kang 00004 * Generated: Thu Jan 7 15:05:26 EST 1999 00005 */ 00006 00007 #include <assert.h> 00008 #include <tqpopupmenu.h> 00009 00010 #include "tdeaccelmenuwatch.h" 00011 00012 TDEAccelMenuWatch::TDEAccelMenuWatch( TDEAccel *accel, TQObject *parent ) 00013 : TQObject( parent ), 00014 _accel( accel ), 00015 _menu ( 0 ) 00016 { 00017 _accList.setAutoDelete( true ); 00018 _menuList.setAutoDelete( false ); 00019 } 00020 00021 void TDEAccelMenuWatch::setMenu( TQPopupMenu *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, TQT_SIGNAL(destroyed()), this, TQT_SLOT(removeDeadMenu()) ); 00031 } 00032 00033 _menu = menu; 00034 } 00035 00036 void TDEAccelMenuWatch::connectAccel( int itemId, const char *action ) 00037 { 00038 AccelItem *item = newAccelItem( _menu, itemId, StringAccel ) ; 00039 item->action = TQString::fromLocal8Bit( action ); 00040 } 00041 00042 void TDEAccelMenuWatch::connectAccel( int itemId, TDEStdAccel::StdAccel accel ) 00043 { 00044 AccelItem *item = newAccelItem( _menu, itemId, StdAccel ) ; 00045 item->stdAction = accel; 00046 } 00047 00048 void TDEAccelMenuWatch::updateMenus() 00049 { 00050 assert( _accel != 0 ); 00051 00052 TQPtrListIterator<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( TDEStdAccel::shortcut( item->stdAction ).keyCodeQt(), item->itemId ); 00064 break; 00065 default: 00066 break; 00067 } 00068 } 00069 00070 } 00071 00072 void TDEAccelMenuWatch::removeDeadMenu() 00073 { 00074 TQPopupMenu *sdr = (TQPopupMenu *) 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 TDEAccelMenuWatch::AccelItem *TDEAccelMenuWatch::newAccelItem( TQPopupMenu *, 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 "tdeaccelmenuwatch.moc"