--- /dev/null
+#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 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 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);
+}
+
+