mirror of
https://github.com/reactos/reactos.git
synced 2026-06-24 17:17:45 +08:00
Some style-improvements I wanted to apply before a planned backport. E.g. The biggest source-file CDefView.cpp in [SHELL32] can be shrinked considerably by stripping some outdated comments from 10 and more years ago, when this class was still non-OOP and named ShellView. Less excessive line-lengths also here and there. In case it is not obvious when reviewing: In the beginning of CDevView.cpp in the declaration-part I just reduced the indentation-level by 4 spaces for a big block. Some shell classes were touched during 0.4.15-dev'ing for fixes like the 'unkown'-typo in 0.4.15-dev-6323-g3854a5d8e9for example or missing \n were added to dbgprints like in 0.4.15-dev-4492-g03422451b3Touched again here, because I want to port those improvements back, but don't intend to increase the size in older releases. The commit looks big, but does consist solely of trivialities. There is no functional change in this commit, aside the logging ofc.
321 lines
9.2 KiB
C++
321 lines
9.2 KiB
C++
/*
|
|
* Folder Options
|
|
*
|
|
* Copyright 2007 Johannes Anderwald <johannes.anderwald@reactos.org>
|
|
* Copyright 2016-2018 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL (fprop);
|
|
|
|
// Folder Options:
|
|
// CLASSKEY = HKEY_CLASSES_ROOT\CLSID\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// strings
|
|
|
|
// path to shell32
|
|
LPCWSTR g_pszShell32 = L"%SystemRoot%\\system32\\shell32.dll";
|
|
|
|
// the space characters
|
|
LPCWSTR g_pszSpace = L" \t\n\r\f\v";
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// utility functions
|
|
|
|
HBITMAP Create24BppBitmap(HDC hDC, INT cx, INT cy)
|
|
{
|
|
BITMAPINFO bi;
|
|
LPVOID pvBits;
|
|
|
|
ZeroMemory(&bi, sizeof(bi));
|
|
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
|
bi.bmiHeader.biWidth = cx;
|
|
bi.bmiHeader.biHeight = cy;
|
|
bi.bmiHeader.biPlanes = 1;
|
|
bi.bmiHeader.biBitCount = 24;
|
|
bi.bmiHeader.biCompression = BI_RGB;
|
|
|
|
HBITMAP hbm = CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, &pvBits, NULL, 0);
|
|
return hbm;
|
|
}
|
|
|
|
HBITMAP BitmapFromIcon(HICON hIcon, INT cx, INT cy)
|
|
{
|
|
HDC hDC = CreateCompatibleDC(NULL);
|
|
if (!hDC)
|
|
return NULL;
|
|
|
|
HBITMAP hbm = Create24BppBitmap(hDC, cx, cy);
|
|
if (!hbm)
|
|
{
|
|
DeleteDC(hDC);
|
|
return NULL;
|
|
}
|
|
|
|
HGDIOBJ hbmOld = SelectObject(hDC, hbm);
|
|
{
|
|
RECT rc = { 0, 0, cx, cy };
|
|
FillRect(hDC, &rc, HBRUSH(COLOR_3DFACE + 1));
|
|
if (hIcon)
|
|
{
|
|
DrawIconEx(hDC, 0, 0, hIcon, cx, cy, 0, NULL, DI_NORMAL);
|
|
}
|
|
}
|
|
SelectObject(hDC, hbmOld);
|
|
DeleteDC(hDC);
|
|
|
|
return hbm;
|
|
}
|
|
|
|
HBITMAP CreateCheckImage(HDC hDC, BOOL bCheck, BOOL bEnabled)
|
|
{
|
|
INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
|
|
INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
|
|
|
|
HBITMAP hbm = Create24BppBitmap(hDC, cxSmallIcon, cySmallIcon);
|
|
if (hbm == NULL)
|
|
return NULL; // failure
|
|
|
|
RECT Rect, BoxRect;
|
|
SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
|
|
BoxRect = Rect;
|
|
InflateRect(&BoxRect, -1, -1);
|
|
|
|
HGDIOBJ hbmOld = SelectObject(hDC, hbm);
|
|
{
|
|
UINT uState = DFCS_BUTTONCHECK | DFCS_FLAT | DFCS_MONO;
|
|
if (bCheck)
|
|
uState |= DFCS_CHECKED;
|
|
if (!bEnabled)
|
|
uState |= DFCS_INACTIVE;
|
|
DrawFrameControl(hDC, &BoxRect, DFC_BUTTON, uState);
|
|
}
|
|
SelectObject(hDC, hbmOld);
|
|
|
|
return hbm; // success
|
|
}
|
|
|
|
HBITMAP CreateCheckMask(HDC hDC)
|
|
{
|
|
INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
|
|
INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
|
|
|
|
HBITMAP hbm = CreateBitmap(cxSmallIcon, cySmallIcon, 1, 1, NULL);
|
|
if (hbm == NULL)
|
|
return NULL; // failure
|
|
|
|
RECT Rect, BoxRect;
|
|
SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
|
|
BoxRect = Rect;
|
|
InflateRect(&BoxRect, -1, -1);
|
|
|
|
HGDIOBJ hbmOld = SelectObject(hDC, hbm);
|
|
{
|
|
FillRect(hDC, &Rect, HBRUSH(GetStockObject(WHITE_BRUSH)));
|
|
FillRect(hDC, &BoxRect, HBRUSH(GetStockObject(BLACK_BRUSH)));
|
|
}
|
|
SelectObject(hDC, hbmOld);
|
|
|
|
return hbm; // success
|
|
}
|
|
|
|
HBITMAP CreateRadioImage(HDC hDC, BOOL bCheck, BOOL bEnabled)
|
|
{
|
|
INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
|
|
INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
|
|
|
|
HBITMAP hbm = Create24BppBitmap(hDC, cxSmallIcon, cySmallIcon);
|
|
if (hbm == NULL)
|
|
return NULL; // failure
|
|
|
|
RECT Rect, BoxRect;
|
|
SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
|
|
BoxRect = Rect;
|
|
InflateRect(&BoxRect, -1, -1);
|
|
|
|
HGDIOBJ hbmOld = SelectObject(hDC, hbm);
|
|
{
|
|
UINT uState = DFCS_BUTTONRADIOIMAGE | DFCS_FLAT | DFCS_MONO;
|
|
if (bCheck)
|
|
uState |= DFCS_CHECKED;
|
|
if (!bEnabled)
|
|
uState |= DFCS_INACTIVE;
|
|
DrawFrameControl(hDC, &BoxRect, DFC_BUTTON, uState);
|
|
}
|
|
SelectObject(hDC, hbmOld);
|
|
|
|
return hbm; // success
|
|
}
|
|
|
|
HBITMAP CreateRadioMask(HDC hDC)
|
|
{
|
|
INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
|
|
INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
|
|
|
|
HBITMAP hbm = CreateBitmap(cxSmallIcon, cySmallIcon, 1, 1, NULL);
|
|
if (hbm == NULL)
|
|
return NULL; // failure
|
|
|
|
RECT Rect, BoxRect;
|
|
SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
|
|
BoxRect = Rect;
|
|
InflateRect(&BoxRect, -1, -1);
|
|
|
|
HGDIOBJ hbmOld = SelectObject(hDC, hbm);
|
|
{
|
|
FillRect(hDC, &Rect, HBRUSH(GetStockObject(WHITE_BRUSH)));
|
|
UINT uState = DFCS_BUTTONRADIOMASK | DFCS_FLAT | DFCS_MONO;
|
|
DrawFrameControl(hDC, &BoxRect, DFC_BUTTON, uState);
|
|
}
|
|
SelectObject(hDC, hbmOld);
|
|
|
|
return hbm; // success
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CMSGlobalFolderOptionsStub --- The owner window of Folder Options.
|
|
// This window hides taskbar button of Folder Options.
|
|
class CMSGlobalFolderOptionsStub : public CWindowImpl<CMSGlobalFolderOptionsStub>
|
|
{
|
|
public:
|
|
DECLARE_WND_CLASS_EX(_T("MSGlobalFolderOptionsStub"), 0, COLOR_WINDOWTEXT)
|
|
|
|
BEGIN_MSG_MAP(CMSGlobalFolderOptionsStub)
|
|
END_MSG_MAP()
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
EXTERN_C HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj);
|
|
|
|
static int CALLBACK
|
|
PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
|
|
{
|
|
// NOTE: This callback is needed to set large icon correctly.
|
|
HICON hIcon;
|
|
switch (uMsg)
|
|
{
|
|
case PSCB_INITIALIZED:
|
|
{
|
|
hIcon = LoadIconW(shell32_hInstance, MAKEINTRESOURCEW(IDI_SHELL_FOLDER_OPTIONS));
|
|
SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static VOID
|
|
ShowFolderOptionsDialog(HWND hWnd, HINSTANCE hInst)
|
|
{
|
|
PROPSHEETHEADERW pinfo;
|
|
HPROPSHEETPAGE hppages[3];
|
|
HPROPSHEETPAGE hpage;
|
|
UINT num_pages = 0;
|
|
WCHAR szOptions[100];
|
|
|
|
hpage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_GENERAL, FolderOptionsGeneralDlg, 0, NULL);
|
|
if (hpage)
|
|
hppages[num_pages++] = hpage;
|
|
|
|
hpage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_VIEW, FolderOptionsViewDlg, 0, NULL);
|
|
if (hpage)
|
|
hppages[num_pages++] = hpage;
|
|
|
|
hpage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_FILETYPES, FolderOptionsFileTypesDlg, 0, NULL);
|
|
if (hpage)
|
|
hppages[num_pages++] = hpage;
|
|
|
|
szOptions[0] = 0;
|
|
LoadStringW(shell32_hInstance, IDS_FOLDER_OPTIONS, szOptions, _countof(szOptions));
|
|
szOptions[_countof(szOptions) - 1] = 0;
|
|
|
|
// the stub window to hide taskbar button
|
|
DWORD style = WS_DISABLED | WS_CLIPSIBLINGS | WS_CAPTION;
|
|
DWORD exstyle = WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW;
|
|
CMSGlobalFolderOptionsStub stub;
|
|
if (!stub.Create(NULL, NULL, NULL, style, exstyle))
|
|
{
|
|
ERR("stub.Create failed\n");
|
|
return;
|
|
}
|
|
|
|
memset(&pinfo, 0x0, sizeof(PROPSHEETHEADERW));
|
|
pinfo.dwSize = sizeof(PROPSHEETHEADERW);
|
|
pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_USEICONID | PSH_USECALLBACK;
|
|
pinfo.hwndParent = stub;
|
|
pinfo.nPages = num_pages;
|
|
pinfo.phpage = hppages;
|
|
pinfo.pszIcon = MAKEINTRESOURCEW(IDI_SHELL_FOLDER_OPTIONS);
|
|
pinfo.pszCaption = szOptions;
|
|
pinfo.pfnCallback = PropSheetProc;
|
|
|
|
PropertySheetW(&pinfo);
|
|
|
|
stub.DestroyWindow();
|
|
}
|
|
|
|
static VOID
|
|
Options_RunDLLCommon(HWND hWnd, HINSTANCE hInst, int fOptions, DWORD nCmdShow)
|
|
{
|
|
switch(fOptions)
|
|
{
|
|
case 0:
|
|
ShowFolderOptionsDialog(hWnd, hInst);
|
|
break;
|
|
|
|
case 1:
|
|
// show taskbar options dialog
|
|
FIXME("notify explorer to show taskbar options dlg\n");
|
|
//PostMessage(GetShellWindow(), WM_USER+22, fOptions, 0);
|
|
break;
|
|
|
|
default:
|
|
FIXME("unrecognized options id %d\n", fOptions);
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
* Options_RunDLL (SHELL32.@)
|
|
*/
|
|
EXTERN_C VOID WINAPI
|
|
Options_RunDLL(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWORD nCmdShow)
|
|
{
|
|
Options_RunDLLCommon(hWnd, hInst, StrToIntA(cmd), nCmdShow);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* Options_RunDLLA (SHELL32.@)
|
|
*/
|
|
EXTERN_C VOID WINAPI
|
|
Options_RunDLLA(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWORD nCmdShow)
|
|
{
|
|
Options_RunDLLCommon(hWnd, hInst, StrToIntA(cmd), nCmdShow);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* Options_RunDLLW (SHELL32.@)
|
|
*/
|
|
EXTERN_C VOID WINAPI
|
|
Options_RunDLLW(HWND hWnd, HINSTANCE hInst, LPCWSTR cmd, DWORD nCmdShow)
|
|
{
|
|
Options_RunDLLCommon(hWnd, hInst, StrToIntW(cmd), nCmdShow);
|
|
}
|