/* Public Domain Curses */

#include "pdcx11.h"

RCSID("$Id: sb.c,v 1.27 2008/07/14 04:24:52 wmcbrine Exp $")

/*man-start**************************************************************

  Name:                                                          sb

  Synopsis:
        int sb_init(void)
        int sb_set_horz(int total, int viewport, int cur)
        int sb_set_vert(int total, int viewport, int cur)
        int sb_get_horz(int *total, int *viewport, int *cur)
        int sb_get_vert(int *total, int *viewport, int *cur)
        int sb_refresh(void);

  Description:
        These functions manipulate the scrollbar.

  Return Value:
        All functions return OK on success and ERR on error.

  Portability                                X/Open    BSD    SYS V
        sb_init                                 -       -       -
        sb_set_horz                             -       -       -
        sb_set_vert                             -       -       -
        sb_get_horz                             -       -       -
        sb_get_vert                             -       -       -
        sb_refresh                              -       -       -

**man-end****************************************************************/

bool sb_started = FALSE;

/* sb_init() is the sb initialization routine.
   This must be called before initscr(). */

int sb_init(void)
{
    PDC_LOG(("sb_init() - called\n"));

    if (SP)
        return ERR;

    sb_started = TRUE;

    return OK;
}

/* sb_set_horz() - Used to set horizontal scrollbar.

   total = total number of columns
   viewport = size of viewport in columns
   cur = current column in total */

int sb_set_horz(int total, int viewport, int cur)
{
    PDC_LOG(("sb_set_horz() - called: total %d viewport %d cur %d\n",
             total, viewport, cur));

    if (!SP)
        return ERR;

    SP->sb_total_x = total;
    SP->sb_viewport_x = viewport;
    SP->sb_cur_x = cur;

    return OK;
}

/* sb_set_vert() - Used to set vertical scrollbar.

   total = total number of columns on line
   viewport = size of viewport in columns
   cur = current column in total */

int sb_set_vert(int total, int viewport, int cur)
{
    PDC_LOG(("sb_set_vert() - called: total %d viewport %d cur %d\n",
             total, viewport, cur));

    if (!SP)
        return ERR;

    SP->sb_total_y = total;
    SP->sb_viewport_y = viewport;
    SP->sb_cur_y = cur;

    return OK;
}

/* sb_get_horz() - Used to get horizontal scrollbar.

   total = total number of lines
   viewport = size of viewport in lines
   cur = current line in total */

int sb_get_horz(int *total, int *viewport, int *cur)
{
    PDC_LOG(("sb_get_horz() - called\n"));

    if (!SP)
        return ERR;

    if (total)
        *total = SP->sb_total_x;
    if (viewport)
        *viewport = SP->sb_viewport_x;
    if (cur)
        *cur = SP->sb_cur_x;

    return OK;
}

/* sb_get_vert() - Used to get vertical scrollbar.

   total = total number of lines
   viewport = size of viewport in lines
   cur = current line in total */

int sb_get_vert(int *total, int *viewport, int *cur)
{
    PDC_LOG(("sb_get_vert() - called\n"));

    if (!SP)
        return ERR;

    if (total)
        *total = SP->sb_total_y;
    if (viewport)
        *viewport = SP->sb_viewport_y;
    if (cur)
        *cur = SP->sb_cur_y;

    return OK;
}

/* sb_refresh() - Used to draw the scrollbars. */

int sb_refresh(void)
{
    PDC_LOG(("sb_refresh() - called\n"));

    if (!SP)
        return ERR;

    XCursesInstruct(CURSES_REFRESH_SCROLLBAR);

    return OK;
}
