mirror of
https://github.com/reactos/reactos.git
synced 2024-07-06 12:45:16 +00:00
[MSCONFIG_NEW]
- Reimplement the SYSTEM.INI/WIN.INI tabs (they should be seen as 2 different instances of the same window; this would be cleaner to do in C++) with all the expected functionality working. - Add TreeView helpers for moving/deleting branches. - Add TreeView helpers for 3-state checkboxes, with support for Windows 2k3 and Vista+ with and without manifest, depending on the comctl32.dll version used by msconfig at runtime. In particular, take advantage of the TVS_EX_PARTIALCHECKBOXES extended style introduced on Windows Vista+. - Just initialize once the uxtheme function pointers. - Create the msconfig dialog box hidden and center it on screen before showing it (removes the flickering caused by the quick move). - Use the correct 16x16 icon for the dialog title icon, adapted from a patch by Jared Smudde with suggestions by Ismael Ferreras Morezuelas. CORE-9333 svn path=/trunk/; revision=69761
This commit is contained in:
parent
dcd1e307d8
commit
6482e8b6ed
|
@ -10,7 +10,9 @@ include_directories(
|
|||
${REACTOS_SOURCE_DIR}/lib/atl)
|
||||
|
||||
list(APPEND C_SOURCE
|
||||
comctl32ex/listviewfuncs.c
|
||||
comctl32ex/comctl32supp.c
|
||||
comctl32ex/listview.c
|
||||
comctl32ex/treeview.c
|
||||
comctl32ex/uxthemesupp.c
|
||||
fileextractdialog.c
|
||||
fileutils.c
|
||||
|
@ -18,12 +20,12 @@ list(APPEND C_SOURCE
|
|||
generalpage.c
|
||||
msconfig.c
|
||||
regutils.c
|
||||
# systempage.c
|
||||
# startuppage.c
|
||||
stringutils.c
|
||||
utils.c)
|
||||
|
||||
list(APPEND CPP_SOURCE
|
||||
systempage.cpp
|
||||
srvpage.cpp
|
||||
toolspage.cpp
|
||||
xmldomparser.cpp
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig_new/comctl32ex/comctl32supp.c
|
||||
* PURPOSE: Common Controls helper functions.
|
||||
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
HRESULT GetComCtl32Version(OUT PDWORD pdwMajor, OUT PDWORD pdwMinor, OUT PDWORD pdwBuild)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
HINSTANCE hDll;
|
||||
DLLGETVERSIONPROC pDllGetVersion;
|
||||
DLLVERSIONINFO dvi;
|
||||
|
||||
*pdwMajor = 0;
|
||||
*pdwMinor = 0;
|
||||
*pdwBuild = 0;
|
||||
|
||||
/*
|
||||
* WARNING! DISCLAIMER!
|
||||
*
|
||||
* This method of retrieving a handle to an already loaded comctl32.dll
|
||||
* is known to not be reliable in case the program is using SxS, or if
|
||||
* this code is used from inside a DLL.
|
||||
*/
|
||||
|
||||
/*
|
||||
* See: https://msdn.microsoft.com/en-us/library/windows/desktop/hh298349(v=vs.85).aspx
|
||||
* and: http://www.geoffchappell.com/studies/windows/shell/comctl32/history/
|
||||
* for the possible version values to be returned.
|
||||
*/
|
||||
|
||||
/* Get a handle to comctl32.dll that must already be loaded */
|
||||
hDll = GetModuleHandleW(L"comctl32.dll"); // NOTE: We must not call FreeLibrary on the returned handle!
|
||||
if (!hDll) return E_FAIL;
|
||||
|
||||
pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hDll, "DllGetVersion");
|
||||
if (pDllGetVersion)
|
||||
{
|
||||
ZeroMemory(&dvi, sizeof(dvi));
|
||||
dvi.cbSize = sizeof(dvi);
|
||||
|
||||
hr = (*pDllGetVersion)(&dvi);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
*pdwMajor = dvi.dwMajorVersion;
|
||||
*pdwMinor = dvi.dwMinorVersion;
|
||||
*pdwBuild = dvi.dwBuildNumber;
|
||||
|
||||
#if 0
|
||||
// #include "stringutils.h"
|
||||
|
||||
LPWSTR strVersion =
|
||||
FormatString(L"ComCtl32 version %d.%d, Build %d, Platform %d",
|
||||
dvi.dwMajorVersion, dvi.dwMinorVersion, dvi.dwBuildNumber, dvi.dwPlatformID);
|
||||
MessageBoxW(NULL, strVersion, L"ComCtl32 version", MB_OK);
|
||||
MemFree(strVersion);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* If GetProcAddress failed, the DLL is a version
|
||||
* previous to the one shipped with IE 3.x.
|
||||
*/
|
||||
*pdwMajor = 4;
|
||||
*pdwMinor = 0;
|
||||
*pdwBuild = 0;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig_new/comctl32ex/comctl32supp.h
|
||||
* PURPOSE: Common Controls helper functions.
|
||||
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
#ifndef __COMCTL32SUPP_H__
|
||||
#define __COMCTL32SUPP_H__
|
||||
|
||||
#include <windowsx.h>
|
||||
/*
|
||||
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
|
||||
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
|
||||
*/
|
||||
|
||||
#define Button_IsEnabled(hwndCtl) IsWindowEnabled((hwndCtl))
|
||||
|
||||
#define UM_CHECKSTATECHANGE (WM_USER + 100)
|
||||
|
||||
#if 0
|
||||
// this typedef, present in newer include files,
|
||||
// supports the building tokenmon on older systems
|
||||
typedef struct _DLLVERSIONINFO
|
||||
{
|
||||
DWORD cbSize;
|
||||
DWORD dwMajorVersion;
|
||||
DWORD dwMinorVersion;
|
||||
DWORD dwBuildNumber;
|
||||
DWORD dwPlatformID;
|
||||
} DLLVERSIONINFO, *PDLLVERSIONINFO;
|
||||
// Version information function
|
||||
typedef HRESULT (WINAPI* DLLGETVERSIONPROC)(PDLLVERSIONINFO);
|
||||
#endif
|
||||
|
||||
HRESULT GetComCtl32Version(OUT PDWORD pdwMajor, OUT PDWORD pdwMinor, OUT PDWORD pdwBuild);
|
||||
|
||||
#endif // __COMCTL32SUPP_H__
|
|
@ -1,20 +0,0 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig_new/comctl32ex/commctrldefs.h
|
||||
* PURPOSE: Common Controls helper functions.
|
||||
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
#ifndef __COMMCTRLDEFS_H__
|
||||
#define __COMMCTRLDEFS_H__
|
||||
|
||||
#include <windowsx.h>
|
||||
/*
|
||||
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
|
||||
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
|
||||
*/
|
||||
|
||||
#define UM_CHECKSTATECHANGE (WM_USER + 100)
|
||||
|
||||
#endif // __COMMCTRLDEFS_H__
|
|
@ -1,13 +1,13 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig_new/comctl32ex/listviewfuncs.c
|
||||
* FILE: base/applications/msconfig_new/comctl32ex/listview.c
|
||||
* PURPOSE: List-View helper functions.
|
||||
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
#include "listviewfuncs.h"
|
||||
#include "listview.h"
|
||||
|
||||
///////////// ListView Sorting /////////////
|
||||
|
|
@ -1,13 +1,13 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig_new/comctl32ex/listviewfuncs.h
|
||||
* FILE: base/applications/msconfig_new/comctl32ex/listview.h
|
||||
* PURPOSE: List-View helper functions.
|
||||
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
#ifndef __LISTVIEWFUNCS_H__
|
||||
#define __LISTVIEWFUNCS_H__
|
||||
#ifndef __LISTVIEW_H__
|
||||
#define __LISTVIEW_H__
|
||||
|
||||
#pragma once
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "commctrldefs.h"
|
||||
#include "comctl32supp.h"
|
||||
|
||||
///////////// ListView Sorting /////////////
|
||||
|
||||
|
@ -38,6 +38,6 @@ ListView_SortEx(HWND hListView,
|
|||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif // __LISTVIEWFUNCS_H__
|
||||
#endif // __LISTVIEW_H__
|
||||
|
||||
/* EOF */
|
281
reactos/base/applications/msconfig_new/comctl32ex/treeview.c
Normal file
281
reactos/base/applications/msconfig_new/comctl32ex/treeview.c
Normal file
|
@ -0,0 +1,281 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig/treeview.c
|
||||
* PURPOSE: Tree-View helper functions.
|
||||
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
// For TVIF_EXPANDEDIMAGE and TVIF_STATEEX (are they really useful ?)
|
||||
#if !defined(_WIN32_IE) || (_WIN32_IE < 0x0600)
|
||||
#define _WIN32_IE 0x0600
|
||||
#endif
|
||||
|
||||
// Fake _WIN32_WINNT to 0x0600 in order to get Vista+ style flags
|
||||
#undef _WIN32_WINNT
|
||||
#define _WIN32_WINNT 0x0600
|
||||
|
||||
#include "precomp.h"
|
||||
#include "treeview.h"
|
||||
|
||||
#include <wingdi.h> // For RGB macro
|
||||
|
||||
|
||||
void TreeView_Set3StateCheck(HWND hTree)
|
||||
{
|
||||
LONG_PTR lStyle;
|
||||
DWORD dwExStyle;
|
||||
|
||||
DWORD Major, Minor, Build;
|
||||
GetComCtl32Version(&Major, &Minor, &Build);
|
||||
|
||||
/*
|
||||
* Choose the best way to handle 3-state TreeView checkboxes
|
||||
* according to the version of comctl32.dll we are running against.
|
||||
*
|
||||
* Starting version comctl32 version 6.10 (Vista+, via SxS)
|
||||
* we have native 3-state checkboxes available.
|
||||
* Only when comctl32 version 5.82 (no SxS) is available,
|
||||
* use its build number to know whether we should use 2k3-style
|
||||
* or Vista+ style check-boxes.
|
||||
*/
|
||||
if (Major > 6 || (Major == 6 && Minor >= 10))
|
||||
{
|
||||
/*
|
||||
* NOTE: As explained in the following link:
|
||||
* http://stackoverflow.com/questions/31488233/treeview-setextendedstyle-does-not-apply-certain-styles-what-am-i-doing-wrong
|
||||
* the TreeView control should have the extended check-box style set
|
||||
* *BEFORE* actually setting the check-box window style, because it is
|
||||
* only at that step that the TreeView control builds its image list
|
||||
* containing the three check-box states. Indeed, if the extended
|
||||
* check-box style was applied after setting the window style, then
|
||||
* the image list would be already built with the default two states
|
||||
* and would not be updated.
|
||||
*
|
||||
* The MSDN documentation is not very clear on that point.
|
||||
*
|
||||
* Let me also take this opportunity to document what those
|
||||
* extended check-box state styles look like on Windows Vista+ :
|
||||
*
|
||||
* - TVS_EX_DIMMEDCHECKBOXES creates a grey tone version of the normal checked box state.
|
||||
* - TVS_EX_EXCLUSIONCHECKBOXES creates a red 'X'-style cross check-box state.
|
||||
* - TVS_EX_PARTIALCHECKBOXES creates a filled box.
|
||||
*/
|
||||
dwExStyle = TreeView_GetExtendedStyle(hTree);
|
||||
TreeView_SetExtendedStyle(hTree, dwExStyle | TVS_EX_PARTIALCHECKBOXES, 0);
|
||||
|
||||
lStyle = GetWindowLongPtr(hTree, GWL_STYLE);
|
||||
SetWindowLongPtr(hTree, GWL_STYLE, lStyle | TVS_CHECKBOXES);
|
||||
}
|
||||
else
|
||||
{
|
||||
lStyle = GetWindowLongPtr(hTree, GWL_STYLE);
|
||||
SetWindowLongPtr(hTree, GWL_STYLE, lStyle | TVS_CHECKBOXES);
|
||||
|
||||
// TODO: Implement this function which should build at runtime
|
||||
// the image list with either two or three check-box states
|
||||
// (as it is done by the real common control TreeView), instead
|
||||
// of storing resource bitmaps.
|
||||
//
|
||||
// hCheckImageList = CreateCheckBoxImagelist(NULL, TRUE, TRUE, FALSE);
|
||||
TreeView_SetImageList(hTree,
|
||||
ImageList_LoadBitmap(hInst, (Build >= 6000 ? MAKEINTRESOURCEW(IDB_V7CHECK) : MAKEINTRESOURCEW(IDB_2K3CHECK)), 16, 4, RGB(255, 255, 255)),
|
||||
TVSIL_STATE);
|
||||
}
|
||||
}
|
||||
|
||||
void TreeView_Cleanup(HWND hTree)
|
||||
{
|
||||
// FIXME: Should we do it always, or only when the custom image list was set?
|
||||
ImageList_Destroy(TreeView_GetImageList(hTree, TVSIL_STATE));
|
||||
}
|
||||
|
||||
|
||||
HTREEITEM
|
||||
InsertItem(HWND hTree,
|
||||
LPCWSTR szName,
|
||||
HTREEITEM hParent,
|
||||
HTREEITEM hInsertAfter)
|
||||
{
|
||||
TVINSERTSTRUCTW tvis;
|
||||
SecureZeroMemory(&tvis, sizeof(tvis));
|
||||
|
||||
tvis.hParent = hParent;
|
||||
tvis.hInsertAfter = hInsertAfter;
|
||||
tvis.itemex.mask = TVIF_TEXT;
|
||||
tvis.itemex.pszText = (LPWSTR)szName;
|
||||
|
||||
return (tvis.itemex.hItem = TreeView_InsertItem(hTree, &tvis));
|
||||
}
|
||||
|
||||
UINT TreeView_GetRealSubtreeState(HWND hTree, HTREEITEM htiSubtreeItem)
|
||||
{
|
||||
#define OP(a, b) ((a) == (b) ? (a) : 2)
|
||||
|
||||
HTREEITEM htiIterator = TreeView_GetChild(hTree, htiSubtreeItem);
|
||||
UINT uRealSubtreeState = TreeView_GetCheckState(hTree, htiIterator);
|
||||
/*
|
||||
while (htiIterator)
|
||||
{
|
||||
UINT temp = TreeView_GetCheckState(hTree, htiIterator);
|
||||
uRealSubtreeState = OP(uRealSubtreeState, temp);
|
||||
|
||||
htiIterator = TreeView_GetNextSibling(hTree, htiIterator);
|
||||
}
|
||||
*/
|
||||
while ( htiIterator && ( (htiIterator = TreeView_GetNextSibling(hTree, htiIterator)) != NULL ) )
|
||||
{
|
||||
UINT temp = TreeView_GetCheckState(hTree, htiIterator);
|
||||
uRealSubtreeState = OP(uRealSubtreeState, temp);
|
||||
}
|
||||
|
||||
return uRealSubtreeState;
|
||||
}
|
||||
|
||||
void TreeView_PropagateStateOfItemToParent(HWND hTree, HTREEITEM htiItem)
|
||||
{
|
||||
HTREEITEM htiParent;
|
||||
UINT uGlobalSiblingsCheckState;
|
||||
|
||||
if (!hTree || !htiItem /* || htiItem == TVI_ROOT */)
|
||||
return;
|
||||
|
||||
htiParent = TreeView_GetParent(hTree, htiItem);
|
||||
if (!htiParent)
|
||||
return;
|
||||
|
||||
uGlobalSiblingsCheckState = TreeView_GetRealSubtreeState(hTree, htiParent);
|
||||
TreeView_SetItemState(hTree, htiParent, INDEXTOSTATEIMAGEMASK(uGlobalSiblingsCheckState + 1), TVIS_STATEIMAGEMASK);
|
||||
TreeView_PropagateStateOfItemToParent(hTree, htiParent);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
HTREEITEM Tree_Item_Copy(HWND hTree, HTREEITEM hSourceItem, HTREEITEM hParent, HTREEITEM hInsertAfter)
|
||||
{
|
||||
HTREEITEM htiIterator;
|
||||
TVINSERTSTRUCTW tvis;
|
||||
WCHAR label[MAX_VALUE_NAME] = L"";
|
||||
|
||||
if (!hTree || !hSourceItem || !hInsertAfter)
|
||||
return NULL;
|
||||
|
||||
// 1- Retrieve properties.
|
||||
SecureZeroMemory(&tvis, sizeof(tvis));
|
||||
|
||||
tvis.itemex.hItem = hSourceItem; // Handle of the item to be retrieved.
|
||||
tvis.itemex.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_STATE |
|
||||
TVIF_CHILDREN | TVIF_DI_SETITEM | TVIF_EXPANDEDIMAGE |
|
||||
TVIF_IMAGE | TVIF_INTEGRAL | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_STATEEX;
|
||||
tvis.itemex.pszText = label;
|
||||
tvis.itemex.cchTextMax = MAX_VALUE_NAME;
|
||||
TreeView_GetItem(hTree, &tvis.itemex);
|
||||
|
||||
// 2- Now, copy to destination.
|
||||
tvis.hParent = hParent;
|
||||
tvis.hInsertAfter = hInsertAfter;
|
||||
tvis.itemex.stateMask = tvis.itemex.state;
|
||||
tvis.itemex.hItem = TreeView_InsertItem(hTree, &tvis);
|
||||
|
||||
for (htiIterator = TreeView_GetChild(hTree, hSourceItem) ; htiIterator ; htiIterator = TreeView_GetNextSibling(hTree, htiIterator))
|
||||
Tree_Item_Copy(hTree, htiIterator, tvis.itemex.hItem, TVI_LAST);
|
||||
|
||||
return tvis.itemex.hItem;
|
||||
}
|
||||
|
||||
void TreeView_DownItem(HWND hTree, HTREEITEM htiItemToDown)
|
||||
{
|
||||
HTREEITEM htiNextItem, htiNewItem;
|
||||
|
||||
if (!hTree || !htiItemToDown)
|
||||
return;
|
||||
|
||||
htiNextItem = TreeView_GetNextSibling(hTree, htiItemToDown);
|
||||
if (!htiNextItem)
|
||||
htiNextItem = TVI_LAST;
|
||||
|
||||
htiNewItem = Tree_Item_Copy(hTree, htiItemToDown, TreeView_GetParent(hTree, htiItemToDown), htiNextItem);
|
||||
TreeView_DeleteItem(hTree, htiItemToDown); // Delete the item and ALL its children.
|
||||
TreeView_SelectItem(hTree, htiNewItem);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void TreeView_UpItem(HWND hTree, HTREEITEM htiItemToUp)
|
||||
{
|
||||
HTREEITEM htiPrevItem, htiPrevPrevItem, htiNewItem;
|
||||
|
||||
if (!hTree || !htiItemToUp)
|
||||
return;
|
||||
|
||||
htiPrevItem = TreeView_GetPrevSibling(hTree, htiItemToUp);
|
||||
htiPrevPrevItem = TreeView_GetPrevSibling(hTree, htiPrevItem);
|
||||
if (!htiPrevPrevItem)
|
||||
htiPrevPrevItem = TVI_FIRST;
|
||||
// if htiPrevItem == NULL , htiPrevPrevItem == NULL.
|
||||
|
||||
htiNewItem = Tree_Item_Copy(hTree, htiItemToUp, TreeView_GetParent(hTree, htiItemToUp), htiPrevPrevItem);
|
||||
TreeView_DeleteItem(hTree, htiItemToUp); // Delete the item and ALL its children.
|
||||
TreeView_SelectItem(hTree, htiNewItem);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
HTREEITEM TreeView_GetFirst(HWND hTree)
|
||||
{
|
||||
return TreeView_GetRoot(hTree);
|
||||
}
|
||||
|
||||
HTREEITEM TreeView_GetLastFromItem(HWND hTree, HTREEITEM hItem)
|
||||
{
|
||||
HTREEITEM htiRet = NULL;
|
||||
HTREEITEM htiIterator;
|
||||
|
||||
for (htiIterator = hItem ; htiIterator ; htiIterator = TreeView_GetNextSibling(hTree, htiIterator))
|
||||
htiRet = htiIterator;
|
||||
|
||||
return htiRet;
|
||||
}
|
||||
|
||||
HTREEITEM TreeView_GetLast(HWND hTree)
|
||||
{
|
||||
return TreeView_GetLastFromItem(hTree, TreeView_GetRoot(hTree));
|
||||
}
|
||||
|
||||
HTREEITEM TreeView_GetPrev(HWND hTree, HTREEITEM hItem)
|
||||
{
|
||||
HTREEITEM hPrev, hTmp;
|
||||
|
||||
if (!hTree)
|
||||
return NULL;
|
||||
|
||||
hPrev = TreeView_GetPrevSibling(hTree, hItem);
|
||||
if (!hPrev)
|
||||
return TreeView_GetParent(hTree, hItem);
|
||||
|
||||
hTmp = TreeView_GetChild(hTree, hPrev);
|
||||
if (hTmp)
|
||||
return TreeView_GetLastFromItem(hTree, hTmp);
|
||||
else
|
||||
return hPrev;
|
||||
}
|
||||
|
||||
HTREEITEM TreeView_GetNext(HWND hTree, HTREEITEM hItem)
|
||||
{
|
||||
HTREEITEM hNext;
|
||||
|
||||
if (!hTree)
|
||||
return NULL;
|
||||
|
||||
hNext = TreeView_GetChild(hTree, hItem);
|
||||
if (hNext)
|
||||
return hNext;
|
||||
|
||||
hNext = TreeView_GetNextSibling(hTree, hItem);
|
||||
if (hNext)
|
||||
return hNext;
|
||||
else
|
||||
return TreeView_GetNextSibling(hTree, TreeView_GetParent(hTree, hItem));
|
||||
}
|
||||
|
||||
/* EOF */
|
81
reactos/base/applications/msconfig_new/comctl32ex/treeview.h
Normal file
81
reactos/base/applications/msconfig_new/comctl32ex/treeview.h
Normal file
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig/treeview.h
|
||||
* PURPOSE: Tree-View helper functions.
|
||||
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
#ifndef __TREEVIEW_H__
|
||||
#define __TREEVIEW_H__
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "comctl32supp.h"
|
||||
|
||||
|
||||
//
|
||||
// Should be present in commctrl.h
|
||||
// defined for Windows Vista+
|
||||
//
|
||||
|
||||
#if (_WIN32_WINNT >= 0x0600)
|
||||
|
||||
#define TVS_EX_MULTISELECT 0x0002
|
||||
#define TVS_EX_DOUBLEBUFFER 0x0004
|
||||
#define TVS_EX_NOINDENTSTATE 0x0008
|
||||
#define TVS_EX_RICHTOOLTIP 0x0010
|
||||
#define TVS_EX_AUTOHSCROLL 0x0020
|
||||
#define TVS_EX_FADEINOUTEXPANDOS 0x0040
|
||||
#define TVS_EX_PARTIALCHECKBOXES 0x0080
|
||||
#define TVS_EX_EXCLUSIONCHECKBOXES 0x0100
|
||||
#define TVS_EX_DIMMEDCHECKBOXES 0x0200
|
||||
#define TVS_EX_DRAWIMAGEASYNC 0x0400
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if (_WIN32_WINNT >= 0x0501)
|
||||
|
||||
#define TVM_SETEXTENDEDSTYLE (TV_FIRST + 44)
|
||||
#define TreeView_SetExtendedStyle(hwnd, dw, mask) \
|
||||
(DWORD)SNDMSG((hwnd), TVM_SETEXTENDEDSTYLE, mask, dw)
|
||||
|
||||
#define TVM_GETEXTENDEDSTYLE (TV_FIRST + 45)
|
||||
#define TreeView_GetExtendedStyle(hwnd) \
|
||||
(DWORD)SNDMSG((hwnd), TVM_GETEXTENDEDSTYLE, 0, 0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
void TreeView_Set3StateCheck(HWND hTree);
|
||||
|
||||
void TreeView_Cleanup(HWND hTree);
|
||||
|
||||
HTREEITEM
|
||||
InsertItem(HWND hTree,
|
||||
LPCWSTR szName,
|
||||
HTREEITEM hParent,
|
||||
HTREEITEM hInsertAfter);
|
||||
|
||||
UINT TreeView_GetRealSubtreeState(HWND hTree, HTREEITEM htiSubtreeItem);
|
||||
void TreeView_PropagateStateOfItemToParent(HWND hTree, HTREEITEM htiItem);
|
||||
void TreeView_DownItem(HWND hTree, HTREEITEM htiItemToDown);
|
||||
void TreeView_UpItem(HWND hTree, HTREEITEM htiItemToUp);
|
||||
HTREEITEM TreeView_GetFirst(HWND hTree);
|
||||
HTREEITEM TreeView_GetLastFromItem(HWND hTree, HTREEITEM hItem);
|
||||
HTREEITEM TreeView_GetLast(HWND hTree);
|
||||
HTREEITEM TreeView_GetPrev(HWND hTree, HTREEITEM hItem);
|
||||
HTREEITEM TreeView_GetNext(HWND hTree, HTREEITEM hItem);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif // __TREEVIEW_H__
|
||||
|
||||
/* EOF */
|
|
@ -11,17 +11,26 @@
|
|||
|
||||
static HMODULE hUxTheme = NULL;
|
||||
|
||||
typedef HRESULT (WINAPI* ETDTProc)(HWND, DWORD);
|
||||
static ETDTProc fnEnableThemeDialogTexture = NULL;
|
||||
|
||||
typedef HRESULT (WINAPI* SWTProc)(HWND, LPCWSTR, LPCWSTR);
|
||||
static SWTProc fnSetWindowTheme = NULL;
|
||||
|
||||
|
||||
static BOOL
|
||||
InitUxTheme(VOID)
|
||||
{
|
||||
static BOOL Initialized = FALSE;
|
||||
|
||||
if (Initialized) return TRUE;
|
||||
if (hUxTheme) return TRUE;
|
||||
|
||||
hUxTheme = LoadLibraryW(L"uxtheme.dll");
|
||||
if (hUxTheme == NULL) return FALSE;
|
||||
|
||||
Initialized = TRUE;
|
||||
fnEnableThemeDialogTexture =
|
||||
(ETDTProc)GetProcAddress(hUxTheme, "EnableThemeDialogTexture");
|
||||
fnSetWindowTheme =
|
||||
(SWTProc)GetProcAddress(hUxTheme, "SetWindowTheme");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -31,7 +40,6 @@ CleanupUxTheme(VOID)
|
|||
{
|
||||
FreeLibrary(hUxTheme);
|
||||
hUxTheme = NULL;
|
||||
// Initialized = FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -42,42 +50,29 @@ CleanupUxTheme(VOID)
|
|||
// Copyright (c) 2002 by J Brown
|
||||
//
|
||||
|
||||
typedef HRESULT (WINAPI* ETDTProc)(HWND, DWORD);
|
||||
|
||||
HRESULT
|
||||
WINAPI
|
||||
EnableThemeDialogTexture(_In_ HWND hwnd,
|
||||
_In_ DWORD dwFlags)
|
||||
{
|
||||
ETDTProc fnEnableThemeDialogTexture;
|
||||
|
||||
if (!InitUxTheme())
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
fnEnableThemeDialogTexture =
|
||||
(ETDTProc)GetProcAddress(hUxTheme, "EnableThemeDialogTexture");
|
||||
if (!fnEnableThemeDialogTexture)
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
return fnEnableThemeDialogTexture(hwnd, dwFlags);
|
||||
}
|
||||
|
||||
|
||||
typedef HRESULT (WINAPI* SWTProc)(HWND, LPCWSTR, LPCWSTR);
|
||||
|
||||
HRESULT
|
||||
WINAPI
|
||||
SetWindowTheme(_In_ HWND hwnd,
|
||||
_In_ LPCWSTR pszSubAppName,
|
||||
_In_ LPCWSTR pszSubIdList)
|
||||
{
|
||||
SWTProc fnSetWindowTheme;
|
||||
|
||||
if (!InitUxTheme())
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
fnSetWindowTheme =
|
||||
(SWTProc)GetProcAddress(hUxTheme, "SetWindowTheme");
|
||||
if (!fnSetWindowTheme)
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
// #include <setupapi.h>
|
||||
#include "fileextractdialog.h"
|
||||
#include "commctrldefs.h"
|
||||
#include "comctl32supp.h"
|
||||
#include "utils.h"
|
||||
|
||||
// #include "callbacks.h"
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include <share.h>
|
||||
|
||||
#include <wingdi.h>
|
||||
#include "commctrldefs.h"
|
||||
#include "comctl32supp.h"
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
|
@ -70,41 +70,38 @@ LoadIniFile(HWND hDlg,
|
|||
hFont = (HFONT)SendMessageW(hDlgCtrl, WM_GETFONT, 0, 0);
|
||||
hOldFont = (HFONT)SelectObject(hDC, hFont);
|
||||
|
||||
while (!feof(file))
|
||||
while (!feof(file) && fgetws(szBuffer, ARRAYSIZE(szBuffer), file))
|
||||
{
|
||||
if (fgetws(szBuffer, ARRAYSIZE(szBuffer), file))
|
||||
length = wcslen(szBuffer);
|
||||
if (length > 1)
|
||||
{
|
||||
length = wcslen(szBuffer);
|
||||
if (length > 1)
|
||||
/* Remove \r\n */
|
||||
szBuffer[length-1] = szBuffer[length] = L'\0';
|
||||
|
||||
pos = ListBox_AddString(hDlgCtrl, szBuffer);
|
||||
|
||||
GetTextExtentPoint32W(hDC, szBuffer, (int)wcslen(szBuffer), &size);
|
||||
horzExt = max((LONG)ListBox_GetHorizontalExtent(hDlgCtrl), size.cx + 5); // 5 to have a little room between the text and the end of the list box.
|
||||
ListBox_SetHorizontalExtent(hDlgCtrl, horzExt);
|
||||
|
||||
if (szBuffer[0] == L'[')
|
||||
continue;
|
||||
|
||||
if (!_wcsnicmp(szBuffer, L"timeout=", 8))
|
||||
{
|
||||
/* Remove \r\n */
|
||||
szBuffer[length-1] = szBuffer[length] = L'\0';
|
||||
|
||||
pos = ListBox_AddString(hDlgCtrl, szBuffer);
|
||||
|
||||
GetTextExtentPoint32W(hDC, szBuffer, (int)wcslen(szBuffer), &size);
|
||||
horzExt = max((LONG)ListBox_GetHorizontalExtent(hDlgCtrl), size.cx + 5); // 5 to have a little room between the text and the end of the list box.
|
||||
ListBox_SetHorizontalExtent(hDlgCtrl, horzExt);
|
||||
|
||||
if (szBuffer[0] == L'[')
|
||||
continue;
|
||||
|
||||
if (!_wcsnicmp(szBuffer, L"timeout=", 8))
|
||||
{
|
||||
Settings.TimeOut = _wtoi(&szBuffer[8]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!_wcsnicmp(szBuffer, L"default=", 8))
|
||||
{
|
||||
wcscpy(Settings.szDefaultOS, &szBuffer[8]);
|
||||
continue;
|
||||
}
|
||||
if (pos != LB_ERR)
|
||||
ListBox_SetItemData(hDlgCtrl, pos, 1); // indicate that this item is a boot entry
|
||||
|
||||
Settings.OSConfigurationCount++;
|
||||
Settings.TimeOut = _wtoi(&szBuffer[8]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!_wcsnicmp(szBuffer, L"default=", 8))
|
||||
{
|
||||
wcscpy(Settings.szDefaultOS, &szBuffer[8]);
|
||||
continue;
|
||||
}
|
||||
if (pos != LB_ERR)
|
||||
ListBox_SetItemData(hDlgCtrl, pos, 1); // indicate that this item is a boot entry
|
||||
|
||||
Settings.OSConfigurationCount++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include "precomp.h"
|
||||
#include "fileutils.h"
|
||||
#include "utils.h"
|
||||
#include "commctrldefs.h"
|
||||
#include "comctl32supp.h"
|
||||
#include "fileextractdialog.h"
|
||||
|
||||
static LPCWSTR lpszRestoreProgPath1 = L"%SystemRoot%\\System32\\rstrui.exe";
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include "utils.h"
|
||||
|
||||
#include "generalpage.h"
|
||||
// #include "systempage.h"
|
||||
#include "systempage.h"
|
||||
#include "freeldrpage.h"
|
||||
#include "srvpage.h"
|
||||
// #include "startuppage.h"
|
||||
|
@ -40,9 +40,8 @@ HINSTANCE hInst = NULL;
|
|||
LPWSTR szAppName = NULL;
|
||||
HWND hMainWnd; /* Main Window */
|
||||
|
||||
HWND hTabWnd; /* Tab Control Window */
|
||||
// HICON hDialogIcon = NULL;
|
||||
HICON hIcon = NULL;
|
||||
HWND hTabWnd; /* Tab Control Window */
|
||||
HICON hIcon = NULL, hIconSm = NULL;
|
||||
WNDPROC wpOrigEditProc = NULL;
|
||||
|
||||
|
||||
|
@ -100,22 +99,13 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lPa
|
|||
// return FALSE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
case WM_SYSCOLORCHANGE:
|
||||
/* Forward WM_SYSCOLORCHANGE to common controls */
|
||||
SendMessage(hServicesListCtrl, WM_SYSCOLORCHANGE, 0, 0);
|
||||
SendMessage(hStartupListCtrl, WM_SYSCOLORCHANGE, 0, 0);
|
||||
SendMessage(hToolsListCtrl, WM_SYSCOLORCHANGE, 0, 0);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case WM_DESTROY:
|
||||
{
|
||||
if (hIcon)
|
||||
DestroyIcon(hIcon);
|
||||
|
||||
if (wpOrigEditProc)
|
||||
SetWindowLongPtr(hWnd, DWLP_DLGPROC, (LONG_PTR)wpOrigEditProc);
|
||||
|
||||
if (hIcon) DestroyIcon(hIcon);
|
||||
if (hIconSm) DestroyIcon(hIconSm);
|
||||
}
|
||||
|
||||
default:
|
||||
|
@ -146,31 +136,6 @@ typedef struct DLGTEMPLATEEX
|
|||
} DLGTEMPLATEEX, *LPDLGTEMPLATEEX;
|
||||
#include <poppack.h>
|
||||
|
||||
|
||||
VOID ModifySystemMenu(HWND hWnd)
|
||||
{
|
||||
WCHAR szMenuString[255];
|
||||
|
||||
/* Customize the window's system menu, add items before the "Close" item */
|
||||
HMENU hSysMenu = GetSystemMenu(hWnd, FALSE);
|
||||
assert(hSysMenu);
|
||||
|
||||
/* New entries... */
|
||||
if (LoadStringW(hInst,
|
||||
IDS_ABOUT,
|
||||
szMenuString,
|
||||
ARRAYSIZE(szMenuString)) > 0)
|
||||
{
|
||||
/* "About" menu */
|
||||
InsertMenuW(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_ABOUT, szMenuString);
|
||||
/* Separator */
|
||||
InsertMenuW(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_SEPARATOR , 0 , NULL);
|
||||
}
|
||||
|
||||
DrawMenuBar(hWnd);
|
||||
return;
|
||||
}
|
||||
|
||||
int CALLBACK PropSheetCallback(HWND hDlg, UINT message, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
|
@ -180,20 +145,24 @@ int CALLBACK PropSheetCallback(HWND hDlg, UINT message, LPARAM lParam)
|
|||
LPDLGTEMPLATE dlgTemplate = (LPDLGTEMPLATE)lParam;
|
||||
LPDLGTEMPLATEEX dlgTemplateEx = (LPDLGTEMPLATEEX)lParam;
|
||||
|
||||
// MFC : DS_MODALFRAME | DS_3DLOOK | DS_CONTEXTHELP | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION;
|
||||
DWORD style = DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU;
|
||||
// DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME;
|
||||
DWORD exStyle = WS_EX_CONTROLPARENT | WS_EX_APPWINDOW;
|
||||
|
||||
/* Hide the dialog by default; we will center it on screen later, and then show it */
|
||||
style &= ~WS_VISIBLE;
|
||||
|
||||
/* Set the styles of the property sheet dialog */
|
||||
if (dlgTemplateEx->signature == 0xFFFF)
|
||||
{
|
||||
//// MFC : DS_MODALFRAME | DS_3DLOOK | DS_CONTEXTHELP | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION;
|
||||
|
||||
dlgTemplateEx->style = DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU;
|
||||
// dlgTemplateEx->style = DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME;
|
||||
dlgTemplateEx->exStyle = WS_EX_CONTROLPARENT | WS_EX_APPWINDOW;
|
||||
dlgTemplateEx->style = style;
|
||||
dlgTemplateEx->exStyle = exStyle;
|
||||
}
|
||||
else
|
||||
{
|
||||
dlgTemplate->style = DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU;
|
||||
// dlgTemplate->style = DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME;
|
||||
dlgTemplate->dwExtendedStyle = WS_EX_CONTROLPARENT | WS_EX_APPWINDOW;
|
||||
dlgTemplate->style = style;
|
||||
dlgTemplate->dwExtendedStyle = exStyle;
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -201,13 +170,28 @@ int CALLBACK PropSheetCallback(HWND hDlg, UINT message, LPARAM lParam)
|
|||
|
||||
case PSCB_INITIALIZED:
|
||||
{
|
||||
/* Modify the system menu of the property sheet dialog */
|
||||
ModifySystemMenu(hDlg);
|
||||
/* Customize the window's system menu, add items before the "Close" item */
|
||||
LPWSTR szMenuString;
|
||||
HMENU hSysMenu = GetSystemMenu(hDlg, FALSE);
|
||||
assert(hSysMenu);
|
||||
|
||||
szMenuString = LoadResourceString(hInst, IDS_ABOUT);
|
||||
if (szMenuString)
|
||||
{
|
||||
/* "About" menu */
|
||||
InsertMenuW(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_ABOUT, szMenuString);
|
||||
/* Separator */
|
||||
InsertMenuW(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_SEPARATOR , 0 , NULL);
|
||||
|
||||
MemFree(szMenuString);
|
||||
}
|
||||
DrawMenuBar(hDlg);
|
||||
|
||||
/* Set the dialog icons */
|
||||
hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
|
||||
hIcon = (HICON)LoadImageW(hInst, MAKEINTRESOURCEW(IDI_APPICON), IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
|
||||
hIconSm = (HICON)CopyImage(hIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_COPYFROMRESOURCE);
|
||||
SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
|
||||
SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
|
||||
SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
|
||||
|
||||
/* Sub-class the property sheet window procedure */
|
||||
wpOrigEditProc = (WNDPROC)SetWindowLongPtr(hDlg, DWLP_DLGPROC, (LONG_PTR)MainWndProc);
|
||||
|
@ -234,22 +218,21 @@ HWND CreatePropSheet(HINSTANCE hInstance, HWND hwndOwner, LPCTSTR lpszTitle)
|
|||
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_MODELESS | /*PSH_USEICONID |*/ PSH_HASHELP | /*PSH_NOCONTEXTHELP |*/ PSH_USECALLBACK;
|
||||
psh.hInstance = hInstance;
|
||||
psh.hwndParent = hwndOwner;
|
||||
//psh.pszIcon = MAKEINTRESOURCE(IDI_APPICON); // It's crap... Only works for the small icon and not the big...
|
||||
// psh.pszIcon = MAKEINTRESOURCEW(IDI_APPICON); // Disabled because it only sets the small icon; the big icon is a stretched version of the small one.
|
||||
psh.pszCaption = lpszTitle;
|
||||
psh.nStartPage = 0;
|
||||
psh.ppsp = psp;
|
||||
psh.pfnCallback = (PFNPROPSHEETCALLBACK)PropSheetCallback;
|
||||
psh.pfnCallback = PropSheetCallback;
|
||||
|
||||
/* General page */
|
||||
psp[nPages].dwSize = sizeof(PROPSHEETPAGEW);
|
||||
psp[nPages].dwFlags = PSP_HASHELP;
|
||||
psp[nPages].hInstance = hInstance;
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_GENERAL_PAGE);
|
||||
psp[nPages].pfnDlgProc = (DLGPROC)GeneralPageWndProc;
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCEW(IDD_GENERAL_PAGE);
|
||||
psp[nPages].pfnDlgProc = GeneralPageWndProc;
|
||||
++nPages;
|
||||
|
||||
#if 0
|
||||
if (bIsWindows && bIsOSVersionLessThanVista)
|
||||
// if (bIsOSVersionLessThanVista)
|
||||
{
|
||||
/* SYSTEM.INI page */
|
||||
if (MyFileExists(lpszSystemIni, NULL))
|
||||
|
@ -257,9 +240,9 @@ HWND CreatePropSheet(HINSTANCE hInstance, HWND hwndOwner, LPCTSTR lpszTitle)
|
|||
psp[nPages].dwSize = sizeof(PROPSHEETPAGEW);
|
||||
psp[nPages].dwFlags = PSP_HASHELP | PSP_USETITLE;
|
||||
psp[nPages].hInstance = hInstance;
|
||||
psp[nPages].pszTitle = MAKEINTRESOURCE(IDS_TAB_SYSTEM);
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_SYSTEM_PAGE);
|
||||
psp[nPages].pfnDlgProc = (DLGPROC)SystemPageWndProc;
|
||||
psp[nPages].pszTitle = MAKEINTRESOURCEW(IDS_TAB_SYSTEM);
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCEW(IDD_SYSTEM_PAGE);
|
||||
psp[nPages].pfnDlgProc = SystemPageWndProc;
|
||||
psp[nPages].lParam = (LPARAM)lpszSystemIni;
|
||||
++nPages;
|
||||
|
||||
|
@ -272,16 +255,15 @@ HWND CreatePropSheet(HINSTANCE hInstance, HWND hwndOwner, LPCTSTR lpszTitle)
|
|||
psp[nPages].dwSize = sizeof(PROPSHEETPAGEW);
|
||||
psp[nPages].dwFlags = PSP_HASHELP | PSP_USETITLE;
|
||||
psp[nPages].hInstance = hInstance;
|
||||
psp[nPages].pszTitle = MAKEINTRESOURCE(IDS_TAB_WIN);
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_SYSTEM_PAGE);
|
||||
psp[nPages].pfnDlgProc = (DLGPROC)WinPageWndProc;
|
||||
psp[nPages].pszTitle = MAKEINTRESOURCEW(IDS_TAB_WIN);
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCEW(IDD_SYSTEM_PAGE);
|
||||
psp[nPages].pfnDlgProc = WinPageWndProc;
|
||||
psp[nPages].lParam = (LPARAM)lpszWinIni;
|
||||
++nPages;
|
||||
|
||||
BackupIniFile(lpszWinIni);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* FreeLdr page */
|
||||
// TODO: Program the interface for Vista: "light" BCD editor...
|
||||
|
@ -305,9 +287,9 @@ HWND CreatePropSheet(HINSTANCE hInstance, HWND hwndOwner, LPCTSTR lpszTitle)
|
|||
psp[nPages].dwSize = sizeof(PROPSHEETPAGEW);
|
||||
psp[nPages].dwFlags = PSP_HASHELP | PSP_USETITLE;
|
||||
psp[nPages].hInstance = hInstance;
|
||||
psp[nPages].pszTitle = MAKEINTRESOURCE(dwTabNameId);
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_FREELDR_PAGE);
|
||||
psp[nPages].pfnDlgProc = (DLGPROC)FreeLdrPageWndProc;
|
||||
psp[nPages].pszTitle = MAKEINTRESOURCEW(dwTabNameId);
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCEW(IDD_FREELDR_PAGE);
|
||||
psp[nPages].pfnDlgProc = FreeLdrPageWndProc;
|
||||
psp[nPages].lParam = (LPARAM)lpszLoaderIniFile;
|
||||
++nPages;
|
||||
|
||||
|
@ -319,8 +301,8 @@ HWND CreatePropSheet(HINSTANCE hInstance, HWND hwndOwner, LPCTSTR lpszTitle)
|
|||
psp[nPages].dwSize = sizeof(PROPSHEETPAGEW);
|
||||
psp[nPages].dwFlags = PSP_HASHELP;
|
||||
psp[nPages].hInstance = hInstance;
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_SERVICES_PAGE);
|
||||
psp[nPages].pfnDlgProc = (DLGPROC)ServicesPageWndProc;
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCEW(IDD_SERVICES_PAGE);
|
||||
psp[nPages].pfnDlgProc = ServicesPageWndProc;
|
||||
++nPages;
|
||||
|
||||
#if 0
|
||||
|
@ -328,8 +310,8 @@ HWND CreatePropSheet(HINSTANCE hInstance, HWND hwndOwner, LPCTSTR lpszTitle)
|
|||
psp[nPages].dwSize = sizeof(PROPSHEETPAGEW);
|
||||
psp[nPages].dwFlags = PSP_HASHELP;
|
||||
psp[nPages].hInstance = hInstance;
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_STARTUP_PAGE);
|
||||
psp[nPages].pfnDlgProc = (DLGPROC)StartupPageWndProc;
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCEW(IDD_STARTUP_PAGE);
|
||||
psp[nPages].pfnDlgProc = StartupPageWndProc;
|
||||
++nPages;
|
||||
#endif
|
||||
|
||||
|
@ -337,21 +319,20 @@ HWND CreatePropSheet(HINSTANCE hInstance, HWND hwndOwner, LPCTSTR lpszTitle)
|
|||
psp[nPages].dwSize = sizeof(PROPSHEETPAGEW);
|
||||
psp[nPages].dwFlags = PSP_HASHELP;
|
||||
psp[nPages].hInstance = hInstance;
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_TOOLS_PAGE);
|
||||
psp[nPages].pfnDlgProc = (DLGPROC)ToolsPageWndProc;
|
||||
psp[nPages].pszTemplate = MAKEINTRESOURCEW(IDD_TOOLS_PAGE);
|
||||
psp[nPages].pfnDlgProc = ToolsPageWndProc;
|
||||
++nPages;
|
||||
|
||||
/* Set the total number of created pages */
|
||||
psh.nPages = nPages;
|
||||
|
||||
/* Create the property sheet */
|
||||
hPropSheet = (HWND)PropertySheet(&psh);
|
||||
hPropSheet = (HWND)PropertySheetW(&psh);
|
||||
if (hPropSheet)
|
||||
{
|
||||
/* Center the property sheet on the desktop */
|
||||
//ShowWindow(hPropSheet, SW_HIDE);
|
||||
/* Center the property sheet on the desktop and show it */
|
||||
ClipOrCenterWindowToMonitor(hPropSheet, MONITOR_WORKAREA | MONITOR_CENTER);
|
||||
//ShowWindow(hPropSheet, SW_SHOWNORMAL);
|
||||
ShowWindow(hPropSheet, SW_SHOWNORMAL);
|
||||
}
|
||||
|
||||
return hPropSheet;
|
||||
|
@ -452,10 +433,10 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
|
|||
return -1;
|
||||
}
|
||||
|
||||
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_MSCONFIG));
|
||||
hAccelTable = LoadAcceleratorsW(hInstance, MAKEINTRESOURCEW(IDR_MSCONFIG));
|
||||
|
||||
/* Message loop */
|
||||
while (IsWindow(hMainWnd) && GetMessage(&msg, NULL, 0, 0))
|
||||
while (IsWindow(hMainWnd) && GetMessageW(&msg, NULL, 0, 0))
|
||||
{
|
||||
/*
|
||||
* PropSheet_GetCurrentPageHwnd returns NULL when the user clicks the OK or Cancel button
|
||||
|
@ -466,7 +447,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
|
|||
break;
|
||||
|
||||
/* Process the accelerator table */
|
||||
if (!TranslateAccelerator(hMainWnd, hAccelTable, &msg))
|
||||
if (!TranslateAcceleratorW(hMainWnd, hAccelTable, &msg))
|
||||
{
|
||||
/*
|
||||
* If e.g. an item on the tree view is being edited,
|
||||
|
@ -477,7 +458,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
|
|||
if (/*g_bDisableDialogDispatch ||*/ !PropSheet_IsDialogMessage(hMainWnd, &msg))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
DispatchMessageW(&msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,9 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
|||
#define REACTOS_STR_ORIGINAL_FILENAME "msconfig.exe"
|
||||
#include <reactos/version.rc>
|
||||
|
||||
IDI_APPICON ICON "res/msconfig.ico"
|
||||
IDI_APPICON ICON "res/msconfig.ico"
|
||||
IDB_2K3CHECK BITMAP "res/2k3check.bmp"
|
||||
IDB_V7CHECK BITMAP "res/v7check.bmp"
|
||||
|
||||
IDR_MSCONFIG ACCELERATORS
|
||||
BEGIN
|
||||
|
|
BIN
reactos/base/applications/msconfig_new/res/2k3check.bmp
Normal file
BIN
reactos/base/applications/msconfig_new/res/2k3check.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
BIN
reactos/base/applications/msconfig_new/res/v7check.bmp
Normal file
BIN
reactos/base/applications/msconfig_new/res/v7check.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
|
@ -148,6 +148,9 @@
|
|||
#define IDS_MSCONFIG_2 3001
|
||||
|
||||
#define IDI_APPICON 3010
|
||||
#define IDB_2K3CHECK 3011
|
||||
#define IDB_V7CHECK 3012
|
||||
|
||||
#define IDR_MSCONFIG 3020
|
||||
|
||||
#define IDM_ABOUT 3030
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#include "regutils.h"
|
||||
#include "stringutils.h"
|
||||
// #include "CmdLineParser.h"
|
||||
#include "listviewfuncs.h"
|
||||
#include "listview.h"
|
||||
#include "uxthemesupp.h"
|
||||
|
||||
#include <winsvc.h>
|
||||
|
|
895
reactos/base/applications/msconfig_new/systempage.cpp
Normal file
895
reactos/base/applications/msconfig_new/systempage.cpp
Normal file
|
@ -0,0 +1,895 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig_new/systempage.c
|
||||
* PURPOSE: System page message handler
|
||||
* COPYRIGHT: Copyright 2005-2006 Christoph von Wittich <Christoph@ApiViewer.de>
|
||||
* 2011 Gregor Schneider <Gregor.Schneider@reactos.org>
|
||||
* Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
#include <share.h>
|
||||
|
||||
#include "treeview.h"
|
||||
#include "uxthemesupp.h"
|
||||
|
||||
#include "regutils.h"
|
||||
#include "utils.h"
|
||||
|
||||
|
||||
extern "C" {
|
||||
|
||||
LPCWSTR lpszSystemIni = L"%SystemRoot%\\system.ini"; // or: %windir%\\... ?
|
||||
LPCWSTR lpszWinIni = L"%SystemRoot%\\win.ini"; // or: %windir%\\... ?
|
||||
|
||||
}
|
||||
|
||||
static LPCWSTR szMSConfigTok = L";msconfig "; // Note the trailing whitespace
|
||||
static const size_t MSConfigTokLen = 10;
|
||||
|
||||
|
||||
extern "C" {
|
||||
|
||||
DWORD GetSystemIniActivation(VOID)
|
||||
{
|
||||
DWORD dwSystemIni = 0;
|
||||
RegGetDWORDValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\state", L"system.ini", &dwSystemIni);
|
||||
return dwSystemIni;
|
||||
}
|
||||
|
||||
DWORD GetWinIniActivation(VOID)
|
||||
{
|
||||
DWORD dwWinIni = 0;
|
||||
RegGetDWORDValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\state", L"win.ini", &dwWinIni);
|
||||
return dwWinIni;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static HWND hTree = NULL;
|
||||
static WCHAR szSearchString[MAX_VALUE_NAME] = L"";
|
||||
static BOOL bMatchExactText = FALSE;
|
||||
static BOOL bSearchSense = TRUE; // TRUE == down, FALSE == up.
|
||||
static BOOL bCaseSensitive = FALSE;
|
||||
|
||||
static void
|
||||
ToLower(LPWSTR lpszString)
|
||||
{
|
||||
if (!lpszString)
|
||||
return;
|
||||
|
||||
while (*lpszString)
|
||||
{
|
||||
*lpszString = towlower(*lpszString);
|
||||
++lpszString;
|
||||
}
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK
|
||||
FindDialogWndProc(HWND hDlg,
|
||||
UINT message,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(lParam);
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
hTree = (HWND)lParam;
|
||||
|
||||
Button_SetCheck(GetDlgItem(hDlg, IDC_CBX_FIND_WHOLE_WORD_ONLY), (bMatchExactText ? BST_CHECKED : BST_UNCHECKED));
|
||||
Button_SetCheck(GetDlgItem(hDlg, IDC_RB_FIND_DOWN), (bSearchSense ? BST_CHECKED : BST_UNCHECKED)); // TRUE == down, FALSE == up.
|
||||
Button_SetCheck(GetDlgItem(hDlg, IDC_RB_FIND_UP ), (bSearchSense ? BST_UNCHECKED : BST_CHECKED )); // TRUE == down, FALSE == up.
|
||||
Button_SetCheck(GetDlgItem(hDlg, IDC_CBX_FIND_MATCH_CASE), (bCaseSensitive ? BST_CHECKED : BST_UNCHECKED));
|
||||
|
||||
Edit_SetText(GetDlgItem(hDlg, IDC_TXT_FIND_TEXT), szSearchString);
|
||||
SetFocus(GetDlgItem(hDlg, IDC_TXT_FIND_TEXT));
|
||||
Edit_SetSel(GetDlgItem(hDlg, IDC_TXT_FIND_TEXT), 0, -1);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDOK:
|
||||
{
|
||||
TVITEMEXW tvItemEx;
|
||||
HTREEITEM htiIterator;
|
||||
WCHAR label[MAX_VALUE_NAME] = L"";
|
||||
WCHAR szTemp[MAX_VALUE_NAME];
|
||||
|
||||
bMatchExactText = (Button_GetCheck(GetDlgItem(hDlg, IDC_CBX_FIND_WHOLE_WORD_ONLY)) == BST_CHECKED);
|
||||
bSearchSense = ((Button_GetCheck(GetDlgItem(hDlg, IDC_RB_FIND_DOWN)) == BST_CHECKED) &&
|
||||
(Button_GetCheck(GetDlgItem(hDlg, IDC_RB_FIND_UP )) == BST_UNCHECKED)); // TRUE == down, FALSE == up.
|
||||
bCaseSensitive = (Button_GetCheck(GetDlgItem(hDlg, IDC_CBX_FIND_MATCH_CASE)) == BST_CHECKED);
|
||||
|
||||
Edit_GetText(GetDlgItem(hDlg, IDC_TXT_FIND_TEXT), szSearchString, _ARRAYSIZE(szSearchString));
|
||||
wcscpy(szTemp, szSearchString);
|
||||
if (!bCaseSensitive)
|
||||
ToLower(szTemp);
|
||||
|
||||
for (htiIterator = ((Button_GetCheck(GetDlgItem(hDlg, IDC_CBX_FIND_FROM_BEGINNING)) == BST_CHECKED) ? (bSearchSense ? TreeView_GetFirst(hTree)
|
||||
: TreeView_GetLast(hTree))
|
||||
: (bSearchSense ? TreeView_GetNext(hTree, TreeView_GetSelection(hTree))
|
||||
: TreeView_GetPrev(hTree, TreeView_GetSelection(hTree))));
|
||||
htiIterator ;
|
||||
htiIterator = (bSearchSense ? TreeView_GetNext(hTree, htiIterator)
|
||||
: TreeView_GetPrev(hTree, htiIterator)))
|
||||
{
|
||||
SecureZeroMemory(&tvItemEx, sizeof(tvItemEx));
|
||||
|
||||
tvItemEx.hItem = htiIterator; // Handle of the item to be retrieved
|
||||
tvItemEx.mask = TVIF_HANDLE | TVIF_TEXT;
|
||||
tvItemEx.pszText = label;
|
||||
tvItemEx.cchTextMax = MAX_VALUE_NAME;
|
||||
TreeView_GetItem(hTree, &tvItemEx);
|
||||
if (!bCaseSensitive)
|
||||
ToLower(label);
|
||||
|
||||
if (bMatchExactText ? (_tcscmp(label, szTemp) == 0) : !!_tcsstr(label, szTemp)) // <-- hackish. A arranger.
|
||||
{
|
||||
TreeView_SelectItem(hTree, htiIterator);
|
||||
EndDialog(hDlg, LOWORD(wParam));
|
||||
return TRUE;
|
||||
}
|
||||
//MessageBox(NULL, label, _T("Info"), MB_ICONINFORMATION | MB_OK);
|
||||
}
|
||||
|
||||
// FIXME: Localize!
|
||||
MessageBoxW(hDlg, L"No correspondence found.", szAppName, MB_ICONINFORMATION | MB_OK);
|
||||
SetFocus(GetDlgItem(hDlg, IDC_TXT_FIND_TEXT));
|
||||
Edit_SetSel(GetDlgItem(hDlg, IDC_TXT_FIND_TEXT), 0, -1);
|
||||
//EndDialog(hDlg, LOWORD(wParam));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDCANCEL:
|
||||
EndDialog(hDlg, LOWORD(wParam));
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
//break;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
TreeView_SetBOOLCheck(HWND hTree, HTREEITEM htiItem, BOOL bState, BOOL bPropagateStateToParent)
|
||||
{
|
||||
if (!hTree || !htiItem)
|
||||
return;
|
||||
|
||||
TreeView_SetCheckState(hTree, htiItem, bState);
|
||||
|
||||
/*
|
||||
* Add or remove the token for tree leaves only.
|
||||
*/
|
||||
if (!TreeView_GetChild(hTree, htiItem))
|
||||
{
|
||||
/* 1- Retrieve properties */
|
||||
TVITEMEXW tvItemEx;
|
||||
SecureZeroMemory(&tvItemEx, sizeof(tvItemEx));
|
||||
|
||||
tvItemEx.hItem = htiItem; // Handle of the item to be retrieved.
|
||||
tvItemEx.mask = TVIF_HANDLE | TVIF_TEXT;
|
||||
WCHAR label[MAX_VALUE_NAME] = L"";
|
||||
tvItemEx.pszText = label;
|
||||
tvItemEx.cchTextMax = MAX_VALUE_NAME;
|
||||
TreeView_GetItem(hTree, &tvItemEx);
|
||||
|
||||
if (!bState)
|
||||
{
|
||||
/* 2- Add the token IF NEEDED */
|
||||
if ((wcslen(tvItemEx.pszText) < MSConfigTokLen) || (_wcsnicmp(tvItemEx.pszText, szMSConfigTok, MSConfigTokLen) != 0))
|
||||
{
|
||||
LPWSTR newLabel = (LPWSTR)MemAlloc(0, (_tcslen(tvItemEx.pszText) + MSConfigTokLen + 1) * sizeof(WCHAR));
|
||||
wcscpy(newLabel, szMSConfigTok);
|
||||
wcscat(newLabel, tvItemEx.pszText);
|
||||
tvItemEx.pszText = newLabel;
|
||||
|
||||
TreeView_SetItem(hTree, &tvItemEx);
|
||||
|
||||
MemFree(newLabel);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 2- Remove the token IF NEEDED */
|
||||
if ((wcslen(tvItemEx.pszText) >= MSConfigTokLen) && (_wcsnicmp(tvItemEx.pszText, szMSConfigTok, MSConfigTokLen) == 0))
|
||||
{
|
||||
LPWSTR newLabel = (LPWSTR)MemAlloc(0, (_tcslen(tvItemEx.pszText) - MSConfigTokLen + 1) * sizeof(WCHAR));
|
||||
wcscpy(newLabel, tvItemEx.pszText + MSConfigTokLen);
|
||||
tvItemEx.pszText = newLabel;
|
||||
|
||||
TreeView_SetItem(hTree, &tvItemEx);
|
||||
|
||||
// TODO: if one finds tvItemEx.pszText == L"", one can
|
||||
// directly remove the item (cf. message TVN_ENDLABELEDIT).
|
||||
|
||||
MemFree(newLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
////////////////////////
|
||||
|
||||
for (HTREEITEM htiIterator = TreeView_GetChild(hTree, htiItem) ; htiIterator ; htiIterator = TreeView_GetNextSibling(hTree, htiIterator))
|
||||
TreeView_SetBOOLCheck(hTree, htiIterator, bState, FALSE);
|
||||
|
||||
if (bPropagateStateToParent)
|
||||
TreeView_PropagateStateOfItemToParent(hTree, htiItem);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
LoadIniFile(HWND hTree, LPCWSTR lpszIniFile)
|
||||
{
|
||||
// Ouverture en lecture (sans création de fichier si celui-ci n'esistait pas déjà)
|
||||
// d'un flux en mode texte, avec permission de lecture seule.
|
||||
DWORD dwNumOfChars = ExpandEnvironmentStringsW(lpszIniFile, NULL, 0);
|
||||
LPWSTR lpszFileName = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
||||
ExpandEnvironmentStringsW(lpszIniFile, lpszFileName, dwNumOfChars);
|
||||
|
||||
FILE* ini_file = _wfsopen(lpszFileName, L"rt", _SH_DENYWR); // r+t <-- read write text ; rt <-- read text
|
||||
MemFree(lpszFileName);
|
||||
|
||||
if (!ini_file)
|
||||
return; // error
|
||||
|
||||
WCHAR szLine[MAX_VALUE_NAME] = L"";
|
||||
TVINSERTSTRUCT tvis;
|
||||
HTREEITEM hParent = TVI_ROOT;
|
||||
BOOL bIsSection = FALSE;
|
||||
LPWSTR lpsz1 = NULL;
|
||||
LPWSTR lpsz2 = NULL;
|
||||
|
||||
while (!feof(ini_file) && fgetws(szLine, _ARRAYSIZE(szLine), ini_file))
|
||||
{
|
||||
/* Skip hypothetical starting spaces or newline characters */
|
||||
lpsz1 = szLine;
|
||||
while (*lpsz1 == L' ' || *lpsz1 == L'\r' || *lpsz1 == L'\n')
|
||||
++lpsz1;
|
||||
|
||||
/* Skip empty lines */
|
||||
if (!*lpsz1)
|
||||
continue;
|
||||
|
||||
/* Find the last newline character (if exists) and replace it by the NULL terminator */
|
||||
lpsz2 = lpsz1;
|
||||
while (*lpsz2)
|
||||
{
|
||||
if (*lpsz2 == L'\r' || *lpsz2 == L'\n')
|
||||
{
|
||||
*lpsz2 = L'\0';
|
||||
break;
|
||||
}
|
||||
|
||||
++lpsz2;
|
||||
}
|
||||
|
||||
/* Check for new sections. They should be parent of ROOT. */
|
||||
if (*lpsz1 == L'[')
|
||||
{
|
||||
bIsSection = TRUE;
|
||||
hParent = TVI_ROOT;
|
||||
}
|
||||
|
||||
SecureZeroMemory(&tvis, sizeof(tvis));
|
||||
tvis.hParent = hParent;
|
||||
tvis.hInsertAfter = TVI_LAST;
|
||||
tvis.itemex.mask = TVIF_TEXT; // TVIF_HANDLE | TVIF_TEXT;
|
||||
tvis.itemex.pszText = lpsz1;
|
||||
tvis.itemex.hItem = TreeView_InsertItem(hTree, &tvis);
|
||||
|
||||
/* The special ";msconfig " token disables the line */
|
||||
if (!bIsSection && _wcsnicmp(lpsz1, szMSConfigTok, MSConfigTokLen) == 0)
|
||||
TreeView_SetBOOLCheck(hTree, tvis.itemex.hItem, FALSE, TRUE);
|
||||
else
|
||||
TreeView_SetBOOLCheck(hTree, tvis.itemex.hItem, TRUE, TRUE);
|
||||
|
||||
/*
|
||||
* Now, all the elements will be children of this section,
|
||||
* until we create a new one.
|
||||
*/
|
||||
if (bIsSection)
|
||||
{
|
||||
bIsSection = FALSE;
|
||||
hParent = tvis.itemex.hItem;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(ini_file);
|
||||
return;
|
||||
|
||||
//// Test code for the TreeView ////
|
||||
/*
|
||||
HTREEITEM hItem[16];
|
||||
|
||||
hItem[0] = InsertItem(hTree, _T("B"),TVI_ROOT,TVI_LAST);
|
||||
hItem[1] = InsertItem(hTree, _T("C"),TVI_ROOT,TVI_LAST);
|
||||
hItem[2] = InsertItem(hTree, _T("A"),TVI_ROOT,TVI_LAST);
|
||||
hItem[3] = InsertItem(hTree, _T("D"),TVI_ROOT,TVI_LAST);
|
||||
hItem[4] = InsertItem(hTree, _T("D-1"),hItem[3] ,TVI_LAST);
|
||||
hItem[5] = InsertItem(hTree, _T("D-2"),hItem[3] ,TVI_LAST);
|
||||
hItem[9] = InsertItem(hTree, _T("D-2-1"),hItem[5],TVI_LAST);
|
||||
hItem[6] = InsertItem(hTree, _T("D-3"),hItem[3] ,TVI_LAST);
|
||||
hItem[7] = InsertItem(hTree, _T("D-3-1"),hItem[6],TVI_LAST);
|
||||
hItem[10] = InsertItem(hTree, _T("D-3-1-1"),hItem[7],TVI_LAST);
|
||||
hItem[11] = InsertItem(hTree, _T("D-3-1-2"),hItem[7],TVI_LAST);
|
||||
hItem[12] = InsertItem(hTree, _T("D-3-1-3"),hItem[7],TVI_LAST);
|
||||
hItem[13] = InsertItem(hTree, _T("D-3-1-4"),hItem[7],TVI_LAST);
|
||||
hItem[14] = InsertItem(hTree, _T("D-3-1-5"),hItem[7],TVI_LAST);
|
||||
hItem[15] = InsertItem(hTree, _T("D-3-1-6"),hItem[7],TVI_LAST);
|
||||
hItem[13] = InsertItem(hTree, _T("E"),TVI_ROOT,TVI_LAST);
|
||||
*/
|
||||
////////////////////////////////////
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
WriteIniFile(HWND hTree, LPCWSTR lpszIniFile)
|
||||
{
|
||||
// Ouverture en écriture (avec création de fichier si celui-ci n'esistait pas déjà)
|
||||
// d'un flux en mode texte, avec permission de lecture seule.
|
||||
#if 0
|
||||
DWORD dwNumOfChars = ExpandEnvironmentStringsW(lpszIniFile, NULL, 0);
|
||||
LPWSTR lpszFileName = MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
||||
ExpandEnvironmentStringsW(lpszIniFile, lpszFileName, dwNumOfChars);
|
||||
#else
|
||||
// HACK: delete these following lines when the program will be ready.
|
||||
DWORD dwNumOfChars = ExpandEnvironmentStringsW(lpszIniFile, NULL, 0) + 11;
|
||||
LPWSTR lpszFileName = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
||||
ExpandEnvironmentStringsW(lpszIniFile, lpszFileName, dwNumOfChars);
|
||||
wcscat(lpszFileName, L"__tests.ini");
|
||||
// END HACK.
|
||||
#endif
|
||||
|
||||
FILE* ini_file = _wfsopen(lpszFileName, L"wt", _SH_DENYRW); // w+t <-- write read text ; wt <-- write text
|
||||
MemFree(lpszFileName);
|
||||
|
||||
if (!ini_file)
|
||||
return; // error
|
||||
|
||||
|
||||
TVITEMEXW tvItemEx;
|
||||
WCHAR label[MAX_VALUE_NAME] = L"";
|
||||
// WCHAR szLine[MAX_VALUE_NAME] = L"";
|
||||
|
||||
// for (HTREEITEM htiIterator = TreeView_GetRoot(hTree) ; htiIterator ; htiIterator = TreeView_GetNextSibling(hTree, htiIterator))
|
||||
for (HTREEITEM htiIterator = TreeView_GetFirst(hTree) ; htiIterator ; htiIterator = TreeView_GetNext(hTree, htiIterator))
|
||||
{
|
||||
SecureZeroMemory(&tvItemEx, sizeof(tvItemEx));
|
||||
|
||||
tvItemEx.hItem = htiIterator; // Handle of the item to be retrieved.
|
||||
tvItemEx.mask = TVIF_HANDLE | TVIF_TEXT;
|
||||
tvItemEx.pszText = label;
|
||||
tvItemEx.cchTextMax = MAX_VALUE_NAME;
|
||||
TreeView_GetItem(hTree, &tvItemEx);
|
||||
|
||||
// Write into the file.
|
||||
wcscat(label, L"\n");
|
||||
fputws(label, ini_file);
|
||||
}
|
||||
|
||||
fclose(ini_file);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
Update_Btn_States(HWND hDlg)
|
||||
{
|
||||
HWND hTree = GetDlgItem(hDlg, IDC_SYSTEM_TREE);
|
||||
|
||||
HTREEITEM hti = TreeView_GetSelection(hTree);
|
||||
HTREEITEM htiPrev = TreeView_GetPrevSibling(hTree, hti);
|
||||
HTREEITEM htiNext = TreeView_GetNextSibling(hTree, hti);
|
||||
|
||||
//
|
||||
// "Up" / "Down" buttons.
|
||||
//
|
||||
if (htiPrev)
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_UP), TRUE);
|
||||
else
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_UP), FALSE);
|
||||
|
||||
if (htiNext)
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DOWN), TRUE);
|
||||
else
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DOWN), FALSE);
|
||||
|
||||
//
|
||||
// "Enable" / "Disable" buttons.
|
||||
//
|
||||
UINT uCheckState = TreeView_GetCheckState(hTree, hti);
|
||||
if (uCheckState == 0)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_ENABLE) , TRUE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DISABLE), FALSE);
|
||||
}
|
||||
else if (uCheckState == 1)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_ENABLE) , FALSE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DISABLE), TRUE);
|
||||
}
|
||||
else if (uCheckState == 2)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_ENABLE) , TRUE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DISABLE), TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_ENABLE) , FALSE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DISABLE), FALSE);
|
||||
}
|
||||
|
||||
//
|
||||
// "Enable all" / "Disable all" buttons.
|
||||
//
|
||||
UINT uRootCheckState = TreeView_GetRealSubtreeState(hTree, TVI_ROOT);
|
||||
if (uRootCheckState == 0)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_ENABLE_ALL) , TRUE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DISABLE_ALL), FALSE);
|
||||
}
|
||||
else if (uRootCheckState == 1)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_ENABLE_ALL) , FALSE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DISABLE_ALL), TRUE);
|
||||
}
|
||||
else if (uRootCheckState == 2)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_ENABLE_ALL) , TRUE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DISABLE_ALL), TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_ENABLE_ALL) , FALSE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DISABLE_ALL), FALSE);
|
||||
}
|
||||
|
||||
//
|
||||
// "Search" / "Edit" / "Delete" buttons.
|
||||
//
|
||||
if (TreeView_GetRoot(hTree))
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_FIND) , TRUE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_EDIT) , TRUE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DELETE), TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_FIND) , FALSE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_EDIT) , FALSE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BTN_SYSTEM_DELETE), FALSE);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
INT_PTR
|
||||
CommonWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(lParam);
|
||||
UNREFERENCED_PARAMETER(wParam);
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
HWND hSystemTree = GetDlgItem(hDlg, IDC_SYSTEM_TREE);
|
||||
|
||||
//
|
||||
// Initialize the styles.
|
||||
//
|
||||
TreeView_Set3StateCheck(hSystemTree);
|
||||
SetWindowTheme(hSystemTree, L"Explorer", NULL);
|
||||
|
||||
TreeView_SetIndent(hSystemTree, TreeView_GetIndent(hSystemTree) + 2);
|
||||
|
||||
/* Load data */
|
||||
LoadIniFile(hSystemTree, (LPCWSTR)((LPPROPSHEETPAGE)lParam)->lParam);
|
||||
|
||||
/* Select the first item */
|
||||
TreeView_SelectItem(hSystemTree, TreeView_GetRoot(hSystemTree)); // Is it really necessary?
|
||||
SetFocus(hSystemTree);
|
||||
|
||||
Update_Btn_States(hDlg);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case WM_DESTROY:
|
||||
{
|
||||
TreeView_Cleanup(GetDlgItem(hDlg, IDC_SYSTEM_TREE));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
case WM_COMMAND:
|
||||
{
|
||||
HWND hSystemTree = GetDlgItem(hDlg, IDC_SYSTEM_TREE);
|
||||
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDC_BTN_SYSTEM_UP:
|
||||
{
|
||||
TreeView_UpItem(hSystemTree, TreeView_GetSelection(hSystemTree));
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDC_BTN_SYSTEM_DOWN:
|
||||
{
|
||||
TreeView_DownItem(hSystemTree, TreeView_GetSelection(hSystemTree));
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDC_BTN_SYSTEM_ENABLE:
|
||||
{
|
||||
HTREEITEM hItem = TreeView_GetSelection(hSystemTree);
|
||||
TreeView_SetBOOLCheck(hSystemTree, hItem, TRUE, TRUE);
|
||||
TreeView_SelectItem(hSystemTree, hItem);
|
||||
Update_Btn_States(hDlg);
|
||||
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDC_BTN_SYSTEM_ENABLE_ALL:
|
||||
{
|
||||
for (HTREEITEM htiIterator = TreeView_GetRoot(hSystemTree) ; htiIterator ; htiIterator = TreeView_GetNextSibling(hSystemTree, htiIterator))
|
||||
TreeView_SetBOOLCheck(hSystemTree, htiIterator, TRUE, TRUE);
|
||||
|
||||
Update_Btn_States(hDlg);
|
||||
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDC_BTN_SYSTEM_DISABLE:
|
||||
{
|
||||
HTREEITEM hItem = TreeView_GetSelection(hSystemTree);
|
||||
TreeView_SetBOOLCheck(hSystemTree, hItem, FALSE, TRUE);
|
||||
TreeView_SelectItem(hSystemTree, hItem);
|
||||
|
||||
Update_Btn_States(hDlg);
|
||||
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDC_BTN_SYSTEM_DISABLE_ALL:
|
||||
{
|
||||
for (HTREEITEM htiIterator = TreeView_GetRoot(hSystemTree) ; htiIterator ; htiIterator = TreeView_GetNextSibling(hSystemTree, htiIterator))
|
||||
TreeView_SetBOOLCheck(hSystemTree, htiIterator, FALSE, TRUE);
|
||||
|
||||
Update_Btn_States(hDlg);
|
||||
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDC_BTN_SYSTEM_FIND:
|
||||
{
|
||||
DialogBoxParamW(hInst, MAKEINTRESOURCEW(IDD_FIND_DIALOG), hDlg /* hMainWnd */, FindDialogWndProc, (LPARAM)hSystemTree);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDC_BTN_SYSTEM_NEW:
|
||||
{
|
||||
HTREEITEM hInsertAfter = TreeView_GetSelection(hSystemTree);
|
||||
HTREEITEM hNewItem = InsertItem(hSystemTree, L"", TreeView_GetParent(hSystemTree, hInsertAfter), hInsertAfter);
|
||||
TreeView_EditLabel(hSystemTree, hNewItem);
|
||||
TreeView_SelectItem(hSystemTree, hNewItem);
|
||||
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDC_BTN_SYSTEM_EDIT:
|
||||
{
|
||||
TreeView_EditLabel(hSystemTree, TreeView_GetSelection(hSystemTree));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case IDC_BTN_SYSTEM_DELETE:
|
||||
{
|
||||
TreeView_DeleteItem(hSystemTree, TreeView_GetSelection(hSystemTree));
|
||||
Update_Btn_States(hDlg);
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
// return FALSE;
|
||||
}
|
||||
|
||||
case UM_CHECKSTATECHANGE:
|
||||
{
|
||||
HWND hSystemTree = GetDlgItem(hDlg, IDC_SYSTEM_TREE);
|
||||
|
||||
/* Retrieve the new checked state of the item and handle the notification */
|
||||
HTREEITEM hItemChanged = (HTREEITEM)lParam;
|
||||
|
||||
//
|
||||
// State before | State after
|
||||
// -------------------------------
|
||||
// 0 (unchecked) | 1 (checked)
|
||||
// 1 (checked) | 0 (unchecked)
|
||||
// 2 (grayed) | 1 (checked) --> this case corresponds to the former
|
||||
// | with 0 == 2 mod 2.
|
||||
//
|
||||
UINT uiCheckState = TreeView_GetCheckState(hSystemTree, hItemChanged) % 2;
|
||||
TreeView_SetBOOLCheck(hSystemTree, hItemChanged, uiCheckState ? FALSE : TRUE, TRUE);
|
||||
TreeView_SelectItem(hSystemTree, hItemChanged);
|
||||
Update_Btn_States(hDlg);
|
||||
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case WM_NOTIFY:
|
||||
{
|
||||
if (((LPNMHDR)lParam)->idFrom == IDC_SYSTEM_TREE)
|
||||
{
|
||||
switch (((LPNMHDR)lParam)->code)
|
||||
{
|
||||
case NM_CLICK:
|
||||
{
|
||||
HWND hSystemTree = GetDlgItem(hDlg, IDC_SYSTEM_TREE);
|
||||
|
||||
DWORD dwpos = GetMessagePos();
|
||||
TVHITTESTINFO ht = {};
|
||||
ht.pt.x = GET_X_LPARAM(dwpos);
|
||||
ht.pt.y = GET_Y_LPARAM(dwpos);
|
||||
MapWindowPoints(HWND_DESKTOP /*NULL*/, hSystemTree, &ht.pt, 1);
|
||||
|
||||
TreeView_HitTest(hSystemTree, &ht);
|
||||
|
||||
if (TVHT_ONITEMSTATEICON & ht.flags)
|
||||
{
|
||||
PostMessage(hDlg, UM_CHECKSTATECHANGE, 0, (LPARAM)ht.hItem);
|
||||
|
||||
// Disable default behaviour. Needed for the UM_CHECKSTATECHANGE
|
||||
// custom notification to work as expected.
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, TRUE);
|
||||
}
|
||||
/*
|
||||
else
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
|
||||
*/
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case TVN_KEYDOWN:
|
||||
{
|
||||
if (((LPNMTVKEYDOWN)lParam)->wVKey == VK_SPACE)
|
||||
{
|
||||
HWND hSystemTree = GetDlgItem(hDlg, IDC_SYSTEM_TREE);
|
||||
|
||||
HTREEITEM hti = TreeView_GetSelection(hSystemTree);
|
||||
|
||||
// Hack the tree item state. This is needed because whether or not
|
||||
// TRUE is being returned, the default implementation of SysTreeView32
|
||||
// is always being processed for a key down !
|
||||
if (GetWindowLongPtr(hSystemTree, GWL_STYLE) & TVS_CHECKBOXES)
|
||||
{
|
||||
TreeView_SetItemState(hSystemTree, hti, INDEXTOSTATEIMAGEMASK(TreeView_GetCheckState(hSystemTree, hti)), TVIS_STATEIMAGEMASK);
|
||||
}
|
||||
|
||||
PostMessage(hDlg, UM_CHECKSTATECHANGE, 0, (LPARAM)hti);
|
||||
|
||||
// Disable default behaviour. Needed for the UM_CHECKSTATECHANGE
|
||||
// custom notification to work as expected.
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, TRUE);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case TVN_ENDLABELEDIT:
|
||||
{
|
||||
HWND hSystemTree = GetDlgItem(hDlg, IDC_SYSTEM_TREE);
|
||||
|
||||
/*
|
||||
* Ehh yes, we have to deal with a "dialog proc", which is quite different from a "window proc":
|
||||
*
|
||||
* (excerpt from: MSDN library http://msdn.microsoft.com/en-us/library/ms645469(VS.85).aspx)
|
||||
*
|
||||
* Return Value
|
||||
* ============
|
||||
* INT_PTR
|
||||
*
|
||||
* Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not.
|
||||
* If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response
|
||||
* to the message.
|
||||
*
|
||||
* If the dialog box procedure processes a message that requires a specific return value, the dialog box procedure
|
||||
* should set the desired return value by calling SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) immediately before
|
||||
* returning TRUE. Note that you must call SetWindowLong immediately before returning TRUE; doing so earlier may result
|
||||
* in the DWL_MSGRESULT value being overwritten by a nested dialog box message.
|
||||
*
|
||||
* [...]
|
||||
*
|
||||
* Remarks
|
||||
* =======
|
||||
* You should use the dialog box procedure only if you use the dialog box class for the dialog box. This is the default
|
||||
* class and is used when no explicit class is specified in the dialog box template. Although the dialog box procedure
|
||||
* is similar to a window procedure, it must not call the DefWindowProc function to process unwanted messages. Unwanted
|
||||
* messages are processed internally by the dialog box window procedure.
|
||||
*
|
||||
*/
|
||||
|
||||
// A arranger un peu ???? Certainement.
|
||||
TVITEMW truc = ((LPNMTVDISPINFO)lParam)->item;
|
||||
if (truc.pszText)
|
||||
{
|
||||
if (!*truc.pszText)
|
||||
TreeView_DeleteItem(hSystemTree, truc.hItem);
|
||||
|
||||
PropSheet_Changed(GetParent(hDlg), hDlg);
|
||||
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, TRUE);
|
||||
}
|
||||
else
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
|
||||
|
||||
Update_Btn_States(hDlg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case TVN_SELCHANGED:
|
||||
Update_Btn_States(hDlg);
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (((LPNMHDR)lParam)->code)
|
||||
{
|
||||
case PSN_APPLY:
|
||||
{
|
||||
// TODO: Enum the items.
|
||||
// HWND hSystemTree = GetDlgItem(hDlg, IDC_SYSTEM_TREE);
|
||||
//
|
||||
PropSheet_CancelToClose(GetParent(hDlg));
|
||||
|
||||
/* TODO: see :
|
||||
*
|
||||
* dll/win32/devmgr/advprop.c: PropSheet_RebootSystem(hwndDlg);
|
||||
* include/psdk/prsht.h:#define PropSheet_RebootSystem(d) SendMessage(d,PSM_REBOOTSYSTEM,0,0)
|
||||
*
|
||||
* dll/shellext/deskadp/deskadp.c: PropSheet_RestartWindows(GetParent(This->hwndDlg));
|
||||
* dll/shellext/deskmon/deskmon.c: PropSheet_RestartWindows(GetParent(This->hwndDlg));
|
||||
* include/psdk/prsht.h:#define PropSheet_RestartWindows(d) SendMessage(d,PSM_RESTARTWINDOWS,0,0)
|
||||
*
|
||||
* for their usage.
|
||||
*/
|
||||
PropSheet_RebootSystem(GetParent(hDlg));
|
||||
//PropSheet_RestartWindows(GetParent(hDlg));
|
||||
|
||||
WriteIniFile(GetDlgItem(hDlg, IDC_SYSTEM_TREE), (LPCWSTR)wParam);
|
||||
|
||||
// Since there are nothing to modify, applying modifications
|
||||
// cannot return any error.
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
||||
//PropSheet_UnChanged(GetParent(hDlg) /*hMainWnd*/, hDlg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case PSN_HELP:
|
||||
{
|
||||
MessageBox(hDlg, _T("Help not implemented yet!"), _T("Help"), MB_ICONINFORMATION | MB_OK);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case PSN_KILLACTIVE: // Is going to lose activation.
|
||||
{
|
||||
// Changes are always valid of course.
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case PSN_QUERYCANCEL:
|
||||
{
|
||||
// Allows cancellation since there are nothing to cancel...
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case PSN_QUERYINITIALFOCUS:
|
||||
{
|
||||
HWND hSystemTree = GetDlgItem(hDlg, IDC_SYSTEM_TREE);
|
||||
|
||||
// Give the focus on and select the first item.
|
||||
ListView_SetItemState(hSystemTree, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
|
||||
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, (LONG_PTR)hSystemTree);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//
|
||||
// DO NOT TOUCH THESE NEXT MESSAGES, THEY ARE OK LIKE THIS...
|
||||
//
|
||||
case PSN_RESET: // Perform final cleaning, called before WM_DESTROY.
|
||||
return TRUE;
|
||||
|
||||
case PSN_SETACTIVE: // Is going to gain activation.
|
||||
{
|
||||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, 0);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// return FALSE;
|
||||
}
|
||||
|
||||
|
||||
extern "C" {
|
||||
|
||||
INT_PTR CALLBACK
|
||||
SystemPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
static LPCWSTR lpszIniFile = NULL;
|
||||
|
||||
if (message == WM_INITDIALOG)
|
||||
lpszIniFile = (LPCWSTR)((LPPROPSHEETPAGE)lParam)->lParam;
|
||||
|
||||
if ( (message == WM_NOTIFY) && (((LPNMHDR)lParam)->code == PSN_APPLY) )
|
||||
wParam = (WPARAM)lpszIniFile;
|
||||
|
||||
return CommonWndProc(hDlg, message, wParam, lParam);
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK
|
||||
WinPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
static LPCWSTR lpszIniFile = NULL;
|
||||
|
||||
if (message == WM_INITDIALOG)
|
||||
lpszIniFile = (LPCWSTR)((LPPROPSHEETPAGE)lParam)->lParam;
|
||||
|
||||
if ( (message == WM_NOTIFY) && (((LPNMHDR)lParam)->code == PSN_APPLY) )
|
||||
wParam = (WPARAM)lpszIniFile;
|
||||
|
||||
return CommonWndProc(hDlg, message, wParam, lParam);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,8 +1,23 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications
|
||||
* LICENSE: LGPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/msconfig_new/systempage.h
|
||||
* PURPOSE: System page message handler
|
||||
* COPYRIGHT: Copyright 2005-2006 Christoph von Wittich <Christoph@ApiViewer.de>
|
||||
* 2011 Gregor Schneider <Gregor.Schneider@reactos.org>
|
||||
* Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
||||
*/
|
||||
|
||||
#ifndef _SYSTEMPAGE_H_
|
||||
#define _SYSTEMPAGE_H_
|
||||
|
||||
extern HWND hSystemPage;
|
||||
extern LPCWSTR lpszSystemIni;
|
||||
extern LPCWSTR lpszWinIni;
|
||||
|
||||
DWORD GetSystemIniActivation(VOID);
|
||||
DWORD GetWinIniActivation(VOID);
|
||||
|
||||
INT_PTR CALLBACK SystemPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
INT_PTR CALLBACK WinPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
#endif /* _SYSTEMPAGE_H_ */
|
||||
#endif
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include "precomp.h"
|
||||
#include "xmldomparser.hpp"
|
||||
#include "utils.h"
|
||||
#include "listviewfuncs.h"
|
||||
#include "listview.h"
|
||||
#include "uxthemesupp.h"
|
||||
|
||||
static HWND hToolsPage = NULL;
|
||||
|
@ -230,8 +230,6 @@ BuildCommandLine(LPWSTR lpszDest, LPCWSTR lpszCmdLine, LPCWSTR lpszParam, size_t
|
|||
return numOfChars;
|
||||
}
|
||||
|
||||
#define Button_IsEnabled(hwndCtl) IsWindowEnabled((hwndCtl))
|
||||
|
||||
static void Update_States(int iSelectedItem)
|
||||
{
|
||||
TOOL* tool;
|
||||
|
|
Loading…
Reference in a new issue