/***************************************************************************
                          knutdock.h  -  description
                             -------------------
    begin                : �t zari 23 2003
    copyright            : (C) 2003 by Daniel Prynych
    email                : Daniel.Prynych@alo.cz
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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 KNUTDOCK_H
#define KNUTDOCK_H

#include "knutupsdata.h"
#include "knutvardata.h"
#include "knutconst.h"


#include <ksystemtray.h>
#include <kpopupmenu.h>

#include <tqobject.h>


class TQString;
class TQPixmap;
class TQColor;

/**
 * This class makes icons in dock.
 * Tato trida zajistuje vytvoreni icony v docku.
 *
 * @author Daniel Prynych
 * @short Dock's icons
 * @version 0.3
  */
class KNutDock : public KSystemTray  {
  Q_OBJECT
  
  public:

  enum KNTDconst { DefaultToolTipFlags = 0x398};


  enum upsConnection {
   idle, // ups isn't connected
   connecting, // ups is connecting
   ok, // ups is connected
   error // error of connecting
   };

  enum eTypeOfIcons { pictureKI = 0, generalKI};


  enum toolTipItems {
   TTMFR = 0x8, // 8,    // FRM
   TTModel = 0x10, // 16,    // Model
   TTSerial = 0x20, // 32,    // Serial
   TTFirm = 0x40, //64,    // Firmware Revision
   TTRun = 0x80,// 128,    // Runtime
   TTCharge = 0x100, // 256,    // Charge
   TTLoad = 0x200 // 512    // Load
   };




/**
 * Constructor - makes icon in dockbar.
 * Konstruktor - vytvori iconu v docku.
 *
 * @param  activeUpsInfo odkaz na structuru upsInfo
 * @param  activeUpsInfo pointer to structure upsInfo
 * @param  settingData  odkaz na strukturu typu SettingDataDef
 * @param  settingData  pointer to structure type of SettingDataDef
 * @param  upsRecord odkaz na instanci tridy tActiveUpsInfo
 * @param  upsRecord pointer to class tActiveUpsInfo
 * @since  0.3
 */
    KNutDock(KNutVarData::upsInfoDef* activeUpsInfo, KNutVarData::SettingDataDef* settingData, KNutUpsData* upsRecords);

/**
 * Destruktor.
 *
 * @since  0.1.2
 **/
    ~KNutDock();


/**
 * Nastavi zakladni nastaveni pro dock.
 * Sets basic setting for dock.
 *
 * @since  0.1
 **/
 void clearDockValues(void);


/**
 * Vytvori menu (seznam) UPS.
 * Makes menu (list) of UPS.
 *
 * @since  0.1
 **/
  void changeUps(void);


/**
 * Zmeni styl/typ icon
 * Changes style/type of icon
 *
 * @since  0.1
 **/
  void changeKIcon (void);

/**
 * Zmeni pozadi icony v kickeru
 * Changes background of icon in kicker
 *
 * @since  0.2
 **/
  void changeKIBColor(void);


/**
 * Zmeni prvky v tooltip-u
 * Changes items in toolTip
 *
 * @since  0.1
 **/
 void changeToolTip(void);

/**
 * Provede nove zpracovani dat a jejich nakresli iconu docku, interni repaint je volan vzdy.
 * Tato funkce take vola funkci ToolTip.
 * Makes new processing of data and paints icons of dock, internal repaint is colled always.
 * This function calls function ToolTips too.
 * @param always Kdyz je true prorovede vykresleni vzdy, kde je false provede vykresleni jen kdyz je zmenena nejaka hodnota UPS.
 * @param always When param is true, icon is made always, is one is false icon is makeing when same UPS's value is changed.
 *
 * @since  0.4
 **/
  void repaintDock ( const bool always = false);



/**
 * Nastavi v Menu oznaceni pro aktivni UPS.
 * Sets mark for active UPS in menu.
 *
 * @since  0.1
 **/
  void setNewUPS(void);




