************
* Программа..:  PLL
* Имя файла..:  Sb.Prg
* Дата.......:  09-12-93 06:48pm
* Назначение.:  Класс скроллирующего бокса
*
* Copyright (c) 1993 Фирма "Интеллект-сервис". Все права сохраняются.
*
******

#define SB_IND_CHAR   254
#define SB_BACK_CHAR  178
#define SB_COLOR      'w+/n,bg+/b,,,n/w'

STATIC sb_t, sb_l, sb_b, sb_num_blks, sWin, aColors

/**********  09-12-93 06:49pm
*  VOID SbAttach()
*  PURPOSE: Инициализирует Scroll Bar
*   Рисует огpаничители в цвете 2, фон в цвете 5 и скроллирующий бокс в цвете 1
*  PARAMS: t,l,b  -координаты
*          InitPercent -Начальный процент ( дробь от 0 до 1 )
***/
FUNCTION SbAttach(t, l, b, InitPercent)
LOCAL sColor:=SetColor(SB_COLOR)
 aColors:=LineToArray(SB_COLOR, ',')

 // Сохраним параметры для последующего использования ...
 sb_t:= t; sb_l:= l;  sb_b:= b
 sWin:=SaveScreen(sb_t, sb_l, sb_b, sb_l)
 InitPercent:=If(InitPercent==Nil, 0, InitPercent)

 // Количество блоков, которое мы можем высветить в области бокса скроллирования
 sb_num_blks:=b-t-1

 // draw scroll bar and init it
 DrawScroll()
 UpdIndicator(InitPercent)
RETURN NIL

STATIC FUNCTION DrawScroll

  @ sb_t, sb_l SAY '' COLOR aColors[2]
  @ sb_b, sb_l SAY '' COLOR aColors[2]
  // Заполняем область скроллирования символом фона
  @ sb_t+1 ,sb_l, sb_b-1, sb_l BOX chr(SB_BACK_CHAR) COLOR aColors[5]
RETURN NIL



FUNCTION UpdIndicator(nPercent)
*  nPercent - процент ( дробь от 0 до 1 )
* Updates scroll bar indicator
LOCAL new_indicator           // indicator position relative from top
STATIC sb_indicator:=1
  new_indicator:= INT((sb_num_blks-1)*nPercent)
  DO CASE
    CASE nPercent > 0 .AND. new_indicator == 0
      new_indicator++
    CASE nPercent < 1 .AND. new_indicator == sb_num_blks-1
      new_indicator--
  ENDCASE
  IF sb_indicator != new_indicator
     @ sb_t+1+sb_indicator, sb_l SAY chr(SB_BACK_CHAR) COLOR aColors[5]
     @ sb_t+1+new_indicator, sb_l SAY chr(SB_IND_CHAR) COLOR aColors[1]
     sb_indicator:=new_indicator
  ENDIF
RETURN new_indicator


* VOID SbDetach()
* Освобождает переменные и восстанавливает экран
FUNCTION SbDetach
  RestScreen(sb_t, sb_l, sb_b, sb_l,sWin)
  sWin = NIL
RETURN NIL

