// Copyright (c) 1993-2005 "Компания БЭСТ". Все права сохраняются.

#include "buttoms.ch"
#include "inkey.ch"
#include "s_public.ch"

STATIC aPrompt := {}, ;
       aButColor,;
       lButShadow
/***
*
* эмуляция кнопок
*
*/
PROCEDURE CreateButtom(nRow, nCol, cStr)
  LOCAL aArray[SIZE]
  LOCAL nAt := AT( '^', cStr )
  IF nAt == 0
    nAt := POSRANGE( ' ', ' ', cStr, .T. ) // Ищем первый символ после пробела
  ELSE
    cStr := POSDEL( cStr, nAt, 1 )+' '
  ENDIF

  // формирование символьной строки
  aArray[BUT_STR] := cStr                     // Сообщение
  aArray[LEN_A]   := LEN(aArray[BUT_STR])     // Его длина
  aArray[LET_COL] := nCol + nAt - 1           // Позиция первого символа

  aArray[BUT_LET] := UPPER(SUBSTR(aArray[BUT_STR], nAt, 1))

  // местоположение
  aArray[ROW]     := nRow                     // Строка
  aArray[COL]     := nCol                     // Столбец

  AADD( aPrompt, aArray )
RETURN

/***
*
* раскрасить кнопку
*
*/
PROCEDURE PaintButtom( cColor, lShadow)
  LOCAL cThisClr, nAt, i, nCursor := SETCURSOR(0)
  lButShadow := lShadow   := IF(lShadow == NIL, .T., lShadow)
  cColor    := IF( cColor==NIL, SETCOLOR(), cColor )
#ifndef __HARBOUR__
  aButColor := LineToArray(cColor, ',')
#else
  aButColor := FParseLine( cColor, ',')
#endif
//  DISPBEGIN()

  FOR i := 1 TO LEN(aPrompt)
    // строка
    @ aPrompt[i][ROW], aPrompt[i][COL] SAY aPrompt[i][BUT_STR] ;
      COLOR  aButColor[1]
    // буква
    COLORWIN( aPrompt[i][ROW], aPrompt[i][LET_COL],;
             aPrompt[i][ROW], aPrompt[i][LET_COL], aButColor[3] )

    // тень ?
    IF lShadow

      // оставить тот же цвет фона
      cThisClr := SCREENATTR(aPrompt[i][ROW]+1, aPrompt[i][COL]+1)
      cThisClr := NTOCOLOR(cThisClr)
      nAt := AT("/", cThisClr)
      cThisClr := "N" + SUBSTR(cThisClr,nAt)

      @ aPrompt[i][ROW]+1, aPrompt[i][COL]+1 SAY ;
        REPLICATE(CHR(223), aPrompt[i][LEN_A]);
        COLOR cThisClr

      @ aPrompt[i][ROW], aPrompt[i][COL]+aPrompt[i][LEN_A] SAY CHR(220) COLOR cThisClr
    ENDIF
  NEXT
//  DISPEND()
  SETCURSOR(nCursor)
RETURN

/***
*
* выбор кнопки
*
*/
FUNCTION SelectButtom( nSel )
 LOCAL nKey, nOldSel,nCursor:=SETCURSOR(0)
#ifdef __HARBOUR__
 Local mCol,mDown := .f.,mTmp
#endif


 nSel := IF( ValType(nSel)<>'N', 1, nSel )
IF LEN(aPrompt) > 0
 DO WHILE .T.

   IF     nSel < 1            ; nSel := LEN(aPrompt)
   ELSEIF nSel > LEN(aPrompt) ; nSel := 1
   ENDIF

   COLORWIN( aPrompt[nSel][ROW], aPrompt[nSel][COL],;
            aPrompt[nSel][ROW], aPrompt[nSel][COL]+aPrompt[nSel][LEN_A]-1, aButColor[2] )
  // буква
   COLORWIN( aPrompt[nSel][ROW], aPrompt[nSel][LET_COL],;
            aPrompt[nSel][ROW], aPrompt[nSel][LET_COL], aButColor[4] )
   nKey := INKEYTRAP(0,INKEY_KEYBOARD+INKEY_LDOWN+INKEY_LUP)

   nOldSel := nSel

   IF     nKey == K_ESC                        ;  nSel := 0        ; EXIT
   ELSEIF nKey == K_F1 .AND. ValType( SetKey( nKey ) ) == 'B'
     EVAL( SetKey( nKey ) )
   ELSEIF LEN(aPrompt) == 1                    ;  /*PressButtom(1)   ; */EXIT
   ELSEIF nKey == K_LEFT  .OR. nKey == K_UP    ;  nSel--
   ELSEIF nKey == K_RIGHT .OR. nKey == K_DOWN  ;  nSel++
   ELSEIF nKey == K_ENTER                      ;  /*PressButtom(nSel);*/ EXIT
