reactos/modules/rosapps/applications/imagesoft/floatwindow.c

630 lines
19 KiB
C

#include "precomp.h"
static const TCHAR szFloatWndClass[] = TEXT("ImageSoftFloatWndClass");
#define ID_TIMER1 1
#define ID_TIMER2 2
#define ID_TIMER3 3
TBBUTTON ToolsButtons[] = {
/* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
{TBICON_RECTSEL, ID_RECTSEL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* rectangle select */
{TBICON_MOVESEL, ID_MOVESEL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* move selected pixels */
{TBICON_LASOO, ID_LASOO, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* lasso select */
{TBICON_MOVE, ID_MOVE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* move selection */
{TBICON_ECLIPSESEL, ID_ECLIPSESEL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* elipse select */
{TBICON_ZOOM, ID_ZOOM, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* zoom */
{TBICON_MAGICWAND, ID_MAGICWAND, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* magic wand */
{TBICON_TEXT, ID_TEXT, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* text */
{TBICON_PAINTBRUSH, ID_PAINTBRUSH, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* paintbrush */
{TBICON_ERASER, ID_ERASER, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* eraser */
{TBICON_PENCIL, ID_PENCIL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* pencil */
{TBICON_COLORPICKER, ID_COLORPICKER, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* color picker */
{TBICON_CLONESTAMP, ID_CLONESTAMP, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* clone stamp */
{TBICON_RECOLORING, ID_RECOLORING, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* recolor */
{TBICON_PAINTBUCKET, ID_PAINTBUCKET, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* paint bucket */
{TBICON_LINE, ID_LINE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* line */
{TBICON_RECTANGLE, ID_RECTANGLE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* rectangle */
{TBICON_ROUNDRECT, ID_ROUNDRECT, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* round rectangle */
{TBICON_ECLIPSE, ID_ECLIPSE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* elipse */
{TBICON_FREEFORM, ID_FREEFORM, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* free form */
{10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},
};
TBBUTTON HistoryButtons[] = {
{TBICON_BACKSM, ID_BACK, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* back */
{TBICON_UNDOSM, ID_UNDO, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* undo */
{TBICON_REDOSM, ID_REDO, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* redo */
{TBICON_FORWARDSM, ID_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* forward */
{TBICON_DELETESM, ID_DELETE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* delete */
};
BOOL
ShowHideWindow(HWND hwnd)
{
if (IsWindowVisible(hwnd))
return ShowWindow(hwnd, SW_HIDE);
else
return ShowWindow(hwnd, SW_SHOW);
}
BOOL
FloatToolbarCreateToolsGui(PMAIN_WND_INFO Info)
{
HWND hTb;
HIMAGELIST hImageList;
INT NumButtons;
NumButtons = sizeof(ToolsButtons) / sizeof(ToolsButtons[0]);
hTb = CreateWindowEx(0,
TOOLBARCLASSNAME,
NULL,
WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_WRAPABLE | CCS_NODIVIDER,
0, 0, 32, 200,
Info->fltTools->hSelf,
NULL,
hInstance,
NULL);
if (hTb != NULL)
{
SendMessage(hTb,
TB_SETEXTENDEDSTYLE,
0,
TBSTYLE_EX_HIDECLIPPEDBUTTONS);
SendMessage(hTb,
TB_BUTTONSTRUCTSIZE,
sizeof(ToolsButtons[0]),
0);
SendMessage(hTb,
TB_SETBITMAPSIZE,
0,
(LPARAM)MAKELONG(16, 16));
hImageList = InitImageList(NumButtons,
IDB_TOOLSRECTSEL);
ImageList_Destroy((HIMAGELIST)SendMessage(hTb,
TB_SETIMAGELIST,
0,
(LPARAM)hImageList));
SendMessage(hTb,
TB_ADDBUTTONS,
NumButtons,
(LPARAM)ToolsButtons);
SendMessage(hTb,
TB_AUTOSIZE,
0,
0);
return TRUE;
}
return FALSE;
}
VOID
FloatWindowPaintColorPicker(HWND hColorPicker)
{
HDC hdc;
RECT rect;
InvalidateRect(hColorPicker,
NULL,
TRUE);
UpdateWindow(hColorPicker);
hdc = GetDC(hColorPicker);
GetClientRect(hColorPicker,
&rect);
Ellipse(hdc,
rect.left,
rect.top,
rect.right,
rect.bottom);
ReleaseDC(hColorPicker,
hdc);
}
VOID
FloatWindowPaintHueSlider(HWND hHueSlider)
{
HDC hdc;
RECT rect;
InvalidateRect(hHueSlider,
NULL,
TRUE);
UpdateWindow(hHueSlider);
hdc = GetDC(hHueSlider);
GetClientRect(hHueSlider,
&rect);
Rectangle(hdc,
rect.left,
rect.top,
rect.right,
rect.bottom);
ReleaseDC(hHueSlider,
hdc);
}
BOOL
FloatToolbarCreateColorsGui(PMAIN_WND_INFO Info)
{
HWND hColorPicker;
HWND hHueSlider;
HWND hMouseButton;
HWND hMore;
RECT rect;
HBITMAP hMoreBitmap;
GetClientRect(Info->fltColors->hSelf,
&rect);
hColorPicker = CreateWindowEx(0,
WC_STATIC,
NULL,
WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
2,
2,
(int) (rect.right * 0.65),
rect.bottom - 2,
Info->fltColors->hSelf,
NULL,
hInstance,
NULL);
if (hColorPicker == NULL)
return FALSE;
hHueSlider = CreateWindowEx(0,
WC_STATIC,
NULL,
WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
145,
35,
25,
135,
Info->fltColors->hSelf,
NULL,
hInstance,
NULL);
if (hHueSlider == NULL)
return FALSE;
hMouseButton = CreateWindowEx(0,
WC_COMBOBOX,
NULL,
WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
118, 5, 75, 25,
Info->fltColors->hSelf,
NULL,
hInstance,
NULL);
if (hMouseButton == NULL)
return FALSE;
MakeFlatCombo(hMouseButton);
/* temp, just testing */
SendMessage(hMouseButton, CB_ADDSTRING, 0, (LPARAM)_T("Primary"));
SendMessage(hMouseButton, CB_ADDSTRING, 0, (LPARAM)_T("Secondary"));
SendMessage(hMouseButton, CB_SETCURSEL, 0, 0);
hMore = CreateWindowEx(WS_EX_STATICEDGE,
WC_BUTTON,
NULL,
WS_CHILD | WS_VISIBLE | BS_BITMAP,
rect.right - 15,
rect.bottom - 15,
15, 15,
Info->fltColors->hSelf,
NULL,
hInstance,
NULL);
if (hMore == NULL)
return FALSE;
hMoreBitmap = (HBITMAP)LoadImage(hInstance,
MAKEINTRESOURCE(IDB_COLORSMORE),
IMAGE_BITMAP,
12,
11,
LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS);
if (hMoreBitmap != NULL)
{
SendMessage(hMore,
BM_SETIMAGE,
IMAGE_BITMAP,
(LPARAM)hMoreBitmap);
}
/* temp functions for playing about with possible layouts */
FloatWindowPaintHueSlider(hHueSlider);
FloatWindowPaintColorPicker(hColorPicker);
if (hColorPicker != NULL)
{
HDC hDc = GetDC(hColorPicker);
TextOut(hDc, 8, 75, _T("Possible layout?"), 16);
ReleaseDC(hColorPicker, hDc);
}
return TRUE;
}
BOOL
FloatToolbarCreateHistoryGui(PMAIN_WND_INFO Info)
{
HWND hList;
HWND hButtons;
HIMAGELIST hImageList;
INT NumButtons;
hList = CreateWindowEx(0,
WC_LISTBOX,
NULL,
WS_CHILD | WS_VISIBLE | LBS_EXTENDEDSEL,
0, 0, 143, 100,
Info->fltHistory->hSelf,
NULL,
hInstance,
NULL);
if (hList == NULL)
return FALSE;
NumButtons = sizeof(HistoryButtons) / sizeof(HistoryButtons[0]);
hButtons = CreateWindowEx(0,
TOOLBARCLASSNAME,
NULL,
WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_BOTTOM | CCS_NODIVIDER,
0, 0, 0, 0,
Info->fltHistory->hSelf,
NULL,
hInstance,
NULL);
if (hButtons != NULL)
{
SendMessage(hButtons,
TB_BUTTONSTRUCTSIZE,
sizeof(ToolsButtons[0]),
0);
SendMessage(hButtons,
TB_SETBITMAPSIZE,
0,
(LPARAM)MAKELONG(10, 10));
hImageList = InitImageList(NumButtons,
IDB_HISTBACK);
ImageList_Destroy((HIMAGELIST)SendMessage(hButtons,
TB_SETIMAGELIST,
0,
(LPARAM)hImageList));
SendMessage(hButtons,
TB_SETBUTTONSIZE,
0,
MAKELONG(18, 16));
SendMessage(hButtons,
TB_ADDBUTTONS,
NumButtons,
(LPARAM)HistoryButtons);
return TRUE;
}
return FALSE;
}
static VOID
DoTimer(PFLT_WND FltInfo,
UINT_PTR idTimer)
{
switch (idTimer)
{
/* timer to check if cursor is in toolbar coords */
case ID_TIMER1:
{
POINT pt;
/* kill timer if toobar is not opaque */
if (FltInfo->bOpaque != TRUE)
{
KillTimer(FltInfo->hSelf,
ID_TIMER1);
break;
}
if (GetCursorPos(&pt))
{
RECT rect;
if (GetWindowRect(FltInfo->hSelf,
&rect))
{
if (!PtInRect(&rect,
pt))
{
KillTimer(FltInfo->hSelf,
ID_TIMER1);
KillTimer(FltInfo->hSelf,
ID_TIMER2);
/* timer to fade out toolbar */
SetTimer(FltInfo->hSelf,
ID_TIMER3,
50,
NULL);
}
}
}
}
break;
/* timer to fade in toolbar */
case ID_TIMER2:
{
SetLayeredWindowAttributes(FltInfo->hSelf,
0,
(255 * FltInfo->Transparancy) / 100,
LWA_ALPHA);
/* increment transparancy until it is opaque (100) */
FltInfo->Transparancy += 5;
if (FltInfo->Transparancy == 100)
{
SetWindowLongPtr(FltInfo->hSelf,
GWL_EXSTYLE,
GetWindowLongPtr(FltInfo->hSelf,
GWL_EXSTYLE) & ~WS_EX_LAYERED);
FltInfo->bOpaque = TRUE;
KillTimer(FltInfo->hSelf,
ID_TIMER2);
}
}
break;
case ID_TIMER3:
{
LONG_PTR Style;
Style = GetWindowLongPtr(FltInfo->hSelf,
GWL_EXSTYLE);
if (Style & ~WS_EX_LAYERED)
{
SetWindowLongPtr(FltInfo->hSelf,
GWL_EXSTYLE,
Style | WS_EX_LAYERED);
}
FltInfo->Transparancy -= 5;
if (FltInfo->Transparancy >= 60)
{
/* set the tranclucency to 60% */
SetLayeredWindowAttributes(FltInfo->hSelf,
0,
(255 * FltInfo->Transparancy) / 100,
LWA_ALPHA);
if (FltInfo->Transparancy == 60)
{
FltInfo->bOpaque = FALSE;
KillTimer(FltInfo->hSelf,
ID_TIMER3);
}
}
}
break;
}
}
LRESULT CALLBACK
FloatToolbarWndProc(HWND hwnd,
UINT Message,
WPARAM wParam,
LPARAM lParam)
{
PFLT_WND FltInfo;
/* Get the window context */
FltInfo = (PFLT_WND)GetWindowLongPtr(hwnd,
GWLP_USERDATA);
if (FltInfo == NULL && Message != WM_CREATE)
{
goto HandleDefaultMessage;
}
switch(Message)
{
case WM_CREATE:
{
FltInfo = (PFLT_WND)(((LPCREATESTRUCT)lParam)->lpCreateParams);
/*FIXME: read this from registry */
// FltInfo->bShow = TRUE;
SetWindowLongPtr(hwnd,
GWLP_USERDATA,
(LONG_PTR)FltInfo);
FltInfo->bOpaque = FALSE;
SetWindowLongPtr(hwnd,
GWL_EXSTYLE,
GetWindowLongPtr(hwnd,
GWL_EXSTYLE) | WS_EX_LAYERED);
/* set the tranclucency to 60% */
FltInfo->Transparancy = 60;
SetLayeredWindowAttributes(hwnd,
0,
(255 * FltInfo->Transparancy) / 100,
LWA_ALPHA);
}
break;
case WM_TIMER:
{
DoTimer(FltInfo,
wParam);
}
break;
case WM_NCMOUSEMOVE:
case WM_MOUSEMOVE:
{
if (FltInfo->bOpaque == FALSE)
{
RedrawWindow(hwnd,
NULL,
NULL,
RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
FltInfo->bOpaque = TRUE;
//MessageBox(NULL, _T("in"), _T("Hit test"), MB_OK | MB_ICONEXCLAMATION);
/* timer to check if cursor is in toolbar coords */
SetTimer(hwnd,
ID_TIMER1,
200,
NULL);
/* timer to fade in the toolbars */
SetTimer(hwnd,
ID_TIMER2,
50,
NULL);
}
}
break;
case WM_CLOSE:
ShowHideWindow(FltInfo->hSelf);
break;
case WM_COMMAND:
{
if (LOWORD(wParam) == IDCANCEL)
ShowHideWindow(FltInfo->hSelf);
switch(LOWORD(wParam))
{
case ID_NEW:
MessageBox(hwnd, _T("Kapow!"), _T("Hit test"), MB_OK | MB_ICONEXCLAMATION);
break;
case ID_CLONESTAMP:
case ID_COLORPICKER:
case ID_ECLIPSE:
case ID_ECLIPSESEL:
case ID_ERASER:
case ID_FREEFORM:
case ID_LASOO:
case ID_LINE:
case ID_MAGICWAND:
case ID_MOVE:
case ID_MOVESEL:
case ID_PAINTBRUSH:
case ID_PAINTBUCKET:
case ID_PENCIL:
case ID_RECOLORING:
case ID_RECTANGLE:
case ID_ROUNDRECT:
case ID_TEXT:
case ID_ZOOM:
/*SendMessage(Info->hSelf,
LOWORD(wParam),
wParam,
lParam);*/
break;
}
}
break;
case WM_NCACTIVATE:
/* FIXME: needs fully implementing */
return DefWindowProc(hwnd,
Message,
TRUE,
lParam);
break;
case WM_DESTROY:
SetWindowLongPtr(hwnd,
GWLP_USERDATA,
0);
break;
default:
HandleDefaultMessage:
return DefWindowProc(hwnd,
Message,
wParam,
lParam);
}
return 0;
}
BOOL
InitFloatWndClass(VOID)
{
WNDCLASSEX wc = {0};
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = FloatToolbarWndProc;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL,
IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszClassName = szFloatWndClass;
wc.hIconSm = NULL;
return RegisterClassEx(&wc) != (ATOM)0;
}
VOID
UninitFloatWndImpl(VOID)
{
UnregisterClass(szFloatWndClass,
hInstance);
}