 signals:
/**This signal is emited when end of application was selected in menu.
 * Tento signal je vyslan pokud bylo vybrano v menu ukonceni aplikace.
 *
 *
 * @since  0.1
 **/
  void endApplication(void);

/**
 * Tento signal je vyslan pokud bylo vybrano v menu minimalizace aplikace.
 * Tento signal is emited when minimize application was selected in menu.
 *
 *
 * @since  0.1
 **/
  void minimize(void);

/**
 * Tento signal je vyslan pokud bylo vybrano v menu polozka preferences.
 * This signal is emited when item preferences was selected in menu.
 *
 * @since  0.1
 **/
  void preferences(void);



/**
 * Tento signal je vyslan pokud byla vybrana activace hlavniho okna (Main Window).
 *
 * @since  0.1
 **/
  void activeMainWindow(void);


/**
 * Tento signal je vyslan pokud bylo vybrano zobrazeni promennych;
 * This signal is emited when showing values was selected.
 *
 * @since  0.1
 **/
  void printUPSVars(void);

/**
 * Tento signal je vyslan pokud bylo vybrano provedeni okamziteho prikazu;
 * This signal is emited when running instant command was selected.
 *
 * @since  0.1
 **/
  void instComms(void);

/**
 * Tento signal je vyslan pokud bylo vybrana zmena RW promennych.
 * This signal is emited when change of RW values was selected.
 *
 * @since  0.1
 **/
  void RWVars(void);

/**
 * Tento signal je vyslan pokud bylo vybrana zmena RW promennych.
 * This signal is emited when refresh connection was selected
 *
 * @since  0.1
 **/
  void makeRefreshConnection(void);


/**
 * Tento signal je vyslan pokud je vybrana nova UPS;
 * This signal is emited when new UPS is selected
 *
 * @since  0.1
 **/
  void UPSChanged(TQString name);


  protected slots:

  virtual void mousePressEvent(TQMouseEvent *e);

/**
 * @internal
 * Vola proceduru KAboutApplication, zobrazi informace o teto aplikaci a KDE.
 * Calls procedure KAboutApplication, shows informations about this application and KDE.
 *
 * @since  0.1
 **/
  void slotShowMyAbout();
  void slotExitApplication (void);

/**
 * @internal
 * Vysle signal minimize.
 * Sends signal minimize.
 *
 * @since  0.1
 **/
  void slotMinimize (void);


/**
 * @internal
 * Vysle signal peferences.
 * Sends signal preferences.
 *
 * @since  0.1
 **/
  void slotPreferences (void);

/**
 * @internal
 * Vysle signal printUPSVars.
 * Sends signal printUPSVars.
 *
 * @since  0.1
 **/
  void slotPrintUPSVars(void);

/**
 * @internal
 * Vysle signal instComms.
 * Sends signal instComms.
 *
 * @since  0.1
 **/
  void slotInstComms(void);


/**
 * @internal
 * Vysle signal RWVars.
 * Sends signal RWVars.
 *
 * @since  0.1
 **/
  void slotRWVars(void);

/**
 * @internal
 * Vysle signal upsName
 * Sends signal upsName.
 *
 * @since  0.1
 **/
  void slotUpsName(int i);

/**
 * @internal
 * Vysle signal makeRefreshConnection
 * Sends signal makeRefreshConnection.
 *
 * @since  0.1
 **/
  void slotRefreshConnection(void);


