source: trunk/Lucide/SOURCE/gui/progressDlg.cpp @ 2

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 15 years ago

First import

File size: 6.5 KB
Line 
1#define INCL_GPI
2#define INCL_WIN
3#include <os2.h>
4
5#include <process.h>
6
7#include "luutils.h"
8#include "progressDlg.h"
9#include "Lucide_res.h"
10#include "messages.h"
11
12#define TID_PAINT   1
13
14
15ProgressDlg::ProgressDlg( HWND hWndFrame )
16{
17    hFrame      = hWndFrame;
18    text        = newstrdup( "" );
19    threadFn    = NULL;
20    threadData  = NULL;
21    fn          = NULL;
22    data        = NULL;
23    pOldBarProc = NULL;
24    hpsBuffer   = NULLHANDLE;
25    hdcBuffer   = NULLHANDLE;
26    startPos    = 0;
27}
28
29ProgressDlg::~ProgressDlg()
30{
31    delete text;
32}
33
34void ProgressDlg::show( progressThreadFn _threadFn, void *_threadData )
35{
36    threadFn = _threadFn;
37    threadData = _threadData;
38    WinDlgBox( HWND_DESKTOP, hFrame, progressDlgProc,
39               NULLHANDLE, IDD_PROGRESS, this );
40}
41
42void ProgressDlg::hide()
43{
44    if ( hDialog != NULLHANDLE ) {
45        WinPostMsg( hDialog, WM_COMMAND, MPFROMSHORT( DID_OK ), (MPARAM)0 );
46    }
47}
48
49void ProgressDlg::setBreakFunc( progressBrkFn _fn, void *_data )
50{
51    fn   = _fn;
52    data = _data;
53}
54
55void ProgressDlg::setText( const char *_text )
56{
57    delete text;
58    text = newstrdup( _text );
59    if ( hDialog != NULLHANDLE ) {
60        WinSetDlgItemText( hDialog, IDC_PTEXT, text );
61    }
62}
63
64MRESULT EXPENTRY ProgressDlg::progressDlgProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
65{
66    // This is a static method, so we don't know which instantiation we're
67    // dealing with. But we can get a pseudo-this from the parameter to
68    // WM_INITDLG, which we therafter store with the window and retrieve
69    // as follows:
70    ProgressDlg *_this = (ProgressDlg *)WinQueryWindowULong( hwnd, QWL_USER );
71
72    switch (msg)
73    {
74
75        // Dialog has just been created
76        case WM_INITDLG:
77        {
78            // Save the mp2 into our user data so that subsequent calls have
79            // access to the parent C++ object
80            WinSetWindowULong( hwnd, QWL_USER, (ULONG)mp2 );
81            _this = (ProgressDlg *)mp2;
82            localizeDialog( hwnd );
83            centerWindow( _this->hFrame, hwnd );
84
85            _this->hDialog = hwnd;
86            WinSetDlgItemText( hwnd, IDC_PTEXT, _this->text );
87
88            _this->startPos = 0;
89            HWND hBar = WinWindowFromID( hwnd, IDC_PBAR );
90            HAB hBarHab = WinQueryAnchorBlock( hBar );
91
92            if ( ( _this->hpsBuffer != NULLHANDLE ) &&
93                 ( _this->hdcBuffer != NULLHANDLE ) ) {
94                DestroyGraphicsBuffer( _this->hpsBuffer, _this->hdcBuffer );
95                _this->hpsBuffer = _this->hdcBuffer = NULLHANDLE;
96            }
97
98            RECTL rcl;
99            WinQueryWindowRect( hBar, &rcl );
100            HPS hps = WinGetPS( hBar );
101            CreateGraphicsBuffer( hBarHab, &rcl, hps, &_this->hpsBuffer, &_this->hdcBuffer );
102            WinReleasePS( hps );
103
104            WinSetWindowULong( hBar, QWL_USER, (ULONG)_this );
105            _this->pOldBarProc = WinSubclassWindow( hBar, progressBarProc );
106            WinStartTimer( hBarHab, hBar, TID_PAINT, 1 );
107
108            _beginthread( _this->threadFn, NULL, 65536, _this->threadData );
109
110            return (MRESULT)FALSE;
111        }
112
113        case WM_DESTROY:
114        {
115            _this->hDialog = NULLHANDLE;
116            if ( ( _this->hpsBuffer != NULLHANDLE ) &&
117                 ( _this->hdcBuffer != NULLHANDLE ) ) {
118                DestroyGraphicsBuffer( _this->hpsBuffer, _this->hdcBuffer );
119                _this->hpsBuffer = _this->hdcBuffer = NULLHANDLE;
120            }
121        }
122        break;
123
124        case WM_COMMAND:
125            switch (SHORT1FROMMP(mp1))
126            {
127                case DID_OK:
128                    WinDismissDlg( hwnd, DID_OK );
129                    return (MRESULT)FALSE;
130
131                case DID_CANCEL:
132                    WinEnableControl( hwnd, DID_CANCEL, FALSE );
133                    _this->fn( _this->data );
134                    return (MRESULT)FALSE;
135            };
136            return (MRESULT)FALSE;
137    }
138    return WinDefDlgProc( hwnd, msg, mp1, mp2 );
139}
140
141#define SHAPE_LEN   30
142
143MRESULT EXPENTRY ProgressDlg::progressBarProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
144{
145    ProgressDlg *_this = (ProgressDlg *)WinQueryWindowULong( hwnd, QWL_USER );
146
147    switch ( msg )
148    {
149        case WM_PAINT:
150            _this->wmPaintBar( hwnd );
151            return (MRESULT)FALSE;
152
153        case WM_TIMER:
154            if ( SHORT1FROMMP( mp1 ) == TID_PAINT )
155            {
156                WinInvalidateRect( hwnd, NULL, FALSE );
157                _this->startPos += 3;
158                if ( _this->startPos > ( ( SHAPE_LEN * 2 ) - 1 ) ) {
159                    _this->startPos = 0;
160                }
161            }
162            break;
163    }
164    return _this->pOldBarProc( hwnd, msg, mp1, mp2 );
165}
166
167void ProgressDlg::drawShape( HPS hps, PRECTL r )
168{
169    POINTL ptlStart, ptlEnd;
170    ptlStart.x = r->xLeft;      // x coordinate, lower-left corner of box
171    ptlStart.y = r->yBottom;    // y coordinate, lower-left corner of box
172    ptlEnd.x   = r->xRight;     // x coordinate, upper-right corner of box
173    ptlEnd.y   = r->yTop;       // y coordinate, upper-right corner of box
174    GpiMove( hps, &ptlStart );
175    GpiBox( hps, DRO_FILL, &ptlEnd, 0, 0 ); // Draw sheared box
176}
177
178void ProgressDlg::wmPaintBar( HWND hwnd )
179{
180    RECTL rcl;
181    HPS hps = WinBeginPaint( hwnd, 0, NULL );
182    WinQueryWindowRect( hwnd, &rcl );
183
184    // 161,192,224
185    LONG lclr1 = ( 161 << 16 ) | ( 192 << 8 ) | 224;
186    LONG lclr2 = ( 121 << 16 ) | ( 144 << 8 ) | 168;
187    LONG ltabl[ 2 ] = { lclr1, lclr2 };
188    GpiCreateLogColorTable( hpsBuffer, 0, LCOLF_CONSECRGB, 100, 2, ltabl );
189    WinFillRect( hpsBuffer, &rcl, 100 );
190    GpiSetColor( hpsBuffer, 101 );
191
192    MATRIXLF matlfTransform;
193    matlfTransform.fxM11 = MAKEFIXED( 1, 0 );
194    matlfTransform.fxM12 = MAKEFIXED( 0, 0 );
195    matlfTransform.lM13  = 0;
196    matlfTransform.fxM21 = MAKEFIXED( 0, 65536 / 2 );  // Shear factor .5
197    matlfTransform.fxM22 = MAKEFIXED( 1, 0 );
198    matlfTransform.lM23  = 0;
199    matlfTransform.lM31  = 0;               // Translate 0 units right
200    matlfTransform.lM32  = 0;
201    matlfTransform.lM33  = 1;
202    GpiSetDefaultViewMatrix( hpsBuffer, 9, &matlfTransform, TRANSFORM_REPLACE );
203
204    LONG xPos = startPos - ( SHAPE_LEN * 2 );
205    for ( ; xPos < rcl.xRight; xPos += ( SHAPE_LEN * 2 ) )
206    {
207        RECTL r = { xPos, rcl.yBottom, xPos + SHAPE_LEN, rcl.yTop - 1 };
208        drawShape( hpsBuffer, &r );
209    }
210
211    BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
212    WinEndPaint( hps );
213}
214
Note: See TracBrowser for help on using the repository browser.