set most of trunk svn property eol-style:native
[reactos.git] / reactos / base / applications / imagesoft / floatwindow.c
1 #include <precomp.h>
2
3 static const TCHAR szFloatWndClass[] = TEXT("ImageSoftFloatWndClass");
4
5 #define ID_TIMER 1
6
7 TBBUTTON ToolsButtons[] = {
8 /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
9 {TBICON_RECTSEL, ID_RECTSEL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* rectangle select */
10 {TBICON_MOVESEL, ID_MOVESEL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* move selected pixels */
11 {TBICON_LASOO, ID_LASOO, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* lasso select */
12 {TBICON_MOVE, ID_MOVE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* move selection */
13 {TBICON_ECLIPSESEL, ID_ECLIPSESEL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* elipse select */
14 {TBICON_ZOOM, ID_ZOOM, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* zoom */
15 {TBICON_MAGICWAND, ID_MAGICWAND, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* magic wand */
16 {TBICON_TEXT, ID_TEXT, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* text */
17 {TBICON_PAINTBRUSH, ID_PAINTBRUSH, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* paintbrush */
18 {TBICON_ERASER, ID_ERASER, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* eraser */
19 {TBICON_PENCIL, ID_PENCIL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* pencil */
20 {TBICON_COLORPICKER, ID_COLORPICKER, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* color picker */
21 {TBICON_CLONESTAMP, ID_CLONESTAMP, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* clone stamp */
22 {TBICON_RECOLORING, ID_RECOLORING, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* recolor */
23 {TBICON_PAINTBUCKET, ID_PAINTBUCKET, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* paint bucket */
24 {TBICON_LINE, ID_LINE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* line */
25 {TBICON_RECTANGLE, ID_RECTANGLE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* rectangle */
26 {TBICON_ROUNDRECT, ID_ROUNDRECT, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* round rectangle */
27 {TBICON_ECLIPSE, ID_ECLIPSE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* elipse */
28 {TBICON_FREEFORM, ID_FREEFORM, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* free form */
29
30 {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},
31 };
32
33 TBBUTTON HistoryButtons[] = {
34 {TBICON_BACKSM, ID_BACK, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* back */
35 {TBICON_UNDOSM, ID_UNDO, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* undo */
36 {TBICON_REDOSM, ID_REDO, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* redo */
37 {TBICON_FORWARDSM, ID_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* forward */
38 {TBICON_DELETESM, ID_DELETE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* delete */
39 };
40
41
42 BOOL
43 ShowHideWindow(PFLT_WND FltInfo)
44 {
45 ShowWindow(FltInfo->hSelf, FltInfo->bShow ? SW_HIDE : SW_SHOW);
46 FltInfo->bShow = ~FltInfo->bShow;
47
48 return FltInfo->bShow;
49 }
50
51
52 BOOL
53 FloatToolbarCreateToolsGui(PMAIN_WND_INFO Info)
54 {
55 HWND hTb;
56 HIMAGELIST hImageList;
57 INT NumButtons;
58
59 NumButtons = sizeof(ToolsButtons) / sizeof(ToolsButtons[0]);
60
61 hTb = CreateWindowEx(0,
62 TOOLBARCLASSNAME,
63 NULL,
64 WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_WRAPABLE | CCS_NODIVIDER,
65 0, 0, 32, 200,
66 Info->fltTools->hSelf,
67 NULL,
68 hInstance,
69 NULL);
70 if (hTb != NULL)
71 {
72 SendMessage(hTb,
73 TB_SETEXTENDEDSTYLE,
74 0,
75 TBSTYLE_EX_HIDECLIPPEDBUTTONS);
76
77 SendMessage(hTb,
78 TB_BUTTONSTRUCTSIZE,
79 sizeof(ToolsButtons[0]),
80 0);
81
82 SendMessage(hTb,
83 TB_SETBITMAPSIZE,
84 0,
85 (LPARAM)MAKELONG(16, 16));
86
87 hImageList = InitImageList(NumButtons,
88 IDB_TOOLSRECTSEL);
89
90 ImageList_Destroy((HIMAGELIST)SendMessage(hTb,
91 TB_SETIMAGELIST,
92 0,
93 (LPARAM)hImageList));
94
95 SendMessage(hTb,
96 TB_ADDBUTTONS,
97 NumButtons,
98 (LPARAM)ToolsButtons);
99
100 SendMessage(hTb,
101 TB_AUTOSIZE,
102 0,
103 0);
104
105 return TRUE;
106 }
107
108 return FALSE;
109 }
110
111
112 VOID
113 FloatWindowPaintColorPicker(HWND hColorPicker)
114 {
115 HDC hdc;
116 RECT rect;
117
118 InvalidateRect(hColorPicker,
119 NULL,
120 TRUE);
121 UpdateWindow(hColorPicker);
122
123 hdc = GetDC(hColorPicker);
124
125 GetClientRect(hColorPicker,
126 &rect);
127
128 Ellipse(hdc,
129 rect.left,
130 rect.top,
131 rect.right,
132 rect.bottom);
133
134 ReleaseDC(hColorPicker,
135 hdc);
136
137 }
138
139 VOID
140 FloatWindowPaintHueSlider(HWND hHueSlider)
141 {
142 HDC hdc;
143 RECT rect;
144
145 InvalidateRect(hHueSlider,
146 NULL,
147 TRUE);
148 UpdateWindow(hHueSlider);
149
150 hdc = GetDC(hHueSlider);
151
152 GetClientRect(hHueSlider,
153 &rect);
154
155 Rectangle(hdc,
156 rect.left,
157 rect.top,
158 rect.right,
159 rect.bottom);
160
161 ReleaseDC(hHueSlider,
162 hdc);
163
164 }
165
166
167 BOOL
168 FloatToolbarCreateColorsGui(PMAIN_WND_INFO Info)
169 {
170 HWND hColorPicker;
171 HWND hHueSlider;
172 HWND hMouseButton;
173 HWND hMore;
174 RECT rect;
175 HBITMAP hMoreBitmap;
176
177 GetClientRect(Info->fltColors->hSelf,
178 &rect);
179
180 hColorPicker = CreateWindowEx(0,
181 WC_STATIC,
182 NULL,
183 WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
184 2,
185 2,
186 rect.right * 0.65,
187 rect.bottom - 2,
188 Info->fltColors->hSelf,
189 NULL,
190 hInstance,
191 NULL);
192 if (hColorPicker == NULL)
193 return FALSE;
194
195 hHueSlider = CreateWindowEx(0,
196 WC_STATIC,
197 NULL,
198 WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
199 145,
200 35,
201 25,
202 135,
203 Info->fltColors->hSelf,
204 NULL,
205 hInstance,
206 NULL);
207 if (hHueSlider == NULL)
208 return FALSE;
209
210 hMouseButton = CreateWindowEx(0,
211 WC_COMBOBOX,
212 NULL,
213 WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
214 118, 5, 75, 25,
215 Info->fltColors->hSelf,
216 NULL,
217 hInstance,
218 NULL);
219 if (hMouseButton == NULL)
220 return FALSE;
221
222 //MakeFlatCombo(hMouseButton);
223
224 /* temp, just testing */
225 SendMessage(hMouseButton, CB_ADDSTRING, 0, (LPARAM)_T("Primary"));
226 SendMessage(hMouseButton, CB_ADDSTRING, 0, (LPARAM)_T("Secondary"));
227 SendMessage(hMouseButton, CB_SETCURSEL, 0, 0);
228
229
230 hMore = CreateWindowEx(WS_EX_STATICEDGE,
231 WC_BUTTON,
232 NULL,
233 WS_CHILD | WS_VISIBLE | BS_BITMAP,
234 rect.right - 15,
235 rect.bottom - 15,
236 15, 15,
237 Info->fltColors->hSelf,
238 NULL,
239 hInstance,
240 NULL);
241 if (hMore == NULL)
242 return FALSE;
243
244 hMoreBitmap = (HBITMAP)LoadImage(hInstance,
245 MAKEINTRESOURCE(IDB_COLORSMORE),
246 IMAGE_BITMAP,
247 12,
248 11,
249 LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS);
250 if (hMoreBitmap != NULL)
251 {
252 SendMessage(hMore,
253 BM_SETIMAGE,
254 IMAGE_BITMAP,
255 (LPARAM)hMoreBitmap);
256 }
257
258
259 /* temp functions for playing about with possible layouts */
260 FloatWindowPaintHueSlider(hHueSlider);
261 FloatWindowPaintColorPicker(hColorPicker);
262
263 if (hColorPicker != NULL)
264 {
265 HDC hDc = GetDC(hColorPicker);
266 TextOut(hDc, 8, 75, _T("Possible layout?"), 16);
267 ReleaseDC(hColorPicker, hDc);
268 }
269
270 return TRUE;
271
272 }
273
274
275 BOOL
276 FloatToolbarCreateHistoryGui(PMAIN_WND_INFO Info)
277 {
278 HWND hList;
279 HWND hButtons;
280 HIMAGELIST hImageList;
281 INT NumButtons;
282
283 hList = CreateWindowEx(0,
284 WC_LISTBOX,
285 NULL,
286 WS_CHILD | WS_VISIBLE | LBS_EXTENDEDSEL,
287 0, 0, 143, 100,
288 Info->fltHistory->hSelf,
289 NULL,
290 hInstance,
291 NULL);
292 if (hList == NULL)
293 return FALSE;
294
295 NumButtons = sizeof(HistoryButtons) / sizeof(HistoryButtons[0]);
296 hButtons = CreateWindowEx(0,
297 TOOLBARCLASSNAME,
298 NULL,
299 WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_BOTTOM | CCS_NODIVIDER,
300 0, 0, 0, 0,
301 Info->fltHistory->hSelf,
302 NULL,
303 hInstance,
304 NULL);
305 if (hButtons != NULL)
306 {
307 SendMessage(hButtons,
308 TB_BUTTONSTRUCTSIZE,
309 sizeof(ToolsButtons[0]),
310 0);
311
312 SendMessage(hButtons,
313 TB_SETBITMAPSIZE,
314 0,
315 (LPARAM)MAKELONG(10, 10));
316
317 hImageList = InitImageList(NumButtons,
318 IDB_HISTBACK);
319
320 ImageList_Destroy((HIMAGELIST)SendMessage(hButtons,
321 TB_SETIMAGELIST,
322 0,
323 (LPARAM)hImageList));
324
325 SendMessage(hButtons,
326 TB_SETBUTTONSIZE,
327 0,
328 MAKELONG(18, 16));
329
330 SendMessage(hButtons,
331 TB_ADDBUTTONS,
332 NumButtons,
333 (LPARAM)HistoryButtons);
334
335 return TRUE;
336 }
337
338 return FALSE;
339 }
340
341 LRESULT CALLBACK
342 FloatToolbarWndProc(HWND hwnd,
343 UINT Message,
344 WPARAM wParam,
345 LPARAM lParam)
346 {
347 PFLT_WND FltInfo;
348
349 /* Get the window context */
350 FltInfo = (PFLT_WND)GetWindowLongPtr(hwnd,
351 GWLP_USERDATA);
352 if (FltInfo == NULL && Message != WM_CREATE)
353 {
354 goto HandleDefaultMessage;
355 }
356
357 switch(Message)
358 {
359 case WM_CREATE:
360
361 FltInfo = (PFLT_WND)(((LPCREATESTRUCT)lParam)->lpCreateParams);
362
363 /*FIXME: read this from registry */
364 FltInfo->bShow = TRUE;
365
366 FltInfo->bOpaque = FALSE;
367
368 SetWindowLong(hwnd,
369 GWL_EXSTYLE,
370 GetWindowLong(hwnd,
371 GWL_EXSTYLE) | WS_EX_LAYERED);
372
373 /* set the tranclucency to 60% */
374 SetLayeredWindowAttributes(hwnd,
375 0,
376 (255 * 60) / 100,
377 LWA_ALPHA);
378
379 break;
380
381 case WM_TIMER:
382 {
383 POINT pt;
384
385 if (FltInfo->bOpaque != TRUE)
386 {
387 KillTimer(hwnd,
388 ID_TIMER);
389 break;
390 }
391
392 if (GetCursorPos(&pt))
393 {
394 RECT rect;
395
396 if (GetWindowRect(hwnd,
397 &rect))
398 {
399 if (! PtInRect(&rect,
400 pt))
401 {
402 KillTimer(hwnd,
403 ID_TIMER);
404
405 FltInfo->bOpaque = FALSE;
406
407 SetWindowLong(hwnd,
408 GWL_EXSTYLE,
409 GetWindowLong(hwnd,
410 GWL_EXSTYLE) | WS_EX_LAYERED);
411
412 /* set the tranclucency to 60% */
413 SetLayeredWindowAttributes(hwnd,
414 0,
415 (255 * 60) / 100,
416 LWA_ALPHA);
417
418 }
419 }
420 }
421 }
422 break;
423
424 case WM_NCMOUSEMOVE:
425 case WM_MOUSEMOVE:
426 if (FltInfo->bOpaque == FALSE)
427 {
428 SetWindowLong(hwnd,
429 GWL_EXSTYLE,
430 GetWindowLong(hwnd,
431 GWL_EXSTYLE) & ~WS_EX_LAYERED);
432
433 RedrawWindow(hwnd,
434 NULL,
435 NULL,
436 RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
437
438 FltInfo->bOpaque = TRUE;
439 MessageBox(NULL, _T("in"), _T("Hit test"), MB_OK | MB_ICONEXCLAMATION);
440 SetTimer(hwnd,
441 ID_TIMER,
442 200,
443 NULL);
444 }
445 break;
446
447 case WM_CLOSE:
448 ShowHideWindow(FltInfo);
449 break;
450
451 case WM_COMMAND:
452 if (LOWORD(wParam) == IDCANCEL)
453 ShowHideWindow(FltInfo);
454
455 switch(LOWORD(wParam))
456 {
457 case ID_NEW:
458 MessageBox(hwnd, _T("Kapow!"), _T("Hit test"), MB_OK | MB_ICONEXCLAMATION);
459 break;
460
461 case ID_CLONESTAMP:
462 case ID_COLORPICKER:
463 case ID_ECLIPSE:
464 case ID_ECLIPSESEL:
465 case ID_ERASER:
466 case ID_FREEFORM:
467 case ID_LASOO:
468 case ID_LINE:
469 case ID_MAGICWAND:
470 case ID_MOVE:
471 case ID_MOVESEL:
472 case ID_PAINTBRUSH:
473 case ID_PAINTBUCKET:
474 case ID_PENCIL:
475 case ID_RECOLORING:
476 case ID_RECTANGLE:
477 case ID_ROUNDRECT:
478 case ID_TEXT:
479 case ID_ZOOM:
480 /*SendMessage(Info->hSelf,
481 LOWORD(wParam),
482 wParam,
483 lParam);*/
484 break;
485 }
486 break;
487
488 case WM_NCACTIVATE:
489 /* FIXME: needs fully implementing */
490 return DefWindowProc(hwnd,
491 Message,
492 TRUE,
493 lParam);
494 break;
495
496 case WM_DESTROY:
497 SetWindowLongPtr(hwnd,
498 GWLP_USERDATA,
499 0);
500 break;
501
502 default:
503 HandleDefaultMessage:
504 return DefWindowProc(hwnd,
505 Message,
506 wParam,
507 lParam);
508 }
509
510 return 0;
511 }
512
513
514 BOOL
515 InitFloatWndClass(VOID)
516 {
517 WNDCLASSEX wc = {0};
518
519 wc.cbSize = sizeof(WNDCLASSEX);
520 wc.style = CS_HREDRAW | CS_VREDRAW;
521 wc.lpfnWndProc = FloatToolbarWndProc;
522 wc.hInstance = hInstance;
523 wc.hIcon = NULL;
524 wc.hCursor = LoadCursor(NULL,
525 IDC_ARROW);
526 wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
527 wc.lpszClassName = szFloatWndClass;
528 wc.hIconSm = NULL;
529
530 return RegisterClassEx(&wc) != (ATOM)0;
531 }
532
533 VOID
534 UninitFloatWndImpl(VOID)
535 {
536 UnregisterClass(szFloatWndClass,
537 hInstance);
538 }
539