00001
00002
00003
00004
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
00026
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
switch( item->type ) {
00057
case StringAccel:
00058 _accel->changeMenuAccel( item->menu, item->itemId, item->action );
00059
break;
00060
case StdAccel:
00061 _accel->changeMenuAccel( item->menu, item->itemId, item->stdAction );
00062
break;
00063
default:
00064
break;
00065 }
00066 }
00067
00068 }
00069
00070
void KAccelMenuWatch::removeDeadMenu()
00071 {
00072
QPopupMenu *sdr = (
QPopupMenu *) sender();
00073 assert( sdr );
00074
00075
if ( !_menuList.findRef( sdr ) )
00076
return;
00077
00078
00079
00080 AccelItem *accel;
00081
for ( accel = _accList.first(); accel; accel = _accList.next() )
00082 {
00083 loop:
00084
if( accel && accel->menu == sdr ) {
00085 _accList.remove();
00086 accel = _accList.current();
00087
goto loop;
00088 }
00089 }
00090
00091
00092 _menuList.remove( sdr );
00093
00094
return;
00095 }
00096
00097 KAccelMenuWatch::AccelItem *KAccelMenuWatch::newAccelItem(
QPopupMenu *,
00098
int itemId, AccelType type )
00099 {
00100 AccelItem *item =
new AccelItem;
00101
00102 item->menu = _menu;
00103 item->itemId = itemId;
00104 item->type = type;
00105
00106 _accList.append( item );
00107
00108
return item;
00109 }
00110
00111
#include "kaccelmenuwatch.moc"