karm Library API Documentation

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     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   // remove all accels
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   // remove from menu list
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"
KDE Logo
This file is part of the documentation for karm Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:37:52 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003