aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/burn/engine/package.cpp4
-rw-r--r--src/libs/dutil/WixToolset.DUtil/atomutil.cpp2
-rw-r--r--src/libs/dutil/WixToolset.DUtil/inc/xmlutil.h19
-rw-r--r--src/libs/dutil/WixToolset.DUtil/strutil.cpp2
-rw-r--r--src/libs/dutil/WixToolset.DUtil/thmutil.cpp993
-rw-r--r--src/libs/dutil/WixToolset.DUtil/xmlutil.cpp121
-rw-r--r--src/libs/dutil/WixToolset.DUtil/xsd/thmutil.xsd1188
7 files changed, 696 insertions, 1633 deletions
diff --git a/src/burn/engine/package.cpp b/src/burn/engine/package.cpp
index 3f8c8b0f..0d52d575 100644
--- a/src/burn/engine/package.cpp
+++ b/src/burn/engine/package.cpp
@@ -141,11 +141,11 @@ extern "C" HRESULT PackagesParseFromXml(
141 ExitOnFailure(hr, "Failed to get @CacheId."); 141 ExitOnFailure(hr, "Failed to get @CacheId.");
142 142
143 // @Size 143 // @Size
144 hr = XmlGetAttributeLargeNumber(pixnNode, L"Size", &pPackage->qwSize); 144 hr = XmlGetAttributeUInt64(pixnNode, L"Size", &pPackage->qwSize);
145 ExitOnFailure(hr, "Failed to get @Size."); 145 ExitOnFailure(hr, "Failed to get @Size.");
146 146
147 // @InstallSize 147 // @InstallSize
148 hr = XmlGetAttributeLargeNumber(pixnNode, L"InstallSize", &pPackage->qwInstallSize); 148 hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize);
149 ExitOnFailure(hr, "Failed to get @InstallSize."); 149 ExitOnFailure(hr, "Failed to get @InstallSize.");
150 150
151 // @PerMachine 151 // @PerMachine
diff --git a/src/libs/dutil/WixToolset.DUtil/atomutil.cpp b/src/libs/dutil/WixToolset.DUtil/atomutil.cpp
index c7c7975a..d6fd3890 100644
--- a/src/libs/dutil/WixToolset.DUtil/atomutil.cpp
+++ b/src/libs/dutil/WixToolset.DUtil/atomutil.cpp
@@ -854,7 +854,7 @@ static HRESULT ParseAtomLink(
854 } 854 }
855 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"length", -1)) 855 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"length", -1))
856 { 856 {
857 hr = XmlGetAttributeLargeNumber(pixnLink, bstrNodeName, &pLink->dw64Length); 857 hr = XmlGetAttributeUInt64(pixnLink, bstrNodeName, &pLink->dw64Length);
858 if (E_INVALIDARG == hr) 858 if (E_INVALIDARG == hr)
859 { 859 {
860 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); 860 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/xmlutil.h b/src/libs/dutil/WixToolset.DUtil/inc/xmlutil.h
index ba92ada9..227c54f3 100644
--- a/src/libs/dutil/WixToolset.DUtil/inc/xmlutil.h
+++ b/src/libs/dutil/WixToolset.DUtil/inc/xmlutil.h
@@ -106,10 +106,25 @@ HRESULT DAPI XmlGetAttributeNumberBase(
106 __in int nBase, 106 __in int nBase,
107 __out DWORD* pdwValue 107 __out DWORD* pdwValue
108 ); 108 );
109HRESULT DAPI XmlGetAttributeLargeNumber( 109HRESULT DAPI XmlGetAttributeUInt16(
110 __in IXMLDOMNode* pixnNode, 110 __in IXMLDOMNode* pixnNode,
111 __in_z LPCWSTR pwzAttribute, 111 __in_z LPCWSTR pwzAttribute,
112 __out DWORD64* pdw64Value 112 __out WORD* pwValue
113 );
114HRESULT DAPI XmlGetAttributeInt32(
115 __in IXMLDOMNode* pixnNode,
116 __in_z LPCWSTR pwzAttribute,
117 __out int* piValue
118 );
119HRESULT DAPI XmlGetAttributeUInt32(
120 __in IXMLDOMNode* pixnNode,
121 __in_z LPCWSTR pwzAttribute,
122 __out DWORD* pdwValue
123 );
124HRESULT DAPI XmlGetAttributeUInt64(
125 __in IXMLDOMNode* pixnNode,
126 __in_z LPCWSTR pwzAttribute,
127 __out DWORD64* pqwValue
113 ); 128 );
114HRESULT DAPI XmlGetNamedItem( 129HRESULT DAPI XmlGetNamedItem(
115 __in IXMLDOMNamedNodeMap *pixnmAttributes, 130 __in IXMLDOMNamedNodeMap *pixnmAttributes,
diff --git a/src/libs/dutil/WixToolset.DUtil/strutil.cpp b/src/libs/dutil/WixToolset.DUtil/strutil.cpp
index 550d6169..3cb7ef6a 100644
--- a/src/libs/dutil/WixToolset.DUtil/strutil.cpp
+++ b/src/libs/dutil/WixToolset.DUtil/strutil.cpp
@@ -2580,7 +2580,7 @@ extern "C" HRESULT DAPI StrStringToUInt64(
2580 while (i < cchIn) 2580 while (i < cchIn)
2581 { 2581 {
2582 nDigit = wzIn[i] - L'0'; 2582 nDigit = wzIn[i] - L'0';
2583 if (9 < nDigit) 2583 if (0 > nDigit || 9 < nDigit)
2584 { 2584 {
2585 ExitFunction1(hr = E_INVALIDARG); 2585 ExitFunction1(hr = E_INVALIDARG);
2586 } 2586 }
diff --git a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp
index 599021bf..1e7fa01a 100644
--- a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp
+++ b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp
@@ -20,6 +20,7 @@
20#define ThmExitOnRequiredXmlQueryFailure(x, s, ...) ExitOnRequiredXmlQueryFailureSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) 20#define ThmExitOnRequiredXmlQueryFailure(x, s, ...) ExitOnRequiredXmlQueryFailureSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__)
21#define ThmExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_THMUTIL, g, x, s, __VA_ARGS__) 21#define ThmExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_THMUTIL, g, x, s, __VA_ARGS__)
22 22
23#define ThmExitOnUnexpectedAttribute(x, n, e, a) { x = ParseUnexpectedAttribute(n, e, a); if (FAILED(x)) { ExitFunction(); } }
23 24
24// from CommCtrl.h 25// from CommCtrl.h
25#ifndef BS_COMMANDLINK 26#ifndef BS_COMMANDLINK
@@ -86,17 +87,33 @@ static HRESULT ParseTheme(
86 __in IXMLDOMDocument* pixd, 87 __in IXMLDOMDocument* pixd,
87 __out THEME** ppTheme 88 __out THEME** ppTheme
88 ); 89 );
89static HRESULT ParseImage( 90static HRESULT GetAttributeImageFileOrResource(
90 __in_opt HMODULE hModule, 91 __in_opt HMODULE hModule,
91 __in_z_opt LPCWSTR wzRelativePath, 92 __in_z_opt LPCWSTR wzRelativePath,
92 __in IXMLDOMNode* pElement, 93 __in IXMLDOMNode* pElement,
93 __out HBITMAP* phImage 94 __out HBITMAP* phImage
94 ); 95 );
95static HRESULT ParseIcon( 96static HRESULT ParseCommandLinkImage(
96 __in_opt HMODULE hModule, 97 __in_opt HMODULE hModule,
97 __in_z_opt LPCWSTR wzRelativePath, 98 __in_z_opt LPCWSTR wzRelativePath,
98 __in IXMLDOMNode* pElement, 99 __in IXMLDOMNode* pElement,
99 __out HICON* phIcon 100 __in THEME_CONTROL* pControl
101 );
102static HRESULT GetAttributeCoordinateOrDimension(
103 __in IXMLDOMNode* pixn,
104 __in LPCWSTR wzAttribute,
105 __inout int* pnValue
106 );
107static HRESULT GetAttributeFontId(
108 __in IXMLDOMNode* pixn,
109 __in LPCWSTR wzAttribute,
110 __inout DWORD* pdwValue
111 );
112static HRESULT ParseSourceXY(
113 __in IXMLDOMNode* pixn,
114 __in BOOL fAllowed,
115 __inout int* pnX,
116 __inout int* pnY
100 ); 117 );
101static HRESULT ParseWindow( 118static HRESULT ParseWindow(
102 __in_opt HMODULE hModule, 119 __in_opt HMODULE hModule,
@@ -138,6 +155,7 @@ static HRESULT ParseControl(
138 __in_opt HMODULE hModule, 155 __in_opt HMODULE hModule,
139 __in_opt LPCWSTR wzRelativePath, 156 __in_opt LPCWSTR wzRelativePath,
140 __in IXMLDOMNode* pixn, 157 __in IXMLDOMNode* pixn,
158 __in_z LPCWSTR wzElementName,
141 __in THEME* pTheme, 159 __in THEME* pTheme,
142 __in THEME_CONTROL* pControl, 160 __in THEME_CONTROL* pControl,
143 __in_opt THEME_PAGE* pPage 161 __in_opt THEME_PAGE* pPage
@@ -183,6 +201,11 @@ static HRESULT ParseTooltips(
183 __in THEME_CONTROL* pControl, 201 __in THEME_CONTROL* pControl,
184 __inout BOOL* pfAnyChildren 202 __inout BOOL* pfAnyChildren
185 ); 203 );
204static HRESULT ParseUnexpectedAttribute(
205 __in IXMLDOMNode* pixn,
206 __in_z LPCWSTR wzElementName,
207 __in_z LPCWSTR wzAttribute
208 );
186static HRESULT ParseNotes( 209static HRESULT ParseNotes(
187 __in IXMLDOMNode* pixn, 210 __in IXMLDOMNode* pixn,
188 __in THEME_CONTROL* pControl, 211 __in THEME_CONTROL* pControl,
@@ -1698,6 +1721,7 @@ static HRESULT ParseTheme(
1698 HRESULT hr = S_OK; 1721 HRESULT hr = S_OK;
1699 THEME* pTheme = NULL; 1722 THEME* pTheme = NULL;
1700 IXMLDOMElement *pThemeElement = NULL; 1723 IXMLDOMElement *pThemeElement = NULL;
1724 BOOL fXmlFound = FALSE;
1701 1725
1702 hr = pixd->get_documentElement(&pThemeElement); 1726 hr = pixd->get_documentElement(&pThemeElement);
1703 ThmExitOnFailure(hr, "Failed to get theme element."); 1727 ThmExitOnFailure(hr, "Failed to get theme element.");
@@ -1709,8 +1733,8 @@ static HRESULT ParseTheme(
1709 pTheme->nDpi = USER_DEFAULT_SCREEN_DPI; 1733 pTheme->nDpi = USER_DEFAULT_SCREEN_DPI;
1710 1734
1711 // Parse the optional background resource image. 1735 // Parse the optional background resource image.
1712 hr = ParseImage(hModule, wzRelativePath, pThemeElement, &pTheme->hImage); 1736 hr = GetAttributeImageFileOrResource(hModule, wzRelativePath, pThemeElement, &pTheme->hImage);
1713 ThmExitOnFailure(hr, "Failed while parsing theme image."); 1737 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed while parsing theme image.");
1714 1738
1715 // Parse the fonts. 1739 // Parse the fonts.
1716 hr = ParseFonts(pThemeElement, pTheme); 1740 hr = ParseFonts(pThemeElement, pTheme);
@@ -1734,7 +1758,7 @@ LExit:
1734 return hr; 1758 return hr;
1735} 1759}
1736 1760
1737static HRESULT ParseImage( 1761static HRESULT GetAttributeImageFileOrResource(
1738 __in_opt HMODULE hModule, 1762 __in_opt HMODULE hModule,
1739 __in_z_opt LPCWSTR wzRelativePath, 1763 __in_z_opt LPCWSTR wzRelativePath,
1740 __in IXMLDOMNode* pElement, 1764 __in IXMLDOMNode* pElement,
@@ -1744,45 +1768,44 @@ static HRESULT ParseImage(
1744 HRESULT hr = S_OK; 1768 HRESULT hr = S_OK;
1745 BSTR bstr = NULL; 1769 BSTR bstr = NULL;
1746 LPWSTR sczImageFile = NULL; 1770 LPWSTR sczImageFile = NULL;
1747 int iResourceId = 0; 1771 WORD wResourceId = 0;
1772 BOOL fFound = FALSE;
1748 Gdiplus::Bitmap* pBitmap = NULL; 1773 Gdiplus::Bitmap* pBitmap = NULL;
1749 *phImage = NULL; 1774 *phImage = NULL;
1750 1775
1751 hr = XmlGetAttribute(pElement, L"ImageResource", &bstr); 1776 hr = XmlGetAttributeUInt16(pElement, L"ImageResource", &wResourceId);
1752 ThmExitOnFailure(hr, "Failed to get image resource attribute."); 1777 ThmExitOnOptionalXmlQueryFailure(hr, fFound, "Failed to get image resource attribute.");
1753 1778
1754 if (S_OK == hr) 1779 if (fFound)
1755 { 1780 {
1756 iResourceId = wcstol(bstr, NULL, 10); 1781 hr = GdipBitmapFromResource(hModule, MAKEINTRESOURCE(wResourceId), &pBitmap);
1757 1782 ThmExitOnFailure(hr, "Failed to load image from resource: %hu", wResourceId);
1758 hr = GdipBitmapFromResource(hModule, MAKEINTRESOURCE(iResourceId), &pBitmap);
1759 // Don't fail.
1760 } 1783 }
1761 1784
1762 ReleaseNullBSTR(bstr); 1785 hr = XmlGetAttribute(pElement, L"ImageFile", &bstr);
1786 ThmExitOnOptionalXmlQueryFailure(hr, fFound, "Failed to get image file attribute.");
1763 1787
1764 // Parse the optional background image from a given file. 1788 if (fFound)
1765 if (!pBitmap)
1766 { 1789 {
1767 hr = XmlGetAttribute(pElement, L"ImageFile", &bstr); 1790 if (pBitmap)
1768 ThmExitOnFailure(hr, "Failed to get image file attribute.");
1769
1770 if (S_OK == hr)
1771 { 1791 {
1772 if (wzRelativePath) 1792 ThmExitWithRootFailure(hr, E_INVALIDDATA, "ImageFile attribute can't be specified with ImageResource attribute.");
1773 { 1793 }
1774 hr = PathConcat(wzRelativePath, bstr, &sczImageFile);
1775 ThmExitOnFailure(hr, "Failed to combine image file path.");
1776 }
1777 else
1778 {
1779 hr = PathRelativeToModule(&sczImageFile, bstr, hModule);
1780 ThmExitOnFailure(hr, "Failed to get image filename.");
1781 }
1782 1794
1783 hr = GdipBitmapFromFile(sczImageFile, &pBitmap); 1795 // Parse the optional background image from a given file.
1784 // Don't fail. 1796 if (wzRelativePath)
1797 {
1798 hr = PathConcat(wzRelativePath, bstr, &sczImageFile);
1799 ThmExitOnFailure(hr, "Failed to combine image file path.");
1800 }
1801 else
1802 {
1803 hr = PathRelativeToModule(&sczImageFile, bstr, hModule);
1804 ThmExitOnFailure(hr, "Failed to get image filename.");
1785 } 1805 }
1806
1807 hr = GdipBitmapFromFile(sczImageFile, &pBitmap);
1808 ThmExitOnFailure(hr, "Failed to load image from file: %ls", sczImageFile);
1786 } 1809 }
1787 1810
1788 // If there is an image, convert it into a bitmap handle. 1811 // If there is an image, convert it into a bitmap handle.
@@ -1792,8 +1815,10 @@ static HRESULT ParseImage(
1792 Gdiplus::Status gs = pBitmap->GetHBITMAP(black, phImage); 1815 Gdiplus::Status gs = pBitmap->GetHBITMAP(black, phImage);
1793 ThmExitOnGdipFailure(gs, hr, "Failed to convert GDI+ bitmap into HBITMAP."); 1816 ThmExitOnGdipFailure(gs, hr, "Failed to convert GDI+ bitmap into HBITMAP.");
1794 } 1817 }
1795 1818 else
1796 hr = S_OK; 1819 {
1820 hr = E_NOTFOUND;
1821 }
1797 1822
1798LExit: 1823LExit:
1799 if (pBitmap) 1824 if (pBitmap)
@@ -1808,62 +1833,244 @@ LExit:
1808} 1833}
1809 1834
1810 1835
1811static HRESULT ParseIcon( 1836static HRESULT ParseOwnerDrawImage(
1812 __in_opt HMODULE hModule, 1837 __in_opt HMODULE hModule,
1813 __in_z_opt LPCWSTR wzRelativePath, 1838 __in_z_opt LPCWSTR wzRelativePath,
1839 __in THEME* pTheme,
1814 __in IXMLDOMNode* pElement, 1840 __in IXMLDOMNode* pElement,
1815 __out HICON* phIcon 1841 __in THEME_CONTROL* pControl
1816 ) 1842 )
1817{ 1843{
1818 HRESULT hr = S_OK; 1844 HRESULT hr = S_OK;
1819 BSTR bstr = NULL; 1845 BOOL fXmlFound = FALSE;
1820 LPWSTR sczImageFile = NULL; 1846 BOOL fFoundImage = FALSE;
1821 int iResourceId = 0;
1822 *phIcon = NULL;
1823 1847
1824 hr = XmlGetAttribute(pElement, L"IconResource", &bstr); 1848 // Parse the optional background resource image.
1825 ThmExitOnFailure(hr, "Failed to get icon resource attribute."); 1849 hr = GetAttributeImageFileOrResource(hModule, wzRelativePath, pElement, &pControl->hImage);
1850 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed while parsing control image.");
1826 1851
1827 if (S_OK == hr) 1852 if (fXmlFound)
1853 {
1854 fFoundImage = TRUE;
1855 }
1856
1857 hr = ParseSourceXY(pElement, NULL != pTheme->hImage, &pControl->nSourceX, &pControl->nSourceY);
1858 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get control SourceX and SourceY attributes.");
1859
1860 if (fXmlFound)
1828 { 1861 {
1829 iResourceId = wcstol(bstr, NULL, 10); 1862 if (fFoundImage)
1863 {
1864 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Unexpected SourceX attribute with image attribute.");
1865 }
1866 else if (1 > pControl->nWidth || 1 > pControl->nHeight)
1867 {
1868 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Control Width and Height must be positive when using SourceX and SourceY.");
1869 }
1830 1870
1831 *phIcon = reinterpret_cast<HICON>(::LoadImageW(hModule, MAKEINTRESOURCEW(iResourceId), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE)); 1871 fFoundImage = TRUE;
1832 ThmExitOnNullWithLastError(*phIcon, hr, "Failed to load icon.");
1833 } 1872 }
1834 else 1873
1874 if (THEME_CONTROL_TYPE_IMAGE == pControl->type && !fFoundImage)
1835 { 1875 {
1836 ReleaseNullBSTR(bstr); 1876 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Image control didn't specify an image.");
1877 }
1837 1878
1838 hr = XmlGetAttribute(pElement, L"IconFile", &bstr); 1879LExit:
1839 ThmExitOnFailure(hr, "Failed to get icon file attribute."); 1880 return hr;
1881}
1840 1882
1841 if (S_OK == hr) 1883
1884static HRESULT ParseCommandLinkImage(
1885 __in_opt HMODULE hModule,
1886 __in_z_opt LPCWSTR wzRelativePath,
1887 __in IXMLDOMNode* pElement,
1888 __in THEME_CONTROL* pControl
1889 )
1890{
1891 HRESULT hr = S_OK;
1892 BSTR bstr = NULL;
1893 BOOL fImageFound = FALSE;
1894 BOOL fXmlFound = FALSE;
1895 LPWSTR sczIconFile = NULL;
1896 WORD wResourceId = 0;
1897
1898 hr = GetAttributeImageFileOrResource(hModule, wzRelativePath, pElement, &pControl->hImage);
1899 ThmExitOnOptionalXmlQueryFailure(hr, fImageFound, "Failed to parse image attributes for CommandLink.");
1900
1901 hr = XmlGetAttributeUInt16(pElement, L"IconResource", &wResourceId);
1902 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get icon resource attribute.");
1903
1904 if (fXmlFound)
1905 {
1906 if (fImageFound)
1842 { 1907 {
1843 if (wzRelativePath) 1908 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Unexpected IconResource attribute with image attribute.");
1844 { 1909 }
1845 hr = PathConcat(wzRelativePath, bstr, &sczImageFile); 1910
1846 ThmExitOnFailure(hr, "Failed to combine image file path."); 1911 pControl->hIcon = reinterpret_cast<HICON>(::LoadImageW(hModule, MAKEINTRESOURCEW(wResourceId), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE));
1847 } 1912 ThmExitOnNullWithLastError(pControl->hIcon, hr, "Failed to load icon.");
1848 else 1913 }
1849 { 1914
1850 hr = PathRelativeToModule(&sczImageFile, bstr, hModule); 1915 hr = XmlGetAttribute(pElement, L"IconFile", &bstr);
1851 ThmExitOnFailure(hr, "Failed to get image filename."); 1916 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get icon file attribute.");
1852 } 1917
1918 if (fXmlFound)
1919 {
1920 if (fImageFound)
1921 {
1922 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Unexpected IconFile attribute with image attribute.");
1923 }
1924 else if (pControl->hIcon)
1925 {
1926 ThmExitWithRootFailure(hr, E_INVALIDDATA, "IconFile attribute can't be specified with IconResource attribute.");
1927 }
1853 1928
1854 *phIcon = reinterpret_cast<HICON>(::LoadImageW(NULL, sczImageFile, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE)); 1929 if (wzRelativePath)
1855 ThmExitOnNullWithLastError(*phIcon, hr, "Failed to load icon: %ls.", sczImageFile); 1930 {
1931 hr = PathConcat(wzRelativePath, bstr, &sczIconFile);
1932 ThmExitOnFailure(hr, "Failed to combine image file path.");
1856 } 1933 }
1934 else
1935 {
1936 hr = PathRelativeToModule(&sczIconFile, bstr, hModule);
1937 ThmExitOnFailure(hr, "Failed to get image filename.");
1938 }
1939
1940 pControl->hIcon = reinterpret_cast<HICON>(::LoadImageW(NULL, sczIconFile, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE));
1941 ThmExitOnNullWithLastError(pControl->hIcon, hr, "Failed to load icon: %ls.", sczIconFile);
1857 } 1942 }
1858 1943
1944 ThmExitOnUnexpectedAttribute(hr, pElement, L"CommandLink", L"SourceX");
1945 ThmExitOnUnexpectedAttribute(hr, pElement, L"CommandLink", L"SourceY");
1946
1859LExit: 1947LExit:
1860 ReleaseStr(sczImageFile); 1948 ReleaseStr(sczIconFile);
1861 ReleaseBSTR(bstr); 1949 ReleaseBSTR(bstr);
1862 1950
1863 return hr; 1951 return hr;
1864} 1952}
1865 1953
1866 1954
1955static HRESULT GetAttributeCoordinateOrDimension(
1956 __in IXMLDOMNode* pixn,
1957 __in LPCWSTR wzAttribute,
1958 __inout int* pnValue
1959 )
1960{
1961 HRESULT hr = S_OK;
1962 int nValue = 0;
1963 BOOL fXmlFound = FALSE;
1964
1965 hr = XmlGetAttributeInt32(pixn, wzAttribute, &nValue);
1966 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get coordinate or dimension attribute.");
1967
1968 if (!fXmlFound)
1969 {
1970 ExitFunction1(hr = E_NOTFOUND);
1971 }
1972 else if (abs(nValue) > SHORT_MAX)
1973 {
1974 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Invalid coordinate or dimension attribute value: %i", nValue);
1975 }
1976
1977 *pnValue = nValue;
1978
1979LExit:
1980 return hr;
1981}
1982
1983static HRESULT GetAttributeFontId(
1984 __in IXMLDOMNode* pixn,
1985 __in LPCWSTR wzAttribute,
1986 __inout DWORD* pdwValue
1987 )
1988{
1989 HRESULT hr = S_OK;
1990 DWORD dwValue = 0;
1991 BOOL fXmlFound = FALSE;
1992
1993 hr = XmlGetAttributeUInt32(pixn, wzAttribute, &dwValue);
1994 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get font id attribute.");
1995
1996 if (!fXmlFound)
1997 {
1998 ExitFunction1(hr = E_NOTFOUND);
1999 }
2000 else if (THEME_INVALID_ID == dwValue)
2001 {
2002 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Invalid font id value: %u", dwValue);
2003 }
2004
2005 *pdwValue = dwValue;
2006
2007LExit:
2008 return hr;
2009}
2010
2011static HRESULT ParseSourceXY(
2012 __in IXMLDOMNode* pixn,
2013 __in BOOL fAllowed,
2014 __inout int* pnX,
2015 __inout int* pnY
2016 )
2017{
2018 HRESULT hr = S_OK;
2019 BOOL fXFound = FALSE;
2020 BOOL fYFound = FALSE;
2021
2022 hr = GetAttributeCoordinateOrDimension(pixn, L"SourceX", pnX);
2023 ThmExitOnOptionalXmlQueryFailure(hr, fXFound, "Failed to get SourceX attribute.");
2024
2025 if (!fXFound)
2026 {
2027 *pnX = -1;
2028 }
2029 else
2030 {
2031 if (!fAllowed)
2032 {
2033 ThmExitWithRootFailure(hr, E_INVALIDDATA, "SourceX cannot be specified without an image specified on Theme.");
2034 }
2035 else if (0 > *pnX)
2036 {
2037 ThmExitWithRootFailure(hr, E_INVALIDDATA, "SourceX must be non-negative.");
2038 }
2039 }
2040
2041 hr = GetAttributeCoordinateOrDimension(pixn, L"SourceY", pnY);
2042 ThmExitOnOptionalXmlQueryFailure(hr, fYFound, "Failed to get SourceY attribute.");
2043
2044 if (!fYFound)
2045 {
2046 if (fXFound)
2047 {
2048 ThmExitWithRootFailure(hr, E_INVALIDDATA, "SourceY must be specified with SourceX.");
2049 }
2050
2051 *pnY = -1;
2052 hr = E_NOTFOUND;
2053 }
2054 else
2055 {
2056 if (!fAllowed)
2057 {
2058 ThmExitWithRootFailure(hr, E_INVALIDDATA, "SourceY cannot be specified without an image specified on Theme.");
2059 }
2060 else if (!fXFound)
2061 {
2062 ThmExitWithRootFailure(hr, E_INVALIDDATA, "SourceY must be specified with SourceX.");
2063 }
2064 else if (0 > *pnY)
2065 {
2066 ThmExitWithRootFailure(hr, E_INVALIDDATA, "SourceY must be non-negative.");
2067 }
2068 }
2069
2070LExit:
2071 return hr;
2072}
2073
1867static HRESULT ParseWindow( 2074static HRESULT ParseWindow(
1868 __in_opt HMODULE hModule, 2075 __in_opt HMODULE hModule,
1869 __in_opt LPCWSTR wzRelativePath, 2076 __in_opt LPCWSTR wzRelativePath,
@@ -1873,77 +2080,79 @@ static HRESULT ParseWindow(
1873{ 2080{
1874 HRESULT hr = S_OK; 2081 HRESULT hr = S_OK;
1875 IXMLDOMNode* pixn = NULL; 2082 IXMLDOMNode* pixn = NULL;
1876 DWORD dwValue = 0; 2083 BOOL fXmlFound = FALSE;
2084 int nValue = 0;
1877 BSTR bstr = NULL; 2085 BSTR bstr = NULL;
1878 LPWSTR sczIconFile = NULL; 2086 LPWSTR sczIconFile = NULL;
1879 2087
1880 hr = XmlSelectSingleNode(pElement, L"Window", &pixn); 2088 hr = XmlSelectSingleNode(pElement, L"Window", &pixn);
1881 if (S_FALSE == hr) 2089 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to find window element.");
1882 {
1883 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
1884 }
1885 ThmExitOnFailure(hr, "Failed to find window element.");
1886 2090
1887 hr = XmlGetYesNoAttribute(pixn, L"AutoResize", &pTheme->fAutoResize); 2091 hr = XmlGetYesNoAttribute(pixn, L"AutoResize", &pTheme->fAutoResize);
1888 if (E_NOTFOUND == hr) 2092 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get window AutoResize attribute.");
1889 {
1890 hr = S_OK;
1891 }
1892 ThmExitOnFailure(hr, "Failed to get window AutoResize attribute.");
1893
1894 hr = XmlGetAttributeNumber(pixn, L"Width", &dwValue);
1895 if (S_FALSE == hr)
1896 {
1897 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
1898 ThmExitOnRootFailure(hr, "Failed to find window Width attribute.");
1899 }
1900 ThmExitOnFailure(hr, "Failed to get window Width attribute.");
1901 2093
1902 pTheme->nWidth = pTheme->nDefaultDpiWidth = pTheme->nWindowWidth = dwValue; 2094 hr = GetAttributeCoordinateOrDimension(pixn, L"Width", &nValue);
2095 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to get window Width attribute.");
1903 2096
1904 hr = XmlGetAttributeNumber(pixn, L"Height", &dwValue); 2097 if (1 > nValue)
1905 if (S_FALSE == hr)
1906 { 2098 {
1907 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); 2099 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Window/@Width must be positive: %i", nValue);
1908 ThmExitOnRootFailure(hr, "Failed to find window Height attribute.");
1909 } 2100 }
1910 ThmExitOnFailure(hr, "Failed to get window Height attribute.");
1911 2101
1912 pTheme->nHeight = pTheme->nDefaultDpiHeight = pTheme->nWindowHeight = dwValue; 2102 pTheme->nWidth = pTheme->nDefaultDpiWidth = pTheme->nWindowWidth = nValue;
1913 2103
1914 hr = XmlGetAttributeNumber(pixn, L"MinimumWidth", &dwValue); 2104 hr = GetAttributeCoordinateOrDimension(pixn, L"Height", &nValue);
1915 if (S_FALSE == hr) 2105 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to get window Height attribute.");
2106
2107 if (1 > nValue)
1916 { 2108 {
1917 dwValue = 0; 2109 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Window/@Height must be positive: %i", nValue);
1918 hr = S_OK;
1919 } 2110 }
1920 ThmExitOnFailure(hr, "Failed to get window MinimumWidth attribute.");
1921 2111
1922 pTheme->nMinimumWidth = pTheme->nDefaultDpiMinimumWidth = dwValue; 2112 pTheme->nHeight = pTheme->nDefaultDpiHeight = pTheme->nWindowHeight = nValue;
1923 2113
1924 hr = XmlGetAttributeNumber(pixn, L"MinimumHeight", &dwValue); 2114 hr = GetAttributeCoordinateOrDimension(pixn, L"MinimumWidth", &nValue);
1925 if (S_FALSE == hr) 2115 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get window MinimumWidth attribute.");
2116
2117 if (fXmlFound)
1926 { 2118 {
1927 dwValue = 0; 2119 if (!pTheme->fAutoResize)
1928 hr = S_OK; 2120 {
2121 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Window/@MinimumWidth can't be specified unless AutoResize is enabled.");
2122 }
2123 else if (1 > nValue || pTheme->nWidth < nValue)
2124 {
2125 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Window/@MinimumWidth must be positive and not greater than Window/@Width: %i", nValue);
2126 }
2127
2128 pTheme->nMinimumWidth = pTheme->nDefaultDpiMinimumWidth = nValue;
1929 } 2129 }
1930 ThmExitOnFailure(hr, "Failed to get window MinimumHeight attribute.");
1931 2130
1932 pTheme->nMinimumHeight = pTheme->nDefaultDpiMinimumHeight = dwValue; 2131 hr = GetAttributeCoordinateOrDimension(pixn, L"MinimumHeight", &nValue);
2132 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get window MinimumHeight attribute.");
1933 2133
1934 hr = XmlGetAttributeNumber(pixn, L"FontId", &pTheme->dwFontId); 2134 if (fXmlFound)
1935 if (S_FALSE == hr)
1936 { 2135 {
1937 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); 2136 if (!pTheme->fAutoResize)
1938 ThmExitOnRootFailure(hr, "Failed to find window FontId attribute."); 2137 {
2138 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Window/@MinimumHeight can't be specified unless AutoResize is enabled.");
2139 }
2140 else if (1 > nValue || pTheme->nHeight < nValue)
2141 {
2142 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Window/@MinimumHeight must be positive and not greater than Window/@Height: %i", nValue);
2143 }
2144
2145 pTheme->nMinimumHeight = pTheme->nDefaultDpiMinimumHeight = nValue;
1939 } 2146 }
1940 ThmExitOnFailure(hr, "Failed to get window FontId attribute."); 2147
2148 hr = GetAttributeFontId(pixn, L"FontId", &pTheme->dwFontId);
2149 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to get window FontId attribute.");
1941 2150
1942 // Get the optional window icon from a resource. 2151 // Get the optional window icon from a resource.
1943 hr = XmlGetAttribute(pixn, L"IconResource", &bstr); 2152 hr = XmlGetAttribute(pixn, L"IconResource", &bstr);
1944 ThmExitOnFailure(hr, "Failed to get window IconResource attribute."); 2153 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get window IconResource attribute.");
1945 2154
1946 if (S_OK == hr) 2155 if (fXmlFound)
1947 { 2156 {
1948 pTheme->hIcon = ::LoadIconW(hModule, bstr); 2157 pTheme->hIcon = ::LoadIconW(hModule, bstr);
1949 ThmExitOnNullWithLastError(pTheme->hIcon, hr, "Failed to load window icon from IconResource."); 2158 ThmExitOnNullWithLastError(pTheme->hIcon, hr, "Failed to load window icon from IconResource.");
@@ -1953,10 +2162,15 @@ static HRESULT ParseWindow(
1953 2162
1954 // Get the optional window icon from a file. 2163 // Get the optional window icon from a file.
1955 hr = XmlGetAttribute(pixn, L"IconFile", &bstr); 2164 hr = XmlGetAttribute(pixn, L"IconFile", &bstr);
1956 ThmExitOnFailure(hr, "Failed to get window IconFile attribute."); 2165 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get window IconFile attribute.");
1957 2166
1958 if (S_OK == hr) 2167 if (fXmlFound)
1959 { 2168 {
2169 if (pTheme->hIcon)
2170 {
2171 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Window/@IconFile can't be specified with IconResource.");
2172 }
2173
1960 if (wzRelativePath) 2174 if (wzRelativePath)
1961 { 2175 {
1962 hr = PathConcat(wzRelativePath, bstr, &sczIconFile); 2176 hr = PathConcat(wzRelativePath, bstr, &sczIconFile);
@@ -1974,48 +2188,37 @@ static HRESULT ParseWindow(
1974 ReleaseNullBSTR(bstr); 2188 ReleaseNullBSTR(bstr);
1975 } 2189 }
1976 2190
1977 hr = XmlGetAttributeNumber(pixn, L"SourceX", reinterpret_cast<DWORD*>(&pTheme->nSourceX)); 2191 hr = ParseSourceXY(pixn, NULL != pTheme->hImage, &pTheme->nSourceX, &pTheme->nSourceY);
1978 if (S_FALSE == hr) 2192 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get window SourceX and SourceY attributes.");
1979 {
1980 pTheme->nSourceX = -1;
1981 }
1982 ThmExitOnFailure(hr, "Failed to get window SourceX attribute.");
1983
1984 hr = XmlGetAttributeNumber(pixn, L"SourceY", reinterpret_cast<DWORD*>(&pTheme->nSourceY));
1985 if (S_FALSE == hr)
1986 {
1987 pTheme->nSourceY = -1;
1988 }
1989 ThmExitOnFailure(hr, "Failed to get window SourceY attribute.");
1990 2193
1991 // Parse the optional window style. 2194 // Parse the optional window style.
1992 hr = XmlGetAttributeNumberBase(pixn, L"HexStyle", 16, &pTheme->dwStyle); 2195 hr = XmlGetAttributeNumberBase(pixn, L"HexStyle", 16, &pTheme->dwStyle);
1993 ThmExitOnFailure(hr, "Failed to get theme window style (Window@HexStyle) attribute."); 2196 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get theme window style (Window@HexStyle) attribute.");
1994 2197
1995 if (S_FALSE == hr) 2198 if (!fXmlFound)
1996 { 2199 {
1997 pTheme->dwStyle = WS_VISIBLE | WS_MINIMIZEBOX | WS_SYSMENU; 2200 pTheme->dwStyle = WS_VISIBLE | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION;
1998 pTheme->dwStyle |= (0 <= pTheme->nSourceX && 0 <= pTheme->nSourceY) ? WS_POPUP : WS_OVERLAPPED; 2201 pTheme->dwStyle |= (0 <= pTheme->nSourceX && 0 <= pTheme->nSourceY) ? WS_POPUP : WS_OVERLAPPED;
1999 } 2202 }
2000 2203
2001 hr = XmlGetAttributeNumber(pixn, L"StringId", reinterpret_cast<DWORD*>(&pTheme->uStringId)); 2204 hr = XmlGetAttributeUInt32(pixn, L"StringId", reinterpret_cast<DWORD*>(&pTheme->uStringId));
2002 ThmExitOnFailure(hr, "Failed to get window StringId attribute."); 2205 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get window StringId attribute.");
2003 2206
2004 if (S_FALSE == hr) 2207 if (!fXmlFound)
2005 { 2208 {
2006 pTheme->uStringId = UINT_MAX; 2209 pTheme->uStringId = UINT_MAX;
2210 }
2211 else if (UINT_MAX == pTheme->uStringId)
2212 {
2213 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Invalid StringId: %u", pTheme->uStringId);
2214 }
2007 2215
2008 hr = XmlGetAttribute(pixn, L"Caption", &bstr); 2216 hr = XmlGetAttributeEx(pixn, L"Caption", &pTheme->sczCaption);
2009 ThmExitOnFailure(hr, "Failed to get window Caption attribute."); 2217 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get window Caption attribute.");
2010
2011 if (S_FALSE == hr)
2012 {
2013 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2014 ThmExitOnRootFailure(hr, "Window elements must contain the Caption or StringId attribute.");
2015 }
2016 2218
2017 hr = StrAllocString(&pTheme->sczCaption, bstr, 0); 2219 if (fXmlFound && UINT_MAX != pTheme->uStringId || !fXmlFound && UINT_MAX == pTheme->uStringId)
2018 ThmExitOnFailure(hr, "Failed to copy window Caption attribute."); 2220 {
2221 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Window elements must contain either the Caption or StringId attribute.");
2019 } 2222 }
2020 2223
2021 // Parse any image lists. 2224 // Parse any image lists.
@@ -2049,6 +2252,7 @@ static HRESULT ParseFonts(
2049 IXMLDOMNode* pixn = NULL; 2252 IXMLDOMNode* pixn = NULL;
2050 BSTR bstrName = NULL; 2253 BSTR bstrName = NULL;
2051 DWORD dwId = 0; 2254 DWORD dwId = 0;
2255 BOOL fXmlFound = FALSE;
2052 COLORREF crForeground = THEME_INVISIBLE_COLORREF; 2256 COLORREF crForeground = THEME_INVISIBLE_COLORREF;
2053 COLORREF crBackground = THEME_INVISIBLE_COLORREF; 2257 COLORREF crBackground = THEME_INVISIBLE_COLORREF;
2054 DWORD dwSystemForegroundColor = FALSE; 2258 DWORD dwSystemForegroundColor = FALSE;
@@ -2062,7 +2266,7 @@ static HRESULT ParseFonts(
2062 2266
2063 if (!pTheme->cFonts) 2267 if (!pTheme->cFonts)
2064 { 2268 {
2065 ExitFunction1(hr = S_OK); 2269 ThmExitOnRootFailure(hr = E_INVALIDDATA, "No font elements found.");
2066 } 2270 }
2067 2271
2068 pTheme->rgFonts = static_cast<THEME_FONT*>(MemAlloc(sizeof(THEME_FONT) * pTheme->cFonts, TRUE)); 2272 pTheme->rgFonts = static_cast<THEME_FONT*>(MemAlloc(sizeof(THEME_FONT) * pTheme->cFonts, TRUE));
@@ -2070,66 +2274,52 @@ static HRESULT ParseFonts(
2070 2274
2071 while (S_OK == (hr = XmlNextElement(pixnl, &pixn, NULL))) 2275 while (S_OK == (hr = XmlNextElement(pixnl, &pixn, NULL)))
2072 { 2276 {
2073 hr = XmlGetAttributeNumber(pixn, L"Id", &dwId); 2277 hr = GetAttributeFontId(pixn, L"Id", &dwId);
2074 if (S_FALSE == hr) 2278 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to find font id.");
2075 {
2076 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2077 }
2078 ThmExitOnFailure(hr, "Failed to find font id.");
2079 2279
2080 if (pTheme->cFonts <= dwId) 2280 if (pTheme->cFonts <= dwId)
2081 { 2281 {
2082 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); 2282 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Invalid theme font id: %u.", dwId);
2083 ThmExitOnRootFailure(hr, "Invalid theme font id.");
2084 } 2283 }
2085 2284
2086 THEME_FONT* pFont = pTheme->rgFonts + dwId; 2285 THEME_FONT* pFont = pTheme->rgFonts + dwId;
2087 if (pFont->cFontInstances) 2286 if (pFont->cFontInstances)
2088 { 2287 {
2089 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); 2288 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Theme font id duplicated.");
2090 ThmExitOnRootFailure(hr, "Theme font id duplicated.");
2091 } 2289 }
2092 2290
2093 pFont->lfQuality = CLEARTYPE_QUALITY; 2291 pFont->lfQuality = CLEARTYPE_QUALITY;
2094 2292
2095 hr = XmlGetText(pixn, &bstrName); 2293 hr = XmlGetText(pixn, &bstrName);
2096 if (S_FALSE == hr) 2294 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to get font name.");
2097 {
2098 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2099 }
2100 ThmExitOnFailure(hr, "Failed to get font name.");
2101 2295
2102 hr = StrAllocString(&pFont->sczFaceName, bstrName, 0); 2296 hr = StrAllocString(&pFont->sczFaceName, bstrName, 0);
2103 ThmExitOnFailure(hr, "Failed to copy font name."); 2297 ThmExitOnFailure(hr, "Failed to copy font name.");
2104 2298
2105 hr = XmlGetAttributeNumber(pixn, L"Height", reinterpret_cast<DWORD*>(&pFont->lfHeight)); 2299 hr = XmlGetAttributeInt32(pixn, L"Height", reinterpret_cast<int*>(&pFont->lfHeight));
2106 if (S_FALSE == hr) 2300 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to find font height attribute.");
2107 { 2301
2108 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); 2302 hr = XmlGetAttributeInt32(pixn, L"Weight", reinterpret_cast<int*>(&pFont->lfWeight));
2109 } 2303 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to find font weight attribute.");
2110 ThmExitOnFailure(hr, "Failed to find font height attribute.");
2111 2304
2112 hr = XmlGetAttributeNumber(pixn, L"Weight", reinterpret_cast<DWORD*>(&pFont->lfWeight)); 2305 if (!fXmlFound)
2113 if (S_FALSE == hr)
2114 { 2306 {
2115 pFont->lfWeight = FW_DONTCARE; 2307 pFont->lfWeight = FW_DONTCARE;
2116 hr = S_OK;
2117 } 2308 }
2118 ThmExitOnFailure(hr, "Failed to find font weight attribute.");
2119 2309
2120 hr = XmlGetYesNoAttribute(pixn, L"Underline", reinterpret_cast<BOOL*>(&pFont->lfUnderline)); 2310 hr = XmlGetYesNoAttribute(pixn, L"Underline", reinterpret_cast<BOOL*>(&pFont->lfUnderline));
2121 if (E_NOTFOUND == hr) 2311 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to find font underline attribute.");
2312
2313 if (!fXmlFound)
2122 { 2314 {
2123 pFont->lfUnderline = FALSE; 2315 pFont->lfUnderline = FALSE;
2124 hr = S_OK;
2125 } 2316 }
2126 ThmExitOnFailure(hr, "Failed to find font underline attribute.");
2127 2317
2128 hr = GetFontColor(pixn, L"Foreground", &crForeground, &dwSystemForegroundColor); 2318 hr = GetFontColor(pixn, L"Foreground", &crForeground, &dwSystemForegroundColor);
2129 ThmExitOnFailure(hr, "Failed to find font foreground color."); 2319 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to find font foreground color.");
2130 2320
2131 hr = GetFontColor(pixn, L"Background", &crBackground, &dwSystemBackgroundColor); 2321 hr = GetFontColor(pixn, L"Background", &crBackground, &dwSystemBackgroundColor);
2132 ThmExitOnFailure(hr, "Failed to find font background color."); 2322 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to find font background color.");
2133 2323
2134 pFont->crForeground = crForeground; 2324 pFont->crForeground = crForeground;
2135 if (THEME_INVISIBLE_COLORREF != pFont->crForeground) 2325 if (THEME_INVISIBLE_COLORREF != pFont->crForeground)
@@ -2173,16 +2363,18 @@ static HRESULT GetFontColor(
2173{ 2363{
2174 HRESULT hr = S_OK; 2364 HRESULT hr = S_OK;
2175 BSTR bstr = NULL; 2365 BSTR bstr = NULL;
2366 BOOL fXmlFound = FALSE;
2176 2367
2177 *pdwSystemColor = 0; 2368 *pdwSystemColor = 0;
2178 2369
2179 hr = XmlGetAttribute(pixn, wzAttributeName, &bstr); 2370 hr = XmlGetAttribute(pixn, wzAttributeName, &bstr);
2180 if (S_FALSE == hr) 2371 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to find font %ls color.", wzAttributeName);
2372
2373 if (!fXmlFound)
2181 { 2374 {
2182 *pColorRef = THEME_INVISIBLE_COLORREF; 2375 *pColorRef = THEME_INVISIBLE_COLORREF;
2183 ExitFunction1(hr = S_OK); 2376 ExitFunction1(hr = E_NOTFOUND);
2184 } 2377 }
2185 ThmExitOnFailure(hr, "Failed to find font %ls color.", wzAttributeName);
2186 2378
2187 if (pdwSystemColor) 2379 if (pdwSystemColor)
2188 { 2380 {
@@ -2220,7 +2412,12 @@ static HRESULT GetFontColor(
2220 } 2412 }
2221 else 2413 else
2222 { 2414 {
2223 *pColorRef = wcstoul(bstr, NULL, 16); 2415 *pColorRef = ::wcstoul(bstr, NULL, 16);
2416
2417 if (THEME_INVISIBLE_COLORREF == *pColorRef)
2418 {
2419 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Invalid %ls value: %ls.", wzAttributeName, bstr);
2420 }
2224 } 2421 }
2225 2422
2226 if (*pdwSystemColor) 2423 if (*pdwSystemColor)
@@ -2248,6 +2445,7 @@ static HRESULT ParsePages(
2248 BSTR bstrType = NULL; 2445 BSTR bstrType = NULL;
2249 THEME_PAGE* pPage = NULL; 2446 THEME_PAGE* pPage = NULL;
2250 DWORD iPage = 0; 2447 DWORD iPage = 0;
2448 BOOL fXmlFound = FALSE;
2251 2449
2252 hr = XmlSelectNodes(pElement, L"Page", &pixnl); 2450 hr = XmlSelectNodes(pElement, L"Page", &pixnl);
2253 ThmExitOnFailure(hr, "Failed to find page elements."); 2451 ThmExitOnFailure(hr, "Failed to find page elements.");
@@ -2270,11 +2468,7 @@ static HRESULT ParsePages(
2270 pPage->wId = static_cast<WORD>(iPage + 1); 2468 pPage->wId = static_cast<WORD>(iPage + 1);
2271 2469
2272 hr = XmlGetAttributeEx(pixn, L"Name", &pPage->sczName); 2470 hr = XmlGetAttributeEx(pixn, L"Name", &pPage->sczName);
2273 if (E_NOTFOUND == hr) 2471 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying page Name.");
2274 {
2275 hr = S_OK;
2276 }
2277 ThmExitOnFailure(hr, "Failed when querying page Name.");
2278 2472
2279 hr = ParseControls(hModule, wzRelativePath, pixn, pTheme, NULL, pPage); 2473 hr = ParseControls(hModule, wzRelativePath, pixn, pTheme, NULL, pPage);
2280 ThmExitOnFailure(hr, "Failed to parse page controls."); 2474 ThmExitOnFailure(hr, "Failed to parse page controls.");
@@ -2314,9 +2508,10 @@ static HRESULT ParseImageLists(
2314 IXMLDOMNode* pixnImage = NULL; 2508 IXMLDOMNode* pixnImage = NULL;
2315 DWORD dwImageListIndex = 0; 2509 DWORD dwImageListIndex = 0;
2316 DWORD dwImageCount = 0; 2510 DWORD dwImageCount = 0;
2511 THEME_IMAGELIST* pThemeImageList = NULL;
2512 BOOL fXmlFound = FALSE;
2317 HBITMAP hBitmap = NULL; 2513 HBITMAP hBitmap = NULL;
2318 BITMAP bm = { }; 2514 BITMAP bm = { };
2319 BSTR bstr = NULL;
2320 DWORD i = 0; 2515 DWORD i = 0;
2321 int iRetVal = 0; 2516 int iRetVal = 0;
2322 2517
@@ -2336,15 +2531,12 @@ static HRESULT ParseImageLists(
2336 2531
2337 while (S_OK == (hr = XmlNextElement(pixnlImageLists, &pixnImageList, NULL))) 2532 while (S_OK == (hr = XmlNextElement(pixnlImageLists, &pixnImageList, NULL)))
2338 { 2533 {
2339 hr = XmlGetAttribute(pixnImageList, L"Name", &bstr); 2534 pThemeImageList = pTheme->rgImageLists + dwImageListIndex;
2340 if (S_FALSE == hr) 2535 ++dwImageListIndex;
2341 { 2536 i = 0;
2342 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2343 }
2344 ThmExitOnFailure(hr, "Failed to find ImageList/@Name attribute.");
2345 2537
2346 hr = StrAllocString(&pTheme->rgImageLists[dwImageListIndex].sczName, bstr, 0); 2538 hr = XmlGetAttributeEx(pixnImageList, L"Name", &pThemeImageList->sczName);
2347 ThmExitOnFailure(hr, "Failed to make copy of ImageList name."); 2539 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to find ImageList/@Name attribute.");
2348 2540
2349 hr = XmlSelectNodes(pixnImageList, L"Image", &pixnlImages); 2541 hr = XmlSelectNodes(pixnImageList, L"Image", &pixnlImages);
2350 ThmExitOnFailure(hr, "Failed to select child Image nodes."); 2542 ThmExitOnFailure(hr, "Failed to select child Image nodes.");
@@ -2352,38 +2544,44 @@ static HRESULT ParseImageLists(
2352 hr = pixnlImages->get_length(reinterpret_cast<long*>(&dwImageCount)); 2544 hr = pixnlImages->get_length(reinterpret_cast<long*>(&dwImageCount));
2353 ThmExitOnFailure(hr, "Failed to count the number of images in list."); 2545 ThmExitOnFailure(hr, "Failed to count the number of images in list.");
2354 2546
2355 if (0 < dwImageCount) 2547 if (!dwImageCount)
2356 { 2548 {
2357 i = 0; 2549 ThmExitOnRootFailure(hr = E_INVALIDDATA, "ImageList '%ls' has no images.", pThemeImageList->sczName);
2358 while (S_OK == (hr = XmlNextElement(pixnlImages, &pixnImage, NULL))) 2550 }
2551
2552 while (S_OK == (hr = XmlNextElement(pixnlImages, &pixnImage, NULL)))
2553 {
2554 if (hBitmap)
2359 { 2555 {
2360 if (hBitmap) 2556 ::DeleteObject(hBitmap);
2361 { 2557 hBitmap = NULL;
2362 ::DeleteObject(hBitmap); 2558 }
2363 hBitmap = NULL;
2364 }
2365 hr = ParseImage(hModule, wzRelativePath, pixnImage, &hBitmap);
2366 ThmExitOnFailure(hr, "Failed to parse image: %u", i);
2367 2559
2368 if (0 == i) 2560 hr = GetAttributeImageFileOrResource(hModule, wzRelativePath, pixnImage, &hBitmap);
2369 { 2561 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to parse image list: '%ls', item: %u", pThemeImageList->sczName, i);
2370 ::GetObjectW(hBitmap, sizeof(BITMAP), &bm);
2371 2562
2372 pTheme->rgImageLists[dwImageListIndex].hImageList = ImageList_Create(bm.bmWidth, bm.bmHeight, ILC_COLOR24, dwImageCount, 0); 2563 if (!fXmlFound)
2373 ThmExitOnNullWithLastError(pTheme->rgImageLists[dwImageListIndex].hImageList, hr, "Failed to create image list."); 2564 {
2374 } 2565 ThmExitWithRootFailure(hr, E_INVALIDDATA, "Image list: '%ls', item %u didn't specify an image.", pThemeImageList->sczName, i);
2566 }
2375 2567
2376 iRetVal = ImageList_Add(pTheme->rgImageLists[dwImageListIndex].hImageList, hBitmap, NULL); 2568 if (0 == i)
2377 if (-1 == iRetVal) 2569 {
2378 { 2570 ::GetObjectW(hBitmap, sizeof(BITMAP), &bm);
2379 ThmExitWithLastError(hr, "Failed to add image %u to image list.", i);
2380 }
2381 2571
2382 ++i; 2572 pThemeImageList->hImageList = ImageList_Create(bm.bmWidth, bm.bmHeight, ILC_COLOR24, dwImageCount, 0);
2383 ReleaseNullObject(pixnImage); 2573 ThmExitOnNullWithLastError(pThemeImageList->hImageList, hr, "Failed to create image list.");
2384 } 2574 }
2575
2576 iRetVal = ImageList_Add(pThemeImageList->hImageList, hBitmap, NULL);
2577 if (-1 == iRetVal)
2578 {
2579 ThmExitWithLastError(hr, "Failed to add image %u to image list.", i);
2580 }
2581
2582 ++i;
2583 ReleaseNullObject(pixnImage);
2385 } 2584 }
2386 ++dwImageListIndex;
2387 2585
2388 ReleaseNullObject(pixnlImages); 2586 ReleaseNullObject(pixnlImages);
2389 ReleaseNullObject(pixnImageList); 2587 ReleaseNullObject(pixnImageList);
@@ -2394,7 +2592,6 @@ LExit:
2394 { 2592 {
2395 ::DeleteObject(hBitmap); 2593 ::DeleteObject(hBitmap);
2396 } 2594 }
2397 ReleaseBSTR(bstr);
2398 ReleaseObject(pixnlImageLists); 2595 ReleaseObject(pixnlImageLists);
2399 ReleaseObject(pixnImageList); 2596 ReleaseObject(pixnImageList);
2400 ReleaseObject(pixnlImages); 2597 ReleaseObject(pixnlImages);
@@ -2572,7 +2769,7 @@ static HRESULT ParseControls(
2572 THEME_CONTROL* pControl = *prgControls + iControl; 2769 THEME_CONTROL* pControl = *prgControls + iControl;
2573 pControl->type = type; 2770 pControl->type = type;
2574 2771
2575 hr = ParseControl(hModule, wzRelativePath, pixn, pTheme, pControl, pPage); 2772 hr = ParseControl(hModule, wzRelativePath, pixn, bstrType, pTheme, pControl, pPage);
2576 ThmExitOnFailure(hr, "Failed to parse control."); 2773 ThmExitOnFailure(hr, "Failed to parse control.");
2577 2774
2578 if (pPage) 2775 if (pPage)
@@ -2608,154 +2805,108 @@ static HRESULT ParseControl(
2608 __in_opt HMODULE hModule, 2805 __in_opt HMODULE hModule,
2609 __in_opt LPCWSTR wzRelativePath, 2806 __in_opt LPCWSTR wzRelativePath,
2610 __in IXMLDOMNode* pixn, 2807 __in IXMLDOMNode* pixn,
2808 __in_z LPCWSTR wzElementName,
2611 __in THEME* pTheme, 2809 __in THEME* pTheme,
2612 __in THEME_CONTROL* pControl, 2810 __in THEME_CONTROL* pControl,
2613 __in_opt THEME_PAGE* pPage 2811 __in_opt THEME_PAGE* pPage
2614 ) 2812 )
2615{ 2813{
2616 HRESULT hr = S_OK; 2814 HRESULT hr = S_OK;
2617 BOOL fFound = FALSE; 2815 BOOL fXmlFound = FALSE;
2618 DWORD dwValue = 0; 2816 DWORD dwValue = 0;
2817 int nValue = 0;
2619 BOOL fValue = FALSE; 2818 BOOL fValue = FALSE;
2620 BSTR bstrText = NULL; 2819 BSTR bstrText = NULL;
2621 BOOL fAnyTextChildren = FALSE; 2820 BOOL fAnyTextChildren = FALSE;
2622 BOOL fAnyNoteChildren = FALSE; 2821 BOOL fAnyNoteChildren = FALSE;
2623 BOOL fSkipDimensions = FALSE;
2624 2822
2625 InitializeThemeControl(pControl); 2823 InitializeThemeControl(pControl);
2626 2824
2627 hr = XmlGetAttributeEx(pixn, L"Name", &pControl->sczName); 2825 hr = XmlGetAttributeEx(pixn, L"Name", &pControl->sczName);
2628 if (E_NOTFOUND == hr) 2826 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control Name attribute.");
2629 {
2630 hr = S_OK;
2631 }
2632 ThmExitOnFailure(hr, "Failed when querying control Name attribute.");
2633 2827
2634 hr = XmlGetAttributeEx(pixn, L"EnableCondition", &pControl->sczEnableCondition); 2828 hr = XmlGetAttributeEx(pixn, L"EnableCondition", &pControl->sczEnableCondition);
2635 if (E_NOTFOUND == hr) 2829 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control EnableCondition attribute.");
2636 {
2637 hr = S_OK;
2638 }
2639 ThmExitOnFailure(hr, "Failed when querying control EnableCondition attribute.");
2640 2830
2641 hr = XmlGetAttributeEx(pixn, L"VisibleCondition", &pControl->sczVisibleCondition); 2831 hr = XmlGetAttributeEx(pixn, L"VisibleCondition", &pControl->sczVisibleCondition);
2642 if (E_NOTFOUND == hr) 2832 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control VisibleCondition attribute.");
2643 {
2644 hr = S_OK;
2645 }
2646 ThmExitOnFailure(hr, "Failed when querying control VisibleCondition attribute.");
2647
2648 if (!fSkipDimensions)
2649 {
2650 hr = XmlGetAttributeNumber(pixn, L"X", &dwValue);
2651 if (S_FALSE == hr)
2652 {
2653 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2654 }
2655 ThmExitOnFailure(hr, "Failed to find control X attribute.");
2656 2833
2657 pControl->nX = pControl->nDefaultDpiX = dwValue; 2834 hr = GetAttributeCoordinateOrDimension(pixn, L"X", &nValue);
2835 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to find control X attribute.");
2658 2836
2659 hr = XmlGetAttributeNumber(pixn, L"Y", &dwValue); 2837 pControl->nX = pControl->nDefaultDpiX = nValue;
2660 if (S_FALSE == hr)
2661 {
2662 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2663 }
2664 ThmExitOnFailure(hr, "Failed to find control Y attribute.");
2665 2838
2666 pControl->nY = pControl->nDefaultDpiY = dwValue; 2839 hr = GetAttributeCoordinateOrDimension(pixn, L"Y", &nValue);
2840 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to find control Y attribute.");
2667 2841
2668 hr = XmlGetAttributeNumber(pixn, L"Height", &dwValue); 2842 pControl->nY = pControl->nDefaultDpiY = nValue;
2669 if (S_FALSE == hr)
2670 {
2671 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2672 }
2673 ThmExitOnFailure(hr, "Failed to find control Height attribute.");
2674 2843
2675 pControl->nHeight = pControl->nDefaultDpiHeight = dwValue; 2844 hr = GetAttributeCoordinateOrDimension(pixn, L"Height", &nValue);
2845 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to find control Height attribute.");
2676 2846
2677 hr = XmlGetAttributeNumber(pixn, L"Width", &dwValue); 2847 pControl->nHeight = pControl->nDefaultDpiHeight = nValue;
2678 if (S_FALSE == hr)
2679 {
2680 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2681 }
2682 ThmExitOnFailure(hr, "Failed to find control Width attribute.");
2683 2848
2684 pControl->nWidth = pControl->nDefaultDpiWidth = dwValue; 2849 hr = GetAttributeCoordinateOrDimension(pixn, L"Width", &nValue);
2685 } 2850 ThmExitOnRequiredXmlQueryFailure(hr, "Failed to find control Width attribute.");
2686 2851
2687 // Parse the optional background resource image. 2852 pControl->nWidth = pControl->nDefaultDpiWidth = nValue;
2688 hr = ParseImage(hModule, wzRelativePath, pixn, &pControl->hImage);
2689 ThmExitOnFailure(hr, "Failed while parsing control image.");
2690 2853
2691 hr = XmlGetAttributeNumber(pixn, L"SourceX", reinterpret_cast<DWORD*>(&pControl->nSourceX)); 2854 switch (pControl->type)
2692 ThmExitOnFailure(hr, "Failed when querying control SourceX attribute."); 2855 {
2856 case THEME_CONTROL_TYPE_COMMANDLINK:
2857 hr = ParseCommandLinkImage(hModule, wzRelativePath, pixn, pControl);
2858 ThmExitOnFailure(hr, "Failed while parsing CommandLink image.");
2859 break;
2860 case THEME_CONTROL_TYPE_BUTTON:
2861 case THEME_CONTROL_TYPE_IMAGE:
2862 case THEME_CONTROL_TYPE_PROGRESSBAR:
2863 hr = ParseOwnerDrawImage(hModule, wzRelativePath, pTheme, pixn, pControl);
2864 ThmExitOnFailure(hr, "Failed while parsing OwnerDraw image.");
2865 break;
2866 default:
2867 ThmExitOnUnexpectedAttribute(hr, pixn, wzElementName, L"ImageId");
2868 ThmExitOnUnexpectedAttribute(hr, pixn, wzElementName, L"ImageFile");
2869 ThmExitOnUnexpectedAttribute(hr, pixn, wzElementName, L"ImageResource");
2870 ThmExitOnUnexpectedAttribute(hr, pixn, wzElementName, L"SourceX");
2871 ThmExitOnUnexpectedAttribute(hr, pixn, wzElementName, L"SourceY");
2872 break;
2873 }
2693 2874
2694 hr = XmlGetAttributeNumber(pixn, L"SourceY", reinterpret_cast<DWORD*>(&pControl->nSourceY));
2695 ThmExitOnFailure(hr, "Failed when querying control SourceY attribute.");
2696 2875
2697 hr = XmlGetAttributeNumber(pixn, L"FontId", &pControl->dwFontId); 2876 hr = GetAttributeFontId(pixn, L"FontId", &pControl->dwFontId);
2698 ThmExitOnFailure(hr, "Failed when querying control FontId attribute."); 2877 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control FontId attribute.");
2699 2878
2700 // Parse the optional window style. 2879 // Parse the optional window style.
2701 hr = XmlGetAttributeNumberBase(pixn, L"HexStyle", 16, &pControl->dwStyle); 2880 hr = XmlGetAttributeNumberBase(pixn, L"HexStyle", 16, &pControl->dwStyle);
2702 ThmExitOnFailure(hr, "Failed when querying control HexStyle attribute."); 2881 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control HexStyle attribute.");
2703 2882
2704 // Parse the tabstop bit "shortcut nomenclature", this could have been set with the style above. 2883 // Parse the tabstop bit "shortcut nomenclature", this could have been set with the style above.
2705 hr = XmlGetYesNoAttribute(pixn, L"TabStop", &fValue); 2884 hr = XmlGetYesNoAttribute(pixn, L"TabStop", &fValue);
2706 if (E_NOTFOUND == hr) 2885 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control TabStop attribute.");
2707 {
2708 hr = S_OK;
2709 }
2710 else
2711 {
2712 ThmExitOnFailure(hr, "Failed when querying control TabStop attribute.");
2713 2886
2714 if (fValue) 2887 if (fXmlFound && fValue)
2715 { 2888 {
2716 pControl->dwStyle |= WS_TABSTOP; 2889 pControl->dwStyle |= WS_TABSTOP;
2717 }
2718 } 2890 }
2719 2891
2720 hr = XmlGetYesNoAttribute(pixn, L"Visible", &fValue); 2892 hr = XmlGetYesNoAttribute(pixn, L"Visible", &fValue);
2721 if (E_NOTFOUND == hr) 2893 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control Visible attribute.");
2722 {
2723 hr = S_OK;
2724 }
2725 else
2726 {
2727 ThmExitOnFailure(hr, "Failed when querying control Visible attribute.");
2728 2894
2729 if (fValue) 2895 if (fXmlFound && fValue)
2730 { 2896 {
2731 pControl->dwStyle |= WS_VISIBLE; 2897 pControl->dwStyle |= WS_VISIBLE;
2732 }
2733 } 2898 }
2734 2899
2735 hr = XmlGetYesNoAttribute(pixn, L"HideWhenDisabled", &fValue); 2900 hr = XmlGetYesNoAttribute(pixn, L"HideWhenDisabled", &fValue);
2736 if (E_NOTFOUND == hr) 2901 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control HideWhenDisabled attribute.");
2737 {
2738 hr = S_OK;
2739 }
2740 else
2741 {
2742 ThmExitOnFailure(hr, "Failed when querying control HideWhenDisabled attribute.");
2743 2902
2744 if (fValue) 2903 if (fXmlFound && fValue)
2745 { 2904 {
2746 pControl->dwInternalStyle |= INTERNAL_CONTROL_STYLE_HIDE_WHEN_DISABLED; 2905 pControl->dwInternalStyle |= INTERNAL_CONTROL_STYLE_HIDE_WHEN_DISABLED;
2747 }
2748 } 2906 }
2749 2907
2750 hr = XmlGetYesNoAttribute(pixn, L"DisableAutomaticBehavior", &pControl->fDisableVariableFunctionality); 2908 hr = XmlGetYesNoAttribute(pixn, L"DisableAutomaticBehavior", &pControl->fDisableVariableFunctionality);
2751 if (E_NOTFOUND == hr) 2909 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control DisableAutomaticBehavior attribute.");
2752 {
2753 hr = S_OK;
2754 }
2755 else
2756 {
2757 ThmExitOnFailure(hr, "Failed when querying control DisableAutomaticBehavior attribute.");
2758 }
2759 2910
2760 hr = ParseActions(pixn, pControl); 2911 hr = ParseActions(pixn, pControl);
2761 ThmExitOnFailure(hr, "Failed to parse action nodes of the control."); 2912 ThmExitOnFailure(hr, "Failed to parse action nodes of the control.");
@@ -2774,10 +2925,10 @@ static HRESULT ParseControl(
2774 2925
2775 if (!fAnyTextChildren && !fAnyNoteChildren) 2926 if (!fAnyTextChildren && !fAnyNoteChildren)
2776 { 2927 {
2777 hr = XmlGetAttributeNumber(pixn, L"StringId", &dwValue); 2928 hr = XmlGetAttributeUInt32(pixn, L"StringId", &dwValue);
2778 ThmExitOnOptionalXmlQueryFailure(hr, fFound, "Failed when querying control StringId attribute."); 2929 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control StringId attribute.");
2779 2930
2780 if (fFound) 2931 if (fXmlFound)
2781 { 2932 {
2782 pControl->uStringId = dwValue; 2933 pControl->uStringId = dwValue;
2783 } 2934 }
@@ -2787,9 +2938,9 @@ static HRESULT ParseControl(
2787 if (THEME_CONTROL_TYPE_BILLBOARD != pControl->type && THEME_CONTROL_TYPE_PANEL != pControl->type) 2938 if (THEME_CONTROL_TYPE_BILLBOARD != pControl->type && THEME_CONTROL_TYPE_PANEL != pControl->type)
2788 { 2939 {
2789 hr = XmlGetText(pixn, &bstrText); 2940 hr = XmlGetText(pixn, &bstrText);
2790 ThmExitOnOptionalXmlQueryFailure(hr, fFound, "Failed to get control inner text."); 2941 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get control inner text.");
2791 2942
2792 if (fFound) 2943 if (fXmlFound)
2793 { 2944 {
2794 hr = StrAllocString(&pControl->sczText, bstrText, 0); 2945 hr = StrAllocString(&pControl->sczText, bstrText, 0);
2795 ThmExitOnFailure(hr, "Failed to copy control text."); 2946 ThmExitOnFailure(hr, "Failed to copy control text.");
@@ -2803,115 +2954,93 @@ static HRESULT ParseControl(
2803 if (THEME_CONTROL_TYPE_BILLBOARD == pControl->type) 2954 if (THEME_CONTROL_TYPE_BILLBOARD == pControl->type)
2804 { 2955 {
2805 hr = XmlGetYesNoAttribute(pixn, L"Loop", &pControl->fBillboardLoops); 2956 hr = XmlGetYesNoAttribute(pixn, L"Loop", &pControl->fBillboardLoops);
2806 if (E_NOTFOUND == hr) 2957 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying Billboard/@Loop attribute.");
2807 {
2808 hr = S_OK;
2809 }
2810 ThmExitOnFailure(hr, "Failed when querying Billboard/@Loop attribute.");
2811 2958
2812 pControl->wBillboardInterval = 5000; 2959 hr = XmlGetAttributeUInt16(pixn, L"Interval", &pControl->wBillboardInterval);
2813 hr = XmlGetAttributeNumber(pixn, L"Interval", &dwValue); 2960 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying Billboard/@Interval attribute.");
2814 if (S_OK == hr && dwValue) 2961
2962 if (!pControl->wBillboardInterval)
2815 { 2963 {
2816 pControl->wBillboardInterval = static_cast<WORD>(dwValue & 0xFFFF); 2964 pControl->wBillboardInterval = 5000;
2817 } 2965 }
2818 ThmExitOnFailure(hr, "Failed when querying Billboard/@Interval attribute.");
2819 2966
2820 hr = ParseBillboardPanels(hModule, wzRelativePath, pixn, pTheme, pControl, pPage); 2967 hr = ParseBillboardPanels(hModule, wzRelativePath, pixn, pTheme, pControl, pPage);
2821 ThmExitOnFailure(hr, "Failed to parse billboard children."); 2968 ThmExitOnFailure(hr, "Failed to parse billboard children.");
2822 } 2969 }
2823 else if (THEME_CONTROL_TYPE_COMMANDLINK == pControl->type)
2824 {
2825 hr = ParseIcon(hModule, wzRelativePath, pixn, &pControl->hIcon);
2826 ThmExitOnFailure(hr, "Failed while parsing control icon.");
2827 }
2828 else if (THEME_CONTROL_TYPE_EDITBOX == pControl->type) 2970 else if (THEME_CONTROL_TYPE_EDITBOX == pControl->type)
2829 { 2971 {
2830 hr = XmlGetYesNoAttribute(pixn, L"FileSystemAutoComplete", &fValue); 2972 hr = XmlGetYesNoAttribute(pixn, L"FileSystemAutoComplete", &fValue);
2831 if (E_NOTFOUND == hr) 2973 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying Editbox/@FileSystemAutoComplete attribute.");
2832 {
2833 hr = S_OK;
2834 }
2835 else
2836 {
2837 ThmExitOnFailure(hr, "Failed when querying Editbox/@FileSystemAutoComplete attribute.");
2838 2974
2839 if (fValue) 2975 if (fXmlFound && fValue)
2840 { 2976 {
2841 pControl->dwInternalStyle |= INTERNAL_CONTROL_STYLE_FILESYSTEM_AUTOCOMPLETE; 2977 pControl->dwInternalStyle |= INTERNAL_CONTROL_STYLE_FILESYSTEM_AUTOCOMPLETE;
2842 }
2843 } 2978 }
2844 } 2979 }
2845 else if (THEME_CONTROL_TYPE_HYPERLINK == pControl->type || THEME_CONTROL_TYPE_BUTTON == pControl->type) 2980 else if (THEME_CONTROL_TYPE_HYPERLINK == pControl->type || THEME_CONTROL_TYPE_BUTTON == pControl->type)
2846 { 2981 {
2847 hr = XmlGetAttributeNumber(pixn, L"HoverFontId", &pControl->dwFontHoverId); 2982 hr = GetAttributeFontId(pixn, L"HoverFontId", &pControl->dwFontHoverId);
2848 ThmExitOnFailure(hr, "Failed when querying control HoverFontId attribute."); 2983 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control HoverFontId attribute.");
2849 2984
2850 hr = XmlGetAttributeNumber(pixn, L"SelectedFontId", &pControl->dwFontSelectedId); 2985 hr = GetAttributeFontId(pixn, L"SelectedFontId", &pControl->dwFontSelectedId);
2851 ThmExitOnFailure(hr, "Failed when querying control SelectedFontId attribute."); 2986 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control SelectedFontId attribute.");
2852 } 2987 }
2853 else if (THEME_CONTROL_TYPE_LABEL == pControl->type) 2988 else if (THEME_CONTROL_TYPE_LABEL == pControl->type)
2854 { 2989 {
2855 hr = XmlGetYesNoAttribute(pixn, L"Center", &fValue); 2990 hr = XmlGetYesNoAttribute(pixn, L"Center", &fValue);
2856 if (E_NOTFOUND == hr) 2991 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying Label/@Center attribute.");
2857 { 2992
2858 hr = S_OK; 2993 if (fXmlFound && fValue)
2859 }
2860 else if (fValue)
2861 { 2994 {
2862 pControl->dwStyle |= SS_CENTER; 2995 pControl->dwStyle |= SS_CENTER;
2863 } 2996 }
2864 ThmExitOnFailure(hr, "Failed when querying Label/@Center attribute.");
2865 2997
2866 hr = XmlGetYesNoAttribute(pixn, L"DisablePrefix", &fValue); 2998 hr = XmlGetYesNoAttribute(pixn, L"DisablePrefix", &fValue);
2867 if (E_NOTFOUND == hr) 2999 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying Label/@DisablePrefix attribute.");
2868 { 3000
2869 hr = S_OK; 3001 if (fXmlFound && fValue)
2870 }
2871 else if (fValue)
2872 { 3002 {
2873 pControl->dwStyle |= SS_NOPREFIX; 3003 pControl->dwStyle |= SS_NOPREFIX;
2874 } 3004 }
2875 ThmExitOnFailure(hr, "Failed when querying Label/@DisablePrefix attribute.");
2876 } 3005 }
2877 else if (THEME_CONTROL_TYPE_LISTVIEW == pControl->type) 3006 else if (THEME_CONTROL_TYPE_LISTVIEW == pControl->type)
2878 { 3007 {
2879 // Parse the optional extended window style. 3008 // Parse the optional extended window style.
2880 hr = XmlGetAttributeNumberBase(pixn, L"HexExtendedStyle", 16, &pControl->dwExtendedStyle); 3009 hr = XmlGetAttributeNumberBase(pixn, L"HexExtendedStyle", 16, &pControl->dwExtendedStyle);
2881 ThmExitOnFailure(hr, "Failed when querying ListView/@HexExtendedStyle attribute."); 3010 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying ListView/@HexExtendedStyle attribute.");
2882 3011
2883 hr = XmlGetAttribute(pixn, L"ImageList", &bstrText); 3012 hr = XmlGetAttribute(pixn, L"ImageList", &bstrText);
2884 if (S_FALSE != hr) 3013 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying ListView/@ImageList attribute.");
2885 {
2886 ThmExitOnFailure(hr, "Failed when querying ListView/@ImageList attribute.");
2887 3014
3015 if (fXmlFound)
3016 {
2888 hr = FindImageList(pTheme, bstrText, &pControl->rghImageList[0]); 3017 hr = FindImageList(pTheme, bstrText, &pControl->rghImageList[0]);
2889 ThmExitOnFailure(hr, "Failed to find image list %ls while setting ImageList for ListView.", bstrText); 3018 ThmExitOnFailure(hr, "Failed to find image list %ls while setting ImageList for ListView.", bstrText);
2890 } 3019 }
2891 3020
2892 hr = XmlGetAttribute(pixn, L"ImageListSmall", &bstrText); 3021 hr = XmlGetAttribute(pixn, L"ImageListSmall", &bstrText);
2893 if (S_FALSE != hr) 3022 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying ListView/@ImageListSmall attribute.");
2894 {
2895 ThmExitOnFailure(hr, "Failed when querying ListView/@ImageListSmall attribute.");
2896 3023
3024 if (fXmlFound)
3025 {
2897 hr = FindImageList(pTheme, bstrText, &pControl->rghImageList[1]); 3026 hr = FindImageList(pTheme, bstrText, &pControl->rghImageList[1]);
2898 ThmExitOnFailure(hr, "Failed to find image list %ls while setting ImageListSmall for ListView.", bstrText); 3027 ThmExitOnFailure(hr, "Failed to find image list %ls while setting ImageListSmall for ListView.", bstrText);
2899 } 3028 }
2900 3029
2901 hr = XmlGetAttribute(pixn, L"ImageListState", &bstrText); 3030 hr = XmlGetAttribute(pixn, L"ImageListState", &bstrText);
2902 if (S_FALSE != hr) 3031 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying ListView/@ImageListState attribute.");
2903 {
2904 ThmExitOnFailure(hr, "Failed when querying ListView/@ImageListState attribute.");
2905 3032
3033 if (fXmlFound)
3034 {
2906 hr = FindImageList(pTheme, bstrText, &pControl->rghImageList[2]); 3035 hr = FindImageList(pTheme, bstrText, &pControl->rghImageList[2]);
2907 ThmExitOnFailure(hr, "Failed to find image list %ls while setting ImageListState for ListView.", bstrText); 3036 ThmExitOnFailure(hr, "Failed to find image list %ls while setting ImageListState for ListView.", bstrText);
2908 } 3037 }
2909 3038
2910 hr = XmlGetAttribute(pixn, L"ImageListGroupHeader", &bstrText); 3039 hr = XmlGetAttribute(pixn, L"ImageListGroupHeader", &bstrText);
2911 if (S_FALSE != hr) 3040 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying ListView/@ImageListGroupHeader attribute.");
2912 {
2913 ThmExitOnFailure(hr, "Failed when querying ListView/@ImageListGroupHeader attribute.");
2914 3041
3042 if (fXmlFound)
3043 {
2915 hr = FindImageList(pTheme, bstrText, &pControl->rghImageList[3]); 3044 hr = FindImageList(pTheme, bstrText, &pControl->rghImageList[3]);
2916 ThmExitOnFailure(hr, "Failed to find image list %ls while setting ImageListGroupHeader for ListView.", bstrText); 3045 ThmExitOnFailure(hr, "Failed to find image list %ls while setting ImageListGroupHeader for ListView.", bstrText);
2917 } 3046 }
@@ -2927,11 +3056,7 @@ static HRESULT ParseControl(
2927 else if (THEME_CONTROL_TYPE_RADIOBUTTON == pControl->type) 3056 else if (THEME_CONTROL_TYPE_RADIOBUTTON == pControl->type)
2928 { 3057 {
2929 hr = XmlGetAttributeEx(pixn, L"Value", &pControl->sczValue); 3058 hr = XmlGetAttributeEx(pixn, L"Value", &pControl->sczValue);
2930 if (E_NOTFOUND == hr) 3059 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying RadioButton/@Value attribute.");
2931 {
2932 hr = S_OK;
2933 }
2934 ThmExitOnFailure(hr, "Failed when querying RadioButton/@Value attribute.");
2935 } 3060 }
2936 else if (THEME_CONTROL_TYPE_TAB == pControl->type) 3061 else if (THEME_CONTROL_TYPE_TAB == pControl->type)
2937 { 3062 {
@@ -2943,70 +3068,52 @@ static HRESULT ParseControl(
2943 pControl->dwStyle |= TVS_DISABLEDRAGDROP; 3068 pControl->dwStyle |= TVS_DISABLEDRAGDROP;
2944 3069
2945 hr = XmlGetYesNoAttribute(pixn, L"EnableDragDrop", &fValue); 3070 hr = XmlGetYesNoAttribute(pixn, L"EnableDragDrop", &fValue);
2946 if (E_NOTFOUND == hr) 3071 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying TreeView/@EnableDragDrop attribute.");
2947 { 3072
2948 hr = S_OK; 3073 if (fXmlFound && fValue)
2949 }
2950 else if (fValue)
2951 { 3074 {
2952 pControl->dwStyle &= ~TVS_DISABLEDRAGDROP; 3075 pControl->dwStyle &= ~TVS_DISABLEDRAGDROP;
2953 } 3076 }
2954 ThmExitOnFailure(hr, "Failed when querying TreeView/@EnableDragDrop attribute.");
2955 3077
2956 hr = XmlGetYesNoAttribute(pixn, L"FullRowSelect", &fValue); 3078 hr = XmlGetYesNoAttribute(pixn, L"FullRowSelect", &fValue);
2957 if (E_NOTFOUND == hr) 3079 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying TreeView/@FullRowSelect attribute.");
2958 { 3080
2959 hr = S_OK; 3081 if (fXmlFound && fValue)
2960 }
2961 else if (fValue)
2962 { 3082 {
2963 pControl->dwStyle |= TVS_FULLROWSELECT; 3083 pControl->dwStyle |= TVS_FULLROWSELECT;
2964 } 3084 }
2965 ThmExitOnFailure(hr, "Failed when querying TreeView/@FullRowSelect attribute.");
2966 3085
2967 hr = XmlGetYesNoAttribute(pixn, L"HasButtons", &fValue); 3086 hr = XmlGetYesNoAttribute(pixn, L"HasButtons", &fValue);
2968 if (E_NOTFOUND == hr) 3087 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying TreeView/@HasButtons attribute.");
2969 { 3088
2970 hr = S_OK; 3089 if (fXmlFound && fValue)
2971 }
2972 else if (fValue)
2973 { 3090 {
2974 pControl->dwStyle |= TVS_HASBUTTONS; 3091 pControl->dwStyle |= TVS_HASBUTTONS;
2975 } 3092 }
2976 ThmExitOnFailure(hr, "Failed when querying TreeView/@HasButtons attribute.");
2977 3093
2978 hr = XmlGetYesNoAttribute(pixn, L"AlwaysShowSelect", &fValue); 3094 hr = XmlGetYesNoAttribute(pixn, L"AlwaysShowSelect", &fValue);
2979 if (E_NOTFOUND == hr) 3095 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying TreeView/@AlwaysShowSelect attribute.");
2980 { 3096
2981 hr = S_OK; 3097 if (fXmlFound && fValue)
2982 }
2983 else if (fValue)
2984 { 3098 {
2985 pControl->dwStyle |= TVS_SHOWSELALWAYS; 3099 pControl->dwStyle |= TVS_SHOWSELALWAYS;
2986 } 3100 }
2987 ThmExitOnFailure(hr, "Failed when querying TreeView/@AlwaysShowSelect attribute.");
2988 3101
2989 hr = XmlGetYesNoAttribute(pixn, L"LinesAtRoot", &fValue); 3102 hr = XmlGetYesNoAttribute(pixn, L"LinesAtRoot", &fValue);
2990 if (E_NOTFOUND == hr) 3103 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying TreeView/@LinesAtRoot attribute.");
2991 { 3104
2992 hr = S_OK; 3105 if (fXmlFound && fValue)
2993 }
2994 else if (fValue)
2995 { 3106 {
2996 pControl->dwStyle |= TVS_LINESATROOT; 3107 pControl->dwStyle |= TVS_LINESATROOT;
2997 } 3108 }
2998 ThmExitOnFailure(hr, "Failed when querying TreeView/@LinesAtRoot attribute.");
2999 3109
3000 hr = XmlGetYesNoAttribute(pixn, L"HasLines", &fValue); 3110 hr = XmlGetYesNoAttribute(pixn, L"HasLines", &fValue);
3001 if (E_NOTFOUND == hr) 3111 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying TreeView/@HasLines attribute.");
3002 { 3112
3003 hr = S_OK; 3113 if (fXmlFound && fValue)
3004 }
3005 else if (fValue)
3006 { 3114 {
3007 pControl->dwStyle |= TVS_HASLINES; 3115 pControl->dwStyle |= TVS_HASLINES;
3008 } 3116 }
3009 ThmExitOnFailure(hr, "Failed when querying TreeView/@HasLines attribute.");
3010 } 3117 }
3011 3118
3012LExit: 3119LExit:
@@ -3188,7 +3295,8 @@ static HRESULT ParseColumns(
3188 IXMLDOMNodeList* pixnl = NULL; 3295 IXMLDOMNodeList* pixnl = NULL;
3189 IXMLDOMNode* pixnChild = NULL; 3296 IXMLDOMNode* pixnChild = NULL;
3190 BSTR bstrText = NULL; 3297 BSTR bstrText = NULL;
3191 DWORD dwValue = 0; 3298 int nValue = 0;
3299 BOOL fXmlFound = FALSE;
3192 3300
3193 hr = XmlSelectNodes(pixn, L"Column", &pixnl); 3301 hr = XmlSelectNodes(pixn, L"Column", &pixnl);
3194 ThmExitOnFailure(hr, "Failed to select child column nodes."); 3302 ThmExitOnFailure(hr, "Failed to select child column nodes.");
@@ -3209,21 +3317,18 @@ static HRESULT ParseColumns(
3209 hr = XmlGetText(pixnChild, &bstrText); 3317 hr = XmlGetText(pixnChild, &bstrText);
3210 ThmExitOnFailure(hr, "Failed to get inner text of column element."); 3318 ThmExitOnFailure(hr, "Failed to get inner text of column element.");
3211 3319
3212 hr = XmlGetAttributeNumber(pixnChild, L"Width", &dwValue); 3320 hr = GetAttributeCoordinateOrDimension(pixnChild, L"Width", &nValue);
3213 if (S_FALSE == hr) 3321 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get column width attribute.");
3322
3323 if (!fXmlFound)
3214 { 3324 {
3215 dwValue = 100; 3325 nValue = 100;
3216 } 3326 }
3217 ThmExitOnFailure(hr, "Failed to get column width attribute.");
3218 3327
3219 pColumn->nBaseWidth = pColumn->nDefaultDpiBaseWidth = dwValue; 3328 pColumn->nBaseWidth = pColumn->nDefaultDpiBaseWidth = nValue;
3220 3329
3221 hr = XmlGetYesNoAttribute(pixnChild, L"Expands", reinterpret_cast<BOOL*>(&pColumn->fExpands)); 3330 hr = XmlGetYesNoAttribute(pixnChild, L"Expands", &pColumn->fExpands);
3222 if (E_NOTFOUND == hr) 3331 ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to get expands attribute.");
3223 {
3224 hr = S_OK;
3225 }
3226 ThmExitOnFailure(hr, "Failed to get expands attribute.");
3227 3332
3228 hr = StrAllocString(&pColumn->pszName, bstrText, 0); 3333 hr = StrAllocString(&pColumn->pszName, bstrText, 0);
3229 ThmExitOnFailure(hr, "Failed to copy column name."); 3334 ThmExitOnFailure(hr, "Failed to copy column name.");
@@ -3305,7 +3410,7 @@ static HRESULT ParseRadioButtons(
3305 pControl->type = THEME_CONTROL_TYPE_RADIOBUTTON; 3410 pControl->type = THEME_CONTROL_TYPE_RADIOBUTTON;
3306 *pcControls += 1; 3411 *pcControls += 1;
3307 3412
3308 hr = ParseControl(hModule, wzRelativePath, pixnChild, pTheme, pControl, pPage); 3413 hr = ParseControl(hModule, wzRelativePath, pixnChild, L"RadioButton", pTheme, pControl, pPage);
3309 ThmExitOnFailure(hr, "Failed to parse control."); 3414 ThmExitOnFailure(hr, "Failed to parse control.");
3310 3415
3311 if (fFirst) 3416 if (fFirst)
@@ -3472,7 +3577,7 @@ static HRESULT ParseTooltips(
3472 __in IXMLDOMNode* pixn, 3577 __in IXMLDOMNode* pixn,
3473 __in THEME_CONTROL* pControl, 3578 __in THEME_CONTROL* pControl,
3474 __inout BOOL* pfAnyChildren 3579 __inout BOOL* pfAnyChildren
3475) 3580 )
3476{ 3581{
3477 HRESULT hr = S_OK; 3582 HRESULT hr = S_OK;
3478 IXMLDOMNode* pixnChild = NULL; 3583 IXMLDOMNode* pixnChild = NULL;
@@ -3503,6 +3608,32 @@ LExit:
3503} 3608}
3504 3609
3505 3610
3611static HRESULT ParseUnexpectedAttribute(
3612 __in IXMLDOMNode* pixn,
3613 __in_z LPCWSTR wzElementName,
3614 __in_z LPCWSTR wzAttribute
3615 )
3616{
3617 HRESULT hr = S_OK;
3618 BSTR bstr = NULL;
3619
3620 hr = XmlGetAttribute(pixn, wzAttribute, &bstr);
3621 ThmExitOnFailure(hr, "Failed to get attribute %ls/@%ls", wzElementName, wzAttribute);
3622
3623 if (S_OK == hr)
3624 {
3625 ThmExitOnRootFailure(hr = E_INVALIDDATA, "Element '%ls' has unexpected attribute '%ls', value: %ls.", wzElementName, wzAttribute, bstr);
3626 }
3627
3628 hr = S_OK;
3629
3630LExit:
3631 ReleaseBSTR(bstr);
3632
3633 return hr;
3634}
3635
3636
3506static HRESULT ParseNotes( 3637static HRESULT ParseNotes(
3507 __in IXMLDOMNode* pixn, 3638 __in IXMLDOMNode* pixn,
3508 __in THEME_CONTROL* pControl, 3639 __in THEME_CONTROL* pControl,
diff --git a/src/libs/dutil/WixToolset.DUtil/xmlutil.cpp b/src/libs/dutil/WixToolset.DUtil/xmlutil.cpp
index 0f1e611d..2e1a2200 100644
--- a/src/libs/dutil/WixToolset.DUtil/xmlutil.cpp
+++ b/src/libs/dutil/WixToolset.DUtil/xmlutil.cpp
@@ -793,13 +793,13 @@ LExit:
793 793
794 794
795/******************************************************************** 795/********************************************************************
796 XmlGetAttributeLargeNumber 796 XmlGetAttributeUInt16
797 797
798*********************************************************************/ 798*********************************************************************/
799extern "C" HRESULT DAPI XmlGetAttributeLargeNumber( 799extern "C" HRESULT DAPI XmlGetAttributeUInt16(
800 __in IXMLDOMNode* pixnNode, 800 __in IXMLDOMNode* pixnNode,
801 __in_z LPCWSTR pwzAttribute, 801 __in_z LPCWSTR pwzAttribute,
802 __out DWORD64* pdw64Value 802 __out WORD* pwValue
803 ) 803 )
804{ 804{
805 HRESULT hr = S_OK; 805 HRESULT hr = S_OK;
@@ -810,15 +810,120 @@ extern "C" HRESULT DAPI XmlGetAttributeLargeNumber(
810 810
811 if (S_OK == hr) 811 if (S_OK == hr)
812 { 812 {
813 LONGLONG ll = 0; 813 WORD w = 0;
814 hr = StrStringToInt64(bstrValue, 0, &ll); 814 hr = StrStringToUInt16(bstrValue, 0, &w);
815 XmlExitOnFailure(hr, "Failed to treat attribute value as number."); 815 XmlExitOnFailure(hr, "Failed to treat attribute value as UInt16.");
816 816
817 *pdw64Value = ll; 817 *pwValue = w;
818 } 818 }
819 else 819 else
820 { 820 {
821 *pdw64Value = 0; 821 *pwValue = 0;
822 }
823
824LExit:
825 ReleaseBSTR(bstrValue);
826 return hr;
827}
828
829
830/********************************************************************
831 XmlGetAttributeInt32
832
833*********************************************************************/
834extern "C" HRESULT DAPI XmlGetAttributeInt32(
835 __in IXMLDOMNode* pixnNode,
836 __in_z LPCWSTR pwzAttribute,
837 __out int* piValue
838 )
839{
840 HRESULT hr = S_OK;
841 BSTR bstrValue = NULL;
842
843 hr = XmlGetAttribute(pixnNode, pwzAttribute, &bstrValue);
844 XmlExitOnFailure(hr, "failed XmlGetAttribute");
845
846 if (S_OK == hr)
847 {
848 int i = 0;
849 hr = StrStringToInt32(bstrValue, 0, &i);
850 XmlExitOnFailure(hr, "Failed to treat attribute value as Int32.");
851
852 *piValue = i;
853 }
854 else
855 {
856 *piValue = 0;
857 }
858
859LExit:
860 ReleaseBSTR(bstrValue);
861 return hr;
862}
863
864
865/********************************************************************
866 XmlGetAttributeUInt32
867
868*********************************************************************/
869extern "C" HRESULT DAPI XmlGetAttributeUInt32(
870 __in IXMLDOMNode* pixnNode,
871 __in_z LPCWSTR pwzAttribute,
872 __out DWORD* pdwValue
873 )
874{
875 HRESULT hr = S_OK;
876 BSTR bstrValue = NULL;
877
878 hr = XmlGetAttribute(pixnNode, pwzAttribute, &bstrValue);
879 XmlExitOnFailure(hr, "failed XmlGetAttribute");
880
881 if (S_OK == hr)
882 {
883 UINT dw = 0;
884 hr = StrStringToUInt32(bstrValue, 0, &dw);
885 XmlExitOnFailure(hr, "Failed to treat attribute value as UInt32.");
886
887 *pdwValue = dw;
888 }
889 else
890 {
891 *pdwValue = 0;
892 }
893
894LExit:
895 ReleaseBSTR(bstrValue);
896 return hr;
897}
898
899
900/********************************************************************
901 XmlGetAttributeUInt64
902
903*********************************************************************/
904extern "C" HRESULT DAPI XmlGetAttributeUInt64(
905 __in IXMLDOMNode* pixnNode,
906 __in_z LPCWSTR pwzAttribute,
907 __out DWORD64* pqwValue
908 )
909{
910 HRESULT hr = S_OK;
911 BSTR bstrValue = NULL;
912
913 hr = XmlGetAttribute(pixnNode, pwzAttribute, &bstrValue);
914 XmlExitOnFailure(hr, "failed XmlGetAttribute");
915
916 if (S_OK == hr)
917 {
918 DWORD64 qw = 0;
919 hr = StrStringToUInt64(bstrValue, 0, &qw);
920 XmlExitOnFailure(hr, "Failed to treat attribute value as UInt64.");
921
922 *pqwValue = qw;
923 }
924 else
925 {
926 *pqwValue = 0;
822 } 927 }
823 928
824LExit: 929LExit:
diff --git a/src/libs/dutil/WixToolset.DUtil/xsd/thmutil.xsd b/src/libs/dutil/WixToolset.DUtil/xsd/thmutil.xsd
deleted file mode 100644
index 46c20e4a..00000000
--- a/src/libs/dutil/WixToolset.DUtil/xsd/thmutil.xsd
+++ /dev/null
@@ -1,1188 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
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<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
6 xmlns:xse="http://wixtoolset.org/schemas/XmlSchemaExtension"
7 xmlns:html="http://www.w3.org/1999/xhtml"
8 targetNamespace="http://wixtoolset.org/schemas/v4/thmutil"
9 xmlns="http://wixtoolset.org/schemas/v4/thmutil">
10 <xs:annotation>
11 <xs:documentation>
12 Schema for describing Theme files processed by thmutil.
13 </xs:documentation>
14 </xs:annotation>
15
16 <xs:import namespace="http://www.w3.org/1999/xhtml" />
17
18 <xs:element name="Theme">
19 <xs:annotation>
20 <xs:documentation>
21 This is the top-level container element for every thmutil Theme file.
22 </xs:documentation>
23 </xs:annotation>
24 <xs:complexType>
25 <xs:sequence>
26 <xs:element ref="Font" maxOccurs="unbounded" />
27 <xs:element ref="Window" />
28 </xs:sequence>
29 <xs:attribute name="ImageFile" type="xs:string">
30 <xs:annotation>
31 <xs:documentation>
32 Relative path to an image file that can serve as a single source for images in the rest of the theme.
33 This image is referenced by controls using the SourceX and SourceY attributes.
34 Mutually exclusive with the ImageResource attribute.
35 </xs:documentation>
36 </xs:annotation>
37 </xs:attribute>
38 <xs:attribute name="ImageResource" type="xs:string">
39 <xs:annotation>
40 <xs:documentation>
41 Identifier that references an image resource in the module for the window.
42 Mutually exclusive with the ImageFile attribute.
43 </xs:documentation>
44 </xs:annotation>
45 </xs:attribute>
46 </xs:complexType>
47 </xs:element>
48
49 <xs:element name="Font">
50 <xs:annotation>
51 <xs:documentation>Defines a font including the size and color.</xs:documentation>
52 </xs:annotation>
53 <xs:complexType>
54 <xs:simpleContent>
55 <xs:extension base="xs:string">
56 <xs:annotation>
57 <xs:documentation>Name of the font face (required).</xs:documentation>
58 </xs:annotation>
59 <xs:attribute name="Id" type="xs:nonNegativeInteger" use="required">
60 <xs:annotation>
61 <xs:documentation>Numeric identifier for the font. Due to limitations in thmutil the first Font must start with "0" and each subsequent Font must increment the Id by 1. Failure to ensure the Font identifiers follow this strict ordering will create unexpected behavior or crashes.</xs:documentation>
62 </xs:annotation>
63 </xs:attribute>
64 <xs:attribute name="Height" type="xs:int" use="required">
65 <xs:annotation>
66 <xs:documentation>Font size. Use negative numbers to specify the font in pixels.</xs:documentation>
67 </xs:annotation>
68 </xs:attribute>
69 <xs:attribute name="Weight" type="xs:nonNegativeInteger">
70 <xs:annotation>
71 <xs:documentation>Font weight.</xs:documentation>
72 </xs:annotation>
73 </xs:attribute>
74 <xs:attribute name="Foreground" type="FontColorType">
75 <xs:annotation>
76 <xs:documentation>
77 A system color id or a hexadecimal value representing BGR foreground color of the font.
78 "ffffff" is white, "ff0000" is pure blue, "00ff00" is pure green, "0000ff" is pure red, and "000000" is black.
79 If this attribute is absent the foreground will be transparent.
80 Supported system color ids are: btnface, btntext, graytext, highlight, highlighttext, hotlight, window, and windowtext.
81 </xs:documentation>
82 </xs:annotation>
83 </xs:attribute>
84 <xs:attribute name="Background" type="FontColorType">
85 <xs:annotation>
86 <xs:documentation>
87 A system color id or a hexadecimal value representing BGR background color of the font.
88 "ffffff" is white, "ff0000" is pure blue, "00ff00" is pure green, "0000ff" is pure red, and "000000" is black.
89 If this attribute is absent the background will be transparent.
90 Supported system color ids are: btnface, btntext, graytext, highlight, highlighttext, hotlight, window, and windowtext.
91 </xs:documentation>
92 </xs:annotation>
93 </xs:attribute>
94 <xs:attribute name="Underline" type="YesNoType">
95 <xs:annotation>
96 <xs:documentation>Specifies whether the font is underlined.</xs:documentation>
97 </xs:annotation>
98 </xs:attribute>
99 </xs:extension>
100 </xs:simpleContent>
101 </xs:complexType>
102 </xs:element>
103
104 <xs:element name="ImageList">
105 <xs:annotation>
106 <xs:documentation>List of images which can be shared between multiple controls.</xs:documentation>
107 </xs:annotation>
108 <xs:complexType>
109 <xs:choice maxOccurs="unbounded">
110 <xs:element ref="Image" />
111 </xs:choice>
112 <xs:attribute name="Name" type="xs:string" use="required">
113 <xs:annotation>
114 <xs:documentation>
115 Name of the ImageList, to be referenced by other controls.
116 </xs:documentation>
117 </xs:annotation>
118 </xs:attribute>
119 </xs:complexType>
120 </xs:element>
121
122 <xs:element name="Page">
123 <xs:annotation>
124 <xs:documentation>Named set of controls that can be shown and hidden collectively.</xs:documentation>
125 </xs:annotation>
126 <xs:complexType>
127 <xs:group ref="ControlElements" maxOccurs="unbounded"/>
128 <xs:attribute name="Name" type="xs:string">
129 <xs:annotation>
130 <xs:documentation>
131 Optional name for the page.
132 </xs:documentation>
133 </xs:annotation>
134 </xs:attribute>
135 </xs:complexType>
136 </xs:element>
137
138 <xs:element name="Window">
139 <xs:annotation>
140 <xs:documentation>Defines the overall look of the main window.</xs:documentation>
141 </xs:annotation>
142 <xs:complexType>
143 <xs:choice minOccurs="0" maxOccurs="unbounded">
144 <xs:element ref="ImageList" />
145 <xs:element ref="Page" />
146 <xs:group ref="ControlElements" minOccurs="0" maxOccurs="unbounded" />
147 </xs:choice>
148 <xs:attribute name="AutoResize" type="YesNoType">
149 <xs:annotation>
150 <xs:documentation>Specifies whether the ThmUtil default window proc should process WM_SIZE and WM_SIZING events.</xs:documentation>
151 </xs:annotation>
152 </xs:attribute>
153 <xs:attribute name="Caption" type="xs:string">
154 <xs:annotation>
155 <xs:documentation>
156 Caption for the window.
157 This is required if not using the StringId attribute.
158 </xs:documentation>
159 </xs:annotation>
160 </xs:attribute>
161 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
162 <xs:annotation>
163 <xs:documentation>Numeric identifier to the Font element that serves as the default font for the window.</xs:documentation>
164 </xs:annotation>
165 </xs:attribute>
166 <xs:attribute name="Height" type="xs:positiveInteger" use="required">
167 <xs:annotation>
168 <xs:documentation>Height of the window's client area.</xs:documentation>
169 </xs:annotation>
170 </xs:attribute>
171 <xs:attribute name="HexStyle" type="xs:hexBinary">
172 <xs:annotation>
173 <xs:documentation>
174 Hexadecimal window style. If this is not specified the default value is: WS_OVERLAPPED | WS_VISIBLE | WS_MINIMIZEBOX | WS_SYSMENU.
175 If SourceX and SourceY are specified, then WS_OVERLAPPED is replaced with WS_POPUP.
176 </xs:documentation>
177 </xs:annotation>
178 </xs:attribute>
179 <xs:attribute name="IconFile" type="xs:string">
180 <xs:annotation>
181 <xs:documentation>Relative path to an icon file for the window. Mutually exclusive with IconResource and SourceX and SourceY attributes.</xs:documentation>
182 </xs:annotation>
183 </xs:attribute>
184 <xs:attribute name="IconResource" type="xs:string">
185 <xs:annotation>
186 <xs:documentation>
187 Identifier that references an icon resource in the module for the icon for the window.
188 Mutually exclusive with IconFile and SourceX and SourceY attributes.
189 </xs:documentation>
190 </xs:annotation>
191 </xs:attribute>
192 <xs:attribute name="MinimumHeight" type="xs:positiveInteger">
193 <xs:annotation>
194 <xs:documentation>Minimum height of the window. Only functions if AutoResize is enabled.</xs:documentation>
195 </xs:annotation>
196 </xs:attribute>
197 <xs:attribute name="MinimumWidth" type="xs:positiveInteger">
198 <xs:annotation>
199 <xs:documentation>Minimum width of the window. Only functions if AutoResize is enabled.</xs:documentation>
200 </xs:annotation>
201 </xs:attribute>
202 <xs:attribute name="SourceX" type="xs:nonNegativeInteger">
203 <xs:annotation>
204 <xs:documentation>X offset of the window background in the Theme/@ImageFile. Mutually exclusive with IconFile and IconResource.</xs:documentation>
205 </xs:annotation>
206 </xs:attribute>
207 <xs:attribute name="SourceY" type="xs:nonNegativeInteger">
208 <xs:annotation>
209 <xs:documentation>Y offset of the window background in the Theme/@ImageFile. Mutually exclusive with IconFile and IconResource.</xs:documentation>
210 </xs:annotation>
211 </xs:attribute>
212 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
213 <xs:annotation>
214 <xs:documentation>
215 Identifier that references a string resource in the module to define the window caption.
216 Mutually exclusive with the Caption attribute.
217 </xs:documentation>
218 </xs:annotation>
219 </xs:attribute>
220 <xs:attribute name="Width" type="xs:positiveInteger" use="required">
221 <xs:annotation>
222 <xs:documentation>Width of the window's client area.</xs:documentation>
223 </xs:annotation>
224 </xs:attribute>
225 </xs:complexType>
226 </xs:element>
227
228 <xs:element name="Billboard">
229 <xs:annotation>
230 <xs:documentation>Defines a control that rotates through a set of images on a specified interval.</xs:documentation>
231 </xs:annotation>
232 <xs:complexType>
233 <xs:sequence>
234 <xs:element ref="Image" />
235 </xs:sequence>
236 <xs:attributeGroup ref="CommonControlAttributes" />
237 <xs:attribute name="Interval" type="xs:positiveInteger">
238 <xs:annotation>
239 <xs:documentation>
240 Specifies the time to wait before showing the next image, in milliseconds.
241 </xs:documentation>
242 </xs:annotation>
243 </xs:attribute>
244 <xs:attribute name="Loop" type="YesNoType">
245 <xs:annotation>
246 <xs:documentation>Specifies whether the billboard should loop through the images infinitely.</xs:documentation>
247 </xs:annotation>
248 </xs:attribute>
249 </xs:complexType>
250 </xs:element>
251
252 <xs:element name="Button">
253 <xs:annotation>
254 <xs:documentation>Defines a button.</xs:documentation>
255 </xs:annotation>
256 <xs:complexType mixed="true">
257 <xs:annotation>
258 <xs:documentation>
259 Text to display in the button.
260 Mutually exclusive with the StringId attribute and child Text elements.
261 </xs:documentation>
262 </xs:annotation>
263 <xs:choice minOccurs="0" maxOccurs="unbounded">
264 <xs:annotation>
265 <xs:documentation>
266 If multiple Action elements are given, the conditions should be mutually exclusive (when multiple conditions are true, the behavior is undefined and could be changed at any time).
267 If none of the conditions of the Action elements are true, then it uses the Action element without the Condition attribute.
268 </xs:documentation>
269 </xs:annotation>
270 <xs:element ref="BrowseDirectoryAction" />
271 <xs:element ref="ChangePageAction" />
272 <xs:element ref="CloseWindowAction" />
273 <xs:element ref="Text" />
274 <xs:element ref="Tooltip" maxOccurs="1" />
275 </xs:choice>
276 <xs:attributeGroup ref="CommonControlAttributes" />
277 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
278 <xs:annotation>
279 <xs:documentation>Numeric identifier to the Font element that serves as the font for the control. Only valid when using graphic buttons.</xs:documentation>
280 </xs:annotation>
281 </xs:attribute>
282 <xs:attribute name="HoverFontId" type="xs:nonNegativeInteger">
283 <xs:annotation>
284 <xs:documentation>Numeric identifier to the Font element that serves as the font when the control is hovered over. Only valid when using graphic buttons.</xs:documentation>
285 </xs:annotation>
286 </xs:attribute>
287 <xs:attribute name="ImageFile" type="xs:string">
288 <xs:annotation>
289 <xs:documentation>
290 Relative path to an image file to define a graphic button.
291 The image must be 4x the height to represent the button in 4 states: unselected, hover, selected, focused.
292 Mutually exclusive with ImageResource and SourceX and SourceY attributes.
293 </xs:documentation>
294 </xs:annotation>
295 </xs:attribute>
296 <xs:attribute name="ImageResource" type="xs:string">
297 <xs:annotation>
298 <xs:documentation>
299 Identifier that references an image resource in the module to define a graphic button.
300 The image must be 4x the height to represent the button in 4 states: unselected, hover, selected, focused.
301 Mutually exclusive with ImageFile and SourceX and SourceY attributes.
302 </xs:documentation>
303 </xs:annotation>
304 </xs:attribute>
305 <xs:attribute name="SelectedFontId" type="xs:nonNegativeInteger">
306 <xs:annotation>
307 <xs:documentation>Numeric identifier to the Font element that serves as the font when the control is selected. Only valid when using graphic buttons.</xs:documentation>
308 </xs:annotation>
309 </xs:attribute>
310 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
311 <xs:annotation>
312 <xs:documentation>
313 Identifier that references a string resource in the module to define the text for the control.
314 </xs:documentation>
315 </xs:annotation>
316 </xs:attribute>
317 </xs:complexType>
318 </xs:element>
319
320 <xs:element name="BrowseDirectoryAction">
321 <xs:annotation>
322 <xs:documentation>
323 When the button is pressed, a directory browser dialog is shown.
324 </xs:documentation>
325 </xs:annotation>
326 <xs:complexType>
327 <xs:attribute name="Condition" type="xs:string">
328 <xs:annotation>
329 <xs:documentation>
330 The condition that determines if the parent control will execute this action.
331 </xs:documentation>
332 </xs:annotation>
333 </xs:attribute>
334 <xs:attribute name="VariableName" type="xs:string" use="required">
335 <xs:annotation>
336 <xs:documentation>
337 The name of the variable to update when the user selects a directory from the dialog.
338 </xs:documentation>
339 </xs:annotation>
340 </xs:attribute>
341 </xs:complexType>
342 </xs:element>
343
344 <xs:element name="ChangePageAction">
345 <xs:annotation>
346 <xs:documentation>
347 When the button is pressed, the specified page is shown.
348 </xs:documentation>
349 </xs:annotation>
350 <xs:complexType>
351 <xs:attribute name="Cancel" type="YesNoType">
352 <xs:annotation>
353 <xs:documentation>
354 When set to 'yes', none of the variable changes made on the current page are saved.
355 </xs:documentation>
356 </xs:annotation>
357 </xs:attribute>
358 <xs:attribute name="Condition" type="xs:string">
359 <xs:annotation>
360 <xs:documentation>
361 The condition that determines if the parent control will execute this action.
362 </xs:documentation>
363 </xs:annotation>
364 </xs:attribute>
365 <xs:attribute name="Page" type="xs:string" use="required">
366 <xs:annotation>
367 <xs:documentation>
368 The Name of the Page to show.
369 </xs:documentation>
370 </xs:annotation>
371 </xs:attribute>
372 </xs:complexType>
373 </xs:element>
374
375 <xs:element name="CloseWindowAction">
376 <xs:annotation>
377 <xs:documentation>
378 When the button is pressed, the WM_CLOSE message is sent to the window.
379 </xs:documentation>
380 </xs:annotation>
381 <xs:complexType>
382 <xs:attribute name="Condition" type="xs:string">
383 <xs:annotation>
384 <xs:documentation>
385 The condition that determines if the parent control will execute this action.
386 </xs:documentation>
387 </xs:annotation>
388 </xs:attribute>
389 </xs:complexType>
390 </xs:element>
391
392 <xs:element name="Checkbox">
393 <xs:annotation>
394 <xs:documentation>Defines a checkbox.</xs:documentation>
395 </xs:annotation>
396 <xs:complexType mixed="true">
397 <xs:annotation>
398 <xs:documentation>
399 Text to display beside the checkbox.
400 Mutually exclusive with the StringId attribute and child Text elements.
401 </xs:documentation>
402 </xs:annotation>
403 <xs:choice minOccurs="0" maxOccurs="unbounded">
404 <xs:element ref="Text" />
405 <xs:element ref="Tooltip" maxOccurs="1" />
406 </xs:choice>
407 <xs:attributeGroup ref="CommonControlAttributes" />
408 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
409 <xs:annotation>
410 <xs:documentation>Numeric identifier to the Font element that serves as the font for the control.</xs:documentation>
411 </xs:annotation>
412 </xs:attribute>
413 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
414 <xs:annotation>
415 <xs:documentation>
416 Identifier that references a string resource in the module to define the text for the control.
417 </xs:documentation>
418 </xs:annotation>
419 </xs:attribute>
420 </xs:complexType>
421 </xs:element>
422
423 <xs:element name="Combobox">
424 <xs:annotation>
425 <xs:documentation>Defines a combobox.</xs:documentation>
426 </xs:annotation>
427 <xs:complexType>
428 <xs:attributeGroup ref="CommonControlAttributes" />
429 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
430 <xs:annotation>
431 <xs:documentation>Numeric identifier to the Font element that serves as the font for the control.</xs:documentation>
432 </xs:annotation>
433 </xs:attribute>
434 </xs:complexType>
435 </xs:element>
436
437 <xs:element name="CommandLink">
438 <xs:annotation>
439 <xs:documentation>Defines a button.</xs:documentation>
440 </xs:annotation>
441 <xs:complexType mixed="true">
442 <xs:annotation>
443 <xs:documentation>
444 Text to display in the button.
445 Mutually exclusive with the StringId attribute and child Text elements.
446 </xs:documentation>
447 </xs:annotation>
448 <xs:choice minOccurs="0" maxOccurs="unbounded">
449 <xs:annotation>
450 <xs:documentation>
451 If multiple Action elements are given, the conditions should be mutually exclusive (when multiple conditions are true, the behavior is undefined and could be changed at any time).
452 If none of the conditions of the Action elements are true, then it uses the Action element without the Condition attribute.
453 </xs:documentation>
454 </xs:annotation>
455 <xs:element ref="BrowseDirectoryAction" />
456 <xs:element ref="ChangePageAction" />
457 <xs:element ref="CloseWindowAction" />
458 <xs:element ref="Note" />
459 <xs:element ref="Text" />
460 </xs:choice>
461 <xs:attributeGroup ref="CommonControlAttributes" />
462 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
463 <xs:annotation>
464 <xs:documentation>Numeric identifier to the Font element that serves as the font for the control. Only valid when using graphic buttons.</xs:documentation>
465 </xs:annotation>
466 </xs:attribute>
467 <xs:attribute name="IconFile" type="xs:string">
468 <xs:annotation>
469 <xs:documentation>
470 Relative path to an icon file to define a command link glyph.
471 Mutually exclusive with ImageResource and SourceX and SourceY attributes.
472 </xs:documentation>
473 </xs:annotation>
474 </xs:attribute>
475 <xs:attribute name="IconResource" type="xs:string">
476 <xs:annotation>
477 <xs:documentation>
478 Identifier that references an icon resource in the module to define a command link glyph.
479 Mutually exclusive with ImageFile and SourceX and SourceY attributes.
480 </xs:documentation>
481 </xs:annotation>
482 </xs:attribute>
483 <xs:attribute name="ImageFile" type="xs:string">
484 <xs:annotation>
485 <xs:documentation>
486 Relative path to an image file to define a command link glyph.
487 Mutually exclusive with ImageResource and SourceX and SourceY attributes.
488 </xs:documentation>
489 </xs:annotation>
490 </xs:attribute>
491 <xs:attribute name="ImageResource" type="xs:string">
492 <xs:annotation>
493 <xs:documentation>
494 Identifier that references an image resource in the module to define a command link glyph.
495 Mutually exclusive with ImageFile and SourceX and SourceY attributes.
496 </xs:documentation>
497 </xs:annotation>
498 </xs:attribute>
499 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
500 <xs:annotation>
501 <xs:documentation>
502 Identifier that references a string resource in the module to define the text for the control.
503 </xs:documentation>
504 </xs:annotation>
505 </xs:attribute>
506 </xs:complexType>
507 </xs:element>
508
509 <xs:element name="Editbox">
510 <xs:annotation>
511 <xs:documentation>Defines an edit box.</xs:documentation>
512 </xs:annotation>
513 <xs:complexType>
514 <xs:simpleContent>
515 <xs:extension base="xs:string">
516 <xs:annotation>
517 <xs:documentation>
518 Initial text for the control.
519 Mutually exclusive with the StringId attribute.
520 </xs:documentation>
521 </xs:annotation>
522 <xs:attributeGroup ref="CommonControlAttributes" />
523 <xs:attribute name="FileSystemAutoComplete" type="YesNoType">
524 <xs:annotation>
525 <xs:documentation>Specifies whether the edit box should auto-complete with file system paths.</xs:documentation>
526 </xs:annotation>
527 </xs:attribute>
528 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
529 <xs:annotation>
530 <xs:documentation>Numeric identifier to the Font element that serves as the font for the control.</xs:documentation>
531 </xs:annotation>
532 </xs:attribute>
533 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
534 <xs:annotation>
535 <xs:documentation>
536 Identifier that references a string resource in the module to define the initial text for the control.
537 </xs:documentation>
538 </xs:annotation>
539 </xs:attribute>
540 </xs:extension>
541 </xs:simpleContent>
542 </xs:complexType>
543 </xs:element>
544
545 <xs:element name="Hyperlink">
546 <xs:annotation>
547 <xs:documentation>Defines a hyperlink.</xs:documentation>
548 </xs:annotation>
549 <xs:complexType mixed="true">
550 <xs:annotation>
551 <xs:documentation>
552 Text to display as the link.
553 Mutually exclusive with the StringId attribute and child Text elements.
554 </xs:documentation>
555 </xs:annotation>
556 <xs:choice minOccurs="0" maxOccurs="unbounded">
557 <xs:element ref="Text" />
558 <xs:element ref="Tooltip" maxOccurs="1" />
559 </xs:choice>
560 <xs:attributeGroup ref="CommonControlAttributes" />
561 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
562 <xs:annotation>
563 <xs:documentation>Numeric identifier to the Font element that serves as the unselected font.</xs:documentation>
564 </xs:annotation>
565 </xs:attribute>
566 <xs:attribute name="HoverFontId" type="xs:nonNegativeInteger" use="required">
567 <xs:annotation>
568 <xs:documentation>Numeric identifier to the Font element that serves as the font when the control is hovered over.</xs:documentation>
569 </xs:annotation>
570 </xs:attribute>
571 <xs:attribute name="SelectedFontId" type="xs:nonNegativeInteger" use="required">
572 <xs:annotation>
573 <xs:documentation>Numeric identifier to the Font element that serves as the font when the control is selected.</xs:documentation>
574 </xs:annotation>
575 </xs:attribute>
576 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
577 <xs:annotation>
578 <xs:documentation>
579 Identifier that references a string resource in the module to define the text for the control.
580 </xs:documentation>
581 </xs:annotation>
582 </xs:attribute>
583 </xs:complexType>
584 </xs:element>
585
586 <xs:element name="Hypertext">
587 <xs:annotation>
588 <xs:documentation>Defines a text block with support for HTML &lt;a&gt; tags.</xs:documentation>
589 </xs:annotation>
590 <xs:complexType mixed="true">
591 <xs:annotation>
592 <xs:documentation>
593 Text to display as the link.
594 Use HTML &lt;a href="URL"&gt; to create a link.
595 Mutually exclusive with the StringId attribute and child Text elements.
596 </xs:documentation>
597 </xs:annotation>
598 <xs:choice minOccurs="0" maxOccurs="unbounded">
599 <xs:element ref="Text" />
600 <xs:element ref="Tooltip" maxOccurs="1" />
601 </xs:choice>
602 <xs:attributeGroup ref="CommonControlAttributes" />
603 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
604 <xs:annotation>
605 <xs:documentation>Numeric identifier to the Font element that serves as the font for the control.</xs:documentation>
606 </xs:annotation>
607 </xs:attribute>
608 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
609 <xs:annotation>
610 <xs:documentation>
611 Identifier that references a string resource in the module to define the text for the control.
612 </xs:documentation>
613 </xs:annotation>
614 </xs:attribute>
615 </xs:complexType>
616 </xs:element>
617
618 <xs:element name="Image">
619 <xs:annotation>
620 <xs:documentation>Defines an image for an ImageList or Billboard.</xs:documentation>
621 </xs:annotation>
622 <xs:complexType>
623 <xs:attribute name="ImageFile" type="xs:string">
624 <xs:annotation>
625 <xs:documentation>Relative path to an image file. Mutually exclusive with ImageResource.</xs:documentation>
626 </xs:annotation>
627 </xs:attribute>
628 <xs:attribute name="ImageResource" type="xs:string">
629 <xs:annotation>
630 <xs:documentation>Identifier that references an image resource in the module. Mutually exclusive with ImageFile.</xs:documentation>
631 </xs:annotation>
632 </xs:attribute>
633 </xs:complexType>
634 </xs:element>
635
636 <xs:element name="ImageControl">
637 <xs:annotation>
638 <xs:documentation>Defines an image.</xs:documentation>
639 </xs:annotation>
640 <xs:complexType>
641 <xs:attributeGroup ref="CommonControlAttributes" />
642 <xs:attribute name="ImageFile" type="xs:string">
643 <xs:annotation>
644 <xs:documentation>Relative path to an image file. Mutually exclusive with ImageResource and SourceX and SourceY attributes.</xs:documentation>
645 </xs:annotation>
646 </xs:attribute>
647 <xs:attribute name="ImageResource" type="xs:string">
648 <xs:annotation>
649 <xs:documentation>Identifier that references an image resource in the module. Mutually exclusive with ImageFile and SourceX and SourceY attributes.</xs:documentation>
650 </xs:annotation>
651 </xs:attribute>
652 </xs:complexType>
653 </xs:element>
654
655 <xs:element name="Label">
656 <xs:annotation>
657 <xs:documentation>Defines a label.</xs:documentation>
658 </xs:annotation>
659 <xs:complexType mixed="true">
660 <xs:annotation>
661 <xs:documentation>
662 Text for the label to display.
663 Mutually exclusive with the StringId attribute and child Text elements.
664 </xs:documentation>
665 </xs:annotation>
666 <xs:choice minOccurs="0" maxOccurs="unbounded">
667 <xs:element ref="Text" />
668 <xs:element ref="Tooltip" maxOccurs="1" />
669 </xs:choice>
670 <xs:attributeGroup ref="CommonControlAttributes" />
671 <xs:attribute name="Center" type="YesNoType" use="optional">
672 <xs:annotation>
673 <xs:documentation>Specifies whether the text should be centered horizontally in the width of the control. Default is "no".</xs:documentation>
674 </xs:annotation>
675 </xs:attribute>
676 <xs:attribute name="DisablePrefix" type="YesNoType" use="optional">
677 <xs:annotation>
678 <xs:documentation>By default ampersands (&amp;) in the text will underline the next character and treat it as an accelerator key. Set this attribute to "yes" to disable that behavior. Default is "no".</xs:documentation>
679 </xs:annotation>
680 </xs:attribute>
681 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
682 <xs:annotation>
683 <xs:documentation>Numeric identifier to the Font element that serves as the font for the control.</xs:documentation>
684 </xs:annotation>
685 </xs:attribute>
686 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
687 <xs:annotation>
688 <xs:documentation>
689 Identifier that references a string resource in the module to define the text for the label.
690 </xs:documentation>
691 </xs:annotation>
692 </xs:attribute>
693 </xs:complexType>
694 </xs:element>
695
696 <xs:element name="ListView">
697 <xs:annotation>
698 <xs:documentation>Defines a listview.</xs:documentation>
699 </xs:annotation>
700 <xs:complexType>
701 <xs:choice maxOccurs="unbounded">
702 <xs:element ref="Column" />
703 </xs:choice>
704 <xs:attributeGroup ref="CommonControlAttributes" />
705 <xs:attribute name="FontId" type="xs:nonNegativeInteger">
706 <xs:annotation>
707 <xs:documentation>Numeric identifier to the Font element that serves as the default font for the ListView.</xs:documentation>
708 </xs:annotation>
709 </xs:attribute>
710 <xs:attribute name="HexExtendedStyle" type="xs:hexBinary">
711 <xs:annotation>
712 <xs:documentation>Hexadecimal extended window style.</xs:documentation>
713 </xs:annotation>
714 </xs:attribute>
715 <xs:attribute name="ImageList" type="xs:string">
716 <xs:annotation>
717 <xs:documentation>
718 The name of the ImageList to assign to this listview with type LVSIL_NORMAL.
719 </xs:documentation>
720 </xs:annotation>
721 </xs:attribute>
722 <xs:attribute name="ImageListSmall" type="xs:string">
723 <xs:annotation>
724 <xs:documentation>
725 The name of the ImageList to assign to this listview with type LVSIL_SMALL.
726 </xs:documentation>
727 </xs:annotation>
728 </xs:attribute>
729 <xs:attribute name="ImageListState" type="xs:string">
730 <xs:annotation>
731 <xs:documentation>
732 The name of the ImageList to assign to this listview with type LVSIL_STATE.
733 </xs:documentation>
734 </xs:annotation>
735 </xs:attribute>
736 <xs:attribute name="ImageListGroupHeader" type="xs:string">
737 <xs:annotation>
738 <xs:documentation>
739 The name of the ImageList to assign to this listview with type LVSIL_GROUPHEADER.
740 </xs:documentation>
741 </xs:annotation>
742 </xs:attribute>
743 </xs:complexType>
744 </xs:element>
745
746 <xs:element name="Note">
747 <xs:annotation>
748 <xs:documentation>
749 Defines note text for a command link control based on an optional condition.
750 If multiple Note elements are given for one control, the conditions should be mutually exclusive (when multiple conditions are true, the behavior is undefined and may be changed at any time).
751 If none of the conditions of a control's Note elements are true, then it uses the text of the Note element without the Condition attribute.
752 </xs:documentation>
753 </xs:annotation>
754 <xs:complexType>
755 <xs:simpleContent>
756 <xs:extension base="xs:string">
757 <xs:annotation>
758 <xs:documentation>
759 Note text for the parent command link control.
760 </xs:documentation>
761 </xs:annotation>
762 <xs:attribute name="Condition" type="xs:string">
763 <xs:annotation>
764 <xs:documentation>
765 The condition that determines when the parent control will use this note text.
766 </xs:documentation>
767 </xs:annotation>
768 </xs:attribute>
769 </xs:extension>
770 </xs:simpleContent>
771 </xs:complexType>
772 </xs:element>
773
774 <xs:element name="Panel">
775 <xs:annotation>
776 <xs:documentation>Defines a collection of controls.</xs:documentation>
777 </xs:annotation>
778 <xs:complexType>
779 <xs:group ref="ControlElements" maxOccurs="unbounded"/>
780 <xs:attributeGroup ref="CommonControlAttributes" />
781 </xs:complexType>
782 </xs:element>
783
784 <xs:element name="Progressbar">
785 <xs:annotation>
786 <xs:documentation>Defines a progress bar.</xs:documentation>
787 </xs:annotation>
788 <xs:complexType>
789 <xs:attributeGroup ref="CommonControlAttributes" />
790 <xs:attribute name="ImageFile" type="xs:string">
791 <xs:annotation>
792 <xs:documentation>Relative path to an image file for the control. The image must be 4 pixels wide: left pixel is the left side of progress bar, left middle pixel is progress used, right middle pixel is progress unused, right pixel is right side of progress bar. Mutually exclusive with ImageResource and SourceX and SourceY attributes.</xs:documentation>
793 </xs:annotation>
794 </xs:attribute>
795 <xs:attribute name="ImageResource" type="xs:string">
796 <xs:annotation>
797 <xs:documentation>Identifier that references an image resource in the module for the control. The image must be 4 pixels wide: left pixel is the left side of progress bar, left middle pixel is progress used, right middle pixel is progress unused, right pixel is right side of progress bar. Mutually exclusive with ImageFile and SourceX and SourceY attributes.</xs:documentation>
798 </xs:annotation>
799 </xs:attribute>
800 </xs:complexType>
801 </xs:element>
802
803 <xs:element name="RadioButton">
804 <xs:annotation>
805 <xs:documentation>Defines an individual radio button within a set of radio buttons.</xs:documentation>
806 </xs:annotation>
807 <xs:complexType mixed="true">
808 <xs:annotation>
809 <xs:documentation>
810 Text to display beside the radio button.
811 Mutually exclusive with the StringId attribute and child Text elements.
812 </xs:documentation>
813 </xs:annotation>
814 <xs:choice minOccurs="0" maxOccurs="unbounded">
815 <xs:element ref="Text" />
816 <xs:element ref="Tooltip" maxOccurs="1" />
817 </xs:choice>
818 <xs:attributeGroup ref="CommonControlAttributes" />
819 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
820 <xs:annotation>
821 <xs:documentation>Numeric identifier to the Font element that serves as the font for the control.</xs:documentation>
822 </xs:annotation>
823 </xs:attribute>
824 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
825 <xs:annotation>
826 <xs:documentation>
827 Identifier that references a string resource in the module to define the text for the control.
828 </xs:documentation>
829 </xs:annotation>
830 </xs:attribute>
831 <xs:attribute name="Value" type="xs:string">
832 <xs:annotation>
833 <xs:documentation>Optional value used when setting the variable associated with the set of radio buttons.</xs:documentation>
834 </xs:annotation>
835 </xs:attribute>
836 </xs:complexType>
837 </xs:element>
838
839 <xs:element name="RadioButtons">
840 <xs:annotation>
841 <xs:documentation>Defines a set of radio buttons.</xs:documentation>
842 </xs:annotation>
843 <xs:complexType>
844 <xs:choice maxOccurs="unbounded">
845 <xs:element ref="RadioButton" />
846 </xs:choice>
847 <xs:attribute name="Name" type="xs:string">
848 <xs:annotation>
849 <xs:documentation>Optional variable name for the set of radio buttons.</xs:documentation>
850 </xs:annotation>
851 </xs:attribute>
852 </xs:complexType>
853 </xs:element>
854
855 <xs:element name="Richedit">
856 <xs:annotation>
857 <xs:documentation>Defines a rich edit control.</xs:documentation>
858 </xs:annotation>
859 <xs:complexType mixed="true">
860 <xs:annotation>
861 <xs:documentation>
862 Initial text for the control.
863 Mutually exclusive with the StringId attribute.
864 </xs:documentation>
865 </xs:annotation>
866 <xs:choice minOccurs="0" maxOccurs="unbounded">
867 <xs:element ref="Text" />
868 <xs:element ref="Tooltip" maxOccurs="1" />
869 </xs:choice>
870 <xs:attributeGroup ref="CommonControlAttributes" />
871 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
872 <xs:annotation>
873 <xs:documentation>
874 Numeric identifier to the Font element that serves as the font for the control.
875 </xs:documentation>
876 </xs:annotation>
877 </xs:attribute>
878 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
879 <xs:annotation>
880 <xs:documentation>
881 Identifier that references a string resource in the module to define the initial text for the control.
882 </xs:documentation>
883 </xs:annotation>
884 </xs:attribute>
885 </xs:complexType>
886 </xs:element>
887
888 <xs:element name="Static">
889 <xs:annotation>
890 <xs:documentation>Defines a straight line.</xs:documentation>
891 </xs:annotation>
892 <xs:complexType>
893 <xs:attributeGroup ref="CommonControlAttributes" />
894 </xs:complexType>
895 </xs:element>
896
897 <xs:element name="Tab">
898 <xs:annotation>
899 <xs:documentation>Defines an individual tab within a set of tabs.</xs:documentation>
900 </xs:annotation>
901 <xs:complexType>
902 <xs:simpleContent>
903 <xs:extension base="xs:string">
904 <xs:annotation>
905 <xs:documentation>
906 Caption of the tab.
907 Mutually exclusive with the StringId attribute.
908 </xs:documentation>
909 </xs:annotation>
910 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
911 <xs:annotation>
912 <xs:documentation>
913 Identifier that references a string resource in the module to define the caption of the tab.
914 </xs:documentation>
915 </xs:annotation>
916 </xs:attribute>
917 </xs:extension>
918 </xs:simpleContent>
919 </xs:complexType>
920 </xs:element>
921
922 <xs:element name="Tabs">
923 <xs:annotation>
924 <xs:documentation>Defines a set of tabs.</xs:documentation>
925 </xs:annotation>
926 <xs:complexType>
927 <xs:choice maxOccurs="unbounded">
928 <xs:element ref="Tab" />
929 </xs:choice>
930 <xs:attributeGroup ref="CommonControlAttributes" />
931 <xs:attribute name="FontId" type="xs:nonNegativeInteger" use="required">
932 <xs:annotation>
933 <xs:documentation>Numeric identifier to the Font element that serves as the font for the control.</xs:documentation>
934 </xs:annotation>
935 </xs:attribute>
936 </xs:complexType>
937 </xs:element>
938
939 <xs:element name="Text">
940 <xs:annotation>
941 <xs:documentation>
942 Defines text for the parent control based on an optional condition.
943 If multiple Text elements are given for one control, the conditions should be mutually exclusive (when multiple conditions are true, the behavior is undefined and may be changed at any time).
944 If none of the conditions of a control's Text elements are true, then it uses the text of the Text element without the Condition attribute.
945 </xs:documentation>
946 </xs:annotation>
947 <xs:complexType>
948 <xs:simpleContent>
949 <xs:extension base="xs:string">
950 <xs:annotation>
951 <xs:documentation>
952 Text for the parent control.
953 </xs:documentation>
954 </xs:annotation>
955 <xs:attribute name="Condition" type="xs:string">
956 <xs:annotation>
957 <xs:documentation>
958 The condition that determines when the parent control will use this text.
959 </xs:documentation>
960 </xs:annotation>
961 </xs:attribute>
962 </xs:extension>
963 </xs:simpleContent>
964 </xs:complexType>
965 </xs:element>
966
967 <xs:element name="Tooltip">
968 <xs:annotation>
969 <xs:documentation>
970 Defines text for the parent control's tooltip.
971 </xs:documentation>
972 </xs:annotation>
973 <xs:complexType>
974 <xs:simpleContent>
975 <xs:extension base="xs:string">
976 <xs:annotation>
977 <xs:documentation>
978 Text for the parent control's tooltip.
979 </xs:documentation>
980 </xs:annotation>
981 </xs:extension>
982 </xs:simpleContent>
983 </xs:complexType>
984 </xs:element>
985
986 <xs:element name="TreeView">
987 <xs:annotation>
988 <xs:documentation>Defines a treeview.</xs:documentation>
989 </xs:annotation>
990 <xs:complexType>
991 <xs:attributeGroup ref="CommonControlAttributes"/>
992 <xs:attribute name="AlwaysShowSelect">
993 <xs:annotation>
994 <xs:documentation>Specifies whether the row always appears selected even when the treeview has lost focus.</xs:documentation>
995 </xs:annotation>
996 </xs:attribute>
997 <xs:attribute name="EnableDragDrop">
998 <xs:annotation>
999 <xs:documentation>Specifies whether drag and drop is enabled for the treeview.</xs:documentation>
1000 </xs:annotation>
1001 </xs:attribute>
1002 <xs:attribute name="FullRowSelect">
1003 <xs:annotation>
1004 <xs:documentation>Specifies whether an entire row is selected for the treeview.</xs:documentation>
1005 </xs:annotation>
1006 </xs:attribute>
1007 <xs:attribute name="HasButtons">
1008 <xs:annotation>
1009 <xs:documentation>Specifies whether the treeview will show buttons.</xs:documentation>
1010 </xs:annotation>
1011 </xs:attribute>
1012 <xs:attribute name="HasLines">
1013 <xs:annotation>
1014 <xs:documentation>Specifies whether lines appear for all treeview items.</xs:documentation>
1015 </xs:annotation>
1016 </xs:attribute>
1017 <xs:attribute name="LinesAtRoot">
1018 <xs:annotation>
1019 <xs:documentation>Specifies whether the root nodes have lines beside them.</xs:documentation>
1020 </xs:annotation>
1021 </xs:attribute>
1022 </xs:complexType>
1023 </xs:element>
1024
1025 <xs:element name="Column">
1026 <xs:annotation>
1027 <xs:documentation>A column of a list.</xs:documentation>
1028 </xs:annotation>
1029 <xs:complexType>
1030 <xs:simpleContent>
1031 <xs:extension base="xs:string">
1032 <xs:annotation>
1033 <xs:documentation>
1034 Text for the column header.
1035 Mutually exclusive with the StringId attribute.
1036 </xs:documentation>
1037 </xs:annotation>
1038 <xs:attribute name="Width" type="xs:int">
1039 <xs:annotation>
1040 <xs:documentation>Width of the column.</xs:documentation>
1041 </xs:annotation>
1042 </xs:attribute>
1043 <xs:attribute name="Expands" type="YesNoType">
1044 <xs:annotation>
1045 <xs:documentation>
1046 Whether or not this column can grow to fill available width of the listview.
1047 More than one column can be marked with yes - all expandable columns will share available extra space.
1048 This is especially useful if the Window/@AutoResize is yes.
1049 </xs:documentation>
1050 </xs:annotation>
1051 </xs:attribute>
1052 <xs:attribute name="StringId" type="xs:nonNegativeInteger">
1053 <xs:annotation>
1054 <xs:documentation>
1055 Identifier that references a string resource in the module to define the text for the column header.
1056 </xs:documentation>
1057 </xs:annotation>
1058 </xs:attribute>
1059 </xs:extension>
1060 </xs:simpleContent>
1061 </xs:complexType>
1062 </xs:element>
1063
1064 <xs:group name="ControlElements">
1065 <xs:choice>
1066 <xs:element ref="Billboard" />
1067 <xs:element ref="Button" />
1068 <xs:element ref="Checkbox" />
1069 <xs:element ref="Combobox" />
1070 <xs:element ref="CommandLink" />
1071 <xs:element ref="Editbox" />
1072 <xs:element ref="Hyperlink" />
1073 <xs:element ref="Hypertext" />
1074 <xs:element ref="ImageControl" />
1075 <xs:element ref="Label" />
1076 <xs:element ref="ListView" />
1077 <xs:element ref="Panel" />
1078 <xs:element ref="Progressbar" />
1079 <xs:element ref="RadioButtons" />
1080 <xs:element ref="Richedit" />
1081 <xs:element ref="Static" />
1082 <xs:element ref="Tabs" />
1083 <xs:element ref="TreeView" />
1084 </xs:choice>
1085 </xs:group>
1086
1087 <xs:attributeGroup name="CommonControlAttributes">
1088 <xs:attribute name="Name" type="xs:string">
1089 <xs:annotation>
1090 <xs:documentation>Optional name for the control.</xs:documentation>
1091 </xs:annotation>
1092 </xs:attribute>
1093 <xs:attribute name="DisableAutomaticBehavior" type="YesNoType">
1094 <xs:annotation>
1095 <xs:documentation>Set to 'yes' to disable automatic variable getting and setting, EnableCondition, VisibleCondition, and conditional Text elements. The default is 'no'.</xs:documentation>
1096 </xs:annotation>
1097 </xs:attribute>
1098 <xs:attribute name="EnableCondition" type="xs:string">
1099 <xs:annotation>
1100 <xs:documentation>A condition that determines if the control is enabled. If this condition is true or omitted, then the control will be enabled.</xs:documentation>
1101 </xs:annotation>
1102 </xs:attribute>
1103 <xs:attribute name="Height" type="xs:int" use="required">
1104 <xs:annotation>
1105 <xs:documentation>Height of the control. Non-positive values extend the control to the bottom of the window minus the value.</xs:documentation>
1106 </xs:annotation>
1107 </xs:attribute>
1108 <xs:attribute name="HexStyle" type="xs:hexBinary">
1109 <xs:annotation>
1110 <xs:documentation>Hexadecimal window style for the control.</xs:documentation>
1111 </xs:annotation>
1112 </xs:attribute>
1113 <xs:attribute name="HideWhenDisabled" type="YesNoType">
1114 <xs:annotation>
1115 <xs:documentation>Specifies whether the control should be hidden when disabled.</xs:documentation>
1116 </xs:annotation>
1117 </xs:attribute>
1118 <xs:attribute name="TabStop" type="YesNoType">
1119 <xs:annotation>
1120 <xs:documentation>Specifies whether the control is part of the tab sequence of controls.</xs:documentation>
1121 </xs:annotation>
1122 </xs:attribute>
1123 <xs:attribute name="Visible" type="YesNoType">
1124 <xs:annotation>
1125 <xs:documentation>Specifies whether the control is initially visible.</xs:documentation>
1126 </xs:annotation>
1127 </xs:attribute>
1128 <xs:attribute name="VisibleCondition" type="xs:string">
1129 <xs:annotation>
1130 <xs:documentation>
1131 A condition that determines if the control is visible. If this condition is true or omitted, then the control will be visible.
1132 </xs:documentation>
1133 </xs:annotation>
1134 </xs:attribute>
1135 <xs:attribute name="Width" type="xs:int" use="required">
1136 <xs:annotation>
1137 <xs:documentation>Width of the control. Non-positive values extend the control to the right of the window minus the value.</xs:documentation>
1138 </xs:annotation>
1139 </xs:attribute>
1140 <xs:attribute name="X" type="xs:int" use="required">
1141 <xs:annotation>
1142 <xs:documentation>X coordinate for the control from the left of the window. Negative values are coordinates from the right of the window minus the width of the control.</xs:documentation>
1143 </xs:annotation>
1144 </xs:attribute>
1145 <xs:attribute name="Y" type="xs:int" use="required">
1146 <xs:annotation>
1147 <xs:documentation>Y coordinate for the control from the top of the window. Negative values are coordinates from the bottom of the window minus the height of the control.</xs:documentation>
1148 </xs:annotation>
1149 </xs:attribute>
1150 </xs:attributeGroup>
1151
1152 <xs:simpleType name="YesNoType">
1153 <xs:annotation>
1154 <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
1155 </xs:annotation>
1156 <xs:restriction base="xs:NMTOKEN">
1157 <xs:enumeration value="no"/>
1158 <xs:enumeration value="yes"/>
1159 </xs:restriction>
1160 </xs:simpleType>
1161
1162 <xs:simpleType name="SystemColorType">
1163 <xs:annotation>
1164 <xs:documentation>
1165 Indicates a system color for a font.
1166 </xs:documentation>
1167 </xs:annotation>
1168 <xs:restriction base="xs:NMTOKEN">
1169 <xs:enumeration value="btnface" />
1170 <xs:enumeration value="btntext" />
1171 <xs:enumeration value="graytext" />
1172 <xs:enumeration value="highlight" />
1173 <xs:enumeration value="highlighttext" />
1174 <xs:enumeration value="hotlight" />
1175 <xs:enumeration value="window" />
1176 <xs:enumeration value="windowtext" />
1177 </xs:restriction>
1178 </xs:simpleType>
1179
1180 <xs:simpleType name="FontColorType">
1181 <xs:annotation>
1182 <xs:documentation>
1183 Indicates the foreground or background color of a font.
1184 </xs:documentation>
1185 </xs:annotation>
1186 <xs:union memberTypes="SystemColorType xs:string"/>
1187 </xs:simpleType>
1188</xs:schema>