/*
* tdeaccelmenuwatch.h -- Declaration of class TDEAccelMenuWatch.
* Generated by newclass on Thu Jan  7 15:05:26 EST 1999.
*/
#ifndef KARM_TDE_ACCEL_MENU_WATCH_H
#define KARM_TDE_ACCEL_MENU_WATCH_H

#include <tqobject.h>
#include <tqptrlist.h>

#include <tdeaccel.h>

class TQPopupMenu;

/**
 * Easy updating of menu accels when changing a TDEAccel object. 
 *
 * Since a TDEAccel object does not keep track of menu items to which it
 * is connected, we normally have to manually call 
 * TDEAccel::changeMenuAccel() again for each update of the TDEAccel object.
 *
 * With TDEAccelMenuWatch you provide the tdeaccel object and the menu
 * items to which it connects, and if you update the tdeaccel you just have
 * to call TDEAccelMenuWatch::updateMenus() and the menu items will be updated.
 *
 * It is safe to delete menus that have connections handled by this class.
 * On deletion of a menu, all associated accelerators will be deleted.
 *
 * Note that you _have_ to call TDEAccelMenuWatch::updateMenus() after you
 * connect the * accelerators, as they are not activated till then.
 * 
 * @author Sirtaj Singh Kang (taj@kde.org)
 */

class TDEAccelMenuWatch : public TQObject
{
  Q_OBJECT
  

  private:
    enum AccelType { StdAccel, StringAccel };

    typedef struct AccelItem {
      TQPopupMenu  *menu;
      int itemId;

      AccelType type;

      // only one of these is used at a time
      TQString action;
      TDEStdAccel::StdAccel stdAction;
    } AccelItem;

    TDEAccel *_accel;
    TQPtrList<AccelItem> _accList;
    TQPtrList<TQPopupMenu> _menuList;

    TQPopupMenu  *_menu;

    TDEAccelMenuWatch::AccelItem *newAccelItem( TQPopupMenu *menu, 
                                              int itemId, AccelType type );

  public:
    /**
     * TDEAccelMenuWatch Constructor
     */
    TDEAccelMenuWatch( TDEAccel *accel, TQObject *parent = 0 );

    /**
     * TDEAccelMenuWatch Destructor
     */
    virtual ~TDEAccelMenuWatch() {}

    /** 
     * Set the menu on which connectAccel calls will operate.
     * All subsequent calls to connectAccel will be associated
     * with this menu. You can call this function any number of
     * times, so multiple menus can be handled.
     */
    void setMenu( TQPopupMenu *menu );

    /** 
     * Return the last menu set with TDEAccelMenuWatch::setMenu(TQPopupMenu*),
     * or 0 if none has been set.
     */
    TQPopupMenu *currentMenu() const  { return _menu; }

    /** 
     * Connect the menu item identified to currentMenu()/id to
     * the accelerator action.
     */
    void connectAccel( int itemId, const char *action );

    /** 
     * Same as above, but connects to standard accelerators.
     */
    void connectAccel( int itemId, TDEStdAccel::StdAccel );
  
  public slots:
    /** 
     * Updates all menu accelerators. Call this after all accelerators
     * have been connected or the tdeaccel object has been updated.
     */
    void updateMenus();

  private slots:
    void removeDeadMenu();

  private:
    TDEAccelMenuWatch& operator=( const TDEAccelMenuWatch& );
    TDEAccelMenuWatch( const TDEAccelMenuWatch& );
};

#endif // KARM_K_ACCEL_MENU_WATCH_H
