summaryrefslogtreecommitdiff
path: root/src/msvc6/testrunner/ProgressBar.cpp
blob: 6352b2459ee4cb478ce5e4220b929b1ca69be61f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132


#include "stdafx.h"
#include "ProgressBar.h"



// Paint the progress bar in response to a paint message
void ProgressBar::paint (CDC& dc)
{
    paintBackground (dc);
    paintStatus (dc);
}


// Paint the background of the progress bar region
void ProgressBar::paintBackground (CDC& dc)
{
    CBrush      brshBackground;
    CPen        penGray     (PS_SOLID, 1, RGB (128, 128, 128));
    CPen        penWhite    (PS_SOLID, 1, RGB (255, 255, 255));

    VERIFY (brshBackground.CreateSolidBrush (::GetSysColor (COLOR_BTNFACE)));

    dc.FillRect (m_bounds, &brshBackground);
    
    CPen    *pOldPen;
            
    pOldPen = dc.SelectObject (&penGray);
    {
        dc.MoveTo (m_bounds.left, m_bounds.top);
        dc.LineTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top);

        dc.MoveTo (m_bounds.left, m_bounds.top);
        dc.LineTo (m_bounds.left, m_bounds.top + m_bounds.Height () -1);

    }
    dc.SelectObject (&penWhite);
    {
        dc.MoveTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top);
        dc.LineTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top + m_bounds.Height () -1);

        dc.MoveTo (m_bounds.left, m_bounds.top + m_bounds.Height () -1);
        dc.LineTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top + m_bounds.Height () -1);

    }
    dc.SelectObject (pOldPen);

}


// Paint the actual status of the progress bar
void ProgressBar::paintStatus (CDC& dc)
{
    if (m_progress <= 0)
        return;

    CBrush      brshStatus;
    CRect       rect (m_bounds.left, m_bounds.top, 
                    m_bounds.left + m_progressX, m_bounds.bottom);

    COLORREF    statusColor = getStatusColor ();

    VERIFY (brshStatus.CreateSolidBrush (statusColor));

    rect.DeflateRect (1, 1);
    dc.FillRect (rect, &brshStatus);

}


// Paint the current step
void ProgressBar::paintStep (int startX, int endX)
{
    // kludge: painting the whole region on each step
    m_baseWindow->RedrawWindow (m_bounds);
    m_baseWindow->UpdateWindow ();

}


// Setup the progress bar for execution over a total number of steps
void ProgressBar::start (int total)
{
    m_total = total;
    reset ();
}


// Take one step, indicating whether it was a successful step
void ProgressBar::step (bool successful)
{
    m_progress++;

    int x = m_progressX;

    m_progressX = scale (m_progress);

    if (!m_error && !successful)
    {
        m_error = true;
        x = 1;
    }

    paintStep (x, m_progressX);

}


// Map from steps to display units
int ProgressBar::scale (int value)
{
    if (m_total > 0)
        return max (1, value * (m_bounds.Width () - 1) / m_total);

    return value;

}


// Reset the progress bar
void ProgressBar::reset ()
{
    m_progressX     = 1;
    m_progress      = 0;
    m_error         = false;

    m_baseWindow->RedrawWindow (m_bounds);
    m_baseWindow->UpdateWindow ();

}