Correction of unstable testing cases
[occt.git] / src / WNT / WNT_IconBox_1.cxx
1 // Copyright (c) 2008-2012 OPEN CASCADE SAS
2 //
3 // The content of this file is subject to the Open CASCADE Technology Public
4 // License Version 6.5 (the "License"). You may not use the content of this file
5 // except in compliance with the License. Please obtain a copy of the License
6 // at http://www.opencascade.org and read it completely before using this file.
7 //
8 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
10 //
11 // The Original Code and all software distributed under the License is
12 // distributed on an "AS IS" basis, without warranty of any kind, and the
13 // Initial Developer hereby disclaims all such warranties, including without
14 // limitation, any warranties of merchantability, fitness for a particular
15 // purpose or non-infringement. Please see the License for the specific terms
16 // and conditions governing the rights and limitations under the License.
17
18
19 #include <windows.h>
20 #include <WNT_IconBox.hxx>
21
22 #include <WNT_GraphicDevice.hxx>
23 #include <WNT_ImageManager.hxx>
24 #include <WNT_Icon.hxx>
25
26 #define X_SPACING 10
27 #define Y_SPACING 10
28
29 //=======================================================================
30 //function : HandleEvent
31 //purpose  :
32 //=======================================================================
33
34 WNT_Long WNT_IconBox::HandleEvent (
35           const Aspect_Handle  hwnd,
36           const WNT_Uint&      uMsg,
37           const WNT_Dword&     wParam,
38           const WNT_Dword&     lParam
39          )
40 {
41
42   switch ( uMsg ) {
43
44   case WM_SIZE : {
45
46    int        len;
47    RECT       r;
48    SCROLLINFO si;
49
50    GetClientRect (  ( HWND )hwnd, &r  );
51
52    myIncX = myIconWidth + X_SPACING + 6;
53    myNX   = r.right  / myIncX;
54
55    if ( myNX == 0 ) ++myNX;
56
57    myIncY = myIconHeight + Y_SPACING + 11 + myIconHeight / Y_SPACING;
58    myNY   = r.bottom / myIncY;
59
60    if ( myNY == 0 ) ++myNY;
61
62    len = myImages -> Size ();
63
64    if ( myNX * myNY >= len )
65
66     ShowScrollBar (  ( HWND )hwnd, SB_VERT, FALSE  );
67
68    else {
69
70     si.cbSize = sizeof ( SCROLLINFO );
71         si.fMask  = SIF_POS | SIF_RANGE;
72         si.nPos   = myNPos = 0;
73         si.nMin   = 0;
74         si.nMax   = myMaxPos = len / myNX;
75
76     SetScrollInfo (  ( HWND )hwnd, SB_VERT, &si, TRUE );
77         ShowScrollBar (  ( HWND )hwnd, SB_VERT, TRUE  );
78         myStart = 1;
79
80    }  // end else
81
82    return 0;
83
84   }  // WM_SIZE
85
86   case WM_VSCROLL : {
87
88    int        nCurPos;
89    int        nScrollCode;
90    int        newStart;
91    int        len;
92    SCROLLINFO si;
93
94    nScrollCode = ( Standard_Integer )LOWORD( wParam );
95    len         = myImages -> Size ();
96
97    switch ( nScrollCode ) {
98
99         case SB_LINEUP :
100         case SB_PAGEUP :
101
102          newStart = myStart - myNX;
103          myStart    = newStart >= 1 ? --myNPos, newStart : (  ( myNPos = 0 ), 1  );
104
105         break;
106
107         case SB_LINEDOWN :
108         case SB_PAGEDOWN :
109
110          newStart = myStart + myNX;
111          myStart    = ( newStart <= len - myNX + 1 ) ? ( ++myNPos, newStart ) :
112                                                        (  ( myNPos = myMaxPos ),
113                                                           ( len - myNX + 1  )
114                                                        );
115
116         break;
117
118         case SB_THUMBTRACK :
119
120      myNPos  = ( Standard_Integer )HIWORD( wParam );
121      myStart = myNPos * myNX;
122
123         break;
124
125         case SB_ENDSCROLL :
126
127         return 0;
128
129    }  // end switch
130
131    if ( myStart == 0 ) ++myStart;
132
133    nCurPos = GetScrollPos (  ( HWND )hwnd, SB_VERT  );
134
135    if ( nCurPos == myNPos ) return 0;
136
137    si.cbSize = sizeof ( SCROLLINFO );
138    si.fMask  = SIF_POS;
139    si.nPos   = myNPos;
140
141    SetScrollInfo (  ( HWND )hwnd, SB_VERT, &si, TRUE  );
142    InvalidateRect (  ( HWND )hwnd, NULL, TRUE  );
143
144    return 0;
145
146   }  // WM_VSCROLL
147
148   case WM_PAINT : {
149
150    HDC         hDCsrc, hDCdst;
151    PAINTSTRUCT ps;
152    HPEN        hOldPen;
153    HFONT       hOldFont;
154    HPALETTE    hOldPal;
155    int         i, j, x, y, ow, oh, cnt, len;
156
157    Handle( WNT_Icon ) icon;
158
159    Handle( WNT_GraphicDevice ) gDev = Handle( WNT_GraphicDevice ) ::
160                                        DownCast (  GraphicDevice ()  );
161
162    if ( !myDragging ) {
163
164     hDCdst = BeginPaint (  ( HWND )hwnd, &ps  );
165     hDCsrc = CreateCompatibleDC ( hDCdst );
166
167     if (  gDev -> IsPaletteDevice ()  ) {
168
169          hOldPal = SelectPalette ( hDCdst, ( HPALETTE )(  gDev -> HPalette ()  ), FALSE );
170          RealizePalette ( hDCdst );
171
172     }  // end if
173
174      len      = myImages -> Size ();
175          hOldPen  = SelectPen ( hDCdst, myPen );
176          hOldFont = SelectFont ( hDCdst, myFont );
177          SetTextAlign ( hDCdst, TA_CENTER | TA_TOP );
178          SetStretchBltMode ( hDCdst, COLORONCOLOR );
179
180          for ( i = 0, y = Y_SPACING, cnt = myStart; i < myNY; ++i, y += myIncY )
181
182           for ( j = 0, x = X_SPACING; j < myNX; ++j, ++cnt, x += myIncX ) {
183
184        if ( cnt > len ) goto exit_display;
185
186            icon = Handle( WNT_Icon ) :: DownCast (  myImages -> Image ( cnt )  );
187
188            if (  icon.IsNull ()  ) continue;
189
190            myImages -> Dim ( cnt, ow, oh );
191            SelectBitmap ( hDCsrc, icon -> myImage );
192
193        Rectangle ( hDCdst, x, y, x + myIconWidth + 4, y + myIconHeight + 4 );
194        TextOut  (
195         hDCdst, x + myIconWidth / 2, y + myIconHeight + 10,
196         icon -> myName, strlen ( icon -> myName )
197        );
198
199        StretchBlt (
200         hDCdst, x + 2, y + 2, myIconWidth, myIconHeight,
201         hDCsrc, 0,     0,     ow,          oh,
202         SRCCOPY
203        );
204
205           }  // end for
206
207 exit_display:
208
209      SelectFont ( hDCdst, hOldFont );
210          SelectPen ( hDCdst, hOldPen );
211
212     if (  gDev -> IsPaletteDevice ()  )
213
214      SelectPalette ( hDCdst, hOldPal, FALSE );
215
216     DeleteDC ( hDCsrc );
217     EndPaint (  ( HWND )hwnd, &ps  );
218
219     return 0;
220
221    } else
222
223     return DefWindowProc (  ( HWND )hwnd, uMsg, wParam, lParam  );
224
225   }  // WM_PAINT
226
227   case WM_ENTERSIZEMOVE :
228
229    myDragging = TRUE;
230
231    return 0;
232
233   case WM_EXITSIZEMOVE :
234
235    myDragging = FALSE;
236    InvalidateRect (  ( HWND )hwnd, NULL, TRUE  );
237
238    return 0;
239
240   case WM_QUERYNEWPALETTE: {
241
242    HDC          hDC = GetDC (  ( HWND )hwnd  );
243    WINDOW_DATA* wd  = (WINDOW_DATA* )GetWindowLongPtr ((HWND )hwnd, GWLP_USERDATA);
244
245    SelectPalette ( hDC, wd -> hPal, FALSE );
246
247 //   if (  RealizePalette ( hDC )  );
248    if (  RealizePalette ( hDC )  )
249     InvalidateRect (  ( HWND )hwnd, NULL, FALSE  );
250
251    ReleaseDC (  ( HWND )hwnd, hDC  );
252
253    return TRUE;
254
255   }  // WM_QUERYNEWPALETTE
256
257   case WM_PALETTECHANGED:
258
259    if (  hwnd != ( HWND )wParam  ) {
260
261     HDC          hDC = GetDC (  ( HWND )hwnd  );
262     WINDOW_DATA* wd  = (WINDOW_DATA* )GetWindowLongPtr ((HWND )hwnd, GWLP_USERDATA);
263     SelectPalette ( hDC, wd -> hPal, TRUE );
264
265     if (  RealizePalette ( hDC )  )
266
267      UpdateColors ( hDC );
268
269     ReleaseDC (  ( HWND )hwnd, hDC  );
270
271     return 0;
272
273    }  // end if
274
275   default:
276
277    return DefWindowProc (  ( HWND )hwnd, uMsg, wParam, lParam  );
278
279  }  // end switch
280
281 }  // end WNT_IconBox :: HandleEvent