// File: main.cxx
//
// SliderBar (as it looked at the end of class, Thursday, Feb 26)
//
// CSCI 1300
// Spring 2004
//
// Karl Winklmann

#include <winbgim.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>

using namespace std;

const int WINDOW_SIZE = 512;
const int N = 200;

class SliderBar
{
public:
    SliderBar (int l, int t, int b, int r);
    void draw ();
    int value ();

    bool mouseDown (int x, int y);
    bool mouseUp (int x, int y);
    bool mouseMove (int x, int y);

private:
    int left;
    int top;
    int bottom;
    int right;

    int position;

    bool beingDragged;
};

void refreshPicture (int numbers [], SliderBar one, SliderBar two);

// main program (or "application") //////////////////////////////////

int main ()
{
    SliderBar one (WINDOW_SIZE - 10, 0, WINDOW_SIZE - 1, WINDOW_SIZE - 1);
    SliderBar two (300, 100, 400, 310);
    
    // setting up graphics window
    initwindow (WINDOW_SIZE, WINDOW_SIZE, "SliderBar");
    setbkcolor (WHITE);
    setcolor (BLACK);
    cleardevice ();

    // generating some data to display
    int numbers [N];
    for (int i = 0; i < N; i++)
        numbers [i] = 20 + rand () % 200;

    while (true) // "forever"
    {
        if (ismouseclick (WM_LBUTTONUP))
        {
            two.mouseUp (mousex (), mousey ());
            clearmouseclick (WM_LBUTTONUP);
        }

        if (ismouseclick (WM_MOUSEMOVE))
        {
            two.mouseMove (mousex (), mousey ());
            clearmouseclick (WM_MOUSEMOVE);
        }

        if (ismouseclick (WM_LBUTTONDOWN))
        {
            two.mouseDown (mousex (), mousey ());
            clearmouseclick (WM_LBUTTONDOWN);
        }

        cout << one.value () << "    " << two.value () << endl;
        refreshPicture (numbers, one, two);
    }
   

    closegraph ();

    return EXIT_SUCCESS;
}

void refreshPicture (int numbers [], SliderBar one, SliderBar two)
{
    static int page = 0;

    // toggle between page 0 and page 1
    page = 1 - page;
    setactivepage (page);

    // start with clean page
    setbkcolor (WHITE);
    cleardevice ();

    // draw bars
    one.draw ();

    // display numbers (as colored bars)
    int x = two.value () * WINDOW_SIZE / 100;
    int i = one.value () * N / 100;
    
    for (int y = 0; y < WINDOW_SIZE && i < N; y+=5)
    {
        setfillstyle(SOLID_FILL, i % 16);
        bar (x, y, x + numbers [i], y + 5);
        i++;
    }
    two.draw ();
        
    // show the result
    setvisualpage (page);
}

SliderBar::SliderBar (int l, int  t, int b, int r)
{
    left = l;
    top = t;
    bottom = b;
    right = r;

    position = top;
    
    beingDragged = false;
}

void SliderBar::draw ()
{
    setfillstyle (SOLID_FILL, RED);
    bar (left, top, right, bottom);

    setfillstyle (SOLID_FILL, CYAN);
    bar (left + 1, position, right - 1, position + 20);
}

int SliderBar::value ()
{
    return 100 * (position - top) / (bottom - top);
}

bool SliderBar::mouseDown (int x, int y)
{
    beingDragged = true;
    return true;
}

bool SliderBar::mouseMove (int x, int y)
{
    if (beingDragged)
    {
        position = y;
        return true;
    }

    return false;
}

bool SliderBar::mouseUp (int x, int y)
{
    beingDragged = false;
    return true;
}
