diff options
-rw-r--r-- | src/burn/engine/package.cpp | 4 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/atomutil.cpp | 2 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/xmlutil.h | 19 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/strutil.cpp | 2 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/thmutil.cpp | 993 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/xmlutil.cpp | 121 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/xsd/thmutil.xsd | 1188 |
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 | ); |
109 | HRESULT DAPI XmlGetAttributeLargeNumber( | 109 | HRESULT 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 | ); | ||
114 | HRESULT DAPI XmlGetAttributeInt32( | ||
115 | __in IXMLDOMNode* pixnNode, | ||
116 | __in_z LPCWSTR pwzAttribute, | ||
117 | __out int* piValue | ||
118 | ); | ||
119 | HRESULT DAPI XmlGetAttributeUInt32( | ||
120 | __in IXMLDOMNode* pixnNode, | ||
121 | __in_z LPCWSTR pwzAttribute, | ||
122 | __out DWORD* pdwValue | ||
123 | ); | ||
124 | HRESULT DAPI XmlGetAttributeUInt64( | ||
125 | __in IXMLDOMNode* pixnNode, | ||
126 | __in_z LPCWSTR pwzAttribute, | ||
127 | __out DWORD64* pqwValue | ||
113 | ); | 128 | ); |
114 | HRESULT DAPI XmlGetNamedItem( | 129 | HRESULT 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 | ); |
89 | static HRESULT ParseImage( | 90 | static 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 | ); |
95 | static HRESULT ParseIcon( | 96 | static 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 | ); | ||
102 | static HRESULT GetAttributeCoordinateOrDimension( | ||
103 | __in IXMLDOMNode* pixn, | ||
104 | __in LPCWSTR wzAttribute, | ||
105 | __inout int* pnValue | ||
106 | ); | ||
107 | static HRESULT GetAttributeFontId( | ||
108 | __in IXMLDOMNode* pixn, | ||
109 | __in LPCWSTR wzAttribute, | ||
110 | __inout DWORD* pdwValue | ||
111 | ); | ||
112 | static HRESULT ParseSourceXY( | ||
113 | __in IXMLDOMNode* pixn, | ||
114 | __in BOOL fAllowed, | ||
115 | __inout int* pnX, | ||
116 | __inout int* pnY | ||
100 | ); | 117 | ); |
101 | static HRESULT ParseWindow( | 118 | static 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 | ); |
204 | static HRESULT ParseUnexpectedAttribute( | ||
205 | __in IXMLDOMNode* pixn, | ||
206 | __in_z LPCWSTR wzElementName, | ||
207 | __in_z LPCWSTR wzAttribute | ||
208 | ); | ||
186 | static HRESULT ParseNotes( | 209 | static 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 | ||
1737 | static HRESULT ParseImage( | 1761 | static 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 | ||
1798 | LExit: | 1823 | LExit: |
1799 | if (pBitmap) | 1824 | if (pBitmap) |
@@ -1808,62 +1833,244 @@ LExit: | |||
1808 | } | 1833 | } |
1809 | 1834 | ||
1810 | 1835 | ||
1811 | static HRESULT ParseIcon( | 1836 | static 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); | 1879 | LExit: |
1839 | ThmExitOnFailure(hr, "Failed to get icon file attribute."); | 1880 | return hr; |
1881 | } | ||
1840 | 1882 | ||
1841 | if (S_OK == hr) | 1883 | |
1884 | static 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 | |||
1859 | LExit: | 1947 | LExit: |
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 | ||
1955 | static 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 | |||
1979 | LExit: | ||
1980 | return hr; | ||
1981 | } | ||
1982 | |||
1983 | static 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 | |||
2007 | LExit: | ||
2008 | return hr; | ||
2009 | } | ||
2010 | |||
2011 | static 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 | |||
2070 | LExit: | ||
2071 | return hr; | ||
2072 | } | ||
2073 | |||
1867 | static HRESULT ParseWindow( | 2074 | static 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 | ||
3012 | LExit: | 3119 | LExit: |
@@ -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 | ||
3611 | static 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 | |||
3630 | LExit: | ||
3631 | ReleaseBSTR(bstr); | ||
3632 | |||
3633 | return hr; | ||
3634 | } | ||
3635 | |||
3636 | |||
3506 | static HRESULT ParseNotes( | 3637 | static 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 | *********************************************************************/ |
799 | extern "C" HRESULT DAPI XmlGetAttributeLargeNumber( | 799 | extern "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 | |||
824 | LExit: | ||
825 | ReleaseBSTR(bstrValue); | ||
826 | return hr; | ||
827 | } | ||
828 | |||
829 | |||
830 | /******************************************************************** | ||
831 | XmlGetAttributeInt32 | ||
832 | |||
833 | *********************************************************************/ | ||
834 | extern "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 | |||
859 | LExit: | ||
860 | ReleaseBSTR(bstrValue); | ||
861 | return hr; | ||
862 | } | ||
863 | |||
864 | |||
865 | /******************************************************************** | ||
866 | XmlGetAttributeUInt32 | ||
867 | |||
868 | *********************************************************************/ | ||
869 | extern "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 | |||
894 | LExit: | ||
895 | ReleaseBSTR(bstrValue); | ||
896 | return hr; | ||
897 | } | ||
898 | |||
899 | |||
900 | /******************************************************************** | ||
901 | XmlGetAttributeUInt64 | ||
902 | |||
903 | *********************************************************************/ | ||
904 | extern "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 | ||
824 | LExit: | 929 | LExit: |
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 <a> 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 <a href="URL"> 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 (&) 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> | ||