/**
 * Konzept für einen Touchscreen-Support für den vdr
 * Ausgangspunkt ist das GraphTFT-Plugin
 * Analyse GraphTFT-Plugin 0.0.8:
 * Das Graph-TFT-Plugin installiert zunächst ein Object der Klasse
 * cGraphTFTdisplay. Ebenfalls zu Beginn werden geladen:
 * - ein cGraphTFTSetup zum lesen der Setup-Daten
 * - ein cGraphTFTTheme zum behandeln der Ausgaben
 * Entscheidend ist also das cGraphTFTdisplay.
 * Es stellt verschiedene Menümasken auf dem TFT dar.
 * Diese sind in Maskenselektoren definiert (DisplayMode).
 * Über die verschiedenen Display-Methoden stellt das Plugin
 * Informationen auf dem Bildschirm dar. Alle Darstellungen sind
 * direkt mit koordinaten versehen.
 * 
 * Hier besteht der erste Ansatzpunkt:
 * Bislang ist das GraphTFT-Plugin eine Einbahnstrasse, besitzt also
 * nur ausgebende Eigenschaften. Ein Touchscreen besitzt aber einen 
 * Ereigniskanal auf der Basis von ???. Hier setzen wir Bildschirmkoordinaten
 * an. Also: Es gibt nicht nur "DisplayObjects" sondern "ToucheableObjects"
 * mit einer verbundenen Aktion. Die Themes geben uns die Möglichkeit, die 
 * Items auf dem Bildschirm zu verteilen.
 * 
 * Auswahl der Display-Objects mit Touchereignis:
 * - DisplayMenuButton (0..3 = Farbbutton)
 *
 * Belassen wir es zunächst beim Behandeln von Buttons.
 * Wenn ein Menü/Bild eingeblendet wird, wird zuhnächst mittels DisplayClear
 * das aktuelle Bild entfernt und dann je nach Theme wieder aufgebaut.
 * Dies nutzen wir zum Entfernen aller "cTouchObjects". 
 * Ein cTouchObject wird dann in den entsprechenden Aufrufen mit 
 * Touchereignissen in die Liste der Touchobjekte eingetragen.
 *
 * Definition der Ereignisse:
 * Wie kann ein Touchereignis in den VDR eingespielt werden.
 * -> Der Touchscreen liefert als Mausereignis eine Koordinate und ein 
 * "Touch" oder "Detouch" -Ereignis.
 * -> Das Toucheable Object wird an der Koordinate erkannt.
 * ->Dem Toucheable Object kann hinterlegt werden, ob es auf "Touch" oder "Detouch" reagieren soll.
 * ->Ein Toucheable Object sollte eine Rückmeldung beim Touch (invertieren?)geben.
 * -> Wenn ein Ereignis anliegt und ausgelöst werden soll:
 * Das Plugin hat zu dem Button ein VDR-Kommando hinterlegt (LIRC)
 * Dieses Kommando ist im Theme mit hinterlegt, die Umsetzung in das 
 * LIRC-Kommando erfolgt anhand des Strings (wie im LIRC.CONF)
 */

/// wir nutzen ein paar std-templates (list, iterator)
#ifndef TOUCH_H
#define TOUCH_H

#include <string>

#include <vdr/osd.h>

#include "touchdriver.h"
#include "setup.h"

/****************************************************************/
class cTouchScreenEnhancer
{
 public:
  /// Konstruktor
  cTouchScreenEnhancer(void);

  /// und Destruktor
  virtual ~cTouchScreenEnhancer(void);

  /**
   * Liefert true, wenn das Objekt korrekt erzeugt wurde
   */
  bool IsOk(void);
  
  /**
   * Aufrumen gehrt zum guten Ton
   */ 
  void Housekeeping(); 
  
  /**
   * Initialisiert den Touch-Device usw.
   */
  void Initialize(void);

  /**
   * Methode: Display wurde gelöscht (alle Objekte entfernen)
   */  
  void Clear(void);

  /**
   * Der Touch wurde betätigt. Touched liefert :
   * true, falls gedrückt, 
   * false, falls losgelassen
   */
  void TouchEvent(int x, int y, bool Touched);

private:

  bool oncestarted;
  void scaletoscreen(int x, int y, int &x, int& y );
  
  cTouchDriver* mTouchDriver;
};

#endif
