rtoss - Blame information for rev 182

Subversion Repositories:
Rev:
Rev Author Line No. Line
181 roytam 1 /*
182 roytam 2 ** Copyright (C) 2003-2008 Nullsoft, Inc.
181 roytam 3 **
4 ** This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held
5 ** liable for any damages arising from the use of this software.
6 **
7 ** Permission is granted to anyone to use this software for any purpose, including commercial applications, and to
8 ** alter it and redistribute it freely, subject to the following restrictions:
9 **
10 **   1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.
11 **      If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 **
13 **   2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
14 **
15 **   3. This notice may not be removed or altered from any source distribution.
16 **
17 */
18  
19 #ifndef _WA_DLG_H_
20 #define _WA_DLG_H_
21  
22 #include "wa_ipc.h"
182 roytam 23 #ifdef __cplusplus
24 extern "C" {
25 #endif
181 roytam 26 /*
27        1) gen.bmp has a generic window frame for plugins to use.
28           its format is similar to the minibrowser's.
29           In addition gen.bmp includes a font for the titlebar, in both
30           highlight and no-highlight modes. The font is variable width,
31           and it uses the first color before the letter A as the delimiter.
32           The no-highlight form of letter must be the same width as the
33           highlight form.
34        2) genex.bmp has button and scrollbar images, as well as some individual
35           pixels that describe the colors for the dialog. The button and
36           scrollbar images should be self explanatory (note that the buttons
37           have 4 pixel sized edges that are not stretched, and the center is
38           stretched), and the scrollbars do something similar.
39           The colors start at (48,0) and run every other pixel. The meaning
40           of each pixel is:
41             x=48: item background (background to edits, listviews etc)
42             x=50: item foreground (text color of edit/listview, etc)
43             x=52: window background (used to set the bg color for the dialog)
44             x=54: button text color
45             x=56: window text color
46             x=58: color of dividers and sunken borders
47             x=60: selection color for playlists
48             x=62: listview header background color
49             x=64: listview header text color
50             x=66: listview header frame top color
51             x=68: listview header frame middle color
52             x=70: listview header frame bottom color
53             x=72: listview header empty color
54             x=74: scrollbar foreground color
55             x=76: scrollbar background color
56             x=78: inverse scrollbar foreground color
57             x=80: inverse scrollbar background color
58             x=82: scrollbar dead area color
59             x=84: listview/treeview selection bar text color (active)
60             x=86: listview/treeview selection bar back color (active)
61             x=88: listview/treeview selection bar text color (inactive)
62             x=90: listview/treeview selection bar back color (inactive)
182 roytam 63                         x=92: alternate item background
64                         x=94: alternate item foreground
181 roytam 65 */
66  
67 #define DCW_SUNKENBORDER 0x00010000
68 #define DCW_DIVIDER 0x00020000
69  
70 enum
71 {
72   WADLG_ITEMBG,
73   WADLG_ITEMFG,
74   WADLG_WNDBG,
75   WADLG_BUTTONFG,
76   WADLG_WNDFG,
77   WADLG_HILITE,
78   WADLG_SELCOLOR,
79   WADLG_LISTHEADER_BGCOLOR,
80   WADLG_LISTHEADER_FONTCOLOR,
81   WADLG_LISTHEADER_FRAME_TOPCOLOR,
82   WADLG_LISTHEADER_FRAME_MIDDLECOLOR,
83   WADLG_LISTHEADER_FRAME_BOTTOMCOLOR,
84   WADLG_LISTHEADER_EMPTY_BGCOLOR,
85   WADLG_SCROLLBAR_FGCOLOR,
86   WADLG_SCROLLBAR_BGCOLOR,
87   WADLG_SCROLLBAR_INV_FGCOLOR,
88   WADLG_SCROLLBAR_INV_BGCOLOR,
89   WADLG_SCROLLBAR_DEADAREA_COLOR,
90   WADLG_SELBAR_FGCOLOR,
91   WADLG_SELBAR_BGCOLOR,
92   WADLG_INACT_SELBAR_FGCOLOR,
93   WADLG_INACT_SELBAR_BGCOLOR,
182 roytam 94   WADLG_ITEMBG2,
95   WADLG_ITEMFG2,
181 roytam 96   WADLG_NUM_COLORS
97 };
98  
182 roytam 99 typedef enum _WACURSOR  // used in IPC_GETSKINCURSORS
100 {
101         WACURSOR_VOLUME = 0,            // volume & balane
102         WACURSOR_POSITION = 1,          // position
103         WACURSOR_BTN_WINSHADE = 2,      // winshade
104         WACURSOR_BTN_MINIMIZE = 3,      // minimize
105         WACURSOR_BTN_CLOSE = 4,         // close
106         WACURSOR_MENU =         5,                      // main menu
107         WACURSOR_TITLEBAR = 6,          // title bar
108         WACURSOR_SONGNAME = 7,         
109         WACURSOR_NORMAL = 8,
110         WACURSOR_WINSHADE_BTN_WINSHADE = 9,
111         WACURSOR_WINSHADE_BTN_MINIMIZE = 10,
112         WACURSOR_WINSHADE_POSITION = 11,
113         WACURSOR_WINSHADE_BTN_CLOSE = 12,
114         WACURSOR_WINSHADE_MENU = 13,
115         WACURSOR_WINSHADE_NORMAL = 14,
116         WACURSOR_PL_BTN_WINSHADE = 15,
117         WACURSOR_PL_BTN_CLOSE = 16,
118         WACURSOR_PL_TITLEBAR = 17,
119         WACURSOR_PL_VSCROLL = 18,
120         WACURSOR_PL_RESIZE = 19,
121         WACURSOR_PL_NORMAL = 20,
122         WACURSOR_PL_WINSHADE_BTN_WINSHADE = 21,
123         WACURSOR_PL_WINSHADE_BTN_CLOSE = 22,
124         WACURSOR_PL_WINSHADE_HSIZE = 23,
125         WACURSOR_PL_WINSHADE_NORMAL = 24,
126         WACURSOR_EQ_SLIDER = 25,
127         WACURSOR_EQ_BTN_CLOSE = 26,
128         WACURSOR_EQ_TITLEBAR = 27,
129         WACURSOR_EQ_NORMAL = 28,
130 } WACURSOR;
181 roytam 131  
132 void WADlg_init(HWND hwndWinamp); // call this on init, or on WM_DISPLAYCHANGE
133 void WADlg_close();
134 int WADlg_getColor(int idx);
182 roytam 135 int WADlg_initted();
181 roytam 136  
182 roytam 137 LRESULT WADlg_handleDialogMsgs(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); //
181 roytam 138 void WADlg_DrawChildWindowBorders(HWND hwndDlg, int *tab, int tabsize); // each entry in tab would be the id | DCW_*
139  
140 HBITMAP WADlg_getBitmap();
141  
142 /// define WA_DLG_IMPLEMENT in one of your source files before including this .h
143 // if you are making a media library plugin, you dont need to do this, look at view_ex for
144 // an example of how to get the function *'s via an IPC message.
182 roytam 145 #ifdef __cplusplus
146 }
147 #endif
181 roytam 148  
149 #ifdef WA_DLG_IMPLEMENT
150  
182 roytam 151 static HBRUSH wadlg_lastbrush=0;
152 static HBITMAP wadlg_bitmap=0; // load this manually
181 roytam 153 static int wadlg_colors[WADLG_NUM_COLORS];
154 static int wadlg_defcolors[WADLG_NUM_COLORS]=
155 {
182 roytam 156         RGB(0,0,0),
157         RGB(0,255,0),
158         RGB(36,36,60),
159         RGB(57,56,66),
160         RGB(255,255,255),
161         RGB(132,148,165),  
162         RGB(0,0,198),
163         RGB(36*2,36*2,60*2),
164         RGB(255,255,255),
165         RGB(36*3,36*3,60*3),
166         RGB(36,36,60),
167         RGB(36*0.5,36*0.5,60*0.5),
168         RGB(36,36,60),
169         RGB(36*1,36*1,60*1),
170         RGB(36*1,36*1,60*1),
171         RGB(121,130,150),
172         RGB(78,88,110),
173         RGB(36*1,36*1,60*1),
174         RGB(255,255,255),
175         RGB(0,0,180),
176         RGB(0,255,0),
177         RGB(0,0,128),
178         RGB(0,0,0),
179         RGB(0,255,0),
181 roytam 180 };
181  
182 roytam 182 int WADlg_initted()
183 {
184         return !!wadlg_bitmap;
185 }
186  
181 roytam 187 int WADlg_getColor(int idx)
188 {
182 roytam 189         if (idx < 0 || idx >= WADLG_NUM_COLORS) return 0;
190         return wadlg_colors[idx];
181 roytam 191 }
192  
193 HBITMAP WADlg_getBitmap()
194 {
182 roytam 195         return wadlg_bitmap;
181 roytam 196 }
197  
198 void WADlg_init(HWND hwndWinamp) // call this on init, or on WM_DISPLAYCHANGE
199 {
182 roytam 200         if (wadlg_bitmap) DeleteObject(wadlg_bitmap);
201         wadlg_bitmap = (HBITMAP) SendMessage(hwndWinamp,WM_WA_IPC,0,IPC_GET_GENSKINBITMAP);
202         if (wadlg_bitmap)
203         {
204                 HDC tmpDC=CreateCompatibleDC(NULL);
205                 HGDIOBJ o=SelectObject(tmpDC,(HGDIOBJ)wadlg_bitmap);
206                 int defbgcol=GetPixel(tmpDC,111,0);
207                 for (int x = 0; x < WADLG_NUM_COLORS; x ++)
208                 {
209                         int a=GetPixel(tmpDC,48+x*2,0);
210                         if (a == CLR_INVALID || a == RGB(0,198,255) || a == defbgcol)
211                         {
212                                 //defaults for old skins
213                                 if (x == WADLG_SELBAR_FGCOLOR || x == WADLG_INACT_SELBAR_FGCOLOR) a=wadlg_colors[WADLG_WNDFG];
214                                 else if (x == WADLG_SELBAR_BGCOLOR || x == WADLG_INACT_SELBAR_BGCOLOR)
215                                 {
216                                         a=wadlg_colors[WADLG_SELCOLOR];
217                                         if (x == WADLG_INACT_SELBAR_BGCOLOR)
218                                         a=((a/2)&0x7F7F7F)+(((wadlg_colors[WADLG_WNDBG])/2)&0x7F7F7F);
219                                 }
220                                 else if (x == WADLG_ITEMBG2)
221                                 {
222                                         a=wadlg_colors[WADLG_ITEMBG];
223                                 }
224                                 else if (x == WADLG_ITEMFG2)
225                                 {
226                                         a=wadlg_colors[WADLG_ITEMFG];
227                                 }
228                                 else a=wadlg_defcolors[x];
229                         }
230                         wadlg_colors[x]=a;
231                 }
181 roytam 232  
182 roytam 233                 SelectObject(tmpDC,o);
234                 DeleteDC(tmpDC);
235         }
181 roytam 236 }
237  
238 void WADlg_close()
239 {
182 roytam 240         if (wadlg_bitmap) DeleteObject(wadlg_bitmap);
241         wadlg_bitmap=0;
242         if (wadlg_lastbrush) DeleteObject(wadlg_lastbrush);
243         wadlg_lastbrush=0;
181 roytam 244 }
245  
246 void WADlg_dotLine(HDC hdc, int left, int top, int len, int vert)
247 {
182 roytam 248         for(int i=(top&1);i<len-1;i+=2)
249         {
250             if(vert)
251                 {
252                         MoveToEx(hdc,left,top+i,NULL);
253                         LineTo(hdc,left,top+i+1);
254                 }
255                 else
256                 {
257                         MoveToEx(hdc,left+i,top,NULL);
258                         LineTo(hdc,left+i+1,top);
259                 }
260         }
181 roytam 261 }
262  
182 roytam 263 LRESULT WADlg_handleDialogMsgs(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
181 roytam 264 {
265         if (uMsg == WM_DRAWITEM)
266         {
267                 DRAWITEMSTRUCT *di = (DRAWITEMSTRUCT *)lParam;
268                 if (di->CtlType == ODT_BUTTON) {
182 roytam 269                         wchar_t wt[256];
181 roytam 270                         RECT r;
182 roytam 271                         GetDlgItemTextW(hwndDlg,(INT)wParam,wt,sizeof(wt)/sizeof(*wt));
181 roytam 272  
182 roytam 273                         HDC hdc = CreateCompatibleDC(di->hDC);
274                         HBITMAP hbmpOld = (HBITMAP)SelectObject(hdc, wadlg_bitmap);
181 roytam 275  
276                         r=di->rcItem;
182 roytam 277                         SetStretchBltMode(di->hDC,COLORONCOLOR);
181 roytam 278  
182 roytam 279                         int yoffs = (di->itemState & ODS_SELECTED) ? 15 : 0;
181 roytam 280  
182 roytam 281                         BitBlt(di->hDC,r.left,r.top,4,4,hdc,0,yoffs,SRCCOPY); // top left
282                         StretchBlt(di->hDC,r.left+4,r.top,r.right-r.left-4-4,4,hdc,4,yoffs,47-4-4,4,SRCCOPY); // top center
283                         BitBlt(di->hDC,r.right-4,r.top,4,4,hdc,47-4,yoffs,SRCCOPY); // top right
181 roytam 284  
182 roytam 285                         StretchBlt(di->hDC,r.left,r.top+4,4,r.bottom-r.top-4-4,hdc,0,4+yoffs,4,15-4-4,SRCCOPY); // left edge
286                         StretchBlt(di->hDC,r.right-4,r.top+4,4,r.bottom-r.top-4-4,hdc,47-4,4+yoffs,4,15-4-4,SRCCOPY); // right edge
181 roytam 287  
182 roytam 288                         // center
289                         StretchBlt(di->hDC,r.left+4,r.top+4,r.right-r.left-4-4,r.bottom-r.top-4-4,hdc,4,4+yoffs,47-4-4,15-4-4,SRCCOPY);
181 roytam 290  
182 roytam 291                         BitBlt(di->hDC,r.left,r.bottom-4,4,4,hdc,0,15-4+yoffs,SRCCOPY); // bottom left
292                         StretchBlt(di->hDC,r.left+4,r.bottom-4,r.right-r.left-4-4,4,hdc,4,15-4+yoffs,47-4-4,4,SRCCOPY); // bottom center
293                         BitBlt(di->hDC,r.right-4,r.bottom-4,4,4,hdc,47-4,15-4+yoffs,SRCCOPY); // bottom right
181 roytam 294  
182 roytam 295                         // draw text
296                         SetBkMode(di->hDC,TRANSPARENT);
181 roytam 297  
182 roytam 298                         // this will do a different style for the button text depending on enabled state of the button
299                         COLORREF colour = wadlg_colors[WADLG_BUTTONFG];
300                         if(!IsWindowEnabled(di->hwndItem)){
301                                 COLORREF fg = wadlg_colors[WADLG_WNDFG],
302                                                  bg = wadlg_colors[WADLG_WNDBG];
303                                                  colour = RGB((GetRValue(fg)+GetRValue(bg))/2,
304                                                                           (GetGValue(fg)+GetGValue(bg))/2,
305                                                                           (GetBValue(fg)+GetBValue(bg))/2);
306                         }
307                         SetTextColor(di->hDC,colour);
308  
309                         if (di->itemState & ODS_SELECTED) {r.left+=2; r.top+=2;}
310                         DrawTextW(di->hDC,wt,-1,&r,DT_VCENTER|DT_SINGLELINE|DT_CENTER);
311  
312                         SelectObject(hdc, hbmpOld);
313                         DeleteDC(hdc);
181 roytam 314  
182 roytam 315                         if(GetFocus()==di->hwndItem) {
316                                 HPEN hpen, hpenOld;
317                                 hpen =CreatePen(PS_SOLID,0,RGB(0,0,0));
318                                 hpenOld = (HPEN)SelectObject(di->hDC, hpen);
319                                 WADlg_dotLine(di->hDC,r.left+2,r.top+2,r.right-r.left-3,0);
320                                 WADlg_dotLine(di->hDC,r.right-3,r.top+2,r.bottom-r.top-3,1);
321                                 WADlg_dotLine(di->hDC,r.left+2,r.top+2,r.bottom-r.top-3,1);
322                                 WADlg_dotLine(di->hDC,r.left+2,r.bottom-3,r.right-r.left-3,0);
323                                 SelectObject(di->hDC, hpenOld);
324                                 DeleteObject(hpen);
325                         }
181 roytam 326                 }      
327         }
182 roytam 328  
329         switch(uMsg)
330         {
331                 case WM_CTLCOLORLISTBOX:
332                 case WM_CTLCOLORDLG:
333                 case WM_CTLCOLORBTN:
334                 case WM_CTLCOLORSTATIC:
335                 case WM_CTLCOLOREDIT:
336                 {
337                         int bgcolor=(uMsg == WM_CTLCOLOREDIT || uMsg == WM_CTLCOLORLISTBOX) ? wadlg_colors[WADLG_ITEMBG] : (uMsg == WM_CTLCOLORBTN ? wadlg_colors[WADLG_ITEMBG] : wadlg_colors[WADLG_WNDBG]);
338                         LOGBRUSH lb={BS_SOLID,GetNearestColor((HDC)wParam,bgcolor)};
339                         if (wadlg_lastbrush) DeleteObject(wadlg_lastbrush);
340                         wadlg_lastbrush=CreateBrushIndirect(&lb);
341                         SetTextColor((HDC)wParam,uMsg == WM_CTLCOLORSTATIC ? wadlg_colors[WADLG_WNDFG] : wadlg_colors[WADLG_ITEMFG]);
342                         SetBkColor((HDC)wParam,lb.lbColor);
343                         return (LRESULT)wadlg_lastbrush;
344                 }
345         }
346         return 0;
181 roytam 347 }
348  
349 static int RectInRect(RECT *rect1, RECT *rect2)
350 {
351   // this has a bias towards true
352  
353   // this could probably be optimized a lot
354   return ((rect1->top >= rect2->top && rect1->top <= rect2->bottom) ||
355       (rect1->bottom >= rect2->top && rect1->bottom <= rect2->bottom) ||
356       (rect2->top >= rect1->top && rect2->top <= rect1->bottom) ||
357       (rect2->bottom >= rect1->top && rect2->bottom <= rect1->bottom)) // vertical intersect
358       &&
359       ((rect1->left >= rect2->left && rect1->left <= rect2->right) ||
360       (rect1->right >= rect2->left && rect1->right <= rect2->right) ||
361       (rect2->left >= rect1->left && rect2->left <= rect1->right) ||
362       (rect2->right >= rect1->left && rect2->right <= rect1->right)) // horiz intersect
363       ;
364 }
365  
366 static void WADlg_removeFromRgn(HRGN hrgn, int left, int top, int right, int bottom)
367 {
182 roytam 368         HRGN rgn2=CreateRectRgn(left,top,right,bottom);
369         CombineRgn(hrgn,hrgn,rgn2,RGN_DIFF);
370         DeleteObject(rgn2);
181 roytam 371 }
372  
373 void WADlg_DrawChildWindowBorders(HWND hwndDlg, int *tab, int tabsize)
374 {
182 roytam 375         PAINTSTRUCT ps;
376         BeginPaint(hwndDlg,&ps);
377         HRGN hrgn = (ps.fErase) ? CreateRectRgnIndirect(&ps.rcPaint) : NULL;
378         HPEN pen = CreatePen(PS_SOLID, 0, wadlg_colors[WADLG_HILITE]);
379         HGDIOBJ o = SelectObject(ps.hdc, pen);
181 roytam 380  
182 roytam 381         while (tabsize--)
382         {
383                 RECT r;
384                 int a = *tab++;
385                 GetWindowRect(GetDlgItem(hwndDlg, a & 0xffff),&r);
386                 MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&r, 2);
387  
388                 if (RectInRect(&ps.rcPaint,&r))
389                 {
390                         if ((a & 0xffff0000) == DCW_SUNKENBORDER)
391                         {
392                                 MoveToEx(ps.hdc,r.left,r.bottom,NULL);
393                                 LineTo(ps.hdc,r.right,r.bottom);
394                                 LineTo(ps.hdc,r.right,r.top-1);
395                                 if(hrgn)
396                                 {
397                                         WADlg_removeFromRgn(hrgn,r.left,r.bottom,r.right,r.bottom+1);
398                                         WADlg_removeFromRgn(hrgn,r.right,r.top,r.right+1,r.bottom);
399                                 }
400                         }
401                         else if ((a & 0xffff0000) == DCW_DIVIDER)
402                         {
403                                 if (r.right - r.left < r.bottom - r.top) // vertical
404                                 {
405                                         int left=(r.left+r.right)/2;
406                                         MoveToEx(ps.hdc,left,r.top,NULL);
407                                         LineTo(ps.hdc,left,r.bottom+1);
408                                         if(hrgn) WADlg_removeFromRgn(hrgn,left,r.top,left+1,r.bottom);
409                                 }
410                                 else // horiz
411                                 {
412                                         int top=(r.top+r.bottom)/2;
413                                         MoveToEx(ps.hdc,r.left,top,NULL);
414                                         LineTo(ps.hdc,r.right+1,top);
415                                         if(hrgn) WADlg_removeFromRgn(hrgn,r.left,top,r.right,top+1);
416                                 }
417                         }
418                 }
419         }
181 roytam 420  
182 roytam 421         SelectObject(ps.hdc, o);
422         DeleteObject(pen);
181 roytam 423  
182 roytam 424         if(hrgn)
425         {
426                 //erase bkgnd while clipping out our own drawn stuff (for flickerless display)
427                 HBRUSH b = CreateSolidBrush(wadlg_colors[WADLG_WNDBG]);
428                 FillRgn(ps.hdc,hrgn,b);
429                 DeleteObject(b);
430             DeleteObject(hrgn);
431         }
432         EndPaint(hwndDlg,&ps);
181 roytam 433 }
434 #endif
435  
436 #endif//_WA_DLG_H_