123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- #include "./fileview.h"
- #include "./fileview_internal.h"
- #include "./resource.h"
- #include "../nu/menushortcuts.h"
- #include <windowsx.h>
- #include <strsafe.h>
- #define FVTOOLBAR_DATAW L"FVTOOLBAR"
- typedef struct _FVTOOLBAR
- {
- HMENU hMenu;
- } FVTOOLBAR;
- #define GetToolbar(__hwnd) ((FVTOOLBAR*)GetPropW((__hwnd), FVTOOLBAR_DATAW))
- static INT_PTR CALLBACK FileViewToolbar_DialogProc(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
- static HMLIMGLST hmlilModes = NULL;
- HWND FileViewToolbar_Create(HWND hwndParent)
- {
- HWND hwnd = WASABI_API_CREATEDIALOGPARAMW(IDD_FILEVIEW_TOOLBAR, hwndParent, FileViewToolbar_DialogProc, 0L);
- return hwnd;
- }
- static LRESULT FileViewToolbar_NotifyParent(HWND hdlg, UINT uCode, NMHDR *phdr)
- {
- HWND hParent = GetParent(hdlg);
- if (!phdr || !hParent) return 0L;
- phdr->code = uCode;
- phdr->hwndFrom = hdlg;
- phdr->idFrom = GetDlgCtrlID(hdlg);
- return SendMessageW(hParent, WM_NOTIFY, (WPARAM)phdr->idFrom, (LPARAM)phdr);
- }
- static void FileViewToolbar_LoadImages()
- {
- MLIMAGESOURCE_I mlis;
- if (NULL != hmlilModes) return;
- ZeroMemory(&mlis, sizeof(MLIMAGESOURCE_I));
- mlis.type = SRC_TYPE_PNG;
- mlis.hInst = plugin.hDllInstance;
- hmlilModes = MLImageListI_Create(18, 12, MLILC_COLOR32, 3, 2, 3, hmlifMngr);
- if (NULL != hmlilModes)
- {
- INT imageList[] = { IDB_FILEVIEW_ICON, IDB_FILEVIEW_LIST, IDB_FILEVIEW_DETAIL };
- for(int i = 0; i < sizeof(imageList)/sizeof(imageList[0]); i++)
- {
- mlis.lpszName = MAKEINTRESOURCEW(imageList[i]);
- MLImageListI_Add(hmlilModes, &mlis, MLIF_BUTTONBLENDPLUSCOLOR_UID, imageList[i]);
- }
- }
- }
- static void FileViewToolbar_LayoutWindows(HWND hdlg, BOOL bRedraw)
- {
- INT buttonList[] = { IDC_BTN_VIEW_ICON, IDC_BTN_VIEW_LIST, IDC_BTN_VIEW_DETAIL, IDC_BTN_ARRANGEBY, IDC_BTN_OPTIONS, };
- HDWP hdwp;
- DWORD flags, size;
- RECT rc;
- if (!GetClientRect(hdlg, &rc)) return;
- flags = SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW;
- hdwp = BeginDeferWindowPos(sizeof(buttonList)/sizeof(buttonList[0]));
- if (!hdwp) return;
- for(int i =0; i < sizeof(buttonList)/sizeof(buttonList[0]); i++)
- {
- HWND hctrl = GetDlgItem(hdlg, buttonList[i]);
- if (NULL != hctrl)
- {
- size = MLSkinnedButton_GetIdealSize(hctrl, NULL);
- INT width = LOWORD(size);
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, 0, 0, width, rc.bottom - rc.top, flags);
- }
- }
- EndDeferWindowPos(hdwp);
- SetWindowPos(hdlg, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE |
- SWP_NOZORDER | SWP_FRAMECHANGED | ((bRedraw) ? 0 : SWP_NOREDRAW));
- }
- static BOOL FileViewToolbar_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam)
- {
- FVTOOLBAR *ptb;
- ptb = (FVTOOLBAR*)calloc(1, sizeof(FVTOOLBAR));
- if (ptb)
- {
- if (!SetPropW(hdlg, FVTOOLBAR_DATAW, ptb))
- {
- free(ptb);
- ptb = NULL;
- }
- }
- if (!ptb)
- {
- DestroyWindow(hdlg);
- return 0;
- }
- FileViewToolbar_LoadImages();
- HWND hctrl;
- SkinWindowEx(hdlg, SKINNEDWND_TYPE_AUTO, SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT);
- hctrl = GetDlgItem(hdlg, IDC_BTN_VIEW_ICON);
- SkinWindowEx(hctrl, SKINNEDWND_TYPE_BUTTON, SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT | SWBS_TOOLBAR);
- MLSkinnedButton_SetImageList(hctrl, hmlilModes, 0, 0, 0, 0);
- hctrl = GetDlgItem(hdlg, IDC_BTN_VIEW_LIST);
- SkinWindowEx(hctrl, SKINNEDWND_TYPE_BUTTON, SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT | SWBS_TOOLBAR);
- MLSkinnedButton_SetImageList(hctrl, hmlilModes, 1, 1, 1, 1);
- hctrl = GetDlgItem(hdlg, IDC_BTN_VIEW_DETAIL);
- SkinWindowEx(hctrl, SKINNEDWND_TYPE_BUTTON, SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT | SWBS_TOOLBAR);
- MLSkinnedButton_SetImageList(hctrl, hmlilModes, 2, 2, 2, 2);
- hctrl = GetDlgItem(hdlg, IDC_BTN_ARRANGEBY);
- SkinWindowEx(hctrl, SKINNEDWND_TYPE_BUTTON, SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT | SWBS_DROPDOWNBUTTON | SWBS_TOOLBAR);
- hctrl = GetDlgItem(hdlg, IDC_BTN_OPTIONS);
- SkinWindowEx(hctrl, SKINNEDWND_TYPE_BUTTON, SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT | SWBS_DROPDOWNBUTTON | SWBS_TOOLBAR);
- FileViewToolbar_LayoutWindows(hdlg, FALSE);
- return FALSE;
- }
- static void FileViewToolbar_OnDestroy(HWND hdlg)
- {
- FVTOOLBAR *ptb = GetToolbar(hdlg);
- if (ptb)
- {
- RemovePropW(hdlg, FVTOOLBAR_DATAW);
- if (ptb->hMenu) DestroyMenu(ptb->hMenu);
- free(ptb);
- }
- }
- static void FileViewToolbar_OnWindowPosChanged(HWND hdlg, WINDOWPOS *pwp)
- {
- HWND hctrl;
- RECT rc, rw;
- UINT flags;
- LONG right, left;
- DWORD ws;
- if (SWP_NOSIZE == ((SWP_NOSIZE | SWP_FRAMECHANGED) & pwp->flags)) return;
- GetClientRect(hdlg, &rc);
- right = rc.right -2;
- left = rc.left + 2;
- rc.bottom -= 2;
- HDWP hdwp = BeginDeferWindowPos(4);
- if (NULL == hdwp) return;
- flags = SWP_NOACTIVATE | SWP_NOZORDER | ((SWP_NOREDRAW | SWP_NOCOPYBITS) & pwp->flags);
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_VIEW_ICON)) && GetWindowRect(hctrl, &rw))
- {
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, left, rc.top, rw.right - rw.left, rc.bottom - rc.top, flags);
- left += (rw.right - rw.left) + 2;
- }
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_VIEW_LIST)) && GetWindowRect(hctrl, &rw))
- {
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, left, rc.top, rw.right - rw.left, rc.bottom - rc.top, flags);
- left += (rw.right - rw.left) + 2;
- }
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_VIEW_DETAIL)) && GetWindowRect(hctrl, &rw))
- {
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, left, rc.top, rw.right - rw.left, rc.bottom - rc.top, flags);
- left += (rw.right - rw.left) + 2;
- }
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_OPTIONS)) && GetWindowRect(hctrl, &rw))
- {
- right -= (rw.right - rw.left);
- ws = GetWindowLongPtrW(hctrl, GWL_STYLE);
- if (right < (left + 8)) { if (WS_VISIBLE & ws) ShowWindow(hctrl, SW_HIDE);}
- else { if (0 == (WS_VISIBLE & ws)) ShowWindow(hctrl, SW_SHOWNA); }
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, right, rc.top, rw.right - rw.left, rc.bottom - rc.top, flags);
- right -= 4;
- }
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_ARRANGEBY)) && GetWindowRect(hctrl, &rw))
- {
- right -= (rw.right - rw.left);
- ws = GetWindowLongPtrW(hctrl, GWL_STYLE);
- if (right < (left + 8)) { if (WS_VISIBLE & ws) ShowWindow(hctrl, SW_HIDE);}
- else { if (0 == (WS_VISIBLE & ws)) ShowWindow(hctrl, SW_SHOWNA); }
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, right, rc.top, rw.right - rw.left, rc.bottom - rc.top, flags);
- }
- EndDeferWindowPos(hdwp);
- }
- static INT FileViewToolbar_OnGetBestHeight(HWND hdlg)
- {
- INT height = 0;
- HWND hctrl;
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_OPTIONS)))
- {
- DWORD sz = MLSkinnedButton_GetIdealSize(hctrl, NULL);
- height = HIWORD(sz);
- }
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_VIEW_ICON)))
- {
- DWORD sz = MLSkinnedButton_GetIdealSize(hctrl, NULL);
- if (height < HIWORD(sz)) height = HIWORD(sz);
- }
- height += 1;
- if (height < 12) height = 12;
- return height;
- }
- static void FolderBrowserToolbar_NotifyViewSwitch(HWND hdlg)
- {
- INT nCmd = 0;
- if (BST_CHECKED == IsDlgButtonChecked(hdlg, IDC_BTN_VIEW_LIST)) nCmd = ID_FILEVIEW_SETMODE_LIST;
- else if (BST_CHECKED == IsDlgButtonChecked(hdlg, IDC_BTN_VIEW_ICON)) nCmd = ID_FILEVIEW_SETMODE_ICON;
- else if (BST_CHECKED == IsDlgButtonChecked(hdlg, IDC_BTN_VIEW_DETAIL)) nCmd = ID_FILEVIEW_SETMODE_DETAIL;
- SendMessageW(GetParent(hdlg), WM_COMMAND, MAKEWPARAM(nCmd, 0), 0L);
- }
- static void FileViewToolbar_InvertParentStyle(HWND hdlg, UINT style)
- {
- HWND hParent = GetParent(hdlg);
- if (hParent)
- {
- FileView_SetStyle(hParent, FileView_GetStyle(hParent) ^ style, style);
- FileView_Refresh(hParent, FALSE);
- }
- }
- static void FileViewToolbar_DisplayOptionsMenu(HWND hdlg, HWND hButton)
- {
- RECT r;
- if (!hButton || !GetWindowRect(hButton, &r))
- {
- GetCursorPos((POINT*)&r);
- SetRect(&r, r.left, r.top, r.left, r.top);
- }
- if (hButton) MLSkinnedButton_SetDropDownState(hButton, TRUE);
- FileView_DisplayPopupMenu(GetParent(hdlg), FVMENU_OPTIONS,
- TPM_RIGHTBUTTON | TPM_LEFTBUTTON | TPM_TOPALIGN | TPM_RIGHTALIGN | TPM_VERPOSANIMATION,
- *(((POINT*)&r) + 1));
- if (hButton) MLSkinnedButton_SetDropDownState(hButton, FALSE);
- }
- static void FileViewToolbar_DisplayArrangeByMenu(HWND hdlg, HWND hButton)
- {
- RECT r;
- if (!hButton || !GetWindowRect(hButton, &r))
- {
- GetCursorPos((POINT*)&r);
- SetRect(&r, r.left, r.top, r.left, r.top);
- }
-
- if (hButton) MLSkinnedButton_SetDropDownState(hButton, TRUE);
-
- FileView_DisplayPopupMenu(GetParent(hdlg),
- FVMENU_ARRANGEBY, TPM_RIGHTBUTTON | TPM_LEFTBUTTON | TPM_TOPALIGN | TPM_RIGHTALIGN | TPM_VERPOSANIMATION,
- *(((POINT*)&r) + 1));
- if (hButton) MLSkinnedButton_SetDropDownState(hButton, FALSE);
- }
- static void FileViewToolbar_OnCommand(HWND hdlg, INT eventId, INT ctrlId, HWND hwndCtrl)
- {
- switch (ctrlId)
- {
- case IDC_BTN_VIEW_ICON:
- case IDC_BTN_VIEW_LIST:
- case IDC_BTN_VIEW_DETAIL:
- switch(eventId)
- {
- case BN_CLICKED: FolderBrowserToolbar_NotifyViewSwitch(hdlg); break;
- }
- break;
- case IDC_BTN_OPTIONS:
- switch(eventId)
- {
- case MLBN_DROPDOWN: FileViewToolbar_DisplayOptionsMenu(hdlg, hwndCtrl); break;
- }
- break;
- case IDC_BTN_ARRANGEBY:
- switch(eventId)
- {
- case MLBN_DROPDOWN: FileViewToolbar_DisplayArrangeByMenu(hdlg, hwndCtrl); break;
- }
- break;
- }
- }
- static void FileViewToolbar_OnSetStyle(HWND hdlg, UINT uStyle, UINT uStyleMask)
- {
- if (FVS_VIEWMASK & uStyleMask)
- {
- UINT idc = ((UINT)-1);
- switch(FVS_VIEWMASK & uStyle)
- {
- case FVS_LISTVIEW: idc = IDC_BTN_VIEW_LIST; break;
- case FVS_ICONVIEW: idc = IDC_BTN_VIEW_ICON; break;
- case FVS_DETAILVIEW: idc = IDC_BTN_VIEW_DETAIL; break;
- }
- CheckRadioButton(hdlg, IDC_BTN_VIEW_ICON, IDC_BTN_VIEW_DETAIL, idc);
- }
- }
- static INT_PTR CALLBACK FileViewToolbar_DialogProc(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch(uMsg)
- {
- case WM_INITDIALOG: return FileViewToolbar_OnInitDialog(hdlg, (HWND)wParam, lParam);
- case WM_DESTROY: FileViewToolbar_OnDestroy(hdlg); return TRUE;
- case WM_WINDOWPOSCHANGED: FileViewToolbar_OnWindowPosChanged(hdlg, (WINDOWPOS*)lParam); return TRUE;
- case WM_COMMAND: FileViewToolbar_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); return TRUE;
- case FVM_GETIDEALHEIGHT: SetWindowLongPtrW(hdlg, DWLP_MSGRESULT, FileViewToolbar_OnGetBestHeight(hdlg)); return TRUE;
- case WM_SETFONT: FileViewToolbar_LayoutWindows(hdlg, LOWORD(lParam)); return TRUE;
- case FVM_SETSTYLE: FileViewToolbar_OnSetStyle(hdlg, (UINT)lParam, (UINT)wParam); return TRUE;
- }
- return 0;
- }
|