diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-10-31 14:20:44 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-11-01 16:34:09 -0500 |
commit | 7e60078d4a7fe748a39c135def9e84a2421ab474 (patch) | |
tree | 51dbe5067ca9596f99107719734c4946e4c080b4 /src | |
parent | c092722a147940532b08f62403e182ef279f2c74 (diff) | |
download | wix-7e60078d4a7fe748a39c135def9e84a2421ab474.tar.gz wix-7e60078d4a7fe748a39c135def9e84a2421ab474.tar.bz2 wix-7e60078d4a7fe748a39c135def9e84a2421ab474.zip |
Avoid using control ids inside of thmutil.
Diffstat (limited to 'src')
-rw-r--r-- | src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | 314 | ||||
-rw-r--r-- | src/ext/Bal/wixstdba/precomp.h | 1 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/dutil.vcxproj | 2 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/dutil.vcxproj.filters | 6 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/dutilsources.h | 1 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/thmutil.h | 117 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/wndutil.h | 41 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/precomp.h | 1 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/thmutil.cpp | 650 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/wndutil.cpp | 206 | ||||
-rw-r--r-- | src/samples/thmviewer/display.cpp | 8 | ||||
-rw-r--r-- | src/samples/thmviewer/precomp.h | 1 | ||||
-rw-r--r-- | src/samples/thmviewer/thmviewer.cpp | 37 | ||||
-rw-r--r-- | src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp | 11 |
14 files changed, 845 insertions, 551 deletions
diff --git a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp index 23158a1c..d1b18cb3 100644 --- a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp +++ b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | |||
@@ -80,7 +80,7 @@ static LPCWSTR vrgwzPageNames[] = { | |||
80 | // The range [0, 100) is unused to avoid collisions with system ids, | 80 | // The range [0, 100) is unused to avoid collisions with system ids, |
81 | // the range [100, 0x4000) is unused to avoid collisions with thmutil, | 81 | // the range [100, 0x4000) is unused to avoid collisions with thmutil, |
82 | // the range [0x4000, 0x8000) is unused to avoid collisions with BAFunctions. | 82 | // the range [0x4000, 0x8000) is unused to avoid collisions with BAFunctions. |
83 | const WORD WIXSTDBA_FIRST_ASSIGN_CONTROL_ID = 0x8000; | 83 | const WORD WIXSTDBA_FIRST_ASSIGN_CONTROL_ID = 0x8000; |
84 | 84 | ||
85 | enum WIXSTDBA_CONTROL | 85 | enum WIXSTDBA_CONTROL |
86 | { | 86 | { |
@@ -119,36 +119,8 @@ enum WIXSTDBA_CONTROL | |||
119 | WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK, | 119 | WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK, |
120 | WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, | 120 | WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, |
121 | WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, | 121 | WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, |
122 | }; | ||
123 | 122 | ||
124 | static THEME_ASSIGN_CONTROL_ID vrgInitControls[] = { | 123 | LAST_WIXSTDBA_CONTROL, |
125 | { WIXSTDBA_CONTROL_INSTALL_BUTTON, L"InstallButton" }, | ||
126 | { WIXSTDBA_CONTROL_EULA_RICHEDIT, L"EulaRichedit" }, | ||
127 | { WIXSTDBA_CONTROL_EULA_LINK, L"EulaHyperlink" }, | ||
128 | { WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX, L"EulaAcceptCheckbox" }, | ||
129 | |||
130 | { WIXSTDBA_CONTROL_REPAIR_BUTTON, L"RepairButton" }, | ||
131 | { WIXSTDBA_CONTROL_UNINSTALL_BUTTON, L"UninstallButton" }, | ||
132 | |||
133 | { WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, L"CacheProgressPackageText" }, | ||
134 | { WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR, L"CacheProgressbar" }, | ||
135 | { WIXSTDBA_CONTROL_CACHE_PROGRESS_TEXT, L"CacheProgressText" }, | ||
136 | { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, L"ExecuteProgressPackageText" }, | ||
137 | { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_BAR, L"ExecuteProgressbar" }, | ||
138 | { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_TEXT, L"ExecuteProgressText" }, | ||
139 | { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, L"ExecuteProgressActionDataText"}, | ||
140 | { WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, L"OverallProgressPackageText" }, | ||
141 | { WIXSTDBA_CONTROL_OVERALL_PROGRESS_BAR, L"OverallProgressbar" }, | ||
142 | { WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, L"OverallCalculatedProgressbar" }, | ||
143 | { WIXSTDBA_CONTROL_OVERALL_PROGRESS_TEXT, L"OverallProgressText" }, | ||
144 | { WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, L"ProgressCancelButton" }, | ||
145 | |||
146 | { WIXSTDBA_CONTROL_LAUNCH_BUTTON, L"LaunchButton" }, | ||
147 | { WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON, L"SuccessRestartButton" }, | ||
148 | |||
149 | { WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK, L"FailureLogFileLink" }, | ||
150 | { WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, L"FailureMessageText" }, | ||
151 | { WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, L"FailureRestartButton" }, | ||
152 | }; | 124 | }; |
153 | 125 | ||
154 | typedef struct _WIXSTDBA_PACKAGE_INFO | 126 | typedef struct _WIXSTDBA_PACKAGE_INFO |
@@ -589,7 +561,7 @@ public: // IBootstrapperApplication | |||
589 | 561 | ||
590 | wz = sczFormattedString ? sczFormattedString : L"Pausing Windows automatic updates"; | 562 | wz = sczFormattedString ? sczFormattedString : L"Pausing Windows automatic updates"; |
591 | 563 | ||
592 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz); | 564 | ThemeSetTextControl(m_pControlOverallProgressPackageText, wz); |
593 | 565 | ||
594 | ReleaseStr(sczFormattedString); | 566 | ReleaseStr(sczFormattedString); |
595 | return hr; | 567 | return hr; |
@@ -615,7 +587,7 @@ public: // IBootstrapperApplication | |||
615 | 587 | ||
616 | wz = sczFormattedString ? sczFormattedString : L"Creating system restore point"; | 588 | wz = sczFormattedString ? sczFormattedString : L"Creating system restore point"; |
617 | 589 | ||
618 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz); | 590 | ThemeSetTextControl(m_pControlOverallProgressPackageText, wz); |
619 | 591 | ||
620 | ReleaseStr(sczFormattedString); | 592 | ReleaseStr(sczFormattedString); |
621 | return hr; | 593 | return hr; |
@@ -635,12 +607,12 @@ public: // IBootstrapperApplication | |||
635 | HRESULT hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); | 607 | HRESULT hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); |
636 | LPCWSTR wz = (SUCCEEDED(hr) && pPackage->sczDisplayName) ? pPackage->sczDisplayName : wzPackageId; | 608 | LPCWSTR wz = (SUCCEEDED(hr) && pPackage->sczDisplayName) ? pPackage->sczDisplayName : wzPackageId; |
637 | 609 | ||
638 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, wz); | 610 | ThemeSetTextControl(m_pControlCacheProgressPackageText, wz); |
639 | 611 | ||
640 | // If something started executing, leave it in the overall progress text. | 612 | // If something started executing, leave it in the overall progress text. |
641 | if (!m_fStartedExecution) | 613 | if (!m_fStartedExecution) |
642 | { | 614 | { |
643 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz); | 615 | ThemeSetTextControl(m_pControlOverallProgressPackageText, wz); |
644 | } | 616 | } |
645 | } | 617 | } |
646 | 618 | ||
@@ -778,7 +750,7 @@ public: // IBootstrapperApplication | |||
778 | ) | 750 | ) |
779 | { | 751 | { |
780 | UpdateCacheProgress(SUCCEEDED(hrStatus) ? 100 : 0); | 752 | UpdateCacheProgress(SUCCEEDED(hrStatus) ? 100 : 0); |
781 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, L""); | 753 | ThemeSetTextControl(m_pControlCacheProgressPackageText, L""); |
782 | SetState(WIXSTDBA_STATE_CACHED, S_OK); // we always return success here and let OnApplyComplete() deal with the error. | 754 | SetState(WIXSTDBA_STATE_CACHED, S_OK); // we always return success here and let OnApplyComplete() deal with the error. |
783 | return __super::OnCacheComplete(hrStatus); | 755 | return __super::OnCacheComplete(hrStatus); |
784 | } | 756 | } |
@@ -891,7 +863,7 @@ public: // IBootstrapperApplication | |||
891 | 863 | ||
892 | if (INSTALLMESSAGE_ACTIONSTART == messageType) | 864 | if (INSTALLMESSAGE_ACTIONSTART == messageType) |
893 | { | 865 | { |
894 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, wzMessage); | 866 | ThemeSetTextControl(m_pControlExecuteProgressActionDataText, wzMessage); |
895 | } | 867 | } |
896 | 868 | ||
897 | return __super::OnExecuteMsiMessage(wzPackageId, messageType, dwUIHint, wzMessage, cData, rgwzData, nRecommendation, pResult); | 869 | return __super::OnExecuteMsiMessage(wzPackageId, messageType, dwUIHint, wzMessage, cData, rgwzData, nRecommendation, pResult); |
@@ -911,9 +883,9 @@ public: // IBootstrapperApplication | |||
911 | #endif | 883 | #endif |
912 | 884 | ||
913 | ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallProgressPercentage); | 885 | ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallProgressPercentage); |
914 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_TEXT, wzProgress); | 886 | ThemeSetTextControl(m_pControlOverallProgressText, wzProgress); |
915 | 887 | ||
916 | ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_BAR, dwOverallProgressPercentage); | 888 | ThemeSetProgressControl(m_pControlOverallProgressbar, dwOverallProgressPercentage); |
917 | SetTaskbarButtonProgress(dwOverallProgressPercentage); | 889 | SetTaskbarButtonProgress(dwOverallProgressPercentage); |
918 | 890 | ||
919 | return __super::OnProgress(dwProgressPercentage, dwOverallProgressPercentage, pfCancel); | 891 | return __super::OnProgress(dwProgressPercentage, dwOverallProgressPercentage, pfCancel); |
@@ -972,8 +944,8 @@ public: // IBootstrapperApplication | |||
972 | 944 | ||
973 | fShowingInternalUiThisPackage = INSTALLUILEVEL_NONE != (INSTALLUILEVEL_NONE & uiLevel); | 945 | fShowingInternalUiThisPackage = INSTALLUILEVEL_NONE != (INSTALLUILEVEL_NONE & uiLevel); |
974 | 946 | ||
975 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, wz); | 947 | ThemeSetTextControl(m_pControlExecuteProgressPackageText, wz); |
976 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz); | 948 | ThemeSetTextControl(m_pControlOverallProgressPackageText, wz); |
977 | } | 949 | } |
978 | 950 | ||
979 | ::EnterCriticalSection(&m_csShowingInternalUiThisPackage); | 951 | ::EnterCriticalSection(&m_csShowingInternalUiThisPackage); |
@@ -1000,12 +972,12 @@ public: // IBootstrapperApplication | |||
1000 | #endif | 972 | #endif |
1001 | 973 | ||
1002 | ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallProgressPercentage); | 974 | ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallProgressPercentage); |
1003 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_TEXT, wzProgress); | 975 | ThemeSetTextControl(m_pControlExecuteProgressText, wzProgress); |
1004 | 976 | ||
1005 | ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_BAR, dwOverallProgressPercentage); | 977 | ThemeSetProgressControl(m_pControlExecuteProgressbar, dwOverallProgressPercentage); |
1006 | 978 | ||
1007 | m_dwCalculatedExecuteProgress = dwOverallProgressPercentage * (100 - WIXSTDBA_ACQUIRE_PERCENTAGE) / 100; | 979 | m_dwCalculatedExecuteProgress = dwOverallProgressPercentage * (100 - WIXSTDBA_ACQUIRE_PERCENTAGE) / 100; |
1008 | ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); | 980 | ThemeSetProgressControl(m_pControlOverallCalculatedProgressbar, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); |
1009 | 981 | ||
1010 | SetTaskbarButtonProgress(m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); | 982 | SetTaskbarButtonProgress(m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); |
1011 | 983 | ||
@@ -1051,10 +1023,10 @@ public: // IBootstrapperApplication | |||
1051 | { | 1023 | { |
1052 | HRESULT hr = S_OK; | 1024 | HRESULT hr = S_OK; |
1053 | 1025 | ||
1054 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, L""); | 1026 | ThemeSetTextControl(m_pControlExecuteProgressPackageText, L""); |
1055 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, L""); | 1027 | ThemeSetTextControl(m_pControlExecuteProgressActionDataText, L""); |
1056 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, L""); | 1028 | ThemeSetTextControl(m_pControlOverallProgressPackageText, L""); |
1057 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, FALSE); // no more cancel. | 1029 | ThemeControlEnable(m_pControlProgressCancelButton, FALSE); // no more cancel. |
1058 | m_fShowingInternalUiThisPackage = FALSE; | 1030 | m_fShowingInternalUiThisPackage = FALSE; |
1059 | 1031 | ||
1060 | SetState(WIXSTDBA_STATE_EXECUTED, S_OK); // we always return success here and let OnApplyComplete() deal with the error. | 1032 | SetState(WIXSTDBA_STATE_EXECUTED, S_OK); // we always return success here and let OnApplyComplete() deal with the error. |
@@ -2933,12 +2905,27 @@ private: | |||
2933 | BA_FUNCTIONS_ONTHEMECONTROLLOADING_ARGS themeControlLoadingArgs = { }; | 2905 | BA_FUNCTIONS_ONTHEMECONTROLLOADING_ARGS themeControlLoadingArgs = { }; |
2934 | BA_FUNCTIONS_ONTHEMECONTROLLOADING_RESULTS themeControlLoadingResults = { }; | 2906 | BA_FUNCTIONS_ONTHEMECONTROLLOADING_RESULTS themeControlLoadingResults = { }; |
2935 | 2907 | ||
2936 | for (DWORD iAssignControl = 0; iAssignControl < countof(vrgInitControls); ++iAssignControl) | 2908 | for (DWORD iAssignControl = 0; iAssignControl < countof(m_rgInitControls); ++iAssignControl) |
2937 | { | 2909 | { |
2938 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, pArgs->pThemeControl->sczName, -1, vrgInitControls[iAssignControl].wzName, -1)) | 2910 | THEME_ASSIGN_CONTROL_ID* pAssignControl = m_rgInitControls + iAssignControl; |
2911 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, pArgs->pThemeControl->sczName, -1, pAssignControl->wzName, -1)) | ||
2939 | { | 2912 | { |
2913 | if (!pAssignControl->ppControl) | ||
2914 | { | ||
2915 | BalExitWithRootFailure(hr, E_INVALIDSTATE, "Control '%ls' has no member variable", pAssignControl->wzName); | ||
2916 | } | ||
2917 | |||
2918 | if (*pAssignControl->ppControl) | ||
2919 | { | ||
2920 | BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Duplicate control name: %ls", pAssignControl->wzName); | ||
2921 | } | ||
2922 | else | ||
2923 | { | ||
2924 | *pAssignControl->ppControl = pArgs->pThemeControl; | ||
2925 | } | ||
2926 | |||
2940 | fProcessed = TRUE; | 2927 | fProcessed = TRUE; |
2941 | pResults->wId = vrgInitControls[iAssignControl].wId; | 2928 | pResults->wId = pAssignControl->wId; |
2942 | ExitFunction(); | 2929 | ExitFunction(); |
2943 | } | 2930 | } |
2944 | } | 2931 | } |
@@ -3059,7 +3046,7 @@ private: | |||
3059 | hr = LocProbeForFile(sczLicenseDirectory, sczLicenseFilename, m_sczLanguage, &sczLicensePath); | 3046 | hr = LocProbeForFile(sczLicenseDirectory, sczLicenseFilename, m_sczLanguage, &sczLicensePath); |
3060 | ExitOnFailure(hr, "Failed to probe for localized license file."); | 3047 | ExitOnFailure(hr, "Failed to probe for localized license file."); |
3061 | 3048 | ||
3062 | hr = ThemeLoadRichEditFromFile(m_pTheme, pThemeControl->wId, sczLicensePath, m_hModule); | 3049 | hr = ThemeLoadRichEditFromFile(pThemeControl, sczLicensePath, m_hModule); |
3063 | ExitOnFailure(hr, "Failed to load license file into richedit control."); | 3050 | ExitOnFailure(hr, "Failed to load license file into richedit control."); |
3064 | 3051 | ||
3065 | LExit: | 3052 | LExit: |
@@ -3178,7 +3165,7 @@ private: | |||
3178 | hr = m_pEngine->Apply(m_hWnd); | 3165 | hr = m_pEngine->Apply(m_hWnd); |
3179 | BalExitOnFailure(hr, "Failed to start applying packages."); | 3166 | BalExitOnFailure(hr, "Failed to start applying packages."); |
3180 | 3167 | ||
3181 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, TRUE); // ensure the cancel button is enabled before starting. | 3168 | ThemeControlEnable(m_pControlProgressCancelButton, TRUE); // ensure the cancel button is enabled before starting. |
3182 | 3169 | ||
3183 | LExit: | 3170 | LExit: |
3184 | if (FAILED(hr)) | 3171 | if (FAILED(hr)) |
@@ -3229,22 +3216,22 @@ private: | |||
3229 | { | 3216 | { |
3230 | BalGetNumericVariable(WIXBUNDLE_VARIABLE_ELEVATED, &llElevated); | 3217 | BalGetNumericVariable(WIXBUNDLE_VARIABLE_ELEVATED, &llElevated); |
3231 | } | 3218 | } |
3232 | ThemeControlElevates(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, (m_Bundle.fPerMachine && !llElevated)); | 3219 | ThemeControlElevates(m_pControlInstallButton, (m_Bundle.fPerMachine && !llElevated)); |
3233 | 3220 | ||
3234 | // If the EULA control exists, show it only if a license URL is provided as well. | 3221 | // If the EULA control exists, show it only if a license URL is provided as well. |
3235 | if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK)) | 3222 | if (m_pControlEulaHyperlink) |
3236 | { | 3223 | { |
3237 | BOOL fEulaLink = (m_sczLicenseUrl && *m_sczLicenseUrl); | 3224 | BOOL fEulaLink = (m_sczLicenseUrl && *m_sczLicenseUrl); |
3238 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK, fEulaLink); | 3225 | ThemeControlEnable(m_pControlEulaHyperlink, fEulaLink); |
3239 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX, fEulaLink); | 3226 | ThemeControlEnable(m_pControlEulaAcceptCheckbox, fEulaLink); |
3240 | } | 3227 | } |
3241 | 3228 | ||
3242 | BOOL fAcceptedLicense = !ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || !ThemeControlEnabled(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX); | 3229 | BOOL fAcceptedLicense = !m_pControlEulaAcceptCheckbox || !ThemeControlEnabled(m_pControlEulaAcceptCheckbox) || ThemeIsControlChecked(m_pControlEulaAcceptCheckbox); |
3243 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense); | 3230 | ThemeControlEnable(m_pControlInstallButton, fAcceptedLicense); |
3244 | } | 3231 | } |
3245 | else if (m_rgdwPageIds[WIXSTDBA_PAGE_MODIFY] == dwNewPageId) | 3232 | else if (m_rgdwPageIds[WIXSTDBA_PAGE_MODIFY] == dwNewPageId) |
3246 | { | 3233 | { |
3247 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_REPAIR_BUTTON, !m_fSuppressRepair); | 3234 | ThemeControlEnable(m_pControlRepairButton, !m_fSuppressRepair); |
3248 | } | 3235 | } |
3249 | else if (m_rgdwPageIds[WIXSTDBA_PAGE_SUCCESS] == dwNewPageId) // on the "Success" page, check if the restart or launch button should be enabled. | 3236 | else if (m_rgdwPageIds[WIXSTDBA_PAGE_SUCCESS] == dwNewPageId) // on the "Success" page, check if the restart or launch button should be enabled. |
3250 | { | 3237 | { |
@@ -3257,13 +3244,13 @@ private: | |||
3257 | fEnableRestartButton = TRUE; | 3244 | fEnableRestartButton = TRUE; |
3258 | } | 3245 | } |
3259 | } | 3246 | } |
3260 | else if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_LAUNCH_BUTTON)) | 3247 | else if (m_pControlLaunchButton) |
3261 | { | 3248 | { |
3262 | fLaunchTargetExists = BalVariableExists(WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH); | 3249 | fLaunchTargetExists = BalVariableExists(WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH); |
3263 | } | 3250 | } |
3264 | 3251 | ||
3265 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_LAUNCH_BUTTON, fLaunchTargetExists && BOOTSTRAPPER_ACTION_UNINSTALL < m_plannedAction); | 3252 | ThemeControlEnable(m_pControlLaunchButton, fLaunchTargetExists && BOOTSTRAPPER_ACTION_UNINSTALL < m_plannedAction); |
3266 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON, fEnableRestartButton); | 3253 | ThemeControlEnable(m_pControlSuccessRestartButton, fEnableRestartButton); |
3267 | } | 3254 | } |
3268 | else if (m_rgdwPageIds[WIXSTDBA_PAGE_FAILURE] == dwNewPageId) // on the "Failure" page, show error message and check if the restart button should be enabled. | 3255 | else if (m_rgdwPageIds[WIXSTDBA_PAGE_FAILURE] == dwNewPageId) // on the "Failure" page, show error message and check if the restart button should be enabled. |
3269 | { | 3256 | { |
@@ -3347,7 +3334,7 @@ private: | |||
3347 | StrAllocFormatted(&sczText, L"0x%08x - %ls", m_hrFinal, sczUnformattedText); | 3334 | StrAllocFormatted(&sczText, L"0x%08x - %ls", m_hrFinal, sczUnformattedText); |
3348 | } | 3335 | } |
3349 | 3336 | ||
3350 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, sczText); | 3337 | ThemeSetTextControl(m_pControlFailureMessageText, sczText); |
3351 | fShowErrorMessage = TRUE; | 3338 | fShowErrorMessage = TRUE; |
3352 | } | 3339 | } |
3353 | 3340 | ||
@@ -3359,9 +3346,9 @@ private: | |||
3359 | } | 3346 | } |
3360 | } | 3347 | } |
3361 | 3348 | ||
3362 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK, fShowLogLink); | 3349 | ThemeControlEnable(m_pControlFailureLogFileLink, fShowLogLink); |
3363 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, fShowErrorMessage); | 3350 | ThemeControlEnable(m_pControlFailureMessageText, fShowErrorMessage); |
3364 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, fEnableRestartButton); | 3351 | ThemeControlEnable(m_pControlFailureRestartButton, fEnableRestartButton); |
3365 | } | 3352 | } |
3366 | 3353 | ||
3367 | HRESULT hr = ThemeShowPage(m_pTheme, dwOldPageId, SW_HIDE); | 3354 | HRESULT hr = ThemeShowPage(m_pTheme, dwOldPageId, SW_HIDE); |
@@ -3379,7 +3366,7 @@ private: | |||
3379 | // On the install page set the focus to the install button or the next enabled control if install is disabled. | 3366 | // On the install page set the focus to the install button or the next enabled control if install is disabled. |
3380 | if (m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == dwNewPageId) | 3367 | if (m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == dwNewPageId) |
3381 | { | 3368 | { |
3382 | ThemeSetFocus(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON); | 3369 | ThemeSetFocus(m_pControlInstallButton); |
3383 | } | 3370 | } |
3384 | } | 3371 | } |
3385 | } | 3372 | } |
@@ -3423,7 +3410,7 @@ private: | |||
3423 | // If we canceled, disable cancel button since clicking it again is silly. | 3410 | // If we canceled, disable cancel button since clicking it again is silly. |
3424 | if (fClose) | 3411 | if (fClose) |
3425 | { | 3412 | { |
3426 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, FALSE); | 3413 | ThemeControlEnable(m_pControlProgressCancelButton, FALSE); |
3427 | } | 3414 | } |
3428 | 3415 | ||
3429 | fClose = FALSE; | 3416 | fClose = FALSE; |
@@ -3447,8 +3434,8 @@ private: | |||
3447 | // | 3434 | // |
3448 | void OnClickAcceptCheckbox() | 3435 | void OnClickAcceptCheckbox() |
3449 | { | 3436 | { |
3450 | BOOL fAcceptedLicense = ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX); | 3437 | BOOL fAcceptedLicense = ThemeIsControlChecked(m_pControlEulaAcceptCheckbox); |
3451 | ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense); | 3438 | ThemeControlEnable(m_pControlInstallButton, fAcceptedLicense); |
3452 | } | 3439 | } |
3453 | 3440 | ||
3454 | 3441 | ||
@@ -3954,12 +3941,12 @@ LExit: | |||
3954 | WCHAR wzProgress[5] = { }; | 3941 | WCHAR wzProgress[5] = { }; |
3955 | 3942 | ||
3956 | ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallPercentage); | 3943 | ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallPercentage); |
3957 | ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_TEXT, wzProgress); | 3944 | ThemeSetTextControl(m_pControlCacheProgressText, wzProgress); |
3958 | 3945 | ||
3959 | ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR, dwOverallPercentage); | 3946 | ThemeSetProgressControl(m_pControlCacheProgressbar, dwOverallPercentage); |
3960 | 3947 | ||
3961 | m_dwCalculatedCacheProgress = dwOverallPercentage * WIXSTDBA_ACQUIRE_PERCENTAGE / 100; | 3948 | m_dwCalculatedCacheProgress = dwOverallPercentage * WIXSTDBA_ACQUIRE_PERCENTAGE / 100; |
3962 | ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); | 3949 | ThemeSetProgressControl(m_pControlOverallCalculatedProgressbar, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); |
3963 | 3950 | ||
3964 | SetTaskbarButtonProgress(m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); | 3951 | SetTaskbarButtonProgress(m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); |
3965 | } | 3952 | } |
@@ -4088,6 +4075,8 @@ public: | |||
4088 | __in IBootstrapperEngine* pEngine | 4075 | __in IBootstrapperEngine* pEngine |
4089 | ) : CBalBaseBootstrapperApplication(pEngine, 3, 3000) | 4076 | ) : CBalBaseBootstrapperApplication(pEngine, 3, 3000) |
4090 | { | 4077 | { |
4078 | THEME_ASSIGN_CONTROL_ID* pAssignControl = NULL; | ||
4079 | |||
4091 | m_hModule = hModule; | 4080 | m_hModule = hModule; |
4092 | m_command = { }; | 4081 | m_command = { }; |
4093 | m_createArgs = { }; | 4082 | m_createArgs = { }; |
@@ -4141,6 +4130,148 @@ public: | |||
4141 | m_hBAFModule = NULL; | 4130 | m_hBAFModule = NULL; |
4142 | m_pfnBAFunctionsProc = NULL; | 4131 | m_pfnBAFunctionsProc = NULL; |
4143 | m_pvBAFunctionsProcContext = NULL; | 4132 | m_pvBAFunctionsProcContext = NULL; |
4133 | |||
4134 | C_ASSERT(0 == WIXSTDBA_CONTROL_INSTALL_BUTTON - WIXSTDBA_FIRST_ASSIGN_CONTROL_ID); | ||
4135 | pAssignControl = m_rgInitControls; | ||
4136 | |||
4137 | pAssignControl->wId = WIXSTDBA_CONTROL_INSTALL_BUTTON; | ||
4138 | pAssignControl->wzName = L"InstallButton"; | ||
4139 | pAssignControl->ppControl = &m_pControlInstallButton; | ||
4140 | m_pControlInstallButton = NULL; | ||
4141 | ++pAssignControl; | ||
4142 | |||
4143 | pAssignControl->wId = WIXSTDBA_CONTROL_EULA_RICHEDIT; | ||
4144 | pAssignControl->wzName = L"EulaRichedit"; | ||
4145 | pAssignControl->ppControl = &m_pControlEulaRichedit; | ||
4146 | m_pControlEulaRichedit = NULL; | ||
4147 | ++pAssignControl; | ||
4148 | |||
4149 | pAssignControl->wId = WIXSTDBA_CONTROL_EULA_LINK; | ||
4150 | pAssignControl->wzName = L"EulaHyperlink"; | ||
4151 | pAssignControl->ppControl = &m_pControlEulaHyperlink; | ||
4152 | m_pControlEulaHyperlink = NULL; | ||
4153 | ++pAssignControl; | ||
4154 | |||
4155 | pAssignControl->wId = WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX; | ||
4156 | pAssignControl->wzName = L"EulaAcceptCheckbox"; | ||
4157 | pAssignControl->ppControl = &m_pControlEulaAcceptCheckbox; | ||
4158 | m_pControlEulaAcceptCheckbox = NULL; | ||
4159 | ++pAssignControl; | ||
4160 | |||
4161 | pAssignControl->wId = WIXSTDBA_CONTROL_REPAIR_BUTTON; | ||
4162 | pAssignControl->wzName = L"RepairButton"; | ||
4163 | pAssignControl->ppControl = &m_pControlRepairButton; | ||
4164 | m_pControlRepairButton = NULL; | ||
4165 | ++pAssignControl; | ||
4166 | |||
4167 | pAssignControl->wId = WIXSTDBA_CONTROL_UNINSTALL_BUTTON; | ||
4168 | pAssignControl->wzName = L"UninstallButton"; | ||
4169 | pAssignControl->ppControl = &m_pControlUninstallButton; | ||
4170 | m_pControlUninstallButton = NULL; | ||
4171 | ++pAssignControl; | ||
4172 | |||
4173 | pAssignControl->wId = WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT; | ||
4174 | pAssignControl->wzName = L"CacheProgressPackageText"; | ||
4175 | pAssignControl->ppControl = &m_pControlCacheProgressPackageText; | ||
4176 | m_pControlCacheProgressPackageText = NULL; | ||
4177 | ++pAssignControl; | ||
4178 | |||
4179 | pAssignControl->wId = WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR; | ||
4180 | pAssignControl->wzName = L"CacheProgressbar"; | ||
4181 | pAssignControl->ppControl = &m_pControlCacheProgressbar; | ||
4182 | m_pControlCacheProgressbar = NULL; | ||
4183 | ++pAssignControl; | ||
4184 | |||
4185 | pAssignControl->wId = WIXSTDBA_CONTROL_CACHE_PROGRESS_TEXT; | ||
4186 | pAssignControl->wzName = L"CacheProgressText"; | ||
4187 | pAssignControl->ppControl = &m_pControlCacheProgressText; | ||
4188 | m_pControlCacheProgressText = NULL; | ||
4189 | ++pAssignControl; | ||
4190 | |||
4191 | pAssignControl->wId = WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT; | ||
4192 | pAssignControl->wzName = L"ExecuteProgressPackageText"; | ||
4193 | pAssignControl->ppControl = &m_pControlExecuteProgressPackageText; | ||
4194 | m_pControlExecuteProgressPackageText = NULL; | ||
4195 | ++pAssignControl; | ||
4196 | |||
4197 | pAssignControl->wId = WIXSTDBA_CONTROL_EXECUTE_PROGRESS_BAR; | ||
4198 | pAssignControl->wzName = L"ExecuteProgressbar"; | ||
4199 | pAssignControl->ppControl = &m_pControlExecuteProgressbar; | ||
4200 | m_pControlExecuteProgressbar = NULL; | ||
4201 | ++pAssignControl; | ||
4202 | |||
4203 | pAssignControl->wId = WIXSTDBA_CONTROL_EXECUTE_PROGRESS_TEXT; | ||
4204 | pAssignControl->wzName = L"ExecuteProgressText"; | ||
4205 | pAssignControl->ppControl = &m_pControlExecuteProgressText; | ||
4206 | m_pControlExecuteProgressText = NULL; | ||
4207 | ++pAssignControl; | ||
4208 | |||
4209 | pAssignControl->wId = WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT; | ||
4210 | pAssignControl->wzName = L"ExecuteProgressActionDataText"; | ||
4211 | pAssignControl->ppControl = &m_pControlExecuteProgressActionDataText; | ||
4212 | m_pControlExecuteProgressActionDataText = NULL; | ||
4213 | ++pAssignControl; | ||
4214 | |||
4215 | pAssignControl->wId = WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT; | ||
4216 | pAssignControl->wzName = L"OverallProgressPackageText"; | ||
4217 | pAssignControl->ppControl = &m_pControlOverallProgressPackageText; | ||
4218 | m_pControlOverallProgressPackageText = NULL; | ||
4219 | ++pAssignControl; | ||
4220 | |||
4221 | pAssignControl->wId = WIXSTDBA_CONTROL_OVERALL_PROGRESS_BAR; | ||
4222 | pAssignControl->wzName = L"OverallProgressbar"; | ||
4223 | pAssignControl->ppControl = &m_pControlOverallProgressbar; | ||
4224 | m_pControlOverallProgressbar = NULL; | ||
4225 | ++pAssignControl; | ||
4226 | |||
4227 | pAssignControl->wId = WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR; | ||
4228 | pAssignControl->wzName = L"OverallCalculatedProgressbar"; | ||
4229 | pAssignControl->ppControl = &m_pControlOverallCalculatedProgressbar; | ||
4230 | m_pControlOverallCalculatedProgressbar = NULL; | ||
4231 | ++pAssignControl; | ||
4232 | |||
4233 | pAssignControl->wId = WIXSTDBA_CONTROL_OVERALL_PROGRESS_TEXT; | ||
4234 | pAssignControl->wzName = L"OverallProgressText"; | ||
4235 | pAssignControl->ppControl = &m_pControlOverallProgressText; | ||
4236 | m_pControlOverallProgressText = NULL; | ||
4237 | ++pAssignControl; | ||
4238 | |||
4239 | pAssignControl->wId = WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON; | ||
4240 | pAssignControl->wzName = L"ProgressCancelButton"; | ||
4241 | pAssignControl->ppControl = &m_pControlProgressCancelButton; | ||
4242 | m_pControlProgressCancelButton = NULL; | ||
4243 | ++pAssignControl; | ||
4244 | |||
4245 | pAssignControl->wId = WIXSTDBA_CONTROL_LAUNCH_BUTTON; | ||
4246 | pAssignControl->wzName = L"LaunchButton"; | ||
4247 | pAssignControl->ppControl = &m_pControlLaunchButton; | ||
4248 | m_pControlLaunchButton = NULL; | ||
4249 | ++pAssignControl; | ||
4250 | |||
4251 | pAssignControl->wId = WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON; | ||
4252 | pAssignControl->wzName = L"SuccessRestartButton"; | ||
4253 | pAssignControl->ppControl = &m_pControlSuccessRestartButton; | ||
4254 | m_pControlSuccessRestartButton = NULL; | ||
4255 | ++pAssignControl; | ||
4256 | |||
4257 | pAssignControl->wId = WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK; | ||
4258 | pAssignControl->wzName = L"FailureLogFileLink"; | ||
4259 | pAssignControl->ppControl = &m_pControlFailureLogFileLink; | ||
4260 | m_pControlFailureLogFileLink = NULL; | ||
4261 | ++pAssignControl; | ||
4262 | |||
4263 | pAssignControl->wId = WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT; | ||
4264 | pAssignControl->wzName = L"FailureMessageText"; | ||
4265 | pAssignControl->ppControl = &m_pControlFailureMessageText; | ||
4266 | m_pControlFailureMessageText = NULL; | ||
4267 | ++pAssignControl; | ||
4268 | |||
4269 | pAssignControl->wId = WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON; | ||
4270 | pAssignControl->wzName = L"FailureRestartButton"; | ||
4271 | pAssignControl->ppControl = &m_pControlFailureRestartButton; | ||
4272 | m_pControlFailureRestartButton = NULL; | ||
4273 | |||
4274 | C_ASSERT(LAST_WIXSTDBA_CONTROL == WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON + 1); | ||
4144 | } | 4275 | } |
4145 | 4276 | ||
4146 | 4277 | ||
@@ -4201,11 +4332,48 @@ private: | |||
4201 | 4332 | ||
4202 | LPWSTR m_sczLanguage; | 4333 | LPWSTR m_sczLanguage; |
4203 | THEME* m_pTheme; | 4334 | THEME* m_pTheme; |
4335 | THEME_ASSIGN_CONTROL_ID m_rgInitControls[LAST_WIXSTDBA_CONTROL - WIXSTDBA_FIRST_ASSIGN_CONTROL_ID]; | ||
4204 | DWORD m_rgdwPageIds[countof(vrgwzPageNames)]; | 4336 | DWORD m_rgdwPageIds[countof(vrgwzPageNames)]; |
4205 | HANDLE m_hUiThread; | 4337 | HANDLE m_hUiThread; |
4206 | BOOL m_fRegistered; | 4338 | BOOL m_fRegistered; |
4207 | HWND m_hWnd; | 4339 | HWND m_hWnd; |
4208 | 4340 | ||
4341 | // Welcome page | ||
4342 | const THEME_CONTROL* m_pControlInstallButton; | ||
4343 | const THEME_CONTROL* m_pControlEulaRichedit; | ||
4344 | const THEME_CONTROL* m_pControlEulaHyperlink; | ||
4345 | const THEME_CONTROL* m_pControlEulaAcceptCheckbox; | ||
4346 | |||
4347 | // Modify page | ||
4348 | const THEME_CONTROL* m_pControlRepairButton; | ||
4349 | const THEME_CONTROL* m_pControlUninstallButton; | ||
4350 | |||
4351 | // Progress page | ||
4352 | const THEME_CONTROL* m_pControlCacheProgressPackageText; | ||
4353 | const THEME_CONTROL* m_pControlCacheProgressbar; | ||
4354 | const THEME_CONTROL* m_pControlCacheProgressText; | ||
4355 | |||
4356 | const THEME_CONTROL* m_pControlExecuteProgressPackageText; | ||
4357 | const THEME_CONTROL* m_pControlExecuteProgressbar; | ||
4358 | const THEME_CONTROL* m_pControlExecuteProgressText; | ||
4359 | const THEME_CONTROL* m_pControlExecuteProgressActionDataText; | ||
4360 | |||
4361 | const THEME_CONTROL* m_pControlOverallProgressPackageText; | ||
4362 | const THEME_CONTROL* m_pControlOverallProgressbar; | ||
4363 | const THEME_CONTROL* m_pControlOverallCalculatedProgressbar; | ||
4364 | const THEME_CONTROL* m_pControlOverallProgressText; | ||
4365 | |||
4366 | const THEME_CONTROL* m_pControlProgressCancelButton; | ||
4367 | |||
4368 | // Success page | ||
4369 | const THEME_CONTROL* m_pControlLaunchButton; | ||
4370 | const THEME_CONTROL* m_pControlSuccessRestartButton; | ||
4371 | |||
4372 | // Failure page | ||
4373 | const THEME_CONTROL* m_pControlFailureLogFileLink; | ||
4374 | const THEME_CONTROL* m_pControlFailureMessageText; | ||
4375 | const THEME_CONTROL* m_pControlFailureRestartButton; | ||
4376 | |||
4209 | WIXSTDBA_STATE m_state; | 4377 | WIXSTDBA_STATE m_state; |
4210 | HRESULT m_hrFinal; | 4378 | HRESULT m_hrFinal; |
4211 | 4379 | ||
diff --git a/src/ext/Bal/wixstdba/precomp.h b/src/ext/Bal/wixstdba/precomp.h index 547183bd..ba56ae6d 100644 --- a/src/ext/Bal/wixstdba/precomp.h +++ b/src/ext/Bal/wixstdba/precomp.h | |||
@@ -29,6 +29,7 @@ | |||
29 | #include "resrutil.h" | 29 | #include "resrutil.h" |
30 | #include "shelutil.h" | 30 | #include "shelutil.h" |
31 | #include "strutil.h" | 31 | #include "strutil.h" |
32 | #include "wndutil.h" | ||
32 | #include "thmutil.h" | 33 | #include "thmutil.h" |
33 | #include "verutil.h" | 34 | #include "verutil.h" |
34 | #include "uriutil.h" | 35 | #include "uriutil.h" |
diff --git a/src/libs/dutil/WixToolset.DUtil/dutil.vcxproj b/src/libs/dutil/WixToolset.DUtil/dutil.vcxproj index a02e638a..3ab8285f 100644 --- a/src/libs/dutil/WixToolset.DUtil/dutil.vcxproj +++ b/src/libs/dutil/WixToolset.DUtil/dutil.vcxproj | |||
@@ -107,6 +107,7 @@ | |||
107 | <ClCompile Include="userutil.cpp" /> | 107 | <ClCompile Include="userutil.cpp" /> |
108 | <ClCompile Include="verutil.cpp" /> | 108 | <ClCompile Include="verutil.cpp" /> |
109 | <ClCompile Include="wiutil.cpp" /> | 109 | <ClCompile Include="wiutil.cpp" /> |
110 | <ClCompile Include="wndutil.cpp" /> | ||
110 | <ClCompile Include="wuautil.cpp" /> | 111 | <ClCompile Include="wuautil.cpp" /> |
111 | <ClCompile Include="xmlutil.cpp" /> | 112 | <ClCompile Include="xmlutil.cpp" /> |
112 | </ItemGroup> | 113 | </ItemGroup> |
@@ -164,6 +165,7 @@ | |||
164 | <ClInclude Include="inc\userutil.h" /> | 165 | <ClInclude Include="inc\userutil.h" /> |
165 | <ClInclude Include="inc\verutil.h" /> | 166 | <ClInclude Include="inc\verutil.h" /> |
166 | <ClInclude Include="inc\wiutil.h" /> | 167 | <ClInclude Include="inc\wiutil.h" /> |
168 | <ClInclude Include="inc\wndutil.h" /> | ||
167 | <ClInclude Include="inc\wuautil.h" /> | 169 | <ClInclude Include="inc\wuautil.h" /> |
168 | <ClInclude Include="inc\xmlutil.h" /> | 170 | <ClInclude Include="inc\xmlutil.h" /> |
169 | <ClInclude Include="precomp.h" /> | 171 | <ClInclude Include="precomp.h" /> |
diff --git a/src/libs/dutil/WixToolset.DUtil/dutil.vcxproj.filters b/src/libs/dutil/WixToolset.DUtil/dutil.vcxproj.filters index b93d166b..6444b19c 100644 --- a/src/libs/dutil/WixToolset.DUtil/dutil.vcxproj.filters +++ b/src/libs/dutil/WixToolset.DUtil/dutil.vcxproj.filters | |||
@@ -165,6 +165,9 @@ | |||
165 | <ClCompile Include="wiutil.cpp"> | 165 | <ClCompile Include="wiutil.cpp"> |
166 | <Filter>Source Files</Filter> | 166 | <Filter>Source Files</Filter> |
167 | </ClCompile> | 167 | </ClCompile> |
168 | <ClCompile Include="wndutil.cpp"> | ||
169 | <Filter>Source Files</Filter> | ||
170 | </ClCompile> | ||
168 | <ClCompile Include="xmlutil.cpp"> | 171 | <ClCompile Include="xmlutil.cpp"> |
169 | <Filter>Source Files</Filter> | 172 | <Filter>Source Files</Filter> |
170 | </ClCompile> | 173 | </ClCompile> |
@@ -338,6 +341,9 @@ | |||
338 | <ClInclude Include="inc\wiutil.h"> | 341 | <ClInclude Include="inc\wiutil.h"> |
339 | <Filter>Header Files</Filter> | 342 | <Filter>Header Files</Filter> |
340 | </ClInclude> | 343 | </ClInclude> |
344 | <ClInclude Include="inc\wndutil.h"> | ||
345 | <Filter>Header Files</Filter> | ||
346 | </ClInclude> | ||
341 | <ClInclude Include="inc\xmlutil.h"> | 347 | <ClInclude Include="inc\xmlutil.h"> |
342 | <Filter>Header Files</Filter> | 348 | <Filter>Header Files</Filter> |
343 | </ClInclude> | 349 | </ClInclude> |
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/dutilsources.h b/src/libs/dutil/WixToolset.DUtil/inc/dutilsources.h index 7d512cb3..6affb392 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/dutilsources.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/dutilsources.h | |||
@@ -61,6 +61,7 @@ typedef enum DUTIL_SOURCE | |||
61 | DUTIL_SOURCE_WUAUTIL, | 61 | DUTIL_SOURCE_WUAUTIL, |
62 | DUTIL_SOURCE_XMLUTIL, | 62 | DUTIL_SOURCE_XMLUTIL, |
63 | DUTIL_SOURCE_VERUTIL, | 63 | DUTIL_SOURCE_VERUTIL, |
64 | DUTIL_SOURCE_WNDUTIL, | ||
64 | 65 | ||
65 | DUTIL_SOURCE_EXTERNAL = 256, | 66 | DUTIL_SOURCE_EXTERNAL = 256, |
66 | } DUTIL_SOURCE; | 67 | } DUTIL_SOURCE; |
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h index cd286854..2f0bfeac 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h | |||
@@ -8,6 +8,7 @@ extern "C" { | |||
8 | 8 | ||
9 | // forward declare | 9 | // forward declare |
10 | 10 | ||
11 | typedef struct _THEME_CONTROL THEME_CONTROL; | ||
11 | typedef struct _THEME THEME; | 12 | typedef struct _THEME THEME; |
12 | 13 | ||
13 | #define ReleaseTheme(p) if (p) { ThemeFree(p); p = NULL; } | 14 | #define ReleaseTheme(p) if (p) { ThemeFree(p); p = NULL; } |
@@ -194,11 +195,12 @@ struct THEME_ASSIGN_CONTROL_ID | |||
194 | { | 195 | { |
195 | WORD wId; // id to apply to control | 196 | WORD wId; // id to apply to control |
196 | LPCWSTR wzName; // name of control to match | 197 | LPCWSTR wzName; // name of control to match |
198 | const THEME_CONTROL** ppControl; | ||
197 | }; | 199 | }; |
198 | 200 | ||
199 | const WORD THEME_FIRST_ASSIGN_CONTROL_ID = 0x4000; // Recommended first control id to be assigned. | 201 | const WORD THEME_FIRST_ASSIGN_CONTROL_ID = 0x4000; // Recommended first control id to be assigned. |
200 | 202 | ||
201 | struct THEME_CONTROL | 203 | typedef struct _THEME_CONTROL |
202 | { | 204 | { |
203 | THEME_CONTROL_TYPE type; | 205 | THEME_CONTROL_TYPE type; |
204 | 206 | ||
@@ -296,7 +298,7 @@ struct THEME_CONTROL | |||
296 | HWND hWnd; | 298 | HWND hWnd; |
297 | DWORD dwData; // type specific data | 299 | DWORD dwData; // type specific data |
298 | THEME* pTheme; | 300 | THEME* pTheme; |
299 | }; | 301 | } THEME_CONTROL; |
300 | 302 | ||
301 | 303 | ||
302 | struct THEME_IMAGELIST | 304 | struct THEME_IMAGELIST |
@@ -580,8 +582,7 @@ HRESULT DAPI ThemeLoadStrings( | |||
580 | 582 | ||
581 | *******************************************************************/ | 583 | *******************************************************************/ |
582 | HRESULT DAPI ThemeLoadRichEditFromFile( | 584 | HRESULT DAPI ThemeLoadRichEditFromFile( |
583 | __in THEME* pTheme, | 585 | __in const THEME_CONTROL* pThemeControl, |
584 | __in DWORD dwControl, | ||
585 | __in_z LPCWSTR wzFileName, | 586 | __in_z LPCWSTR wzFileName, |
586 | __in HMODULE hModule | 587 | __in HMODULE hModule |
587 | ); | 588 | ); |
@@ -591,19 +592,7 @@ HRESULT DAPI ThemeLoadRichEditFromFile( | |||
591 | 592 | ||
592 | *******************************************************************/ | 593 | *******************************************************************/ |
593 | HRESULT DAPI ThemeLoadRichEditFromResource( | 594 | HRESULT DAPI ThemeLoadRichEditFromResource( |
594 | __in THEME* pTheme, | 595 | __in const THEME_CONTROL* pThemeControl, |
595 | __in DWORD dwControl, | ||
596 | __in_z LPCSTR szResourceName, | ||
597 | __in HMODULE hModule | ||
598 | ); | ||
599 | |||
600 | /******************************************************************** | ||
601 | ThemeLoadRichEditFromResourceToHWnd - Attach a richedit control (by | ||
602 | HWND) to resource data. | ||
603 | |||
604 | *******************************************************************/ | ||
605 | HRESULT DAPI ThemeLoadRichEditFromResourceToHWnd( | ||
606 | __in HWND hWnd, | ||
607 | __in_z LPCSTR szResourceName, | 596 | __in_z LPCSTR szResourceName, |
608 | __in HMODULE hModule | 597 | __in HMODULE hModule |
609 | ); | 598 | ); |
@@ -682,18 +671,28 @@ ThemeShowChild - shows a control's specified child control, hiding the rest. | |||
682 | 671 | ||
683 | *******************************************************************/ | 672 | *******************************************************************/ |
684 | void DAPI ThemeShowChild( | 673 | void DAPI ThemeShowChild( |
685 | __in THEME* pTheme, | ||
686 | __in THEME_CONTROL* pParentControl, | 674 | __in THEME_CONTROL* pParentControl, |
687 | __in DWORD dwIndex | 675 | __in DWORD dwIndex |
688 | ); | 676 | ); |
689 | 677 | ||
690 | /******************************************************************** | 678 | /******************************************************************** |
691 | ThemeControlExists - check if a control with the specified id exists. | 679 | ThemeControlExistsByHwnd - check if a control with the specified hWnd exists. |
680 | |||
681 | *******************************************************************/ | ||
682 | BOOL DAPI ThemeControlExistsByHWnd( | ||
683 | __in const THEME* pTheme, | ||
684 | __in HWND hWnd, | ||
685 | __out_opt const THEME_CONTROL** ppThemeControl | ||
686 | ); | ||
687 | |||
688 | /******************************************************************** | ||
689 | ThemeControlExistsById - check if a control with the specified id exists. | ||
692 | 690 | ||
693 | *******************************************************************/ | 691 | *******************************************************************/ |
694 | BOOL DAPI ThemeControlExists( | 692 | BOOL DAPI ThemeControlExistsById( |
695 | __in const THEME* pTheme, | 693 | __in const THEME* pTheme, |
696 | __in DWORD dwControl | 694 | __in WORD wId, |
695 | __out_opt const THEME_CONTROL** ppThemeControl | ||
697 | ); | 696 | ); |
698 | 697 | ||
699 | /******************************************************************** | 698 | /******************************************************************** |
@@ -701,8 +700,7 @@ BOOL DAPI ThemeControlExists( | |||
701 | 700 | ||
702 | *******************************************************************/ | 701 | *******************************************************************/ |
703 | void DAPI ThemeControlEnable( | 702 | void DAPI ThemeControlEnable( |
704 | __in THEME* pTheme, | 703 | __in const THEME_CONTROL* pThemeControl, |
705 | __in DWORD dwControl, | ||
706 | __in BOOL fEnable | 704 | __in BOOL fEnable |
707 | ); | 705 | ); |
708 | 706 | ||
@@ -711,8 +709,7 @@ void DAPI ThemeControlEnable( | |||
711 | 709 | ||
712 | *******************************************************************/ | 710 | *******************************************************************/ |
713 | BOOL DAPI ThemeControlEnabled( | 711 | BOOL DAPI ThemeControlEnabled( |
714 | __in THEME* pTheme, | 712 | __in const THEME_CONTROL* pThemeControl |
715 | __in DWORD dwControl | ||
716 | ); | 713 | ); |
717 | 714 | ||
718 | /******************************************************************** | 715 | /******************************************************************** |
@@ -720,8 +717,7 @@ BOOL DAPI ThemeControlEnabled( | |||
720 | 717 | ||
721 | *******************************************************************/ | 718 | *******************************************************************/ |
722 | void DAPI ThemeControlElevates( | 719 | void DAPI ThemeControlElevates( |
723 | __in THEME* pTheme, | 720 | __in const THEME_CONTROL* pThemeControl, |
724 | __in DWORD dwControl, | ||
725 | __in BOOL fElevates | 721 | __in BOOL fElevates |
726 | ); | 722 | ); |
727 | 723 | ||
@@ -730,8 +726,7 @@ void DAPI ThemeControlElevates( | |||
730 | 726 | ||
731 | *******************************************************************/ | 727 | *******************************************************************/ |
732 | void DAPI ThemeShowControl( | 728 | void DAPI ThemeShowControl( |
733 | __in THEME* pTheme, | 729 | __in const THEME_CONTROL* pThemeControl, |
734 | __in DWORD dwControl, | ||
735 | __in int nCmdShow | 730 | __in int nCmdShow |
736 | ); | 731 | ); |
737 | 732 | ||
@@ -741,8 +736,7 @@ conditional text and notes. | |||
741 | 736 | ||
742 | *******************************************************************/ | 737 | *******************************************************************/ |
743 | void DAPI ThemeShowControlEx( | 738 | void DAPI ThemeShowControlEx( |
744 | __in THEME* pTheme, | 739 | __in const THEME_CONTROL* pThemeControl, |
745 | __in DWORD dwControl, | ||
746 | __in int nCmdShow | 740 | __in int nCmdShow |
747 | ); | 741 | ); |
748 | 742 | ||
@@ -751,24 +745,7 @@ void DAPI ThemeShowControlEx( | |||
751 | 745 | ||
752 | *******************************************************************/ | 746 | *******************************************************************/ |
753 | BOOL DAPI ThemeControlVisible( | 747 | BOOL DAPI ThemeControlVisible( |
754 | __in THEME* pTheme, | 748 | __in const THEME_CONTROL* pThemeControl |
755 | __in DWORD dwControl | ||
756 | ); | ||
757 | |||
758 | BOOL DAPI ThemePostControlMessage( | ||
759 | __in THEME* pTheme, | ||
760 | __in DWORD dwControl, | ||
761 | __in UINT Msg, | ||
762 | __in WPARAM wParam, | ||
763 | __in LPARAM lParam | ||
764 | ); | ||
765 | |||
766 | LRESULT DAPI ThemeSendControlMessage( | ||
767 | __in const THEME* pTheme, | ||
768 | __in DWORD dwControl, | ||
769 | __in UINT Msg, | ||
770 | __in WPARAM wParam, | ||
771 | __in LPARAM lParam | ||
772 | ); | 749 | ); |
773 | 750 | ||
774 | /******************************************************************** | 751 | /******************************************************************** |
@@ -790,34 +767,12 @@ HRESULT DAPI ThemeDrawControl( | |||
790 | ); | 767 | ); |
791 | 768 | ||
792 | /******************************************************************** | 769 | /******************************************************************** |
793 | ThemeHoverControl - mark a control as hover. | ||
794 | |||
795 | *******************************************************************/ | ||
796 | BOOL DAPI ThemeHoverControl( | ||
797 | __in THEME* pTheme, | ||
798 | __in HWND hwndParent, | ||
799 | __in HWND hwndControl | ||
800 | ); | ||
801 | |||
802 | /******************************************************************** | ||
803 | ThemeIsControlChecked - gets whether a control is checked. Only | 770 | ThemeIsControlChecked - gets whether a control is checked. Only |
804 | really useful for checkbox controls. | 771 | really useful for checkbox controls. |
805 | 772 | ||
806 | *******************************************************************/ | 773 | *******************************************************************/ |
807 | BOOL DAPI ThemeIsControlChecked( | 774 | BOOL DAPI ThemeIsControlChecked( |
808 | __in THEME* pTheme, | 775 | __in const THEME_CONTROL* pThemeControl |
809 | __in DWORD dwControl | ||
810 | ); | ||
811 | |||
812 | /******************************************************************** | ||
813 | ThemeSetControlColor - sets the color of text for a control. | ||
814 | |||
815 | *******************************************************************/ | ||
816 | BOOL DAPI ThemeSetControlColor( | ||
817 | __in THEME* pTheme, | ||
818 | __in HDC hdc, | ||
819 | __in HWND hWnd, | ||
820 | __out HBRUSH* phBackgroundBrush | ||
821 | ); | 776 | ); |
822 | 777 | ||
823 | /******************************************************************** | 778 | /******************************************************************** |
@@ -826,8 +781,7 @@ BOOL DAPI ThemeSetControlColor( | |||
826 | 781 | ||
827 | *******************************************************************/ | 782 | *******************************************************************/ |
828 | HRESULT DAPI ThemeSetProgressControl( | 783 | HRESULT DAPI ThemeSetProgressControl( |
829 | __in THEME* pTheme, | 784 | __in const THEME_CONTROL* pThemeControl, |
830 | __in DWORD dwControl, | ||
831 | __in DWORD dwProgressPercentage | 785 | __in DWORD dwProgressPercentage |
832 | ); | 786 | ); |
833 | 787 | ||
@@ -837,8 +791,7 @@ HRESULT DAPI ThemeSetProgressControl( | |||
837 | 791 | ||
838 | *******************************************************************/ | 792 | *******************************************************************/ |
839 | HRESULT DAPI ThemeSetProgressControlColor( | 793 | HRESULT DAPI ThemeSetProgressControlColor( |
840 | __in THEME* pTheme, | 794 | __in const THEME_CONTROL* pThemeControl, |
841 | __in DWORD dwControl, | ||
842 | __in DWORD dwColorIndex | 795 | __in DWORD dwColorIndex |
843 | ); | 796 | ); |
844 | 797 | ||
@@ -847,8 +800,7 @@ HRESULT DAPI ThemeSetProgressControlColor( | |||
847 | 800 | ||
848 | *******************************************************************/ | 801 | *******************************************************************/ |
849 | HRESULT DAPI ThemeSetTextControl( | 802 | HRESULT DAPI ThemeSetTextControl( |
850 | __in const THEME* pTheme, | 803 | __in const THEME_CONTROL* pThemeControl, |
851 | __in DWORD dwControl, | ||
852 | __in_z_opt LPCWSTR wzText | 804 | __in_z_opt LPCWSTR wzText |
853 | ); | 805 | ); |
854 | 806 | ||
@@ -858,8 +810,7 @@ ThemeSetTextControl - sets the text of a control and optionally | |||
858 | 810 | ||
859 | *******************************************************************/ | 811 | *******************************************************************/ |
860 | HRESULT DAPI ThemeSetTextControlEx( | 812 | HRESULT DAPI ThemeSetTextControlEx( |
861 | __in const THEME* pTheme, | 813 | __in const THEME_CONTROL* pThemeControl, |
862 | __in DWORD dwControl, | ||
863 | __in BOOL fUpdate, | 814 | __in BOOL fUpdate, |
864 | __in_z_opt LPCWSTR wzText | 815 | __in_z_opt LPCWSTR wzText |
865 | ); | 816 | ); |
@@ -869,8 +820,7 @@ HRESULT DAPI ThemeSetTextControlEx( | |||
869 | 820 | ||
870 | *******************************************************************/ | 821 | *******************************************************************/ |
871 | HRESULT DAPI ThemeGetTextControl( | 822 | HRESULT DAPI ThemeGetTextControl( |
872 | __in const THEME* pTheme, | 823 | __in const THEME_CONTROL* pThemeControl, |
873 | __in DWORD dwControl, | ||
874 | __inout_z LPWSTR* psczText | 824 | __inout_z LPWSTR* psczText |
875 | ); | 825 | ); |
876 | 826 | ||
@@ -889,8 +839,7 @@ HRESULT DAPI ThemeUpdateCaption( | |||
889 | 839 | ||
890 | *******************************************************************/ | 840 | *******************************************************************/ |
891 | void DAPI ThemeSetFocus( | 841 | void DAPI ThemeSetFocus( |
892 | __in THEME* pTheme, | 842 | __in const THEME_CONTROL* pThemeControl |
893 | __in DWORD dwControl | ||
894 | ); | 843 | ); |
895 | 844 | ||
896 | #ifdef __cplusplus | 845 | #ifdef __cplusplus |
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/wndutil.h b/src/libs/dutil/WixToolset.DUtil/inc/wndutil.h new file mode 100644 index 00000000..8de77f6e --- /dev/null +++ b/src/libs/dutil/WixToolset.DUtil/inc/wndutil.h | |||
@@ -0,0 +1,41 @@ | |||
1 | #pragma once | ||
2 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
3 | |||
4 | |||
5 | #ifdef __cplusplus | ||
6 | extern "C" { | ||
7 | #endif | ||
8 | |||
9 | /******************************************************************** | ||
10 | WnduLoadRichEditFromFile - Attach a richedit control to a RTF file. | ||
11 | |||
12 | *******************************************************************/ | ||
13 | HRESULT DAPI WnduLoadRichEditFromFile( | ||
14 | __in HWND hWnd, | ||
15 | __in_z LPCWSTR wzFileName, | ||
16 | __in HMODULE hModule | ||
17 | ); | ||
18 | |||
19 | /******************************************************************** | ||
20 | WnduLoadRichEditFromResource - Attach a richedit control to resource data. | ||
21 | |||
22 | *******************************************************************/ | ||
23 | HRESULT DAPI WnduLoadRichEditFromResource( | ||
24 | __in HWND hWnd, | ||
25 | __in_z LPCSTR szResourceName, | ||
26 | __in HMODULE hModule | ||
27 | ); | ||
28 | |||
29 | /******************************************************************** | ||
30 | WnduGetControlText - gets the text of a control. | ||
31 | |||
32 | *******************************************************************/ | ||
33 | HRESULT DAPI WnduGetControlText( | ||
34 | __in HWND hWnd, | ||
35 | __inout_z LPWSTR* psczText | ||
36 | ); | ||
37 | |||
38 | #ifdef __cplusplus | ||
39 | } | ||
40 | #endif | ||
41 | |||
diff --git a/src/libs/dutil/WixToolset.DUtil/precomp.h b/src/libs/dutil/WixToolset.DUtil/precomp.h index 46d29f21..093c16a2 100644 --- a/src/libs/dutil/WixToolset.DUtil/precomp.h +++ b/src/libs/dutil/WixToolset.DUtil/precomp.h | |||
@@ -87,6 +87,7 @@ | |||
87 | #include "strutil.h" | 87 | #include "strutil.h" |
88 | #include "timeutil.h" | 88 | #include "timeutil.h" |
89 | #include "timeutil.h" | 89 | #include "timeutil.h" |
90 | #include "wndutil.h" | ||
90 | #include "thmutil.h" | 91 | #include "thmutil.h" |
91 | #include "uncutil.h" | 92 | #include "uncutil.h" |
92 | #include "uriutil.h" | 93 | #include "uriutil.h" |
diff --git a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp index e8c23b6c..9adc2ddd 100644 --- a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp | |||
@@ -44,7 +44,6 @@ const DWORD THEME_INVALID_ID = 0xFFFFFFFF; | |||
44 | const COLORREF THEME_INVISIBLE_COLORREF = 0xFFFFFFFF; | 44 | const COLORREF THEME_INVISIBLE_COLORREF = 0xFFFFFFFF; |
45 | const DWORD GROW_FONT_INSTANCES = 3; | 45 | const DWORD GROW_FONT_INSTANCES = 3; |
46 | const DWORD GROW_IMAGE_INSTANCES = 5; | 46 | const DWORD GROW_IMAGE_INSTANCES = 5; |
47 | const DWORD GROW_WINDOW_TEXT = 250; | ||
48 | 47 | ||
49 | static Gdiplus::GdiplusStartupInput vgsi; | 48 | static Gdiplus::GdiplusStartupInput vgsi; |
50 | static Gdiplus::GdiplusStartupOutput vgso = { }; | 49 | static Gdiplus::GdiplusStartupOutput vgso = { }; |
@@ -70,16 +69,29 @@ enum INTERNAL_CONTROL_STYLE | |||
70 | INTERNAL_CONTROL_STYLE_OWNER_DRAW = 0x0010, | 69 | INTERNAL_CONTROL_STYLE_OWNER_DRAW = 0x0010, |
71 | }; | 70 | }; |
72 | 71 | ||
73 | struct MEMBUFFER_FOR_RICHEDIT | ||
74 | { | ||
75 | BYTE* rgbData; | ||
76 | DWORD cbData; | ||
77 | 72 | ||
78 | DWORD iData; | 73 | // prototypes |
79 | }; | 74 | /******************************************************************** |
75 | ThemeHoverControl - mark a control as hover. | ||
76 | |||
77 | *******************************************************************/ | ||
78 | static BOOL ThemeHoverControl( | ||
79 | __in THEME* pTheme, | ||
80 | __in HWND hwndParent, | ||
81 | __in HWND hwndControl | ||
82 | ); | ||
80 | 83 | ||
84 | /******************************************************************** | ||
85 | ThemeSetControlColor - sets the color of text for a control. | ||
86 | |||
87 | *******************************************************************/ | ||
88 | static BOOL ThemeSetControlColor( | ||
89 | __in THEME* pTheme, | ||
90 | __in HDC hdc, | ||
91 | __in HWND hWnd, | ||
92 | __out HBRUSH* phBackgroundBrush | ||
93 | ); | ||
81 | 94 | ||
82 | // prototypes | ||
83 | static HRESULT RegisterWindowClasses( | 95 | static HRESULT RegisterWindowClasses( |
84 | __in_opt HMODULE hModule | 96 | __in_opt HMODULE hModule |
85 | ); | 97 | ); |
@@ -258,11 +270,11 @@ static HRESULT ParseNotes( | |||
258 | ); | 270 | ); |
259 | static HRESULT StopBillboard( | 271 | static HRESULT StopBillboard( |
260 | __in THEME* pTheme, | 272 | __in THEME* pTheme, |
261 | __in DWORD dwControl | 273 | __in THEME_CONTROL* pControl |
262 | ); | 274 | ); |
263 | static HRESULT StartBillboard( | 275 | static HRESULT StartBillboard( |
264 | __in THEME* pTheme, | 276 | __in THEME* pTheme, |
265 | __in DWORD dwControl | 277 | __in THEME_CONTROL* pControl |
266 | ); | 278 | ); |
267 | static HRESULT EnsureFontInstance( | 279 | static HRESULT EnsureFontInstance( |
268 | __in THEME* pTheme, | 280 | __in THEME* pTheme, |
@@ -290,7 +302,6 @@ static HRESULT LoadControls( | |||
290 | __in_opt THEME_CONTROL* pParentControl | 302 | __in_opt THEME_CONTROL* pParentControl |
291 | ); | 303 | ); |
292 | static HRESULT ShowControl( | 304 | static HRESULT ShowControl( |
293 | __in THEME* pTheme, | ||
294 | __in THEME_CONTROL* pControl, | 305 | __in THEME_CONTROL* pControl, |
295 | __in int nCmdShow, | 306 | __in int nCmdShow, |
296 | __in BOOL fSaveEditboxes, | 307 | __in BOOL fSaveEditboxes, |
@@ -376,18 +387,6 @@ static BOOL DrawHoverControl( | |||
376 | __in THEME* pTheme, | 387 | __in THEME* pTheme, |
377 | __in BOOL fHover | 388 | __in BOOL fHover |
378 | ); | 389 | ); |
379 | static DWORD CALLBACK RichEditStreamFromFileHandleCallback( | ||
380 | __in DWORD_PTR dwCookie, | ||
381 | __in_bcount(cb) LPBYTE pbBuff, | ||
382 | __in LONG cb, | ||
383 | __in LONG *pcb | ||
384 | ); | ||
385 | static DWORD CALLBACK RichEditStreamFromMemoryCallback( | ||
386 | __in DWORD_PTR dwCookie, | ||
387 | __in_bcount(cb) LPBYTE pbBuff, | ||
388 | __in LONG cb, | ||
389 | __in LONG *pcb | ||
390 | ); | ||
391 | static void FreeFontInstance( | 390 | static void FreeFontInstance( |
392 | __in THEME_FONT_INSTANCE* pFontInstance | 391 | __in THEME_FONT_INSTANCE* pFontInstance |
393 | ); | 392 | ); |
@@ -475,6 +474,11 @@ static BOOL OnWmNotify( | |||
475 | __in const THEME_CONTROL* pThemeControl, | 474 | __in const THEME_CONTROL* pThemeControl, |
476 | __inout LRESULT* plResult | 475 | __inout LRESULT* plResult |
477 | ); | 476 | ); |
477 | static const THEME_CONTROL* FindControlFromId( | ||
478 | __in const THEME* pTheme, | ||
479 | __in WORD wId, | ||
480 | __in_opt const THEME_CONTROL* pParentControl = NULL | ||
481 | ); | ||
478 | static const THEME_CONTROL* FindControlFromHWnd( | 482 | static const THEME_CONTROL* FindControlFromHWnd( |
479 | __in const THEME* pTheme, | 483 | __in const THEME* pTheme, |
480 | __in HWND hWnd, | 484 | __in HWND hWnd, |
@@ -974,83 +978,39 @@ LExit: | |||
974 | 978 | ||
975 | 979 | ||
976 | DAPI_(HRESULT) ThemeLoadRichEditFromFile( | 980 | DAPI_(HRESULT) ThemeLoadRichEditFromFile( |
977 | __in THEME* pTheme, | 981 | __in const THEME_CONTROL* pThemeControl, |
978 | __in DWORD dwControl, | ||
979 | __in_z LPCWSTR wzFileName, | 982 | __in_z LPCWSTR wzFileName, |
980 | __in HMODULE hModule | 983 | __in HMODULE hModule |
981 | ) | 984 | ) |
982 | { | 985 | { |
983 | HRESULT hr = S_OK; | 986 | HRESULT hr = E_INVALIDARG; |
984 | LPWSTR sczFile = NULL; | ||
985 | HANDLE hFile = INVALID_HANDLE_VALUE; | ||
986 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | ||
987 | |||
988 | hr = PathRelativeToModule(&sczFile, wzFileName, hModule); | ||
989 | ThmExitOnFailure(hr, "Failed to read resource data."); | ||
990 | 987 | ||
991 | hFile = ::CreateFileW(sczFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); | 988 | if (pThemeControl) |
992 | if (INVALID_HANDLE_VALUE == hFile) | ||
993 | { | 989 | { |
994 | ThmExitWithLastError(hr, "Failed to open RTF file."); | 990 | AssertSz(THEME_CONTROL_TYPE_RICHEDIT == pThemeControl->type, "ThemeLoadRichEditFromFile called for non-RichEdit control."); |
995 | } | ||
996 | else | ||
997 | { | ||
998 | LONGLONG llRtfSize; | ||
999 | hr = FileSizeByHandle(hFile, &llRtfSize); | ||
1000 | if (SUCCEEDED(hr)) | ||
1001 | { | ||
1002 | ::SendMessageW(hWnd, EM_EXLIMITTEXT, 0, static_cast<LPARAM>(llRtfSize)); | ||
1003 | } | ||
1004 | |||
1005 | EDITSTREAM es = { }; | ||
1006 | es.pfnCallback = RichEditStreamFromFileHandleCallback; | ||
1007 | es.dwCookie = reinterpret_cast<DWORD_PTR>(hFile); | ||
1008 | 991 | ||
1009 | ::SendMessageW(hWnd, EM_STREAMIN, SF_RTF, reinterpret_cast<LPARAM>(&es)); | 992 | hr = WnduLoadRichEditFromFile(pThemeControl->hWnd, wzFileName, hModule); |
1010 | hr = es.dwError; | ||
1011 | ThmExitOnFailure(hr, "Failed to update RTF stream."); | ||
1012 | } | 993 | } |
1013 | 994 | ||
1014 | LExit: | ||
1015 | ReleaseStr(sczFile); | ||
1016 | ReleaseFile(hFile); | ||
1017 | |||
1018 | return hr; | 995 | return hr; |
1019 | } | 996 | } |
1020 | 997 | ||
1021 | 998 | ||
1022 | DAPI_(HRESULT) ThemeLoadRichEditFromResource( | 999 | DAPI_(HRESULT) ThemeLoadRichEditFromResource( |
1023 | __in THEME* pTheme, | 1000 | __in const THEME_CONTROL* pThemeControl, |
1024 | __in DWORD dwControl, | ||
1025 | __in_z LPCSTR szResourceName, | ||
1026 | __in HMODULE hModule | ||
1027 | ) | ||
1028 | { | ||
1029 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | ||
1030 | return ThemeLoadRichEditFromResourceToHWnd(hWnd, szResourceName, hModule); | ||
1031 | } | ||
1032 | |||
1033 | DAPI_(HRESULT) ThemeLoadRichEditFromResourceToHWnd( | ||
1034 | __in HWND hWnd, | ||
1035 | __in_z LPCSTR szResourceName, | 1001 | __in_z LPCSTR szResourceName, |
1036 | __in HMODULE hModule | 1002 | __in HMODULE hModule |
1037 | ) | 1003 | ) |
1038 | { | 1004 | { |
1039 | HRESULT hr = S_OK; | 1005 | HRESULT hr = E_INVALIDARG; |
1040 | MEMBUFFER_FOR_RICHEDIT buffer = { }; | ||
1041 | EDITSTREAM es = { }; | ||
1042 | |||
1043 | hr = ResReadData(hModule, szResourceName, reinterpret_cast<LPVOID*>(&buffer.rgbData), &buffer.cbData); | ||
1044 | ThmExitOnFailure(hr, "Failed to read resource data."); | ||
1045 | 1006 | ||
1046 | es.pfnCallback = RichEditStreamFromMemoryCallback; | 1007 | if (pThemeControl) |
1047 | es.dwCookie = reinterpret_cast<DWORD_PTR>(&buffer); | 1008 | { |
1009 | AssertSz(THEME_CONTROL_TYPE_RICHEDIT == pThemeControl->type, "ThemeLoadRichEditFromResource called for non-RichEdit control."); | ||
1048 | 1010 | ||
1049 | ::SendMessageW(hWnd, EM_STREAMIN, SF_RTF, reinterpret_cast<LPARAM>(&es)); | 1011 | hr = WnduLoadRichEditFromResource(pThemeControl->hWnd, szResourceName, hModule); |
1050 | hr = es.dwError; | 1012 | } |
1051 | ThmExitOnFailure(hr, "Failed to update RTF stream."); | ||
1052 | 1013 | ||
1053 | LExit: | ||
1054 | return hr; | 1014 | return hr; |
1055 | } | 1015 | } |
1056 | 1016 | ||
@@ -1293,141 +1253,127 @@ LExit: | |||
1293 | } | 1253 | } |
1294 | 1254 | ||
1295 | 1255 | ||
1296 | DAPI_(BOOL) ThemeControlExists( | 1256 | DAPI_(BOOL) ThemeControlExistsByHWnd( |
1297 | __in const THEME* pTheme, | 1257 | __in const THEME* pTheme, |
1298 | __in DWORD dwControl | 1258 | __in HWND hWnd, |
1259 | __out_opt const THEME_CONTROL** ppThemeControl | ||
1299 | ) | 1260 | ) |
1300 | { | 1261 | { |
1301 | BOOL fExists = FALSE; | 1262 | const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, hWnd); |
1302 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1263 | |
1303 | if (hWnd) | 1264 | if (ppThemeControl) |
1304 | { | 1265 | { |
1305 | const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, hWnd); | 1266 | *ppThemeControl = pControl; |
1306 | fExists = (pControl && hWnd == pControl->hWnd); | ||
1307 | } | 1267 | } |
1308 | 1268 | ||
1309 | return fExists; | 1269 | return NULL != pControl; |
1270 | } | ||
1271 | |||
1272 | |||
1273 | DAPI_(BOOL) ThemeControlExistsById( | ||
1274 | __in const THEME* pTheme, | ||
1275 | __in WORD wId, | ||
1276 | __out_opt const THEME_CONTROL** ppThemeControl | ||
1277 | ) | ||
1278 | { | ||
1279 | const THEME_CONTROL* pControl = FindControlFromId(pTheme, wId); | ||
1280 | |||
1281 | if (ppThemeControl) | ||
1282 | { | ||
1283 | *ppThemeControl = pControl; | ||
1284 | } | ||
1285 | |||
1286 | return NULL != pControl; | ||
1310 | } | 1287 | } |
1311 | 1288 | ||
1312 | 1289 | ||
1313 | DAPI_(void) ThemeControlEnable( | 1290 | DAPI_(void) ThemeControlEnable( |
1314 | __in THEME* pTheme, | 1291 | __in const THEME_CONTROL* pThemeControl, |
1315 | __in DWORD dwControl, | ||
1316 | __in BOOL fEnable | 1292 | __in BOOL fEnable |
1317 | ) | 1293 | ) |
1318 | { | 1294 | { |
1319 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1295 | if (pThemeControl) |
1320 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(FindControlFromHWnd(pTheme, hWnd)); | ||
1321 | if (pControl) | ||
1322 | { | 1296 | { |
1297 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(pThemeControl); | ||
1323 | pControl->dwInternalStyle = fEnable ? (pControl->dwInternalStyle & ~INTERNAL_CONTROL_STYLE_DISABLED) : (pControl->dwInternalStyle | INTERNAL_CONTROL_STYLE_DISABLED); | 1298 | pControl->dwInternalStyle = fEnable ? (pControl->dwInternalStyle & ~INTERNAL_CONTROL_STYLE_DISABLED) : (pControl->dwInternalStyle | INTERNAL_CONTROL_STYLE_DISABLED); |
1324 | ::EnableWindow(hWnd, fEnable); | 1299 | ::EnableWindow(pControl->hWnd, fEnable); |
1325 | 1300 | ||
1326 | if (pControl->dwInternalStyle & INTERNAL_CONTROL_STYLE_HIDE_WHEN_DISABLED) | 1301 | if (pControl->dwInternalStyle & INTERNAL_CONTROL_STYLE_HIDE_WHEN_DISABLED) |
1327 | { | 1302 | { |
1328 | ::ShowWindow(hWnd, fEnable ? SW_SHOW : SW_HIDE); | 1303 | ::ShowWindow(pControl->hWnd, fEnable ? SW_SHOW : SW_HIDE); |
1329 | } | 1304 | } |
1330 | } | 1305 | } |
1331 | } | 1306 | } |
1332 | 1307 | ||
1333 | 1308 | ||
1334 | DAPI_(BOOL) ThemeControlEnabled( | 1309 | DAPI_(BOOL) ThemeControlEnabled( |
1335 | __in THEME* pTheme, | 1310 | __in const THEME_CONTROL* pThemeControl |
1336 | __in DWORD dwControl | ||
1337 | ) | 1311 | ) |
1338 | { | 1312 | { |
1339 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1313 | BOOL fEnabled = FALSE; |
1340 | const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, hWnd); | 1314 | |
1341 | return pControl && !(pControl->dwInternalStyle & INTERNAL_CONTROL_STYLE_DISABLED); | 1315 | if (pThemeControl) |
1316 | { | ||
1317 | fEnabled = !(pThemeControl->dwInternalStyle & INTERNAL_CONTROL_STYLE_DISABLED); | ||
1318 | } | ||
1319 | |||
1320 | return fEnabled; | ||
1342 | } | 1321 | } |
1343 | 1322 | ||
1344 | 1323 | ||
1345 | DAPI_(void) ThemeControlElevates( | 1324 | DAPI_(void) ThemeControlElevates( |
1346 | __in THEME* pTheme, | 1325 | __in const THEME_CONTROL* pThemeControl, |
1347 | __in DWORD dwControl, | ||
1348 | __in BOOL fElevates | 1326 | __in BOOL fElevates |
1349 | ) | 1327 | ) |
1350 | { | 1328 | { |
1351 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1329 | if (pThemeControl) |
1352 | ::SendMessageW(hWnd, BCM_SETSHIELD, 0, fElevates); | 1330 | { |
1331 | ::SendMessageW(pThemeControl->hWnd, BCM_SETSHIELD, 0, fElevates); | ||
1332 | } | ||
1353 | } | 1333 | } |
1354 | 1334 | ||
1355 | 1335 | ||
1356 | DAPI_(void) ThemeShowControl( | 1336 | DAPI_(void) ThemeShowControl( |
1357 | __in THEME* pTheme, | 1337 | __in const THEME_CONTROL* pThemeControl, |
1358 | __in DWORD dwControl, | ||
1359 | __in int nCmdShow | 1338 | __in int nCmdShow |
1360 | ) | 1339 | ) |
1361 | { | 1340 | { |
1362 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1341 | if (pThemeControl) |
1363 | ::ShowWindow(hWnd, nCmdShow); | ||
1364 | |||
1365 | // Save the control's visible state. | ||
1366 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(FindControlFromHWnd(pTheme, hWnd)); | ||
1367 | if (pControl) | ||
1368 | { | 1342 | { |
1343 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(pThemeControl); | ||
1344 | ::ShowWindow(pControl->hWnd, nCmdShow); | ||
1345 | |||
1346 | // Save the control's visible state. | ||
1369 | pControl->dwInternalStyle = (SW_HIDE == nCmdShow) ? (pControl->dwInternalStyle | INTERNAL_CONTROL_STYLE_HIDDEN) : (pControl->dwInternalStyle & ~INTERNAL_CONTROL_STYLE_HIDDEN); | 1347 | pControl->dwInternalStyle = (SW_HIDE == nCmdShow) ? (pControl->dwInternalStyle | INTERNAL_CONTROL_STYLE_HIDDEN) : (pControl->dwInternalStyle & ~INTERNAL_CONTROL_STYLE_HIDDEN); |
1370 | } | 1348 | } |
1371 | } | 1349 | } |
1372 | 1350 | ||
1373 | 1351 | ||
1374 | DAPI_(void) ThemeShowControlEx( | 1352 | DAPI_(void) ThemeShowControlEx( |
1375 | __in THEME* pTheme, | 1353 | __in const THEME_CONTROL* pThemeControl, |
1376 | __in DWORD dwControl, | ||
1377 | __in int nCmdShow | 1354 | __in int nCmdShow |
1378 | ) | 1355 | ) |
1379 | { | 1356 | { |
1380 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1357 | if (pThemeControl) |
1381 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(FindControlFromHWnd(pTheme, hWnd)); | ||
1382 | if (pControl) | ||
1383 | { | 1358 | { |
1384 | ShowControl(pTheme, pControl, nCmdShow, THEME_CONTROL_TYPE_EDITBOX == pControl->type, THEME_SHOW_PAGE_REASON_REFRESH, 0, NULL); | 1359 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(pThemeControl); |
1360 | ShowControl(pControl, nCmdShow, THEME_CONTROL_TYPE_EDITBOX == pControl->type, THEME_SHOW_PAGE_REASON_REFRESH, 0, NULL); | ||
1385 | } | 1361 | } |
1386 | } | 1362 | } |
1387 | 1363 | ||
1388 | 1364 | ||
1389 | DAPI_(BOOL) ThemeControlVisible( | 1365 | DAPI_(BOOL) ThemeControlVisible( |
1390 | __in THEME* pTheme, | 1366 | __in const THEME_CONTROL* pThemeControl |
1391 | __in DWORD dwControl | ||
1392 | ) | 1367 | ) |
1393 | { | 1368 | { |
1394 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1369 | BOOL fVisible = FALSE; |
1395 | return ::IsWindowVisible(hWnd); | ||
1396 | } | ||
1397 | |||
1398 | 1370 | ||
1399 | DAPI_(BOOL) ThemePostControlMessage( | 1371 | if (pThemeControl) |
1400 | __in THEME* pTheme, | ||
1401 | __in DWORD dwControl, | ||
1402 | __in UINT Msg, | ||
1403 | __in WPARAM wParam, | ||
1404 | __in LPARAM lParam | ||
1405 | ) | ||
1406 | { | ||
1407 | HRESULT hr = S_OK; | ||
1408 | UINT er = ERROR_SUCCESS; | ||
1409 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | ||
1410 | |||
1411 | if (!::PostMessageW(hWnd, Msg, wParam, lParam)) | ||
1412 | { | 1372 | { |
1413 | er = ::GetLastError(); | 1373 | fVisible = ::IsWindowVisible(pThemeControl->hWnd); |
1414 | hr = HRESULT_FROM_WIN32(er); | ||
1415 | } | 1374 | } |
1416 | 1375 | ||
1417 | return SUCCEEDED(hr); | 1376 | return fVisible; |
1418 | } | ||
1419 | |||
1420 | |||
1421 | DAPI_(LRESULT) ThemeSendControlMessage( | ||
1422 | __in const THEME* pTheme, | ||
1423 | __in DWORD dwControl, | ||
1424 | __in UINT Msg, | ||
1425 | __in WPARAM wParam, | ||
1426 | __in LPARAM lParam | ||
1427 | ) | ||
1428 | { | ||
1429 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | ||
1430 | return ::SendMessageW(hWnd, Msg, wParam, lParam); | ||
1431 | } | 1377 | } |
1432 | 1378 | ||
1433 | 1379 | ||
@@ -1453,9 +1399,15 @@ DAPI_(HRESULT) ThemeDrawControl( | |||
1453 | ) | 1399 | ) |
1454 | { | 1400 | { |
1455 | HRESULT hr = S_OK; | 1401 | HRESULT hr = S_OK; |
1456 | const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, pdis->hwndItem); | 1402 | const THEME_CONTROL* pControl = NULL; |
1403 | BOOL fExists = ThemeControlExistsByHWnd(pTheme, pdis->hwndItem, &pControl); | ||
1404 | |||
1405 | AssertSz(fExists, "Expected control window from owner draw window."); | ||
1406 | if (!fExists) | ||
1407 | { | ||
1408 | ExitFunction1(hr = E_INVALIDARG); | ||
1409 | } | ||
1457 | 1410 | ||
1458 | AssertSz(pControl, "Expected control window from owner draw window."); | ||
1459 | AssertSz(pControl->hWnd == pdis->hwndItem, "Expected control window to match owner draw window."); | 1411 | AssertSz(pControl->hWnd == pdis->hwndItem, "Expected control window to match owner draw window."); |
1460 | AssertSz(pControl->nWidth < 1 || pControl->nWidth == pdis->rcItem.right - pdis->rcItem.left, "Expected control window width to match owner draw window width."); | 1412 | AssertSz(pControl->nWidth < 1 || pControl->nWidth == pdis->rcItem.right - pdis->rcItem.left, "Expected control window width to match owner draw window width."); |
1461 | AssertSz(pControl->nHeight < 1 || pControl->nHeight == pdis->rcItem.bottom - pdis->rcItem.top, "Expected control window height to match owner draw window height."); | 1413 | AssertSz(pControl->nHeight < 1 || pControl->nHeight == pdis->rcItem.bottom - pdis->rcItem.top, "Expected control window height to match owner draw window height."); |
@@ -1492,7 +1444,7 @@ LExit: | |||
1492 | } | 1444 | } |
1493 | 1445 | ||
1494 | 1446 | ||
1495 | DAPI_(BOOL) ThemeHoverControl( | 1447 | static BOOL ThemeHoverControl( |
1496 | __in THEME* pTheme, | 1448 | __in THEME* pTheme, |
1497 | __in HWND hwndParent, | 1449 | __in HWND hwndParent, |
1498 | __in HWND hwndControl | 1450 | __in HWND hwndControl |
@@ -1519,16 +1471,21 @@ DAPI_(BOOL) ThemeHoverControl( | |||
1519 | 1471 | ||
1520 | 1472 | ||
1521 | DAPI_(BOOL) ThemeIsControlChecked( | 1473 | DAPI_(BOOL) ThemeIsControlChecked( |
1522 | __in THEME* pTheme, | 1474 | __in const THEME_CONTROL* pThemeControl |
1523 | __in DWORD dwControl | ||
1524 | ) | 1475 | ) |
1525 | { | 1476 | { |
1526 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1477 | BOOL fChecked = FALSE; |
1527 | return BST_CHECKED == ::SendMessageW(hWnd, BM_GETCHECK, 0, 0); | 1478 | |
1479 | if (pThemeControl) | ||
1480 | { | ||
1481 | fChecked = BST_CHECKED == ::SendMessageW(pThemeControl->hWnd, BM_GETCHECK, 0, 0); | ||
1482 | } | ||
1483 | |||
1484 | return fChecked; | ||
1528 | } | 1485 | } |
1529 | 1486 | ||
1530 | 1487 | ||
1531 | DAPI_(BOOL) ThemeSetControlColor( | 1488 | static BOOL ThemeSetControlColor( |
1532 | __in THEME* pTheme, | 1489 | __in THEME* pTheme, |
1533 | __in HDC hdc, | 1490 | __in HDC hdc, |
1534 | __in HWND hWnd, | 1491 | __in HWND hWnd, |
@@ -1537,6 +1494,7 @@ DAPI_(BOOL) ThemeSetControlColor( | |||
1537 | { | 1494 | { |
1538 | THEME_FONT* pFont = NULL; | 1495 | THEME_FONT* pFont = NULL; |
1539 | BOOL fHasBackground = FALSE; | 1496 | BOOL fHasBackground = FALSE; |
1497 | const THEME_CONTROL* pControl = NULL; | ||
1540 | 1498 | ||
1541 | *phBackgroundBrush = NULL; | 1499 | *phBackgroundBrush = NULL; |
1542 | 1500 | ||
@@ -1544,10 +1502,9 @@ DAPI_(BOOL) ThemeSetControlColor( | |||
1544 | { | 1502 | { |
1545 | pFont = (THEME_INVALID_ID == pTheme->dwFontId) ? NULL : pTheme->rgFonts + pTheme->dwFontId; | 1503 | pFont = (THEME_INVALID_ID == pTheme->dwFontId) ? NULL : pTheme->rgFonts + pTheme->dwFontId; |
1546 | } | 1504 | } |
1547 | else | 1505 | else if (ThemeControlExistsByHWnd(pTheme, hWnd, &pControl)) |
1548 | { | 1506 | { |
1549 | const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, hWnd); | 1507 | pFont = THEME_INVALID_ID == pControl->dwFontId ? NULL : pTheme->rgFonts + pControl->dwFontId; |
1550 | pFont = (!pControl || THEME_INVALID_ID == pControl->dwFontId) ? NULL : pTheme->rgFonts + pControl->dwFontId; | ||
1551 | } | 1508 | } |
1552 | 1509 | ||
1553 | if (pFont) | 1510 | if (pFont) |
@@ -1577,44 +1534,40 @@ DAPI_(BOOL) ThemeSetControlColor( | |||
1577 | 1534 | ||
1578 | 1535 | ||
1579 | DAPI_(HRESULT) ThemeSetProgressControl( | 1536 | DAPI_(HRESULT) ThemeSetProgressControl( |
1580 | __in THEME* pTheme, | 1537 | __in const THEME_CONTROL* pThemeControl, |
1581 | __in DWORD dwControl, | ||
1582 | __in DWORD dwProgressPercentage | 1538 | __in DWORD dwProgressPercentage |
1583 | ) | 1539 | ) |
1584 | { | 1540 | { |
1585 | HRESULT hr = E_NOTFOUND; | 1541 | HRESULT hr = E_INVALIDARG; |
1586 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | ||
1587 | 1542 | ||
1588 | if (hWnd) | 1543 | if (pThemeControl && THEME_CONTROL_TYPE_PROGRESSBAR == pThemeControl->type) |
1589 | { | 1544 | { |
1590 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(FindControlFromHWnd(pTheme, hWnd)); | 1545 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(pThemeControl); |
1591 | if (pControl && THEME_CONTROL_TYPE_PROGRESSBAR == pControl->type) | 1546 | |
1547 | DWORD dwCurrentProgress = LOWORD(pControl->dwData); | ||
1548 | |||
1549 | if (dwCurrentProgress != dwProgressPercentage) | ||
1592 | { | 1550 | { |
1593 | DWORD dwCurrentProgress = LOWORD(pControl->dwData); | 1551 | DWORD dwColor = HIWORD(pControl->dwData); |
1552 | pControl->dwData = MAKEDWORD(dwProgressPercentage, dwColor); | ||
1594 | 1553 | ||
1595 | if (dwCurrentProgress != dwProgressPercentage) | 1554 | if (pControl->dwInternalStyle & INTERNAL_CONTROL_STYLE_OWNER_DRAW) |
1596 | { | 1555 | { |
1597 | DWORD dwColor = HIWORD(pControl->dwData); | 1556 | if (!::InvalidateRect(pControl->hWnd, NULL, FALSE)) |
1598 | pControl->dwData = MAKEDWORD(dwProgressPercentage, dwColor); | ||
1599 | |||
1600 | if (pControl->dwInternalStyle & INTERNAL_CONTROL_STYLE_OWNER_DRAW) | ||
1601 | { | 1557 | { |
1602 | if (!::InvalidateRect(hWnd, NULL, FALSE)) | 1558 | ThmExitWithLastError(hr, "Failed to invalidate progress bar window."); |
1603 | { | ||
1604 | ThmExitWithLastError(hr, "Failed to invalidate progress bar window."); | ||
1605 | } | ||
1606 | } | ||
1607 | else | ||
1608 | { | ||
1609 | ::SendMessageW(hWnd, PBM_SETPOS, dwProgressPercentage, 0); | ||
1610 | } | 1559 | } |
1611 | |||
1612 | hr = S_OK; | ||
1613 | } | 1560 | } |
1614 | else | 1561 | else |
1615 | { | 1562 | { |
1616 | hr = S_FALSE; | 1563 | ::SendMessageW(pControl->hWnd, PBM_SETPOS, dwProgressPercentage, 0); |
1617 | } | 1564 | } |
1565 | |||
1566 | hr = S_OK; | ||
1567 | } | ||
1568 | else | ||
1569 | { | ||
1570 | hr = S_FALSE; | ||
1618 | } | 1571 | } |
1619 | } | 1572 | } |
1620 | 1573 | ||
@@ -1624,37 +1577,37 @@ LExit: | |||
1624 | 1577 | ||
1625 | 1578 | ||
1626 | DAPI_(HRESULT) ThemeSetProgressControlColor( | 1579 | DAPI_(HRESULT) ThemeSetProgressControlColor( |
1627 | __in THEME* pTheme, | 1580 | __in const THEME_CONTROL* pThemeControl, |
1628 | __in DWORD dwControl, | ||
1629 | __in DWORD dwColorIndex | 1581 | __in DWORD dwColorIndex |
1630 | ) | 1582 | ) |
1631 | { | 1583 | { |
1632 | HRESULT hr = S_FALSE; | 1584 | HRESULT hr = E_INVALIDARG; |
1633 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1585 | |
1634 | if (hWnd) | 1586 | // Only set color on owner draw progress bars. |
1587 | if (pThemeControl && THEME_CONTROL_TYPE_PROGRESSBAR == pThemeControl->type && (pThemeControl->dwInternalStyle & INTERNAL_CONTROL_STYLE_OWNER_DRAW)) | ||
1635 | { | 1588 | { |
1636 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(FindControlFromHWnd(pTheme, hWnd)); | 1589 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(pThemeControl); |
1637 | 1590 | ||
1638 | // Only set color on owner draw progress bars. | 1591 | if (pControl->ProgressBar.cImageRef <= dwColorIndex) |
1639 | if (pControl && (pControl->dwInternalStyle & INTERNAL_CONTROL_STYLE_OWNER_DRAW) && THEME_CONTROL_TYPE_PROGRESSBAR == pControl->type) | ||
1640 | { | 1592 | { |
1641 | if (pControl->ProgressBar.cImageRef <= dwColorIndex) | 1593 | ThmExitWithRootFailure(hr, E_INVALIDARG, "Invalid progress bar color index: %u", dwColorIndex); |
1642 | { | 1594 | } |
1643 | ThmExitWithRootFailure(hr, E_INVALIDARG, "Invalid progress bar color index: %u", dwColorIndex); | ||
1644 | } | ||
1645 | |||
1646 | if (HIWORD(pControl->dwData) != dwColorIndex) | ||
1647 | { | ||
1648 | DWORD dwCurrentProgress = LOWORD(pControl->dwData); | ||
1649 | pControl->dwData = MAKEDWORD(dwCurrentProgress, dwColorIndex); | ||
1650 | 1595 | ||
1651 | if (!::InvalidateRect(hWnd, NULL, FALSE)) | 1596 | if (HIWORD(pControl->dwData) != dwColorIndex) |
1652 | { | 1597 | { |
1653 | ThmExitWithLastError(hr, "Failed to invalidate progress bar window."); | 1598 | DWORD dwCurrentProgress = LOWORD(pControl->dwData); |
1654 | } | 1599 | pControl->dwData = MAKEDWORD(dwCurrentProgress, dwColorIndex); |
1655 | 1600 | ||
1656 | hr = S_OK; | 1601 | if (!::InvalidateRect(pControl->hWnd, NULL, FALSE)) |
1602 | { | ||
1603 | ThmExitWithLastError(hr, "Failed to invalidate progress bar window."); | ||
1657 | } | 1604 | } |
1605 | |||
1606 | hr = S_OK; | ||
1607 | } | ||
1608 | else | ||
1609 | { | ||
1610 | hr = S_FALSE; | ||
1658 | } | 1611 | } |
1659 | } | 1612 | } |
1660 | 1613 | ||
@@ -1664,41 +1617,40 @@ LExit: | |||
1664 | 1617 | ||
1665 | 1618 | ||
1666 | DAPI_(HRESULT) ThemeSetTextControl( | 1619 | DAPI_(HRESULT) ThemeSetTextControl( |
1667 | __in const THEME* pTheme, | 1620 | __in const THEME_CONTROL* pThemeControl, |
1668 | __in DWORD dwControl, | ||
1669 | __in_z_opt LPCWSTR wzText | 1621 | __in_z_opt LPCWSTR wzText |
1670 | ) | 1622 | ) |
1671 | { | 1623 | { |
1672 | return ThemeSetTextControlEx(pTheme, dwControl, FALSE, wzText); | 1624 | return ThemeSetTextControlEx(pThemeControl, FALSE, wzText); |
1673 | } | 1625 | } |
1674 | 1626 | ||
1675 | 1627 | ||
1676 | DAPI_(HRESULT) ThemeSetTextControlEx( | 1628 | DAPI_(HRESULT) ThemeSetTextControlEx( |
1677 | __in const THEME* pTheme, | 1629 | __in const THEME_CONTROL* pThemeControl, |
1678 | __in DWORD dwControl, | ||
1679 | __in BOOL fUpdate, | 1630 | __in BOOL fUpdate, |
1680 | __in_z_opt LPCWSTR wzText | 1631 | __in_z_opt LPCWSTR wzText |
1681 | ) | 1632 | ) |
1682 | { | 1633 | { |
1683 | HRESULT hr = S_OK; | 1634 | HRESULT hr = E_INVALIDARG; |
1684 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | ||
1685 | 1635 | ||
1686 | if (hWnd) | 1636 | if (pThemeControl) |
1687 | { | 1637 | { |
1688 | if (fUpdate) | 1638 | if (fUpdate) |
1689 | { | 1639 | { |
1690 | ::ShowWindow(hWnd, SW_HIDE); | 1640 | ::ShowWindow(pThemeControl->hWnd, SW_HIDE); |
1691 | } | 1641 | } |
1692 | 1642 | ||
1693 | if (!::SetWindowTextW(hWnd, wzText)) | 1643 | if (!::SetWindowTextW(pThemeControl->hWnd, wzText)) |
1694 | { | 1644 | { |
1695 | ThmExitWithLastError(hr, "Failed to set control text."); | 1645 | ThmExitWithLastError(hr, "Failed to set control text."); |
1696 | } | 1646 | } |
1697 | 1647 | ||
1698 | if (fUpdate) | 1648 | if (fUpdate) |
1699 | { | 1649 | { |
1700 | ::ShowWindow(hWnd, SW_SHOW); | 1650 | ::ShowWindow(pThemeControl->hWnd, SW_SHOW); |
1701 | } | 1651 | } |
1652 | |||
1653 | hr = S_OK; | ||
1702 | } | 1654 | } |
1703 | 1655 | ||
1704 | LExit: | 1656 | LExit: |
@@ -1707,50 +1659,17 @@ LExit: | |||
1707 | 1659 | ||
1708 | 1660 | ||
1709 | DAPI_(HRESULT) ThemeGetTextControl( | 1661 | DAPI_(HRESULT) ThemeGetTextControl( |
1710 | __in const THEME* pTheme, | 1662 | __in const THEME_CONTROL* pThemeControl, |
1711 | __in DWORD dwControl, | ||
1712 | __inout_z LPWSTR* psczText | 1663 | __inout_z LPWSTR* psczText |
1713 | ) | 1664 | ) |
1714 | { | 1665 | { |
1715 | HRESULT hr = S_OK; | 1666 | HRESULT hr = E_INVALIDARG; |
1716 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | ||
1717 | SIZE_T cbSize = 0; | ||
1718 | DWORD cchText = 0; | ||
1719 | DWORD cchTextRead = 0; | ||
1720 | |||
1721 | // Ensure the string has room for at least one character. | ||
1722 | hr = StrMaxLength(*psczText, &cbSize); | ||
1723 | ThmExitOnFailure(hr, "Failed to get text buffer length."); | ||
1724 | 1667 | ||
1725 | cchText = (DWORD)min(DWORD_MAX, cbSize); | 1668 | if (pThemeControl) |
1726 | |||
1727 | if (!cchText) | ||
1728 | { | 1669 | { |
1729 | cchText = GROW_WINDOW_TEXT; | 1670 | hr = WnduGetControlText(pThemeControl->hWnd, psczText); |
1730 | |||
1731 | hr = StrAlloc(psczText, cchText); | ||
1732 | ThmExitOnFailure(hr, "Failed to grow text buffer."); | ||
1733 | } | 1671 | } |
1734 | 1672 | ||
1735 | // Read (and keep growing buffer) until we finally read less than there | ||
1736 | // is room in the buffer. | ||
1737 | for (;;) | ||
1738 | { | ||
1739 | cchTextRead = ::GetWindowTextW(hWnd, *psczText, cchText); | ||
1740 | if (cchTextRead + 1 < cchText) | ||
1741 | { | ||
1742 | break; | ||
1743 | } | ||
1744 | else | ||
1745 | { | ||
1746 | cchText = cchTextRead + GROW_WINDOW_TEXT; | ||
1747 | |||
1748 | hr = StrAlloc(psczText, cchText); | ||
1749 | ThmExitOnFailure(hr, "Failed to grow text buffer again."); | ||
1750 | } | ||
1751 | } | ||
1752 | |||
1753 | LExit: | ||
1754 | return hr; | 1673 | return hr; |
1755 | } | 1674 | } |
1756 | 1675 | ||
@@ -1771,25 +1690,26 @@ LExit: | |||
1771 | 1690 | ||
1772 | 1691 | ||
1773 | DAPI_(void) ThemeSetFocus( | 1692 | DAPI_(void) ThemeSetFocus( |
1774 | __in THEME* pTheme, | 1693 | __in const THEME_CONTROL* pThemeControl |
1775 | __in DWORD dwControl | ||
1776 | ) | 1694 | ) |
1777 | { | 1695 | { |
1778 | HWND hwndFocus = ::GetDlgItem(pTheme->hwndParent, dwControl); | 1696 | if (pThemeControl) |
1779 | if (hwndFocus && !ThemeControlEnabled(pTheme, dwControl)) | 1697 | { |
1780 | { | 1698 | HWND hwndFocus = pThemeControl->hWnd; |
1781 | hwndFocus = ::GetNextDlgTabItem(pTheme->hwndParent, hwndFocus, FALSE); | 1699 | if (hwndFocus && !ThemeControlEnabled(pThemeControl)) |
1782 | } | 1700 | { |
1701 | hwndFocus = ::GetNextDlgTabItem(pThemeControl->pTheme->hwndParent, hwndFocus, FALSE); | ||
1702 | } | ||
1783 | 1703 | ||
1784 | if (hwndFocus) | 1704 | if (hwndFocus) |
1785 | { | 1705 | { |
1786 | ::SetFocus(hwndFocus); | 1706 | ::SetFocus(hwndFocus); |
1707 | } | ||
1787 | } | 1708 | } |
1788 | } | 1709 | } |
1789 | 1710 | ||
1790 | 1711 | ||
1791 | DAPI_(void) ThemeShowChild( | 1712 | DAPI_(void) ThemeShowChild( |
1792 | __in THEME* pTheme, | ||
1793 | __in THEME_CONTROL* pParentControl, | 1713 | __in THEME_CONTROL* pParentControl, |
1794 | __in DWORD dwIndex | 1714 | __in DWORD dwIndex |
1795 | ) | 1715 | ) |
@@ -1798,7 +1718,7 @@ DAPI_(void) ThemeShowChild( | |||
1798 | for (DWORD i = 0; i < pParentControl->cControls; ++i) | 1718 | for (DWORD i = 0; i < pParentControl->cControls; ++i) |
1799 | { | 1719 | { |
1800 | THEME_CONTROL* pControl = pParentControl->rgControls + i; | 1720 | THEME_CONTROL* pControl = pParentControl->rgControls + i; |
1801 | ShowControl(pTheme, pControl, dwIndex == i ? SW_SHOW : SW_HIDE, FALSE, THEME_SHOW_PAGE_REASON_DEFAULT, 0, NULL); | 1721 | ShowControl(pControl, dwIndex == i ? SW_SHOW : SW_HIDE, FALSE, THEME_SHOW_PAGE_REASON_DEFAULT, 0, NULL); |
1802 | } | 1722 | } |
1803 | } | 1723 | } |
1804 | 1724 | ||
@@ -4322,28 +4242,24 @@ LExit: | |||
4322 | 4242 | ||
4323 | static HRESULT StartBillboard( | 4243 | static HRESULT StartBillboard( |
4324 | __in THEME* pTheme, | 4244 | __in THEME* pTheme, |
4325 | __in DWORD dwControl | 4245 | __in THEME_CONTROL* pControl |
4326 | ) | 4246 | ) |
4327 | { | 4247 | { |
4328 | HRESULT hr = E_NOTFOUND; | 4248 | HRESULT hr = E_NOTFOUND; |
4329 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 4249 | UINT_PTR idEvent = reinterpret_cast<UINT_PTR>(pControl); |
4330 | 4250 | ||
4331 | if (hWnd) | 4251 | if (THEME_CONTROL_TYPE_BILLBOARD == pControl->type) |
4332 | { | 4252 | { |
4333 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(FindControlFromHWnd(pTheme, hWnd)); | 4253 | // kick off |
4334 | if (pControl && THEME_CONTROL_TYPE_BILLBOARD == pControl->type) | 4254 | pControl->dwData = 0; |
4335 | { | 4255 | OnBillboardTimer(pTheme, pTheme->hwndParent, idEvent); |
4336 | // kick off | ||
4337 | pControl->dwData = 0; | ||
4338 | OnBillboardTimer(pTheme, pTheme->hwndParent, dwControl); | ||
4339 | 4256 | ||
4340 | if (!::SetTimer(pTheme->hwndParent, pControl->wId, pControl->wBillboardInterval, NULL)) | 4257 | if (!::SetTimer(pTheme->hwndParent, idEvent, pControl->wBillboardInterval, NULL)) |
4341 | { | 4258 | { |
4342 | ThmExitWithLastError(hr, "Failed to start billboard."); | 4259 | ThmExitWithLastError(hr, "Failed to start billboard."); |
4343 | } | ||
4344 | |||
4345 | hr = S_OK; | ||
4346 | } | 4260 | } |
4261 | |||
4262 | hr = S_OK; | ||
4347 | } | 4263 | } |
4348 | 4264 | ||
4349 | LExit: | 4265 | LExit: |
@@ -4353,23 +4269,19 @@ LExit: | |||
4353 | 4269 | ||
4354 | static HRESULT StopBillboard( | 4270 | static HRESULT StopBillboard( |
4355 | __in THEME* pTheme, | 4271 | __in THEME* pTheme, |
4356 | __in DWORD dwControl | 4272 | __in THEME_CONTROL* pControl |
4357 | ) | 4273 | ) |
4358 | { | 4274 | { |
4359 | HRESULT hr = E_NOTFOUND; | 4275 | HRESULT hr = E_NOTFOUND; |
4360 | HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); | 4276 | UINT_PTR idEvent = reinterpret_cast<UINT_PTR>(pControl); |
4361 | 4277 | ||
4362 | if (hWnd) | 4278 | if (THEME_CONTROL_TYPE_BILLBOARD == pControl->type) |
4363 | { | 4279 | { |
4364 | const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, hWnd); | 4280 | ThemeControlEnable(pControl, FALSE); |
4365 | if (pControl && THEME_CONTROL_TYPE_BILLBOARD == pControl->type) | ||
4366 | { | ||
4367 | ThemeControlEnable(pTheme, dwControl, FALSE); | ||
4368 | 4281 | ||
4369 | if (::KillTimer(pTheme->hwndParent, pControl->wId)) | 4282 | if (::KillTimer(pTheme->hwndParent, idEvent)) |
4370 | { | 4283 | { |
4371 | hr = S_OK; | 4284 | hr = S_OK; |
4372 | } | ||
4373 | } | 4285 | } |
4374 | } | 4286 | } |
4375 | 4287 | ||
@@ -5039,81 +4951,33 @@ static void FreeImageInstance( | |||
5039 | } | 4951 | } |
5040 | 4952 | ||
5041 | 4953 | ||
5042 | static DWORD CALLBACK RichEditStreamFromFileHandleCallback( | ||
5043 | __in DWORD_PTR dwCookie, | ||
5044 | __in_bcount(cb) LPBYTE pbBuff, | ||
5045 | __in LONG cb, | ||
5046 | __in LONG* pcb | ||
5047 | ) | ||
5048 | { | ||
5049 | HRESULT hr = S_OK; | ||
5050 | HANDLE hFile = reinterpret_cast<HANDLE>(dwCookie); | ||
5051 | |||
5052 | if (!::ReadFile(hFile, pbBuff, cb, reinterpret_cast<DWORD*>(pcb), NULL)) | ||
5053 | { | ||
5054 | ThmExitWithLastError(hr, "Failed to read file"); | ||
5055 | } | ||
5056 | |||
5057 | LExit: | ||
5058 | return hr; | ||
5059 | } | ||
5060 | |||
5061 | |||
5062 | static DWORD CALLBACK RichEditStreamFromMemoryCallback( | ||
5063 | __in DWORD_PTR dwCookie, | ||
5064 | __in_bcount(cb) LPBYTE pbBuff, | ||
5065 | __in LONG cb, | ||
5066 | __in LONG* pcb | ||
5067 | ) | ||
5068 | { | ||
5069 | HRESULT hr = S_OK; | ||
5070 | MEMBUFFER_FOR_RICHEDIT* pBuffer = reinterpret_cast<MEMBUFFER_FOR_RICHEDIT*>(dwCookie); | ||
5071 | DWORD cbCopy = 0; | ||
5072 | |||
5073 | if (pBuffer->iData < pBuffer->cbData) | ||
5074 | { | ||
5075 | cbCopy = min(static_cast<DWORD>(cb), pBuffer->cbData - pBuffer->iData); | ||
5076 | memcpy(pbBuff, pBuffer->rgbData + pBuffer->iData, cbCopy); | ||
5077 | |||
5078 | pBuffer->iData += cbCopy; | ||
5079 | Assert(pBuffer->iData <= pBuffer->cbData); | ||
5080 | } | ||
5081 | |||
5082 | *pcb = cbCopy; | ||
5083 | return hr; | ||
5084 | } | ||
5085 | |||
5086 | |||
5087 | static void CALLBACK OnBillboardTimer( | 4954 | static void CALLBACK OnBillboardTimer( |
5088 | __in THEME* pTheme, | 4955 | __in THEME* /*pTheme*/, |
5089 | __in HWND hwnd, | 4956 | __in HWND hwnd, |
5090 | __in UINT_PTR idEvent | 4957 | __in UINT_PTR idEvent |
5091 | ) | 4958 | ) |
5092 | { | 4959 | { |
5093 | HWND hwndControl = ::GetDlgItem(hwnd, static_cast<int>(idEvent)); | 4960 | THEME_CONTROL* pControl = reinterpret_cast<THEME_CONTROL*>(idEvent); |
5094 | if (hwndControl) | 4961 | |
4962 | if (pControl) | ||
5095 | { | 4963 | { |
5096 | THEME_CONTROL* pControl = const_cast<THEME_CONTROL*>(FindControlFromHWnd(pTheme, hwndControl)); | 4964 | AssertSz(THEME_CONTROL_TYPE_BILLBOARD == pControl->type, "Only billboard controls should get billboard timer messages."); |
5097 | AssertSz(pControl && THEME_CONTROL_TYPE_BILLBOARD == pControl->type, "Only billboard controls should get billboard timer messages."); | ||
5098 | 4965 | ||
5099 | if (pControl) | 4966 | if (pControl->dwData < pControl->cControls) |
5100 | { | 4967 | { |
5101 | if (pControl->dwData < pControl->cControls) | 4968 | ThemeShowChild(pControl, pControl->dwData); |
5102 | { | ||
5103 | ThemeShowChild(pTheme, pControl, pControl->dwData); | ||
5104 | } | ||
5105 | else if (pControl->fBillboardLoops) | ||
5106 | { | ||
5107 | pControl->dwData = 0; | ||
5108 | ThemeShowChild(pTheme, pControl, pControl->dwData); | ||
5109 | } | ||
5110 | else // no more looping | ||
5111 | { | ||
5112 | ::KillTimer(hwnd, idEvent); | ||
5113 | } | ||
5114 | |||
5115 | ++pControl->dwData; | ||
5116 | } | 4969 | } |
4970 | else if (pControl->fBillboardLoops) | ||
4971 | { | ||
4972 | pControl->dwData = 0; | ||
4973 | ThemeShowChild(pControl, pControl->dwData); | ||
4974 | } | ||
4975 | else // no more looping | ||
4976 | { | ||
4977 | ::KillTimer(hwnd, idEvent); | ||
4978 | } | ||
4979 | |||
4980 | ++pControl->dwData; | ||
5117 | } | 4981 | } |
5118 | } | 4982 | } |
5119 | 4983 | ||
@@ -5151,7 +5015,7 @@ static void OnBrowseDirectory( | |||
5151 | 5015 | ||
5152 | if (pTargetControl && THEME_CONTROL_TYPE_EDITBOX == pTargetControl->type && !pTargetControl->fDisableVariableFunctionality) | 5016 | if (pTargetControl && THEME_CONTROL_TYPE_EDITBOX == pTargetControl->type && !pTargetControl->fDisableVariableFunctionality) |
5153 | { | 5017 | { |
5154 | hr = ThemeSetTextControl(pTheme, pTargetControl->wId, wzPath); | 5018 | hr = ThemeSetTextControl(pTargetControl, wzPath); |
5155 | ThmExitOnFailure(hr, "Failed to set text on editbox: %ls", pTargetControl->sczName); | 5019 | ThmExitOnFailure(hr, "Failed to set text on editbox: %ls", pTargetControl->sczName); |
5156 | } | 5020 | } |
5157 | else if (pTheme->pfnSetStringVariable) | 5021 | else if (pTheme->pfnSetStringVariable) |
@@ -5161,7 +5025,7 @@ static void OnBrowseDirectory( | |||
5161 | } | 5025 | } |
5162 | else if (pTargetControl) | 5026 | else if (pTargetControl) |
5163 | { | 5027 | { |
5164 | hr = ThemeSetTextControl(pTheme, pTargetControl->wId, wzPath); | 5028 | hr = ThemeSetTextControl(pTargetControl, wzPath); |
5165 | ThmExitOnFailure(hr, "Failed to set text on control: %ls", pTargetControl->sczName); | 5029 | ThmExitOnFailure(hr, "Failed to set text on control: %ls", pTargetControl->sczName); |
5166 | } | 5030 | } |
5167 | 5031 | ||
@@ -5252,13 +5116,13 @@ static BOOL OnButtonClicked( | |||
5252 | case THEME_CONTROL_TYPE_CHECKBOX: | 5116 | case THEME_CONTROL_TYPE_CHECKBOX: |
5253 | if (pTheme->pfnSetNumericVariable && pControl->sczName && *pControl->sczName) | 5117 | if (pTheme->pfnSetNumericVariable && pControl->sczName && *pControl->sczName) |
5254 | { | 5118 | { |
5255 | BOOL fChecked = ThemeIsControlChecked(pTheme, pControl->wId); | 5119 | BOOL fChecked = ThemeIsControlChecked(pControl); |
5256 | pTheme->pfnSetNumericVariable(pControl->sczName, fChecked ? 1 : 0, pTheme->pvVariableContext); | 5120 | pTheme->pfnSetNumericVariable(pControl->sczName, fChecked ? 1 : 0, pTheme->pvVariableContext); |
5257 | fRefresh = TRUE; | 5121 | fRefresh = TRUE; |
5258 | } | 5122 | } |
5259 | break; | 5123 | break; |
5260 | case THEME_CONTROL_TYPE_RADIOBUTTON: | 5124 | case THEME_CONTROL_TYPE_RADIOBUTTON: |
5261 | if (pTheme->pfnSetStringVariable && pControl->sczVariable && *pControl->sczVariable && ThemeIsControlChecked(pTheme, pControl->wId)) | 5125 | if (pTheme->pfnSetStringVariable && pControl->sczVariable && *pControl->sczVariable && ThemeIsControlChecked(pControl)) |
5262 | { | 5126 | { |
5263 | pTheme->pfnSetStringVariable(pControl->sczVariable, pControl->sczValue, FALSE, pTheme->pvVariableContext); | 5127 | pTheme->pfnSetStringVariable(pControl->sczVariable, pControl->sczValue, FALSE, pTheme->pvVariableContext); |
5264 | fRefresh = TRUE; | 5128 | fRefresh = TRUE; |
@@ -5386,6 +5250,42 @@ LExit: | |||
5386 | return fProcessed; | 5250 | return fProcessed; |
5387 | } | 5251 | } |
5388 | 5252 | ||
5253 | static const THEME_CONTROL* FindControlFromId( | ||
5254 | __in const THEME* pTheme, | ||
5255 | __in WORD wId, | ||
5256 | __in_opt const THEME_CONTROL* pParentControl | ||
5257 | ) | ||
5258 | { | ||
5259 | DWORD cControls = 0; | ||
5260 | THEME_CONTROL* rgControls = NULL; | ||
5261 | const THEME_CONTROL* pChildControl = NULL; | ||
5262 | |||
5263 | GetControls(pTheme, pParentControl, cControls, rgControls); | ||
5264 | |||
5265 | // Breadth first search since control ids are technically only valid for direct child windows of a specific parent window. | ||
5266 | for (DWORD i = 0; i < cControls; ++i) | ||
5267 | { | ||
5268 | if (wId == rgControls[i].wId) | ||
5269 | { | ||
5270 | return rgControls + i; | ||
5271 | } | ||
5272 | } | ||
5273 | |||
5274 | for (DWORD i = 0; i < cControls; ++i) | ||
5275 | { | ||
5276 | if (0 < rgControls[i].cControls) | ||
5277 | { | ||
5278 | pChildControl = FindControlFromId(pTheme, wId, rgControls + i); | ||
5279 | if (pChildControl) | ||
5280 | { | ||
5281 | return pChildControl; | ||
5282 | } | ||
5283 | } | ||
5284 | } | ||
5285 | |||
5286 | return NULL; | ||
5287 | } | ||
5288 | |||
5389 | static BOOL OnNotifyEnMsgFilter( | 5289 | static BOOL OnNotifyEnMsgFilter( |
5390 | __in THEME* pTheme, | 5290 | __in THEME* pTheme, |
5391 | __in const THEME_CONTROL* pThemeControl, | 5291 | __in const THEME_CONTROL* pThemeControl, |
@@ -5638,7 +5538,6 @@ LExit: | |||
5638 | 5538 | ||
5639 | 5539 | ||
5640 | static HRESULT ShowControl( | 5540 | static HRESULT ShowControl( |
5641 | __in THEME* pTheme, | ||
5642 | __in THEME_CONTROL* pControl, | 5541 | __in THEME_CONTROL* pControl, |
5643 | __in int nCmdShow, | 5542 | __in int nCmdShow, |
5644 | __in BOOL fSaveEditboxes, | 5543 | __in BOOL fSaveEditboxes, |
@@ -5654,13 +5553,14 @@ static HRESULT ShowControl( | |||
5654 | LPWSTR sczText = NULL; | 5553 | LPWSTR sczText = NULL; |
5655 | THEME_SAVEDVARIABLE* pSavedVariable = NULL; | 5554 | THEME_SAVEDVARIABLE* pSavedVariable = NULL; |
5656 | BOOL fHide = SW_HIDE == nCmdShow; | 5555 | BOOL fHide = SW_HIDE == nCmdShow; |
5556 | THEME* pTheme = pControl->pTheme; | ||
5657 | THEME_PAGE* pPage = ThemeGetPage(pTheme, dwPageId); | 5557 | THEME_PAGE* pPage = ThemeGetPage(pTheme, dwPageId); |
5658 | 5558 | ||
5659 | // Save the editbox value if necessary (other control types save their values immediately). | 5559 | // Save the editbox value if necessary (other control types save their values immediately). |
5660 | if (pTheme->pfnSetStringVariable && !pControl->fDisableVariableFunctionality && | 5560 | if (pTheme->pfnSetStringVariable && !pControl->fDisableVariableFunctionality && |
5661 | fSaveEditboxes && THEME_CONTROL_TYPE_EDITBOX == pControl->type && pControl->sczName && *pControl->sczName) | 5561 | fSaveEditboxes && THEME_CONTROL_TYPE_EDITBOX == pControl->type && pControl->sczName && *pControl->sczName) |
5662 | { | 5562 | { |
5663 | hr = ThemeGetTextControl(pTheme, pControl->wId, &sczText); | 5563 | hr = ThemeGetTextControl(pControl, &sczText); |
5664 | ThmExitOnFailure(hr, "Failed to get the text for control: %ls", pControl->sczName); | 5564 | ThmExitOnFailure(hr, "Failed to get the text for control: %ls", pControl->sczName); |
5665 | 5565 | ||
5666 | hr = pTheme->pfnSetStringVariable(pControl->sczName, sczText, FALSE, pTheme->pvVariableContext); | 5566 | hr = pTheme->pfnSetStringVariable(pControl->sczName, sczText, FALSE, pTheme->pvVariableContext); |
@@ -5675,7 +5575,7 @@ static HRESULT ShowControl( | |||
5675 | 5575 | ||
5676 | if (THEME_CONTROL_TYPE_BILLBOARD == pControl->type) | 5576 | if (THEME_CONTROL_TYPE_BILLBOARD == pControl->type) |
5677 | { | 5577 | { |
5678 | StopBillboard(pTheme, pControl->wId); | 5578 | StopBillboard(pTheme, pControl); |
5679 | } | 5579 | } |
5680 | 5580 | ||
5681 | ExitFunction(); | 5581 | ExitFunction(); |
@@ -5767,7 +5667,7 @@ static HRESULT ShowControl( | |||
5767 | ReleaseNullStr(sczText); | 5667 | ReleaseNullStr(sczText); |
5768 | } | 5668 | } |
5769 | 5669 | ||
5770 | ThemeSetTextControl(pTheme, pControl->wId, sczText); | 5670 | ThemeSetTextControl(pControl, sczText); |
5771 | 5671 | ||
5772 | if (wzNote && *wzNote) | 5672 | if (wzNote && *wzNote) |
5773 | { | 5673 | { |
@@ -5811,7 +5711,7 @@ static HRESULT ShowControl( | |||
5811 | ++iPageControl; | 5711 | ++iPageControl; |
5812 | } | 5712 | } |
5813 | 5713 | ||
5814 | ThemeSendControlMessage(pTheme, pControl->wId, BM_SETCHECK, SUCCEEDED(hr) && llValue ? BST_CHECKED : BST_UNCHECKED, 0); | 5714 | ::SendMessageW(pControl->hWnd, BM_SETCHECK, SUCCEEDED(hr) && llValue ? BST_CHECKED : BST_UNCHECKED, 0); |
5815 | } | 5715 | } |
5816 | 5716 | ||
5817 | // If this is an editbox control, | 5717 | // If this is an editbox control, |
@@ -5838,7 +5738,7 @@ static HRESULT ShowControl( | |||
5838 | ++iPageControl; | 5738 | ++iPageControl; |
5839 | } | 5739 | } |
5840 | 5740 | ||
5841 | ThemeSetTextControl(pTheme, pControl->wId, sczText); | 5741 | ThemeSetTextControl(pControl, sczText); |
5842 | } | 5742 | } |
5843 | } | 5743 | } |
5844 | 5744 | ||
@@ -5901,11 +5801,11 @@ static HRESULT ShowControl( | |||
5901 | { | 5801 | { |
5902 | if (fEnabled) | 5802 | if (fEnabled) |
5903 | { | 5803 | { |
5904 | StartBillboard(pTheme, pControl->wId); | 5804 | StartBillboard(pTheme, pControl); |
5905 | } | 5805 | } |
5906 | else | 5806 | else |
5907 | { | 5807 | { |
5908 | StopBillboard(pTheme, pControl->wId); | 5808 | StopBillboard(pTheme, pControl); |
5909 | } | 5809 | } |
5910 | } | 5810 | } |
5911 | 5811 | ||
@@ -5944,7 +5844,7 @@ static HRESULT ShowControls( | |||
5944 | // Only look at non-page controls and the specified page's controls. | 5844 | // Only look at non-page controls and the specified page's controls. |
5945 | if (!pControl->wPageId || pControl->wPageId == dwPageId) | 5845 | if (!pControl->wPageId || pControl->wPageId == dwPageId) |
5946 | { | 5846 | { |
5947 | hr = ShowControl(pTheme, pControl, nCmdShow, fSaveEditboxes, reason, dwPageId, &hwndFocus); | 5847 | hr = ShowControl(pControl, nCmdShow, fSaveEditboxes, reason, dwPageId, &hwndFocus); |
5948 | ThmExitOnFailure(hr, "Failed to show control '%ls' at index %d.", pControl->sczName, i); | 5848 | ThmExitOnFailure(hr, "Failed to show control '%ls' at index %d.", pControl->sczName, i); |
5949 | } | 5849 | } |
5950 | } | 5850 | } |
@@ -6509,7 +6409,7 @@ static HRESULT LoadControls( | |||
6509 | HRESULT hrFormat = pTheme->pfnFormatString(pControl->sczText, &sczText, pTheme->pvVariableContext); | 6409 | HRESULT hrFormat = pTheme->pfnFormatString(pControl->sczText, &sczText, pTheme->pvVariableContext); |
6510 | if (SUCCEEDED(hrFormat)) | 6410 | if (SUCCEEDED(hrFormat)) |
6511 | { | 6411 | { |
6512 | ThemeSetTextControl(pTheme, pControl->wId, sczText); | 6412 | ThemeSetTextControl(pControl, sczText); |
6513 | } | 6413 | } |
6514 | } | 6414 | } |
6515 | 6415 | ||
diff --git a/src/libs/dutil/WixToolset.DUtil/wndutil.cpp b/src/libs/dutil/WixToolset.DUtil/wndutil.cpp new file mode 100644 index 00000000..b75b0491 --- /dev/null +++ b/src/libs/dutil/WixToolset.DUtil/wndutil.cpp | |||
@@ -0,0 +1,206 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | #include "precomp.h" | ||
4 | |||
5 | |||
6 | // Exit macros | ||
7 | #define WnduExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_WNDUTIL, x, s, __VA_ARGS__) | ||
8 | #define WnduExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_WNDUTIL, x, s, __VA_ARGS__) | ||
9 | #define WnduExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_WNDUTIL, x, s, __VA_ARGS__) | ||
10 | #define WnduExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_WNDUTIL, x, s, __VA_ARGS__) | ||
11 | #define WnduExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_WNDUTIL, x, s, __VA_ARGS__) | ||
12 | #define WnduExitWithRootFailure(x, e, s, ...) ExitWithRootFailureSource(DUTIL_SOURCE_WNDUTIL, x, e, s, __VA_ARGS__) | ||
13 | #define WnduExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_WNDUTIL, x, s, __VA_ARGS__) | ||
14 | #define WnduExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_WNDUTIL, p, x, e, s, __VA_ARGS__) | ||
15 | #define WnduExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_WNDUTIL, p, x, s, __VA_ARGS__) | ||
16 | #define WnduExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_WNDUTIL, p, x, e, s, __VA_ARGS__) | ||
17 | #define WnduExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_WNDUTIL, p, x, s, __VA_ARGS__) | ||
18 | #define WnduExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_WNDUTIL, e, x, s, __VA_ARGS__) | ||
19 | #define WnduExitOnOptionalXmlQueryFailure(x, b, s, ...) ExitOnOptionalXmlQueryFailureSource(DUTIL_SOURCE_WNDUTIL, x, b, s, __VA_ARGS__) | ||
20 | #define WnduExitOnRequiredXmlQueryFailure(x, s, ...) ExitOnRequiredXmlQueryFailureSource(DUTIL_SOURCE_WNDUTIL, x, s, __VA_ARGS__) | ||
21 | #define WnduExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_WNDUTIL, g, x, s, __VA_ARGS__) | ||
22 | |||
23 | struct MEMBUFFER_FOR_RICHEDIT | ||
24 | { | ||
25 | BYTE* rgbData; | ||
26 | DWORD cbData; | ||
27 | |||
28 | DWORD iData; | ||
29 | }; | ||
30 | |||
31 | const DWORD GROW_WINDOW_TEXT = 250; | ||
32 | |||
33 | |||
34 | // prototypes | ||
35 | static DWORD CALLBACK RichEditStreamFromFileHandleCallback( | ||
36 | __in DWORD_PTR dwCookie, | ||
37 | __in_bcount(cb) LPBYTE pbBuff, | ||
38 | __in LONG cb, | ||
39 | __in LONG *pcb | ||
40 | ); | ||
41 | static DWORD CALLBACK RichEditStreamFromMemoryCallback( | ||
42 | __in DWORD_PTR dwCookie, | ||
43 | __in_bcount(cb) LPBYTE pbBuff, | ||
44 | __in LONG cb, | ||
45 | __in LONG *pcb | ||
46 | ); | ||
47 | |||
48 | |||
49 | DAPI_(HRESULT) WnduLoadRichEditFromFile( | ||
50 | __in HWND hWnd, | ||
51 | __in_z LPCWSTR wzFileName, | ||
52 | __in HMODULE hModule | ||
53 | ) | ||
54 | { | ||
55 | HRESULT hr = S_OK; | ||
56 | LPWSTR sczFile = NULL; | ||
57 | HANDLE hFile = INVALID_HANDLE_VALUE; | ||
58 | |||
59 | hr = PathRelativeToModule(&sczFile, wzFileName, hModule); | ||
60 | WnduExitOnFailure(hr, "Failed to read resource data."); | ||
61 | |||
62 | hFile = ::CreateFileW(sczFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); | ||
63 | if (INVALID_HANDLE_VALUE == hFile) | ||
64 | { | ||
65 | WnduExitWithLastError(hr, "Failed to open RTF file."); | ||
66 | } | ||
67 | else | ||
68 | { | ||
69 | LONGLONG llRtfSize; | ||
70 | hr = FileSizeByHandle(hFile, &llRtfSize); | ||
71 | if (SUCCEEDED(hr)) | ||
72 | { | ||
73 | ::SendMessageW(hWnd, EM_EXLIMITTEXT, 0, static_cast<LPARAM>(llRtfSize)); | ||
74 | } | ||
75 | |||
76 | EDITSTREAM es = { }; | ||
77 | es.pfnCallback = RichEditStreamFromFileHandleCallback; | ||
78 | es.dwCookie = reinterpret_cast<DWORD_PTR>(hFile); | ||
79 | |||
80 | ::SendMessageW(hWnd, EM_STREAMIN, SF_RTF, reinterpret_cast<LPARAM>(&es)); | ||
81 | hr = es.dwError; | ||
82 | WnduExitOnFailure(hr, "Failed to update RTF stream."); | ||
83 | } | ||
84 | |||
85 | LExit: | ||
86 | ReleaseStr(sczFile); | ||
87 | ReleaseFile(hFile); | ||
88 | |||
89 | return hr; | ||
90 | } | ||
91 | |||
92 | DAPI_(HRESULT) WnduLoadRichEditFromResource( | ||
93 | __in HWND hWnd, | ||
94 | __in_z LPCSTR szResourceName, | ||
95 | __in HMODULE hModule | ||
96 | ) | ||
97 | { | ||
98 | HRESULT hr = S_OK; | ||
99 | MEMBUFFER_FOR_RICHEDIT buffer = { }; | ||
100 | EDITSTREAM es = { }; | ||
101 | |||
102 | hr = ResReadData(hModule, szResourceName, reinterpret_cast<LPVOID*>(&buffer.rgbData), &buffer.cbData); | ||
103 | WnduExitOnFailure(hr, "Failed to read resource data."); | ||
104 | |||
105 | es.pfnCallback = RichEditStreamFromMemoryCallback; | ||
106 | es.dwCookie = reinterpret_cast<DWORD_PTR>(&buffer); | ||
107 | |||
108 | ::SendMessageW(hWnd, EM_STREAMIN, SF_RTF, reinterpret_cast<LPARAM>(&es)); | ||
109 | hr = es.dwError; | ||
110 | WnduExitOnFailure(hr, "Failed to update RTF stream."); | ||
111 | |||
112 | LExit: | ||
113 | return hr; | ||
114 | } | ||
115 | |||
116 | |||
117 | DAPI_(HRESULT) WnduGetControlText( | ||
118 | __in HWND hWnd, | ||
119 | __inout_z LPWSTR* psczText | ||
120 | ) | ||
121 | { | ||
122 | HRESULT hr = S_OK; | ||
123 | SIZE_T cbSize = 0; | ||
124 | DWORD cchText = 0; | ||
125 | DWORD cchTextRead = 0; | ||
126 | |||
127 | // Ensure the string has room for at least one character. | ||
128 | hr = StrMaxLength(*psczText, &cbSize); | ||
129 | WnduExitOnFailure(hr, "Failed to get text buffer length."); | ||
130 | |||
131 | cchText = (DWORD)min(DWORD_MAX, cbSize); | ||
132 | |||
133 | if (!cchText) | ||
134 | { | ||
135 | cchText = GROW_WINDOW_TEXT; | ||
136 | |||
137 | hr = StrAlloc(psczText, cchText); | ||
138 | WnduExitOnFailure(hr, "Failed to grow text buffer."); | ||
139 | } | ||
140 | |||
141 | // Read (and keep growing buffer) until we finally read less than there | ||
142 | // is room in the buffer. | ||
143 | for (;;) | ||
144 | { | ||
145 | cchTextRead = ::GetWindowTextW(hWnd, *psczText, cchText); | ||
146 | if (cchTextRead + 1 < cchText) | ||
147 | { | ||
148 | break; | ||
149 | } | ||
150 | else | ||
151 | { | ||
152 | cchText = cchTextRead + GROW_WINDOW_TEXT; | ||
153 | |||
154 | hr = StrAlloc(psczText, cchText); | ||
155 | WnduExitOnFailure(hr, "Failed to grow text buffer again."); | ||
156 | } | ||
157 | } | ||
158 | |||
159 | LExit: | ||
160 | return hr; | ||
161 | } | ||
162 | |||
163 | |||
164 | static DWORD CALLBACK RichEditStreamFromFileHandleCallback( | ||
165 | __in DWORD_PTR dwCookie, | ||
166 | __in_bcount(cb) LPBYTE pbBuff, | ||
167 | __in LONG cb, | ||
168 | __in LONG* pcb | ||
169 | ) | ||
170 | { | ||
171 | HRESULT hr = S_OK; | ||
172 | HANDLE hFile = reinterpret_cast<HANDLE>(dwCookie); | ||
173 | |||
174 | if (!::ReadFile(hFile, pbBuff, cb, reinterpret_cast<DWORD*>(pcb), NULL)) | ||
175 | { | ||
176 | WnduExitWithLastError(hr, "Failed to read file"); | ||
177 | } | ||
178 | |||
179 | LExit: | ||
180 | return hr; | ||
181 | } | ||
182 | |||
183 | |||
184 | static DWORD CALLBACK RichEditStreamFromMemoryCallback( | ||
185 | __in DWORD_PTR dwCookie, | ||
186 | __in_bcount(cb) LPBYTE pbBuff, | ||
187 | __in LONG cb, | ||
188 | __in LONG* pcb | ||
189 | ) | ||
190 | { | ||
191 | HRESULT hr = S_OK; | ||
192 | MEMBUFFER_FOR_RICHEDIT* pBuffer = reinterpret_cast<MEMBUFFER_FOR_RICHEDIT*>(dwCookie); | ||
193 | DWORD cbCopy = 0; | ||
194 | |||
195 | if (pBuffer->iData < pBuffer->cbData) | ||
196 | { | ||
197 | cbCopy = min(static_cast<DWORD>(cb), pBuffer->cbData - pBuffer->iData); | ||
198 | memcpy(pbBuff, pBuffer->rgbData + pBuffer->iData, cbCopy); | ||
199 | |||
200 | pBuffer->iData += cbCopy; | ||
201 | Assert(pBuffer->iData <= pBuffer->cbData); | ||
202 | } | ||
203 | |||
204 | *pcb = cbCopy; | ||
205 | return hr; | ||
206 | } | ||
diff --git a/src/samples/thmviewer/display.cpp b/src/samples/thmviewer/display.cpp index 9ef88018..f40b50b5 100644 --- a/src/samples/thmviewer/display.cpp +++ b/src/samples/thmviewer/display.cpp | |||
@@ -188,7 +188,7 @@ static DWORD WINAPI DisplayThreadProc( | |||
188 | THEME_CONTROL* pControl = pCurrentHandle->pTheme->rgControls + i; | 188 | THEME_CONTROL* pControl = pCurrentHandle->pTheme->rgControls + i; |
189 | if (!pControl->wPageId) | 189 | if (!pControl->wPageId) |
190 | { | 190 | { |
191 | ThemeShowControl(pCurrentHandle->pTheme, pControl->wId, nCmdShow); | 191 | ThemeShowControl(pControl, nCmdShow); |
192 | } | 192 | } |
193 | } | 193 | } |
194 | 194 | ||
@@ -264,7 +264,7 @@ static LRESULT CALLBACK DisplayWndProc( | |||
264 | break; | 264 | break; |
265 | 265 | ||
266 | case WM_TIMER: | 266 | case WM_TIMER: |
267 | if (!lParam && SUCCEEDED(ThemeSetProgressControl(pHandleTheme->pTheme, wParam, dwProgress))) | 267 | if (!lParam && SUCCEEDED(ThemeSetProgressControl(reinterpret_cast<THEME_CONTROL*>(wParam), dwProgress))) |
268 | { | 268 | { |
269 | dwProgress += rand() % 10 + 1; | 269 | dwProgress += rand() % 10 + 1; |
270 | if (dwProgress > 100) | 270 | if (dwProgress > 100) |
@@ -322,12 +322,12 @@ static BOOL DisplayOnThmLoadedControl( | |||
322 | // Pre-populate some control types with data. | 322 | // Pre-populate some control types with data. |
323 | if (THEME_CONTROL_TYPE_RICHEDIT == pControl->type) | 323 | if (THEME_CONTROL_TYPE_RICHEDIT == pControl->type) |
324 | { | 324 | { |
325 | hr = ThemeLoadRichEditFromResource(pTheme, pControl->wId, MAKEINTRESOURCEA(THMVWR_RES_RICHEDIT_FILE), ::GetModuleHandleW(NULL)); | 325 | hr = WnduLoadRichEditFromResource(pControl->hWnd, MAKEINTRESOURCEA(THMVWR_RES_RICHEDIT_FILE), ::GetModuleHandleW(NULL)); |
326 | ExitOnFailure(hr, "Failed to load richedit text."); | 326 | ExitOnFailure(hr, "Failed to load richedit text."); |
327 | } | 327 | } |
328 | else if (THEME_CONTROL_TYPE_PROGRESSBAR == pControl->type) | 328 | else if (THEME_CONTROL_TYPE_PROGRESSBAR == pControl->type) |
329 | { | 329 | { |
330 | DWORD dwId = ::SetTimer(pTheme->hwndParent, pControl->wId, 500, NULL); | 330 | DWORD dwId = ::SetTimer(pTheme->hwndParent, reinterpret_cast<UINT_PTR>(pControl), 500, NULL); |
331 | dwId = dwId; // prevents warning in "ship" build. | 331 | dwId = dwId; // prevents warning in "ship" build. |
332 | Assert(dwId == pControl->wId); | 332 | Assert(dwId == pControl->wId); |
333 | } | 333 | } |
diff --git a/src/samples/thmviewer/precomp.h b/src/samples/thmviewer/precomp.h index f11d3534..762a0623 100644 --- a/src/samples/thmviewer/precomp.h +++ b/src/samples/thmviewer/precomp.h | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "shelutil.h" | 28 | #include "shelutil.h" |
29 | #include "strutil.h" | 29 | #include "strutil.h" |
30 | #include "thmutil.h" | 30 | #include "thmutil.h" |
31 | #include "wndutil.h" | ||
31 | 32 | ||
32 | #include "resource.h" | 33 | #include "resource.h" |
33 | 34 | ||
diff --git a/src/samples/thmviewer/thmviewer.cpp b/src/samples/thmviewer/thmviewer.cpp index 94b1ef55..38f3c4dc 100644 --- a/src/samples/thmviewer/thmviewer.cpp +++ b/src/samples/thmviewer/thmviewer.cpp | |||
@@ -390,6 +390,12 @@ static void OnThemeLoadError( | |||
390 | LPWSTR* psczErrors = NULL; | 390 | LPWSTR* psczErrors = NULL; |
391 | UINT cErrors = 0; | 391 | UINT cErrors = 0; |
392 | TVINSERTSTRUCTW tvi = { }; | 392 | TVINSERTSTRUCTW tvi = { }; |
393 | const THEME_CONTROL* pTreeControl = NULL; | ||
394 | |||
395 | if (!ThemeControlExistsById(pTheme, THMVWR_CONTROL_TREE, &pTreeControl)) | ||
396 | { | ||
397 | ExitWithRootFailure(hr, E_INVALIDSTATE, "THMVWR_CONTROL_TREE control doesn't exist."); | ||
398 | } | ||
393 | 399 | ||
394 | // Add the application node. | 400 | // Add the application node. |
395 | tvi.hParent = NULL; | 401 | tvi.hParent = NULL; |
@@ -397,7 +403,7 @@ static void OnThemeLoadError( | |||
397 | tvi.item.mask = TVIF_TEXT | TVIF_PARAM; | 403 | tvi.item.mask = TVIF_TEXT | TVIF_PARAM; |
398 | tvi.item.lParam = 0; | 404 | tvi.item.lParam = 0; |
399 | tvi.item.pszText = L"Failed to load theme."; | 405 | tvi.item.pszText = L"Failed to load theme."; |
400 | tvi.hParent = reinterpret_cast<HTREEITEM>(ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi))); | 406 | tvi.hParent = reinterpret_cast<HTREEITEM>(::SendMessage(pTreeControl->hWnd, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi))); |
401 | 407 | ||
402 | if (!vsczThemeLoadErrors) | 408 | if (!vsczThemeLoadErrors) |
403 | { | 409 | { |
@@ -405,13 +411,13 @@ static void OnThemeLoadError( | |||
405 | ExitOnFailure(hr, "Failed to format error message."); | 411 | ExitOnFailure(hr, "Failed to format error message."); |
406 | 412 | ||
407 | tvi.item.pszText = sczMessage; | 413 | tvi.item.pszText = sczMessage; |
408 | ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi)); | 414 | ::SendMessage(pTreeControl->hWnd, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi)); |
409 | 415 | ||
410 | hr = StrAllocFromError(&sczMessage, hrFailure, NULL); | 416 | hr = StrAllocFromError(&sczMessage, hrFailure, NULL); |
411 | ExitOnFailure(hr, "Failed to format error message text."); | 417 | ExitOnFailure(hr, "Failed to format error message text."); |
412 | 418 | ||
413 | tvi.item.pszText = sczMessage; | 419 | tvi.item.pszText = sczMessage; |
414 | ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi)); | 420 | ::SendMessage(pTreeControl->hWnd, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi)); |
415 | } | 421 | } |
416 | else | 422 | else |
417 | { | 423 | { |
@@ -421,11 +427,11 @@ static void OnThemeLoadError( | |||
421 | for (DWORD i = 0; i < cErrors; ++i) | 427 | for (DWORD i = 0; i < cErrors; ++i) |
422 | { | 428 | { |
423 | tvi.item.pszText = psczErrors[i]; | 429 | tvi.item.pszText = psczErrors[i]; |
424 | ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi)); | 430 | ::SendMessage(pTreeControl->hWnd, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi)); |
425 | } | 431 | } |
426 | } | 432 | } |
427 | 433 | ||
428 | ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_EXPAND, TVE_EXPAND, reinterpret_cast<LPARAM>(tvi.hParent)); | 434 | ::SendMessage(pTreeControl->hWnd, TVM_EXPAND, TVE_EXPAND, reinterpret_cast<LPARAM>(tvi.hParent)); |
429 | 435 | ||
430 | LExit: | 436 | LExit: |
431 | ReleaseStr(sczMessage); | 437 | ReleaseStr(sczMessage); |
@@ -439,6 +445,7 @@ static void OnNewTheme( | |||
439 | __in HANDLE_THEME* pHandle | 445 | __in HANDLE_THEME* pHandle |
440 | ) | 446 | ) |
441 | { | 447 | { |
448 | const THEME_CONTROL* pTreeControl = NULL; | ||
442 | HANDLE_THEME* pOldHandle = reinterpret_cast<HANDLE_THEME*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA)); | 449 | HANDLE_THEME* pOldHandle = reinterpret_cast<HANDLE_THEME*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA)); |
443 | THEME* pNewTheme = pHandle->pTheme; | 450 | THEME* pNewTheme = pHandle->pTheme; |
444 | 451 | ||
@@ -460,17 +467,23 @@ static void OnNewTheme( | |||
460 | 467 | ||
461 | ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pHandle)); | 468 | ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pHandle)); |
462 | 469 | ||
470 | if (!ThemeControlExistsById(pTheme, THMVWR_CONTROL_TREE, &pTreeControl)) | ||
471 | { | ||
472 | TraceError(E_INVALIDSTATE, "Tree control doesn't exist."); | ||
473 | return; | ||
474 | } | ||
475 | |||
463 | // Remember the currently selected item by name so we can try to automatically select it later. | 476 | // Remember the currently selected item by name so we can try to automatically select it later. |
464 | // Otherwise, the user would see their window destroyed after every save of their theme file and | 477 | // Otherwise, the user would see their window destroyed after every save of their theme file and |
465 | // have to click to get the window back. | 478 | // have to click to get the window back. |
466 | item.mask = TVIF_TEXT; | 479 | item.mask = TVIF_TEXT; |
467 | item.pszText = wzSelectedPage; | 480 | item.pszText = wzSelectedPage; |
468 | item.cchTextMax = countof(wzSelectedPage); | 481 | item.cchTextMax = countof(wzSelectedPage); |
469 | item.hItem = reinterpret_cast<HTREEITEM>(ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_GETNEXTITEM, TVGN_CARET, NULL)); | 482 | item.hItem = reinterpret_cast<HTREEITEM>(::SendMessage(pTreeControl->hWnd, TVM_GETNEXTITEM, TVGN_CARET, NULL)); |
470 | ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&item)); | 483 | ::SendMessage(pTreeControl->hWnd, TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&item)); |
471 | 484 | ||
472 | // Remove the previous items in the tree. | 485 | // Remove the previous items in the tree. |
473 | ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_DELETEITEM, 0, reinterpret_cast<LPARAM>(TVI_ROOT)); | 486 | ::SendMessage(pTreeControl->hWnd, TVM_DELETEITEM, 0, reinterpret_cast<LPARAM>(TVI_ROOT)); |
474 | 487 | ||
475 | // Add the application node. | 488 | // Add the application node. |
476 | tvi.hParent = NULL; | 489 | tvi.hParent = NULL; |
@@ -480,7 +493,7 @@ static void OnNewTheme( | |||
480 | tvi.item.pszText = pHandle && pHandle->pTheme && pHandle->pTheme->sczCaption ? pHandle->pTheme->sczCaption : L"Window"; | 493 | tvi.item.pszText = pHandle && pHandle->pTheme && pHandle->pTheme->sczCaption ? pHandle->pTheme->sczCaption : L"Window"; |
481 | 494 | ||
482 | // Add the pages. | 495 | // Add the pages. |
483 | tvi.hParent = reinterpret_cast<HTREEITEM>(ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi))); | 496 | tvi.hParent = reinterpret_cast<HTREEITEM>(::SendMessage(pTreeControl->hWnd, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi))); |
484 | tvi.hInsertAfter = TVI_SORT; | 497 | tvi.hInsertAfter = TVI_SORT; |
485 | for (DWORD i = 0; i < pNewTheme->cPages; ++i) | 498 | for (DWORD i = 0; i < pNewTheme->cPages; ++i) |
486 | { | 499 | { |
@@ -490,7 +503,7 @@ static void OnNewTheme( | |||
490 | tvi.item.pszText = pPage->sczName; | 503 | tvi.item.pszText = pPage->sczName; |
491 | tvi.item.lParam = i + 1; //prgdwPageIds[i]; - TODO: do the right thing here by calling ThemeGetPageIds(), should not assume we know how the page ids will be calculated. | 504 | tvi.item.lParam = i + 1; //prgdwPageIds[i]; - TODO: do the right thing here by calling ThemeGetPageIds(), should not assume we know how the page ids will be calculated. |
492 | 505 | ||
493 | HTREEITEM hti = reinterpret_cast<HTREEITEM>(ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi))); | 506 | HTREEITEM hti = reinterpret_cast<HTREEITEM>(::SendMessage(pTreeControl->hWnd, TVM_INSERTITEMW, 0, reinterpret_cast<LPARAM>(&tvi))); |
494 | if (*wzSelectedPage && CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, pPage->sczName, -1, wzSelectedPage, -1)) | 507 | if (*wzSelectedPage && CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, pPage->sczName, -1, wzSelectedPage, -1)) |
495 | { | 508 | { |
496 | htiSelected = hti; | 509 | htiSelected = hti; |
@@ -503,10 +516,10 @@ static void OnNewTheme( | |||
503 | htiSelected = tvi.hParent; | 516 | htiSelected = tvi.hParent; |
504 | } | 517 | } |
505 | 518 | ||
506 | ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_EXPAND, TVE_EXPAND, reinterpret_cast<LPARAM>(tvi.hParent)); | 519 | ::SendMessage(pTreeControl->hWnd, TVM_EXPAND, TVE_EXPAND, reinterpret_cast<LPARAM>(tvi.hParent)); |
507 | if (htiSelected) | 520 | if (htiSelected) |
508 | { | 521 | { |
509 | ThemeSendControlMessage(pTheme, THMVWR_CONTROL_TREE, TVM_SELECTITEM, TVGN_CARET, reinterpret_cast<LPARAM>(htiSelected)); | 522 | ::SendMessage(pTreeControl->hWnd, TVM_SELECTITEM, TVGN_CARET, reinterpret_cast<LPARAM>(htiSelected)); |
510 | } | 523 | } |
511 | } | 524 | } |
512 | 525 | ||
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp index b502285f..6c37fbd8 100644 --- a/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp +++ b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp | |||
@@ -365,18 +365,23 @@ private: | |||
365 | 365 | ||
366 | void UpdateProgressBarProgress() | 366 | void UpdateProgressBarProgress() |
367 | { | 367 | { |
368 | const THEME_CONTROL* pControlProgressbarImage = NULL; | ||
369 | const THEME_CONTROL* pControlProgressbarStandard = NULL; | ||
368 | static DWORD dwProgress = 0; | 370 | static DWORD dwProgress = 0; |
369 | DWORD dwCurrent = dwProgress < 100 ? dwProgress : 200 - dwProgress; | 371 | DWORD dwCurrent = dwProgress < 100 ? dwProgress : 200 - dwProgress; |
370 | 372 | ||
373 | ThemeControlExistsById(m_pBafTheme, BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_IMAGE, &pControlProgressbarImage); | ||
374 | ThemeControlExistsById(m_pBafTheme, BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_STANDARD, &pControlProgressbarStandard); | ||
375 | |||
371 | if (0 == dwProgress || 100 == dwProgress) | 376 | if (0 == dwProgress || 100 == dwProgress) |
372 | { | 377 | { |
373 | ThemeSetProgressControlColor(m_pBafTheme, BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_IMAGE, 100 == dwProgress ? 1 : 0); | 378 | ThemeSetProgressControlColor(pControlProgressbarImage, 100 == dwProgress ? 1 : 0); |
374 | } | 379 | } |
375 | 380 | ||
376 | dwProgress = (dwProgress + 10) % 200; | 381 | dwProgress = (dwProgress + 10) % 200; |
377 | 382 | ||
378 | ThemeSetProgressControl(m_pBafTheme, BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_IMAGE, dwCurrent); | 383 | ThemeSetProgressControl(pControlProgressbarImage, dwCurrent); |
379 | ThemeSetProgressControl(m_pBafTheme, BAFTHMUTILTESTING_CONTROL_PROGRESSBAR_STANDARD, dwCurrent); | 384 | ThemeSetProgressControl(pControlProgressbarStandard, dwCurrent); |
380 | } | 385 | } |
381 | 386 | ||
382 | public: | 387 | public: |