  protected:
/**
 * @internal
 * Nastavi vse pro vykresleni zakladni ikony.
 * Tato ikona je kreslena dokud neni navazano spojeni
 * Sets all for painting of basic icon.
 * This icon is painted
 *
 * @since  0.2
 **/
  void initImage(void);



/**
 * @internal
 * Sets tooltip.
 * Nastavi ToolTip.
 *
 * @since  0.1
 **/
    void toolTip (int runtime, int status, int batteryCharge, int upsLoad );


/**
 * @internal
 * Vytvori a hlavni menu panelu.
 * Makes a main menu of panel
 *
 * @since  0.1
 **/
    void createMainMenu(void);

/**
 * @internal
 * Vytvori a podmenu pro seznam UPS-ek.
 * Makes a  submenu for list ig UPSes.
 *
 * @since  0.1
 **/
    void createUpsMenu(void);

/**
 * @internal
 * Paints a numbers.
 * Vykresli cisla.
 * @param number je hodnota cisla.
 * @param x je leva souradnice cisla
 * @param y je horni souradnice cisla
 * @param p je ukazatel na painter
 *
 * @since  0.2
 **/
    void paintNumbers (int numbers, int x, int y, TQPainter* p, float sizeMult ); //x,y levy horni roh cisla 1

/**
 * @internal
 * Paints a number
 * Vykresli cislici.
 * @param number je hodnota cislice.
 * @param x je leva souradnice cislice
 * @param y je horni souradnice cislice
 * @param p je ukazatel na painter
 *
 * @since  0.1
 **/
    void paintNumber (int x, int y, int number, TQPainter *p, float sizeMult);

/**
 * @internal
 * Paints a char.
 * Vykresli znak.
 * @param x je leva souradnice cislice
 * @param y je horni souradnice cislice
 * @param p je ukazatel na painter
 * @param char je vykreslovany znak.
 *
 * @since  0.1
 **/
    void paintChar (int x, int y, char LCDChar, TQPainter *p);


/**
 * @internal
 * Vykresli pomlcku.
 * @param x je leva souradnice pomlcky
 * @param y je horni souradnice pomlcky
 * @param p je ukazatel na painter
 *
 * @since  0.1
 **/
    void paintDash (int x, int y, TQPainter *p, float sizeMult);


/**
 * @internal
 * Paints runtime layer.
 * Vykresli vrstvu runtime.
 *
 * @since  0.1
 **/
    void paintRuntime (int runtime, int status);

/**
 * @internal
 * Paints layer for UPS Load
 * Vykresli vrstvu pro UPS Load.
 *
 * @since  0.2
 **/
    void paintLoad (int load );

/**
 * @internal
 * Paints layer for Battery Charge, only for type general.
 * Vykresli vrstvu pro Battery Charge.
 *
 * @since  0.2
 **/
    void paintCharge (int charge );

/**
 * @internal
 * Paints layer for UPS Status, only for type general
 * Vykresli vrstvu pro UPS Status.
 *
 * @since  0.2
 **/
    void paintStatus (int status );


    void paintEvent (TQPaintEvent *);

/**
 * @internal
 * Paints green point into main layer, only for type picture.
 * Vykresli do hlavni vrstvy zeleny bod.
 * Ma vyznam jen pro typ picture.
 *
 * @since  0.3
 **/
    void paintErrorPoint ( TQPainter& paint );

/**
 * @internal
 * Paints red point into main layer, only for type picture.
 * Vykresli do hlavni vrstvy cerveny bod.
 * Ma vyznam jen pro typ picture.
 *
 * @since  0.3
 **/
    void paintOKPoint ( TQPainter& paint );

/**
 * @internal
 * Clean internal variables this class.
 * Vycisti interni promene teto tridy.
 *
 * @since  0.1
 **/
  void clearValues(void);

  void resizeEvent ( TQResizeEvent * );


    KNutUpsData* m_upsRecords;
    KNutVarData::SettingDataDef* m_settingData;  // v teto strukture jsou ulozeny promene ktere nastavuji konfiguraci
    KNutVarData::upsInfoDef* m_activeUpsInfo; // values for selected ups

    TQPixmap m_mainPix;
    TQPixmap m_errorPix;
    TQPixmap m_connectPix;
    TQPixmap m_upsPix;
    TQPixmap m_battPix;

    TQPixmap m_mainLayer1;

    TQColor backgroundColor;

    KPopupMenu* m_menu;
    KPopupMenu* m_upsServerMenu;

    TQPixmap *m_statusLayer;
    TQPixmap *m_runtimeLayer;
    TQPixmap *m_loadLayer;
    TQPixmap *m_chargeLayer;
    TQPixmap *m_mainLayer;

    int m_runtimeValue;
    int m_upsLoadValue;
    int m_batteryChargeValue;
    int m_statusValue;
    int m_statusBatValue;
    int m_statusWarningValue;


    upsConnection m_dataOk; // selects one from four type of icons's view //idle, connecting, connected, error
    upsConnection m_dataOkOld;

    int m_typeOfIcon;
    TQColor m_myBGColor;
    unsigned int m_toolTipFlags;

};

#endif