/*
 *  Copyright (c) 2004 Gunnar Schmi Dt <gunnar@schmi-dt.de>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 */

#ifndef __kbstate_h__
#define __kbstate_h__

#include <kpanelapplet.h> 
#include <qpushbutton.h>
#include <qptrlist.h>
#include <qtimer.h>
     
class QLabel;      
class QGridLayout;
class KPopupMenu;

class StatusIcon : public QPushButton {
   Q_OBJECT
public:
   StatusIcon (const QString &text, QWidget *parent, const char *name=0);
   ~StatusIcon ();

   QSize minimumSizeHint () const;
};
typedef QPtrList<StatusIcon> IconList;

class TimeoutIcon : public StatusIcon {
   Q_OBJECT
public:
   TimeoutIcon (KInstance *instance, const QString &text, QWidget *parent, const char *name=0);
   ~TimeoutIcon ();

   void update ();
   void setGlyth (const QString &glyth);
   void setImage (const QString &name, int timeout = 0);

   void drawButton (QPainter *p);

private:
   QString glyth;
   QString iconname;
   QPixmap pixmap;
   QPixmap image;
   QTimer timer;
   KInstance *instance;
   
private slots:
   void timeout ();
};

class KeyIcon : public StatusIcon {
   Q_OBJECT
public:
   KeyIcon (int keyId, KInstance *instance,
            QWidget *parent, const char *name=0);
   ~KeyIcon ();
   void setState (bool latched, bool locked);
   void drawButton (QPainter *p);
   void updateImages ();

signals:
   void stateChangeRequest (KeyIcon *source, bool latched, bool locked);

protected:
   void resizeEvent(QResizeEvent*);

private slots:
   void clickedSlot();

private:
   QPixmap locked;
   QPixmap latched;
   QPixmap unlatched;
   bool    isLatched;
   bool    isLocked;
   bool    tristate;
   int     keyId;
   KInstance *instance;
};

class KbStateApplet : public KPanelApplet {
   Q_OBJECT

public:
   KbStateApplet(const QString& configFile, Type t = Normal, int actions = 0,
              QWidget *parent = 0, const char *name = 0);
   ~KbStateApplet();

   int widthForHeight(int height) const;
   int heightForWidth(int width) const;

protected:
    void mousePressEvent(QMouseEvent *e);
    void timerEvent(QTimerEvent*);
    void resizeEvent(QResizeEvent*);
    bool x11Event (XEvent *);

public slots:
   void about();
   void configureAccessX();
   void toggleModifier ();
   void toggleLockkeys ();
   void toggleSlowkeys ();
   void paletteChanged();

private slots:
   void setIconDim (int size);
   void stateChangeRequest (KeyIcon *source, bool latched, bool locked);

private:
   void loadConfig();
   void saveConfig();
   void layout();
   
   int xkb_base_event_type;

   KeyIcon *(icons[8]);
   IconList modifiers;
   IconList lockkeys;
   TimeoutIcon *slow;
   TimeoutIcon *bounce;
   
   int state;
   int size;
   
   void initMasks();

   void buildPopupMenu();
   void updateMenu();
   KPopupMenu *popup;
   KPopupMenu *sizePopup;
   KPopupMenu *showPopup;
   int modifierItem, lockkeysItem, slowkeysItem;
   bool showModifiers, showLockkeys, showSlowkeys;

   KInstance *instance;
};

#endif // __kbstate_h__
