Reactos
1/*
2 * Copyright 2012 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "mshtml_private.h"
20
21typedef struct {
22 HTMLElement element;
23
24 IHTMLTableCell IHTMLTableCell_iface;
25
26 nsIDOMHTMLTableCellElement *nscell;
27} HTMLTableCell;
28
29static inline HTMLTableCell *impl_from_IHTMLTableCell(IHTMLTableCell *iface)
30{
31 return CONTAINING_RECORD(iface, HTMLTableCell, IHTMLTableCell_iface);
32}
33
34static HRESULT WINAPI HTMLTableCell_QueryInterface(IHTMLTableCell *iface, REFIID riid, void **ppv)
35{
36 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
37
38 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
39}
40
41static ULONG WINAPI HTMLTableCell_AddRef(IHTMLTableCell *iface)
42{
43 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
44
45 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
46}
47
48static ULONG WINAPI HTMLTableCell_Release(IHTMLTableCell *iface)
49{
50 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
51
52 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
53}
54
55static HRESULT WINAPI HTMLTableCell_GetTypeInfoCount(IHTMLTableCell *iface, UINT *pctinfo)
56{
57 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
58 return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo);
59}
60
61static HRESULT WINAPI HTMLTableCell_GetTypeInfo(IHTMLTableCell *iface, UINT iTInfo,
62 LCID lcid, ITypeInfo **ppTInfo)
63{
64 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
65 return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid,
66 ppTInfo);
67}
68
69static HRESULT WINAPI HTMLTableCell_GetIDsOfNames(IHTMLTableCell *iface, REFIID riid,
70 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
71{
72 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
73 return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames,
74 cNames, lcid, rgDispId);
75}
76
77static HRESULT WINAPI HTMLTableCell_Invoke(IHTMLTableCell *iface, DISPID dispIdMember, REFIID riid,
78 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
79 UINT *puArgErr)
80{
81 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
82 return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid,
83 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
84}
85
86static HRESULT WINAPI HTMLTableCell_put_rowSpan(IHTMLTableCell *iface, LONG v)
87{
88 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
89 FIXME("(%p)->(%d)\n", This, v);
90 return E_NOTIMPL;
91}
92
93static HRESULT WINAPI HTMLTableCell_get_rowSpan(IHTMLTableCell *iface, LONG *p)
94{
95 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
96 FIXME("(%p)->(%p)\n", This, p);
97 return E_NOTIMPL;
98}
99
100static HRESULT WINAPI HTMLTableCell_put_colSpan(IHTMLTableCell *iface, LONG v)
101{
102 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
103 FIXME("(%p)->(%d)\n", This, v);
104 return E_NOTIMPL;
105}
106
107static HRESULT WINAPI HTMLTableCell_get_colSpan(IHTMLTableCell *iface, LONG *p)
108{
109 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
110 FIXME("(%p)->(%p)\n", This, p);
111 return E_NOTIMPL;
112}
113
114static HRESULT WINAPI HTMLTableCell_put_align(IHTMLTableCell *iface, BSTR v)
115{
116 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
117 nsAString str;
118 nsresult nsres;
119
120 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
121
122 nsAString_InitDepend(&str, v);
123 nsres = nsIDOMHTMLTableCellElement_SetAlign(This->nscell, &str);
124 nsAString_Finish(&str);
125 if (NS_FAILED(nsres)) {
126 ERR("Set Align failed: %08x\n", nsres);
127 return E_FAIL;
128 }
129 return S_OK;
130}
131
132static HRESULT WINAPI HTMLTableCell_get_align(IHTMLTableCell *iface, BSTR *p)
133{
134 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
135 nsAString str;
136 nsresult nsres;
137
138 TRACE("(%p)->(%p)\n", This, p);
139
140 nsAString_Init(&str, NULL);
141 nsres = nsIDOMHTMLTableCellElement_GetAlign(This->nscell, &str);
142
143 return return_nsstr(nsres, &str, p);
144}
145
146static HRESULT WINAPI HTMLTableCell_put_vAlign(IHTMLTableCell *iface, BSTR v)
147{
148 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
149 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
150 return E_NOTIMPL;
151}
152
153static HRESULT WINAPI HTMLTableCell_get_vAlign(IHTMLTableCell *iface, BSTR *p)
154{
155 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
156 FIXME("(%p)->(%p)\n", This, p);
157 return E_NOTIMPL;
158}
159
160static HRESULT WINAPI HTMLTableCell_put_bgColor(IHTMLTableCell *iface, VARIANT v)
161{
162 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
163 nsAString strColor;
164 nsresult nsres;
165
166 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
167
168 if(!variant_to_nscolor(&v, &strColor))
169 return S_OK;
170
171 nsres = nsIDOMHTMLTableCellElement_SetBgColor(This->nscell, &strColor);
172 nsAString_Finish(&strColor);
173 if(NS_FAILED(nsres)) {
174 ERR("SetBgColor(%s) failed: %08x\n", debugstr_variant(&v), nsres);
175 return E_FAIL;
176 }
177
178 return S_OK;
179}
180
181static HRESULT WINAPI HTMLTableCell_get_bgColor(IHTMLTableCell *iface, VARIANT *p)
182{
183 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
184 nsAString strColor;
185 nsresult nsres;
186 HRESULT hres;
187
188 TRACE("(%p)->(%p)\n", This, p);
189
190 nsAString_Init(&strColor, NULL);
191 nsres = nsIDOMHTMLTableCellElement_GetBgColor(This->nscell, &strColor);
192
193 if(NS_SUCCEEDED(nsres)) {
194 const PRUnichar *color;
195 nsAString_GetData(&strColor, &color);
196 V_VT(p) = VT_BSTR;
197 hres = nscolor_to_str(color, &V_BSTR(p));
198 }else {
199 ERR("GetBgColor failed: %08x\n", nsres);
200 hres = E_FAIL;
201 }
202 nsAString_Finish(&strColor);
203 return hres;
204}
205
206static HRESULT WINAPI HTMLTableCell_put_noWrap(IHTMLTableCell *iface, VARIANT_BOOL v)
207{
208 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
209 FIXME("(%p)->(%x)\n", This, v);
210 return E_NOTIMPL;
211}
212
213static HRESULT WINAPI HTMLTableCell_get_noWrap(IHTMLTableCell *iface, VARIANT_BOOL *p)
214{
215 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
216 FIXME("(%p)->(%p)\n", This, p);
217 return E_NOTIMPL;
218}
219
220static HRESULT WINAPI HTMLTableCell_put_background(IHTMLTableCell *iface, BSTR v)
221{
222 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
223 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
224 return E_NOTIMPL;
225}
226
227static HRESULT WINAPI HTMLTableCell_get_background(IHTMLTableCell *iface, BSTR *p)
228{
229 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
230 FIXME("(%p)->(%p)\n", This, p);
231 return E_NOTIMPL;
232}
233
234static HRESULT WINAPI HTMLTableCell_put_borderColor(IHTMLTableCell *iface, VARIANT v)
235{
236 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
237 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
238 return E_NOTIMPL;
239}
240
241static HRESULT WINAPI HTMLTableCell_get_borderColor(IHTMLTableCell *iface, VARIANT *p)
242{
243 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
244 FIXME("(%p)->(%p)\n", This, p);
245 return E_NOTIMPL;
246}
247
248static HRESULT WINAPI HTMLTableCell_put_borderColorLight(IHTMLTableCell *iface, VARIANT v)
249{
250 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
251 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
252 return E_NOTIMPL;
253}
254
255static HRESULT WINAPI HTMLTableCell_get_borderColorLight(IHTMLTableCell *iface, VARIANT *p)
256{
257 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
258 FIXME("(%p)->(%p)\n", This, p);
259 return E_NOTIMPL;
260}
261
262static HRESULT WINAPI HTMLTableCell_put_borderColorDark(IHTMLTableCell *iface, VARIANT v)
263{
264 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
265 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
266 return E_NOTIMPL;
267}
268
269static HRESULT WINAPI HTMLTableCell_get_borderColorDark(IHTMLTableCell *iface, VARIANT *p)
270{
271 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
272 FIXME("(%p)->(%p)\n", This, p);
273 return E_NOTIMPL;
274}
275
276static HRESULT WINAPI HTMLTableCell_put_width(IHTMLTableCell *iface, VARIANT v)
277{
278 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
279 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
280 return E_NOTIMPL;
281}
282
283static HRESULT WINAPI HTMLTableCell_get_width(IHTMLTableCell *iface, VARIANT *p)
284{
285 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
286 FIXME("(%p)->(%p)\n", This, p);
287 return E_NOTIMPL;
288}
289
290static HRESULT WINAPI HTMLTableCell_put_height(IHTMLTableCell *iface, VARIANT v)
291{
292 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
293 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
294 return E_NOTIMPL;
295}
296
297static HRESULT WINAPI HTMLTableCell_get_height(IHTMLTableCell *iface, VARIANT *p)
298{
299 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
300 FIXME("(%p)->(%p)\n", This, p);
301 return E_NOTIMPL;
302}
303
304static HRESULT WINAPI HTMLTableCell_get_cellIndex(IHTMLTableCell *iface, LONG *p)
305{
306 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
307 nsresult nsres;
308
309 TRACE("(%p)->(%p)\n", This, p);
310 nsres = nsIDOMHTMLTableCellElement_GetCellIndex(This->nscell, p);
311 if (NS_FAILED(nsres)) {
312 ERR("Get CellIndex failed: %08x\n", nsres);
313 return E_FAIL;
314 }
315
316 return S_OK;
317}
318
319static const IHTMLTableCellVtbl HTMLTableCellVtbl = {
320 HTMLTableCell_QueryInterface,
321 HTMLTableCell_AddRef,
322 HTMLTableCell_Release,
323 HTMLTableCell_GetTypeInfoCount,
324 HTMLTableCell_GetTypeInfo,
325 HTMLTableCell_GetIDsOfNames,
326 HTMLTableCell_Invoke,
327 HTMLTableCell_put_rowSpan,
328 HTMLTableCell_get_rowSpan,
329 HTMLTableCell_put_colSpan,
330 HTMLTableCell_get_colSpan,
331 HTMLTableCell_put_align,
332 HTMLTableCell_get_align,
333 HTMLTableCell_put_vAlign,
334 HTMLTableCell_get_vAlign,
335 HTMLTableCell_put_bgColor,
336 HTMLTableCell_get_bgColor,
337 HTMLTableCell_put_noWrap,
338 HTMLTableCell_get_noWrap,
339 HTMLTableCell_put_background,
340 HTMLTableCell_get_background,
341 HTMLTableCell_put_borderColor,
342 HTMLTableCell_get_borderColor,
343 HTMLTableCell_put_borderColorLight,
344 HTMLTableCell_get_borderColorLight,
345 HTMLTableCell_put_borderColorDark,
346 HTMLTableCell_get_borderColorDark,
347 HTMLTableCell_put_width,
348 HTMLTableCell_get_width,
349 HTMLTableCell_put_height,
350 HTMLTableCell_get_height,
351 HTMLTableCell_get_cellIndex
352};
353
354static inline HTMLTableCell *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
355{
356 return CONTAINING_RECORD(iface, HTMLTableCell, element.node);
357}
358
359static HRESULT HTMLTableCell_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
360{
361 HTMLTableCell *This = impl_from_HTMLDOMNode(iface);
362
363 if(IsEqualGUID(&IID_IUnknown, riid)) {
364 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
365 *ppv = &This->IHTMLTableCell_iface;
366 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
367 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
368 *ppv = &This->IHTMLTableCell_iface;
369 }else if(IsEqualGUID(&IID_IHTMLTableCell, riid)) {
370 TRACE("(%p)->(IID_IHTMLTableCell %p)\n", This, ppv);
371 *ppv = &This->IHTMLTableCell_iface;
372 }else {
373 return HTMLElement_QI(&This->element.node, riid, ppv);
374 }
375
376 IUnknown_AddRef((IUnknown*)*ppv);
377 return S_OK;
378}
379
380static void HTMLTableCell_destructor(HTMLDOMNode *iface)
381{
382 HTMLTableCell *This = impl_from_HTMLDOMNode(iface);
383
384 HTMLElement_destructor(&This->element.node);
385}
386
387static void HTMLTableCell_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
388{
389 HTMLTableCell *This = impl_from_HTMLDOMNode(iface);
390
391 if(This->nscell)
392 note_cc_edge((nsISupports*)This->nscell, "This->nstablecell", cb);
393}
394
395static void HTMLTableCell_unlink(HTMLDOMNode *iface)
396{
397 HTMLTableCell *This = impl_from_HTMLDOMNode(iface);
398
399 if(This->nscell) {
400 nsIDOMHTMLTableCellElement *nscell = This->nscell;
401
402 This->nscell = NULL;
403 nsIDOMHTMLTableCellElement_Release(nscell);
404 }
405}
406
407static const NodeImplVtbl HTMLTableCellImplVtbl = {
408 HTMLTableCell_QI,
409 HTMLTableCell_destructor,
410 HTMLElement_cpc,
411 HTMLElement_clone,
412 HTMLElement_handle_event,
413 HTMLElement_get_attr_col,
414 NULL,
415 NULL,
416 NULL,
417 NULL,
418 NULL,
419 NULL,
420 NULL,
421 NULL,
422 NULL,
423 HTMLTableCell_traverse,
424 HTMLTableCell_unlink
425};
426
427static const tid_t HTMLTableCell_iface_tids[] = {
428 HTMLELEMENT_TIDS,
429 IHTMLTableCell_tid,
430 0
431};
432
433static dispex_static_data_t HTMLTableCell_dispex = {
434 NULL,
435 DispHTMLTableCell_tid,
436 NULL,
437 HTMLTableCell_iface_tids
438};
439
440HRESULT HTMLTableCell_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
441{
442 HTMLTableCell *ret;
443 nsresult nsres;
444
445 ret = heap_alloc_zero(sizeof(*ret));
446 if(!ret)
447 return E_OUTOFMEMORY;
448
449 ret->IHTMLTableCell_iface.lpVtbl = &HTMLTableCellVtbl;
450 ret->element.node.vtbl = &HTMLTableCellImplVtbl;
451
452 HTMLElement_Init(&ret->element, doc, nselem, &HTMLTableCell_dispex);
453
454 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLTableCellElement, (void**)&ret->nscell);
455 assert(nsres == NS_OK);
456
457 *elem = &ret->element;
458 return S_OK;
459}