/********************f*******************************************************
                          dockwidget.h  -  description
                             -------------------
    begin                : Mon Apr 23 2001
    copyright            : (C) 2001 by Dieter Landolt
    email                : dieter.landolt@secs.ch
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef DOCKWIDGET_H
#define DOCKWIDGET_H

#include <qwidget.h>
#include <ksystemtray.h>
#include <kstandarddirs.h>
#include <qfileinfo.h>

// #include <kiconloader.h>

#include <qwidget.h>
#include <qpixmap.h>
#include <qtimer.h>
#include <qevent.h>
#include <qmovie.h>

class QPoint;

/**Das Widget welches ins Panel eindocken soll
  *@author Dieter Landolt
  */

class DockWidget : public KSystemTray  {
   Q_OBJECT
public: 
  /**
   * Type off Keyboard Led
   *
  */
  enum Type {Numlock, Capslock, Scrollock };
	
   DockWidget(QWidget *parent=0,
	           const char *name=0,
	           DockWidget::Type type=DockWidget::Capslock);
   ~DockWidget();
	
  /**
   * Status of the light is on/off.
   * @short LED on/off.
   */
  enum State { Off=false, On=true, Undeff=-10 };

  /**
   * Sets the state of the widget to On or Off.
   *
   * The widget will be painted immediately.
   * @see on() off() toggle() toggleState()
   *
   * @param state The LED state: on or off.
   * @short Set LED state.
   */
  // void setState( State state );
  void toggleState();
  /** Overwrites the default Mouse Event */
  void mousePressEvent(QMouseEvent *e);
  /** Ask if is locked or not */
  bool isLocked() {
    return keylocked;
  }

public slots:
  /**
   * Sets the state of the widget to On or Off.
   *
   * The widget will be painted immediately.
   * @see on() off() toggle() toggleState()
   *
   * @param state The LED state: on or off.
   * @short Set LED state.
   */
  void setState( State state );

  /**
   * Toggle the state of the led from Off to On or vice versa.
   *
   * The widget repaints itself immediately.
   */
  void toggle();
  void toggle(int);

  /**
   * Sets the state of the widget to On.
   *
   * The widget will be painted immediately.
   * @see off() toggle() toggleState() setState()
   */
  void on();

  /**
   * Sets the state of the widget to Off.
   *
   * The widget will be painted immediately.
   * @see on() toggle() toggleState() setState()
   */
  void off();

  /**
   * Checks the State of the Global Numlock... Items
   *
   * Set the State to the state of the Keyboard
   * @see on() toggle() toggleState() setState()
   */

    /*!
        MovieButton::slotStatus(int state)
	Needes for Workaround an Infinite Loop on MNG Files 
	to Workaround a bug by QT
     */
    void slotStatusOn(int state)
    {
    if (state == QMovie::EndOfLoop)
         movOn.pause();
    }
    void slotStatusOff(int state)
    {
    if (state == QMovie::EndOfLoop)
         movOff.pause();
    }
    // QT End Workarournd
  void checkState();
  /** uses the hide or show dependig from bool show */
  virtual void changeVisible(int s);
  /** Paints a Iconon into a pixmap and returns it to the caller.
It's the default icon, witch can be used. */
  static QPixmap paintIcon(State state);
  /** return the state for the led */
  bool getState();
  /** read's the configuration after change is notified */
  void readConfig();
  /** to set the key locked or unlockef */
  void setlocked(bool state);
  /** Lets Paint */
    /*!
        DockWidget::lockOn()
     */
    void lockOn()
    {
        setlocked(true);
	repaint();
    }

    /*!
        \fn DockWidget::lockOff()
     */
    void lockOff()
    {
        setlocked(false);
	repaint();
    }

    /*!
        \fn DockWidget::lockToggle()
     */
    void lockToggle()
    {
        setlocked(! keylocked);
	repaint();
    }
protected slots: // Protected attributes
  void paintEvent(QPaintEvent *ev);
private:
  State led_state;
  Type  led_type;
  QString *sname;
    /*!
        \fn kkeyleddtlcfg::locate(QString type, QString filename)
	I build the funktion with the return QString::null if file is not found
     */
    QString locate(QString type, QString filename)
    {
	QFileInfo fi;
	fi.setFile(KGlobal::dirs()->findResource(type,filename));
	if ( fi.isFile() ) {
		return fi.absFilePath();
	} else {
		return QString::null;
	}
    }

signals: // Signals
  /** tels to all that the state is changed */
  void stateChanged(bool);
private slots: // Private slots
  /** Handels the Contextmenu */
  virtual void menuHandler(int menuitem);
public: // Public attributes
  /** The effektive Position of the widget in the Panel after a Mousbutton is pressed */
  static QPoint *globalPos;
protected: // Protected attributes
  /** Holds the pixmap for the off state */
  QPixmap pixOff;
  /** Holds the pixmap for the on State */
  QPixmap pixOn;
  /** Holds the soundpath for the off state */
  QString soundOffPath;
  /** Holds the soundpath for the on State */
  QString soundOnPath;
  /** idendifies if it should use the pixmaps or draw the led internali */
  bool usepixmap;
  /** idendifies if it should use the sound or be quiet */
  bool usesounds;
  /** is set if the button shold lock the state */
  bool keylocked;
  /** Holds the movie for the off State */
  QMovie movOff;
  /** Holds the movie for the on State */
  QMovie movOn;
};

#endif