#ifdef __HARBOUR__
   ELSEIF nKey == K_LBUTTONDOWN
             if aPrompt[nSel][ROW] == mRow()
                mDown := .t.
                mCol := mCol()
                mTmp := aScan(aPrompt,{|x| mCol > x[COL].and.mCol < x[COL]+x[LEN_A] })
                if mTmp > 0
                   if mTmp != nOldSel
                      nSel := mTmp
                      COLORWIN( aPrompt[nOldSel][ROW], aPrompt[nOldSel][COL],aPrompt[nOldSel][ROW], aPrompt[nOldSel][COL]+aPrompt[nOldSel][LEN_A]-1, aButColor[1] )
                      COLORWIN( aPrompt[nOldSel][ROW], aPrompt[nOldSel][LET_COL],aPrompt[nOldSel][ROW], aPrompt[nOldSel][LET_COL], aButColor[3] )

                      COLORWIN( aPrompt[nSel][ROW], aPrompt[nSel][COL],aPrompt[nSel][ROW], aPrompt[nSel][COL]+aPrompt[nSel][LEN_A]-1, aButColor[2] )
                      COLORWIN( aPrompt[nSel][ROW], aPrompt[nSel][LET_COL],aPrompt[nSel][ROW], aPrompt[nSel][LET_COL], aButColor[4] )
                   endif
                endif

             endif


   ELSEIF nKey == K_LBUTTONUP

          if aPrompt[nSel][ROW] == mRow().and.mDown
             mDown := .f.
             mCol := mCol()
             nKey := aScan(aPrompt,{|x| mCol > x[COL].and.mCol < x[COL]+x[LEN_A] })
             if nKey > 0
                nSel := nKey
                KEYBOARD CHR( K_ENTER )
             endif
          endif
#endif




   ELSEIF  (nKey := ASCAN( aPrompt, {|x| x[BUT_LET]==UPPER(CHR(nKey))})) <> 0
     nSel := nKey
     KEYBOARD CHR( K_ENTER )
   ENDIF

   COLORWIN( aPrompt[nOldSel][ROW], aPrompt[nOldSel][COL],aPrompt[nOldSel][ROW], aPrompt[nOldSel][COL]+aPrompt[nOldSel][LEN_A]-1, aButColor[1] )
   COLORWIN( aPrompt[nOldSel][ROW], aPrompt[nOldSel][LET_COL],aPrompt[nOldSel][ROW], aPrompt[nOldSel][LET_COL], aButColor[3] )
 ENDDO
ELSE
 nSel := 0
ENDIF
 SETCURSOR(nCursor)
RETURN (nSel)

/***
*
* отмена выбора кнопки
*
*/
PROCEDURE UnselectButtom( aOldPrompt )
  aPrompt := IF( ValType(aOldPrompt)=='A', ACLONE(aOldPrompt), {} )
RETURN

FUNCTION ReturnButtom()
RETURN( ACLONE(aPrompt) )

/***
*
* "нажатие" кнопки
*
*/
PROCEDURE PressButtom(i)
  LOCAL/* cString := SCREENSTR( aPrompt[i][ROW],;
                              aPrompt[i][COL],;
                              aPrompt[i][LEN_A]),;
       */ cScreen := SAVESCREEN(aPrompt[i][ROW],   ;
                              aPrompt[i][COL],   ;
                              aPrompt[i][ROW]+1, ;
                              aPrompt[i][COL]+aPrompt[i][LEN_A])

  IF lButShadow
  DISPBEGIN()
  CLEARWIN(aPrompt[i][ROW],   ;
           aPrompt[i][COL]+aPrompt[i][LEN_A],   ;
           aPrompt[i][ROW], ;
           aPrompt[i][COL]+aPrompt[i][LEN_A],;
           SCREENATTR(aPrompt[i][ROW]+1, aPrompt[i][COL]+1) )

  CLEARWIN(aPrompt[i][ROW]+1,   ;
           aPrompt[i][COL],   ;
           aPrompt[i][ROW]+1, ;
           aPrompt[i][COL]+aPrompt[i][LEN_A],;
           SCREENATTR(aPrompt[i][ROW]+1, aPrompt[i][COL]+1) )

//  STRSCREEN( cString, aPrompt[i][ROW]+1, aPrompt[i][COL]+1 )
  DISPEND()
#ifndef __HARBOUR__
  INKEY(.5)
#endif
  RESTSCREEN(aPrompt[i][ROW],   ;
             aPrompt[i][COL],   ;
             aPrompt[i][ROW]+1, ;
             aPrompt[i][COL]+aPrompt[i][LEN_A],;
             cScreen )
#ifndef __HARBOUR__
  INKEY(.3)
#endif
  ENDIF
RETURN

#ifdef __HARBOUR__
Static Function ScreenAttr(nRow, nCol)
nRow := if(nRow == NIL,Row(),nRow)
nCol := if(nCol == NIL,Col(),nCol)
Return Asc(SaveScreen( nRow, nCol, nRow, nCol )[2])
#endif
