//////////////////////////////////////////////////////////////////////
//
//  SPINCOL.PRG
//
//  Copyright:
//      Alaska Software, (c) 1999-2002. Alle Rechte vorbehalten.         
//  
//  Inhalt:
//      Das Beispiel implementiert die XbpSpinbuttonColumn Klasse, die
//      einen Spinbutton zum Editieren einzelner Zellen in einem
//      XbpBrowse Objekt verwendet (Editieren von Ganzzahlen bzw. Integers).
//   
//      Der Spinbutton wird durch die Klasse XbpGetSpinbutton bereitgestellt,
//      welche ebenfalls in dieser Datei implementiert ist.
//   
//  Bemerkungen:
//   
//      Die folgenden Programmiertechniken werden demonstriert:
//     
//      1. Wie man eine Klasse von der XbpGetColumn Klasse ableitet um
//         anstelle von XbpGet einen anderen Xbase Part zum Editieren
//         im Browser zu verwenden.
//     
//      2. Wie man die Tastaturverarbeitung von XbpSpinbutton aendern kann.
//   
//////////////////////////////////////////////////////////////////////

#include "Appevent.ch"
#include "Common.ch"
#include "Xbp.ch"


CLASS XbpSpinbuttonColumn FROM XbpGetColumn
   PROTECTED:
   VAR    spinbutton IS xbpGet IN XbpGetColumn
   VAR    aMinMax

   EXPORTED:   
   METHOD init
   METHOD createXbp
   METHOD setNumLimits
ENDCLASS


/*
 * Objekt initialisieren
 */
METHOD XbpSpinbuttonColumn:init( p1, p2, p3, p4, p5, p6 )
   ::xbpGetColumn:init( p1, p2, p3, p4, p5, p6 )
   ::aMinMax := { 0, 99999 }
RETURN self


/*
 * Erzeuge anstelle von XbpGet ein XbpSpinbutton Objekt und weise den
 * :dataLink Codeblock zu.
 *
 * Hinweis: die Instanzvariable :spinbutton ist eigentlich in der Superklasse
 *          als :xbpGet deklariert, aber in dieser Klasse umbenannt worden.
 *          Dadurch wird der Code besser lesbar.
 */
METHOD XbpSpinbuttonColumn:createXbp
   ::spinbutton            := XbpGetSpinbutton():new( ::dataArea, ::dataArea, NIL, NIL, NIL, .F. )
   ::spinbutton:controller := self
   ::spinbutton:dataLink   := ::dataLink
   ::spinbutton:create()
   ::spinbutton:setNumLimits( ::aMinMax[1], ::aMinMax[2] )
RETURN self


/*
 * Sichere die Min/max Werte und uebertrage sie an den Spinbutton
 * falls er schon existiert.
 */
METHOD XbpSpinbuttonColumn:setNumLimits( nMin, nMax )
   ::aMinMax := { nMin, nMax }
   IF ::spinbutton <> NIL
      ::spinbutton:setNumLimits( ::aMinMax[1], ::aMinMax[2] )
   ENDIF
RETURN self


******************************************************************************
/*
 * Spinbutton Klasse mit ueberladener :keyboard() Methode. Dadurch koennen die
 * xbeK_UP, xbeK_DOWN Tasten zur Browsernavigation verwendet werden.
 * Der Spinbutton reagiert stattdessen auf xbeK_ALT_UP, xbeK_ALT_DOWN
 */

CLASS XbpGetSpinbutton FROM XbpSpinbutton
   EXPORTED:
   VAR    controller
   METHOD keyboard
ENDCLASS


METHOD XbpGetSpinbutton:keyboard( nKey )
   DO CASE
   /*
    * Der Spinbutton reagiert bei xbeK_ALT_UP oder xbeK_ALT_DOWN genau so
    * als waere xbeK_UP oder xbeK_DOWN gedrueckt worden.
    */
   CASE nKey == xbeK_ALT_UP
      ::xbpSpinbutton:keyboard( xbeK_UP )

   CASE nKey == xbeK_ALT_DOWN
      ::xbpSpinbutton:keyboard( xbeK_DOWN )

   CASE ::controller == NIL .OR. .NOT. ::controller:keyboard( nKey )
      /*
       * xbeK_UP und xbeK_DOWN werden vom :controller Objekt
       * (XbpSpinbuttonColumn) an den Browser weitergeleitet und der
       * fuehrt bei UP/DOWN eine Navigation durch. Alle Tasten, die
       * nicht vom :controller Objekt behandelt werden, uebernimmt
       * XbpSpinbutton.
       */
      ::xbpSpinbutton:keyboard( nKey )

   ENDCASE
RETURN self
