nsStyleConsts.h added some HTML 4 consts for tables
nsHTMLAtoms.cpp,h added some HTML 4 strings for tables nsHTMLParts.h added constructors for new table content classes nsGenericHTMLElement.cpp,h added table frame creation, common table attribute parsing nsHTMLTable*Element.cpp these are the new table content classes nsHTMLContentSink.cpp enabled the new content and removed the old nsHTMLStyleSheet.cpp fixed the table style optimizations to work with new content nsTable*Frame.cpp these work with the new content
This commit is contained in:
@@ -78,6 +78,7 @@ CPPSRCS= \
|
|||||||
nsHTMLTableCaptionElement.cpp \
|
nsHTMLTableCaptionElement.cpp \
|
||||||
nsHTMLTableCellElement.cpp \
|
nsHTMLTableCellElement.cpp \
|
||||||
nsHTMLTableColElement.cpp \
|
nsHTMLTableColElement.cpp \
|
||||||
|
nsHTMLTableColGroupElement.cpp \
|
||||||
nsHTMLTableRowElement.cpp \
|
nsHTMLTableRowElement.cpp \
|
||||||
nsHTMLTableSectionElement.cpp \
|
nsHTMLTableSectionElement.cpp \
|
||||||
nsHTMLTextAreaElement.cpp \
|
nsHTMLTextAreaElement.cpp \
|
||||||
@@ -143,6 +144,7 @@ CPP_OBJS= \
|
|||||||
.\$(OBJDIR)\nsHTMLTableCaptionElement.obj \
|
.\$(OBJDIR)\nsHTMLTableCaptionElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTableCellElement.obj \
|
.\$(OBJDIR)\nsHTMLTableCellElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTableColElement.obj \
|
.\$(OBJDIR)\nsHTMLTableColElement.obj \
|
||||||
|
.\$(OBJDIR)\nsHTMLTableColGroupElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTableRowElement.obj \
|
.\$(OBJDIR)\nsHTMLTableRowElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTableSectionElement.obj \
|
.\$(OBJDIR)\nsHTMLTableSectionElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTextAreaElement.obj \
|
.\$(OBJDIR)\nsHTMLTextAreaElement.obj \
|
||||||
|
|||||||
@@ -1866,6 +1866,32 @@ nsGenericHTMLElement::CreateFrame(nsIPresContext* aPresContext,
|
|||||||
rv = NS_NewWBRFrame(mContent, aParentFrame, frame);
|
rv = NS_NewWBRFrame(mContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the table content frames...
|
||||||
|
else if (mTag == nsHTMLAtoms::caption) {
|
||||||
|
rv = NS_NewBodyFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (mTag == nsHTMLAtoms::table) {
|
||||||
|
rv = NS_NewTableFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((mTag == nsHTMLAtoms::tbody) ||
|
||||||
|
(mTag == nsHTMLAtoms::thead) ||
|
||||||
|
(mTag == nsHTMLAtoms::tfoot)) {
|
||||||
|
rv = NS_NewTableRowGroupFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (mTag == nsHTMLAtoms::tr) {
|
||||||
|
rv = NS_NewTableRowFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (mTag == nsHTMLAtoms::colgroup) {
|
||||||
|
rv = NS_NewTableColGroupFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (mTag == nsHTMLAtoms::col) {
|
||||||
|
rv = NS_NewTableColFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((mTag == nsHTMLAtoms::td) ||
|
||||||
|
(mTag == nsHTMLAtoms::th)) {
|
||||||
|
rv = NS_NewTableCellFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
|
||||||
if (NS_OK != rv) {
|
if (NS_OK != rv) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
@@ -2489,6 +2515,23 @@ static nsGenericHTMLElement::EnumTable kScrollingStandardTable[] = {
|
|||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kTableHAlignTable[] = {
|
||||||
|
{ "left", NS_STYLE_TEXT_ALIGN_LEFT },
|
||||||
|
{ "right", NS_STYLE_TEXT_ALIGN_RIGHT },
|
||||||
|
{ "center", NS_STYLE_TEXT_ALIGN_CENTER },
|
||||||
|
{ "char", NS_STYLE_TEXT_ALIGN_CHAR },
|
||||||
|
{ "justify",NS_STYLE_TEXT_ALIGN_JUSTIFY },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kTableVAlignTable[] = {
|
||||||
|
{ "top", NS_STYLE_VERTICAL_ALIGN_TOP },
|
||||||
|
{ "middle", NS_STYLE_VERTICAL_ALIGN_MIDDLE },
|
||||||
|
{ "bottom", NS_STYLE_VERTICAL_ALIGN_BOTTOM },
|
||||||
|
{ "baseline",NS_STYLE_VERTICAL_ALIGN_BASELINE },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
nsGenericHTMLElement::ParseAlignValue(const nsString& aString,
|
nsGenericHTMLElement::ParseAlignValue(const nsString& aString,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
@@ -2496,6 +2539,20 @@ nsGenericHTMLElement::ParseAlignValue(const nsString& aString,
|
|||||||
return ParseEnumValue(aString, kAlignTable, aResult);
|
return ParseEnumValue(aString, kAlignTable, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsGenericHTMLElement::ParseTableHAlignValue(const nsString& aString,
|
||||||
|
nsHTMLValue& aResult)
|
||||||
|
{
|
||||||
|
return ParseEnumValue(aString, kTableHAlignTable, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsGenericHTMLElement::ParseTableVAlignValue(const nsString& aString,
|
||||||
|
nsHTMLValue& aResult)
|
||||||
|
{
|
||||||
|
return ParseEnumValue(aString, kTableVAlignTable, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
nsGenericHTMLElement::AlignValueToString(const nsHTMLValue& aValue,
|
nsGenericHTMLElement::AlignValueToString(const nsHTMLValue& aValue,
|
||||||
nsString& aResult)
|
nsString& aResult)
|
||||||
@@ -2503,6 +2560,20 @@ nsGenericHTMLElement::AlignValueToString(const nsHTMLValue& aValue,
|
|||||||
return EnumValueToString(aValue, kAlignTable, aResult);
|
return EnumValueToString(aValue, kAlignTable, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsGenericHTMLElement::TableHAlignValueToString(const nsHTMLValue& aValue,
|
||||||
|
nsString& aResult)
|
||||||
|
{
|
||||||
|
return EnumValueToString(aValue, kTableHAlignTable, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsGenericHTMLElement::TableVAlignValueToString(const nsHTMLValue& aValue,
|
||||||
|
nsString& aResult)
|
||||||
|
{
|
||||||
|
return EnumValueToString(aValue, kTableVAlignTable, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
nsGenericHTMLElement::ParseDivAlignValue(const nsString& aString,
|
nsGenericHTMLElement::ParseDivAlignValue(const nsString& aString,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
|
|||||||
@@ -238,6 +238,18 @@ public:
|
|||||||
static PRBool ParseDivAlignValue(const nsString& aString,
|
static PRBool ParseDivAlignValue(const nsString& aString,
|
||||||
nsHTMLValue& aResult);
|
nsHTMLValue& aResult);
|
||||||
|
|
||||||
|
static PRBool ParseTableHAlignValue(const nsString& aString,
|
||||||
|
nsHTMLValue& aResult);
|
||||||
|
|
||||||
|
static PRBool ParseTableVAlignValue(const nsString& aString,
|
||||||
|
nsHTMLValue& aResult);
|
||||||
|
|
||||||
|
static PRBool TableHAlignValueToString(const nsHTMLValue& aValue,
|
||||||
|
nsString& aResult);
|
||||||
|
|
||||||
|
static PRBool TableVAlignValueToString(const nsHTMLValue& aValue,
|
||||||
|
nsString& aResult);
|
||||||
|
|
||||||
static PRBool AlignValueToString(const nsHTMLValue& aValue,
|
static PRBool AlignValueToString(const nsHTMLValue& aValue,
|
||||||
nsString& aResult);
|
nsString& aResult);
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ nsIAtom* nsHTMLAtoms::border;
|
|||||||
nsIAtom* nsHTMLAtoms::bordercolor;
|
nsIAtom* nsHTMLAtoms::bordercolor;
|
||||||
nsIAtom* nsHTMLAtoms::bottompadding;
|
nsIAtom* nsHTMLAtoms::bottompadding;
|
||||||
nsIAtom* nsHTMLAtoms::br;
|
nsIAtom* nsHTMLAtoms::br;
|
||||||
|
nsIAtom* nsHTMLAtoms::caption;
|
||||||
nsIAtom* nsHTMLAtoms::cellpadding;
|
nsIAtom* nsHTMLAtoms::cellpadding;
|
||||||
nsIAtom* nsHTMLAtoms::cellspacing;
|
nsIAtom* nsHTMLAtoms::cellspacing;
|
||||||
nsIAtom* nsHTMLAtoms::ch;
|
nsIAtom* nsHTMLAtoms::ch;
|
||||||
@@ -58,6 +59,8 @@ nsIAtom* nsHTMLAtoms::code;
|
|||||||
nsIAtom* nsHTMLAtoms::codebase;
|
nsIAtom* nsHTMLAtoms::codebase;
|
||||||
nsIAtom* nsHTMLAtoms::codetype;
|
nsIAtom* nsHTMLAtoms::codetype;
|
||||||
nsIAtom* nsHTMLAtoms::color;
|
nsIAtom* nsHTMLAtoms::color;
|
||||||
|
nsIAtom* nsHTMLAtoms::col;
|
||||||
|
nsIAtom* nsHTMLAtoms::colgroup;
|
||||||
nsIAtom* nsHTMLAtoms::cols;
|
nsIAtom* nsHTMLAtoms::cols;
|
||||||
nsIAtom* nsHTMLAtoms::colspan;
|
nsIAtom* nsHTMLAtoms::colspan;
|
||||||
nsIAtom* nsHTMLAtoms::columnPseudo;
|
nsIAtom* nsHTMLAtoms::columnPseudo;
|
||||||
@@ -189,13 +192,17 @@ nsIAtom* nsHTMLAtoms::tabindex;
|
|||||||
nsIAtom* nsHTMLAtoms::table;
|
nsIAtom* nsHTMLAtoms::table;
|
||||||
nsIAtom* nsHTMLAtoms::tabstop;
|
nsIAtom* nsHTMLAtoms::tabstop;
|
||||||
nsIAtom* nsHTMLAtoms::target;
|
nsIAtom* nsHTMLAtoms::target;
|
||||||
|
nsIAtom* nsHTMLAtoms::tbody;
|
||||||
nsIAtom* nsHTMLAtoms::td;
|
nsIAtom* nsHTMLAtoms::td;
|
||||||
|
nsIAtom* nsHTMLAtoms::tfoot;
|
||||||
|
nsIAtom* nsHTMLAtoms::thead;
|
||||||
nsIAtom* nsHTMLAtoms::text;
|
nsIAtom* nsHTMLAtoms::text;
|
||||||
nsIAtom* nsHTMLAtoms::textarea;
|
nsIAtom* nsHTMLAtoms::textarea;
|
||||||
nsIAtom* nsHTMLAtoms::th;
|
nsIAtom* nsHTMLAtoms::th;
|
||||||
nsIAtom* nsHTMLAtoms::title;
|
nsIAtom* nsHTMLAtoms::title;
|
||||||
nsIAtom* nsHTMLAtoms::top;
|
nsIAtom* nsHTMLAtoms::top;
|
||||||
nsIAtom* nsHTMLAtoms::toppadding;
|
nsIAtom* nsHTMLAtoms::toppadding;
|
||||||
|
nsIAtom* nsHTMLAtoms::tr;
|
||||||
nsIAtom* nsHTMLAtoms::type;
|
nsIAtom* nsHTMLAtoms::type;
|
||||||
nsIAtom* nsHTMLAtoms::ul;
|
nsIAtom* nsHTMLAtoms::ul;
|
||||||
nsIAtom* nsHTMLAtoms::usemap;
|
nsIAtom* nsHTMLAtoms::usemap;
|
||||||
@@ -243,6 +250,7 @@ void nsHTMLAtoms::AddrefAtoms()
|
|||||||
bordercolor = NS_NewAtom("BORDERCOLOR");
|
bordercolor = NS_NewAtom("BORDERCOLOR");
|
||||||
bottompadding = NS_NewAtom("BOTTOMPADDING");
|
bottompadding = NS_NewAtom("BOTTOMPADDING");
|
||||||
br = NS_NewAtom("BR");
|
br = NS_NewAtom("BR");
|
||||||
|
caption = NS_NewAtom("CAPTION");
|
||||||
cellpadding = NS_NewAtom("CELLPADDING");
|
cellpadding = NS_NewAtom("CELLPADDING");
|
||||||
cellspacing = NS_NewAtom("CELLSPACING");
|
cellspacing = NS_NewAtom("CELLSPACING");
|
||||||
ch = NS_NewAtom("CH");
|
ch = NS_NewAtom("CH");
|
||||||
@@ -258,6 +266,8 @@ void nsHTMLAtoms::AddrefAtoms()
|
|||||||
codebase = NS_NewAtom("CODEBASE");
|
codebase = NS_NewAtom("CODEBASE");
|
||||||
codetype = NS_NewAtom("CODETYPE");
|
codetype = NS_NewAtom("CODETYPE");
|
||||||
color = NS_NewAtom("COLOR");
|
color = NS_NewAtom("COLOR");
|
||||||
|
col = NS_NewAtom("COL");
|
||||||
|
colgroup = NS_NewAtom("COLGROUP");
|
||||||
cols = NS_NewAtom("COLS");
|
cols = NS_NewAtom("COLS");
|
||||||
colspan = NS_NewAtom("COLSPAN");
|
colspan = NS_NewAtom("COLSPAN");
|
||||||
columnPseudo = NS_NewAtom(":BODY-COLUMN");
|
columnPseudo = NS_NewAtom(":BODY-COLUMN");
|
||||||
@@ -388,13 +398,17 @@ void nsHTMLAtoms::AddrefAtoms()
|
|||||||
table = NS_NewAtom("TABLE");
|
table = NS_NewAtom("TABLE");
|
||||||
tabstop = NS_NewAtom("TABSTOP");
|
tabstop = NS_NewAtom("TABSTOP");
|
||||||
target = NS_NewAtom("TARGET");
|
target = NS_NewAtom("TARGET");
|
||||||
|
tbody = NS_NewAtom("TBODY");
|
||||||
td = NS_NewAtom("TD");
|
td = NS_NewAtom("TD");
|
||||||
|
tfoot = NS_NewAtom("TFOOT");
|
||||||
|
thead = NS_NewAtom("THEAD");
|
||||||
text = NS_NewAtom("TEXT");
|
text = NS_NewAtom("TEXT");
|
||||||
textarea = NS_NewAtom("TEXTAREA");
|
textarea = NS_NewAtom("TEXTAREA");
|
||||||
th = NS_NewAtom("TH");
|
th = NS_NewAtom("TH");
|
||||||
title = NS_NewAtom("TITLE");
|
title = NS_NewAtom("TITLE");
|
||||||
top = NS_NewAtom("TOP");
|
top = NS_NewAtom("TOP");
|
||||||
toppadding = NS_NewAtom("TOPPADDING");
|
toppadding = NS_NewAtom("TOPPADDING");
|
||||||
|
tr = NS_NewAtom("TR");
|
||||||
type = NS_NewAtom("TYPE");
|
type = NS_NewAtom("TYPE");
|
||||||
ul = NS_NewAtom("UL");
|
ul = NS_NewAtom("UL");
|
||||||
usemap = NS_NewAtom("USEMAP");
|
usemap = NS_NewAtom("USEMAP");
|
||||||
@@ -440,6 +454,7 @@ void nsHTMLAtoms::ReleaseAtoms()
|
|||||||
NS_RELEASE(bordercolor);
|
NS_RELEASE(bordercolor);
|
||||||
NS_RELEASE(bottompadding);
|
NS_RELEASE(bottompadding);
|
||||||
NS_RELEASE(br);
|
NS_RELEASE(br);
|
||||||
|
NS_RELEASE(caption);
|
||||||
NS_RELEASE(cellpadding);
|
NS_RELEASE(cellpadding);
|
||||||
NS_RELEASE(cellspacing);
|
NS_RELEASE(cellspacing);
|
||||||
NS_RELEASE(ch);
|
NS_RELEASE(ch);
|
||||||
@@ -455,6 +470,8 @@ void nsHTMLAtoms::ReleaseAtoms()
|
|||||||
NS_RELEASE(codebase);
|
NS_RELEASE(codebase);
|
||||||
NS_RELEASE(codetype);
|
NS_RELEASE(codetype);
|
||||||
NS_RELEASE(color);
|
NS_RELEASE(color);
|
||||||
|
NS_RELEASE(col);
|
||||||
|
NS_RELEASE(colgroup);
|
||||||
NS_RELEASE(cols);
|
NS_RELEASE(cols);
|
||||||
NS_RELEASE(colspan);
|
NS_RELEASE(colspan);
|
||||||
NS_RELEASE(columnPseudo);
|
NS_RELEASE(columnPseudo);
|
||||||
@@ -579,12 +596,16 @@ void nsHTMLAtoms::ReleaseAtoms()
|
|||||||
NS_RELEASE(table);
|
NS_RELEASE(table);
|
||||||
NS_RELEASE(tabstop);
|
NS_RELEASE(tabstop);
|
||||||
NS_RELEASE(target);
|
NS_RELEASE(target);
|
||||||
|
NS_RELEASE(tbody);
|
||||||
NS_RELEASE(td);
|
NS_RELEASE(td);
|
||||||
|
NS_RELEASE(tfoot);
|
||||||
|
NS_RELEASE(thead);
|
||||||
NS_RELEASE(text);
|
NS_RELEASE(text);
|
||||||
NS_RELEASE(textarea);
|
NS_RELEASE(textarea);
|
||||||
NS_RELEASE(th);
|
NS_RELEASE(th);
|
||||||
NS_RELEASE(top);
|
NS_RELEASE(top);
|
||||||
NS_RELEASE(toppadding);
|
NS_RELEASE(toppadding);
|
||||||
|
NS_RELEASE(tr);
|
||||||
NS_RELEASE(type);
|
NS_RELEASE(type);
|
||||||
NS_RELEASE(ul);
|
NS_RELEASE(ul);
|
||||||
NS_RELEASE(usemap);
|
NS_RELEASE(usemap);
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ public:
|
|||||||
static nsIAtom* bottompadding;
|
static nsIAtom* bottompadding;
|
||||||
static nsIAtom* br;
|
static nsIAtom* br;
|
||||||
|
|
||||||
|
static nsIAtom* caption;
|
||||||
static nsIAtom* cellpadding;
|
static nsIAtom* cellpadding;
|
||||||
static nsIAtom* cellspacing;
|
static nsIAtom* cellspacing;
|
||||||
static nsIAtom* ch;
|
static nsIAtom* ch;
|
||||||
@@ -79,6 +80,8 @@ public:
|
|||||||
static nsIAtom* codebase;
|
static nsIAtom* codebase;
|
||||||
static nsIAtom* codetype;
|
static nsIAtom* codetype;
|
||||||
static nsIAtom* color;
|
static nsIAtom* color;
|
||||||
|
static nsIAtom* col;
|
||||||
|
static nsIAtom* colgroup;
|
||||||
static nsIAtom* cols;
|
static nsIAtom* cols;
|
||||||
static nsIAtom* colspan;
|
static nsIAtom* colspan;
|
||||||
static nsIAtom* columnPseudo;
|
static nsIAtom* columnPseudo;
|
||||||
@@ -224,13 +227,17 @@ public:
|
|||||||
static nsIAtom* table;
|
static nsIAtom* table;
|
||||||
static nsIAtom* tabstop;
|
static nsIAtom* tabstop;
|
||||||
static nsIAtom* target;
|
static nsIAtom* target;
|
||||||
|
static nsIAtom* tbody;
|
||||||
static nsIAtom* td;
|
static nsIAtom* td;
|
||||||
|
static nsIAtom* tfoot;
|
||||||
|
static nsIAtom* thead;
|
||||||
static nsIAtom* text;
|
static nsIAtom* text;
|
||||||
static nsIAtom* textarea;
|
static nsIAtom* textarea;
|
||||||
static nsIAtom* th;
|
static nsIAtom* th;
|
||||||
static nsIAtom* title;
|
static nsIAtom* title;
|
||||||
static nsIAtom* top;
|
static nsIAtom* top;
|
||||||
static nsIAtom* toppadding;
|
static nsIAtom* toppadding;
|
||||||
|
static nsIAtom* tr;
|
||||||
static nsIAtom* type;
|
static nsIAtom* type;
|
||||||
|
|
||||||
static nsIAtom* ul;
|
static nsIAtom* ul;
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
#include "nsStyleConsts.h"
|
#include "nsStyleConsts.h"
|
||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
|
|
||||||
static NS_DEFINE_IID(kIDOMHTMLTableCaptionElementIID, NS_IDOMHTMLTABLECAPTIONELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLTableCaptionElementIID, NS_IDOMHTMLTABLECAPTIONELEMENT_IID);
|
||||||
|
|
||||||
@@ -124,12 +125,24 @@ nsHTMLTableCaptionElement::CloneNode(nsIDOMNode** aReturn)
|
|||||||
|
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableCaptionElement, Align, align, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableCaptionElement, Align, align, eSetAttrNotify_Reflow)
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kTableCaptionAlignTable[] = {
|
||||||
|
{ "left", NS_STYLE_TEXT_ALIGN_LEFT },
|
||||||
|
{ "right", NS_STYLE_TEXT_ALIGN_RIGHT },
|
||||||
|
{ "top", NS_STYLE_VERTICAL_ALIGN_TOP},
|
||||||
|
{ "bottom",NS_STYLE_VERTICAL_ALIGN_BOTTOM},
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableCaptionElement::StringToAttribute(nsIAtom* aAttribute,
|
nsHTMLTableCaptionElement::StringToAttribute(nsIAtom* aAttribute,
|
||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseEnumValue(aValue, kTableCaptionAlignTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +151,12 @@ nsHTMLTableCaptionElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (eHTMLUnit_Enumerated == aValue.GetUnit()) {
|
||||||
|
nsGenericHTMLElement::AlignValueToString(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,7 +165,32 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
if (nsnull != aAttributes) {
|
||||||
|
nsHTMLValue value;
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated) {
|
||||||
|
PRUint8 align = value.GetIntValue();
|
||||||
|
nsStyleText* text = (nsStyleText*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
switch (align) {
|
||||||
|
case NS_STYLE_VERTICAL_ALIGN_TOP:
|
||||||
|
case NS_STYLE_VERTICAL_ALIGN_BOTTOM:
|
||||||
|
text->mVerticalAlign.SetIntValue(align, eStyleUnit_Enumerated);
|
||||||
|
break;
|
||||||
|
// XXX: this is not right, it sets the content's h-align
|
||||||
|
// what it should do is actually move the caption to the left or right of the table!
|
||||||
|
/*
|
||||||
|
case NS_STYLE_TEXT_ALIGN_LEFT:
|
||||||
|
case NS_STYLE_TEXT_ALIGN_RIGHT:
|
||||||
|
text->mTextAlign = align;
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
// illegal value -- ignore it.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,12 @@
|
|||||||
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||||
* Netscape Communications Corporation. All Rights Reserved.
|
* Netscape Communications Corporation. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
#include "nsIHTMLTableCellElement.h"
|
||||||
#include "nsIDOMHTMLTableCellElement.h"
|
#include "nsIDOMHTMLTableCellElement.h"
|
||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -28,29 +30,40 @@
|
|||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
|
|
||||||
static NS_DEFINE_IID(kIDOMHTMLTableCellElementIID, NS_IDOMHTMLTABLECELLELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLTableCellElementIID, NS_IDOMHTMLTABLECELLELEMENT_IID);
|
||||||
|
static NS_DEFINE_IID(kIHTMLTableCellElementIID, NS_IHTMLTABLECELLELEMENT_IID);
|
||||||
|
|
||||||
class nsHTMLTableCellElement : public nsIDOMHTMLTableCellElement,
|
class nsHTMLTableCellElement : public nsIHTMLTableCellElement,
|
||||||
public nsIScriptObjectOwner,
|
public nsIDOMHTMLTableCellElement,
|
||||||
public nsIDOMEventReceiver,
|
public nsIScriptObjectOwner,
|
||||||
public nsIHTMLContent
|
public nsIDOMEventReceiver,
|
||||||
|
public nsIHTMLContent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsHTMLTableCellElement(nsIAtom* aTag);
|
nsHTMLTableCellElement(nsIAtom* aTag);
|
||||||
~nsHTMLTableCellElement();
|
~nsHTMLTableCellElement();
|
||||||
|
|
||||||
// nsISupports
|
// nsISupports
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
// nsIDOMNode
|
// nsIHTMLTableCellElement
|
||||||
|
|
||||||
|
/** @return the starting column for this cell. Always >= 1 */
|
||||||
|
NS_METHOD GetColIndex (PRInt32* aColIndex);
|
||||||
|
|
||||||
|
/** set the starting column for this cell. Always >= 1 */
|
||||||
|
NS_METHOD SetColIndex (PRInt32 aColIndex);
|
||||||
|
|
||||||
|
|
||||||
|
// nsIDOMNode
|
||||||
NS_IMPL_IDOMNODE_USING_GENERIC(mInner)
|
NS_IMPL_IDOMNODE_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIDOMElement
|
// nsIDOMElement
|
||||||
NS_IMPL_IDOMELEMENT_USING_GENERIC(mInner)
|
NS_IMPL_IDOMELEMENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIDOMHTMLElement
|
// nsIDOMHTMLElement
|
||||||
NS_IMPL_IDOMHTMLELEMENT_USING_GENERIC(mInner)
|
NS_IMPL_IDOMHTMLELEMENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIDOMHTMLTableCellElement
|
// nsIDOMHTMLTableCellElement
|
||||||
NS_IMETHOD GetCellIndex(PRInt32* aCellIndex);
|
NS_IMETHOD GetCellIndex(PRInt32* aCellIndex);
|
||||||
NS_IMETHOD SetCellIndex(PRInt32 aCellIndex);
|
NS_IMETHOD SetCellIndex(PRInt32 aCellIndex);
|
||||||
NS_IMETHOD GetAbbr(nsString& aAbbr);
|
NS_IMETHOD GetAbbr(nsString& aAbbr);
|
||||||
@@ -82,20 +95,21 @@ public:
|
|||||||
NS_IMETHOD GetWidth(nsString& aWidth);
|
NS_IMETHOD GetWidth(nsString& aWidth);
|
||||||
NS_IMETHOD SetWidth(const nsString& aWidth);
|
NS_IMETHOD SetWidth(const nsString& aWidth);
|
||||||
|
|
||||||
// nsIScriptObjectOwner
|
// nsIScriptObjectOwner
|
||||||
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC(mInner)
|
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIDOMEventReceiver
|
// nsIDOMEventReceiver
|
||||||
NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC(mInner)
|
NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIContent
|
// nsIContent
|
||||||
NS_IMPL_ICONTENT_USING_GENERIC(mInner)
|
NS_IMPL_ICONTENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIHTMLContent
|
// nsIHTMLContent
|
||||||
NS_IMPL_IHTMLCONTENT_USING_GENERIC(mInner)
|
NS_IMPL_IHTMLCONTENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsGenericHTMLContainerElement mInner;
|
nsGenericHTMLContainerElement mInner;
|
||||||
|
PRInt32 mColIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
@@ -116,6 +130,7 @@ nsHTMLTableCellElement::nsHTMLTableCellElement(nsIAtom* aTag)
|
|||||||
{
|
{
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
mInner.Init(this, aTag);
|
mInner.Init(this, aTag);
|
||||||
|
mColIndex=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsHTMLTableCellElement::~nsHTMLTableCellElement()
|
nsHTMLTableCellElement::~nsHTMLTableCellElement()
|
||||||
@@ -136,6 +151,12 @@ nsHTMLTableCellElement::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|||||||
mRefCnt++;
|
mRefCnt++;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
else if (aIID.Equals(kIHTMLTableCellElementIID)) {
|
||||||
|
nsIHTMLTableCellElement* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
mRefCnt++;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
return NS_NOINTERFACE;
|
return NS_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,6 +171,20 @@ nsHTMLTableCellElement::CloneNode(nsIDOMNode** aReturn)
|
|||||||
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return the starting column for this cell in aColIndex. Always >= 1 */
|
||||||
|
NS_METHOD nsHTMLTableCellElement::GetColIndex (PRInt32* aColIndex)
|
||||||
|
{
|
||||||
|
*aColIndex = mColIndex;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** set the starting column for this cell. Always >= 1 */
|
||||||
|
NS_METHOD nsHTMLTableCellElement::SetColIndex (PRInt32 aColIndex)
|
||||||
|
{
|
||||||
|
mColIndex = aColIndex;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableCellElement::GetCellIndex(PRInt32* aCellIndex)
|
nsHTMLTableCellElement::GetCellIndex(PRInt32* aCellIndex)
|
||||||
{
|
{
|
||||||
@@ -179,12 +214,73 @@ NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, Scope, scope, eSetAttrNotify_None)
|
|||||||
NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, VAlign, valign, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, VAlign, valign, eSetAttrNotify_Reflow)
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, Width, width, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, Width, width, eSetAttrNotify_Reflow)
|
||||||
|
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kCellScopeTable[] = {
|
||||||
|
{ "row", NS_STYLE_CELL_SCOPE_ROW },
|
||||||
|
{ "col", NS_STYLE_CELL_SCOPE_COL },
|
||||||
|
{ "rowgroup", NS_STYLE_CELL_SCOPE_ROWGROUP },
|
||||||
|
{ "colgroup", NS_STYLE_CELL_SCOPE_COLGROUP },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableCellElement::StringToAttribute(nsIAtom* aAttribute,
|
nsHTMLTableCellElement::StringToAttribute(nsIAtom* aAttribute,
|
||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored simply as strings
|
||||||
|
abbr, axis, ch, headers
|
||||||
|
*/
|
||||||
|
/* attributes that resolve to integers */
|
||||||
|
if ((aAttribute == nsHTMLAtoms::choff) ||
|
||||||
|
(aAttribute == nsHTMLAtoms::colspan) ||
|
||||||
|
(aAttribute == nsHTMLAtoms::rowspan)) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::height) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercent(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents or proportions */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::width) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercentOrProportional(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::background) {
|
||||||
|
nsAutoString href(aValue);
|
||||||
|
href.StripWhitespace();
|
||||||
|
aResult.SetStringValue(href);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::bgcolor) {
|
||||||
|
nsGenericHTMLElement::ParseColor(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::nowrap) {
|
||||||
|
aResult.SetEmptyValue();
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::scope) {
|
||||||
|
if (nsGenericHTMLElement::ParseEnumValue(aValue, kCellScopeTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableVAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,7 +289,27 @@ nsHTMLTableCellElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored already as strings
|
||||||
|
abbr, axis, ch, headers
|
||||||
|
*/
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
choff, colspan, rowspan, height, width, nowrap, background, bgcolor
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::scope) {
|
||||||
|
if (nsGenericHTMLElement::EnumValueToString(aValue, kCellScopeTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::TableVAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,8 +318,68 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
if (nsnull!=aAttributes)
|
||||||
|
{
|
||||||
|
nsHTMLValue value;
|
||||||
|
nsHTMLValue widthValue;
|
||||||
|
nsStyleText* textStyle = nsnull;
|
||||||
|
|
||||||
|
// align: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mTextAlign = value.GetIntValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// valign: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
||||||
|
}
|
||||||
|
|
||||||
|
// width: pixel
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsStylePosition* pos = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::width, widthValue);
|
||||||
|
if (widthValue.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
nscoord twips = NSIntPixelsToTwips(widthValue.GetPixelValue(), p2t);
|
||||||
|
pos->mWidth.SetCoordValue(twips);
|
||||||
|
}
|
||||||
|
else if (widthValue.GetUnit() == eHTMLUnit_Percent) {
|
||||||
|
pos->mWidth.SetPercentValue(widthValue.GetPercentValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
// height: pixel
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::height, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
nscoord twips = NSIntPixelsToTwips(value.GetPixelValue(), p2t);
|
||||||
|
pos->mHeight.SetCoordValue(twips);
|
||||||
|
}
|
||||||
|
|
||||||
|
// nowrap
|
||||||
|
// nowrap depends on the width attribute, so be sure to handle it after width is mapped!
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::nowrap, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Empty)
|
||||||
|
{
|
||||||
|
if (widthValue.GetUnit() != eHTMLUnit_Pixel)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mWhiteSpace = NS_STYLE_WHITESPACE_NOWRAP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -17,9 +17,11 @@
|
|||||||
* Netscape Communications Corporation. All Rights Reserved.
|
* Netscape Communications Corporation. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
#include "nsIDOMHTMLTableColElement.h"
|
#include "nsIDOMHTMLTableColElement.h"
|
||||||
|
#include "nsIHTMLTableColElement.h"
|
||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -28,11 +30,13 @@
|
|||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
|
|
||||||
static NS_DEFINE_IID(kIDOMHTMLTableColElementIID, NS_IDOMHTMLTABLECOLELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLTableColElementIID, NS_IDOMHTMLTABLECOLELEMENT_IID);
|
||||||
|
static NS_DEFINE_IID(kIHTMLTableColElementIID, NS_IHTMLTABLECOLELEMENT_IID);
|
||||||
|
|
||||||
class nsHTMLTableColElement : public nsIDOMHTMLTableColElement,
|
class nsHTMLTableColElement : public nsIDOMHTMLTableColElement,
|
||||||
public nsIScriptObjectOwner,
|
public nsIScriptObjectOwner,
|
||||||
public nsIDOMEventReceiver,
|
public nsIDOMEventReceiver,
|
||||||
public nsIHTMLContent
|
public nsIHTMLContent,
|
||||||
|
public nsIHTMLTableColElement
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsHTMLTableColElement(nsIAtom* aTag);
|
nsHTMLTableColElement(nsIAtom* aTag);
|
||||||
@@ -76,6 +80,9 @@ public:
|
|||||||
// nsIHTMLContent
|
// nsIHTMLContent
|
||||||
NS_IMPL_IHTMLCONTENT_USING_GENERIC(mInner)
|
NS_IMPL_IHTMLCONTENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
|
// nsIHTMLTableColElement
|
||||||
|
NS_IMETHOD GetSpanValue(PRInt32* aSpan);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsGenericHTMLContainerElement mInner;
|
nsGenericHTMLContainerElement mInner;
|
||||||
};
|
};
|
||||||
@@ -118,6 +125,12 @@ nsHTMLTableColElement::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|||||||
mRefCnt++;
|
mRefCnt++;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
if (aIID.Equals(kIHTMLTableColElementIID)) {
|
||||||
|
nsIHTMLTableColElement* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
mRefCnt++;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
return NS_NOINTERFACE;
|
return NS_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +157,36 @@ nsHTMLTableColElement::StringToAttribute(nsIAtom* aAttribute,
|
|||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored simply as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* attributes that resolve to integers */
|
||||||
|
if (aAttribute == nsHTMLAtoms::choff) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::repeat) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 1, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents or proportions */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::width) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercentOrProportional(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableVAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +195,22 @@ nsHTMLTableColElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored already as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
choff, repeat, width
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::TableVAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,10 +219,52 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
if (nsnull != aAttributes) {
|
||||||
|
|
||||||
|
float p2t;
|
||||||
|
nsHTMLValue value;
|
||||||
|
nsStyleText* textStyle = nsnull;
|
||||||
|
|
||||||
|
// width
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::width, value);
|
||||||
|
if (value.GetUnit() != eHTMLUnit_Null) {
|
||||||
|
nsStylePosition* position = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
switch (value.GetUnit()) {
|
||||||
|
case eHTMLUnit_Percent:
|
||||||
|
position->mWidth.SetPercentValue(value.GetPercentValue());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case eHTMLUnit_Pixel:
|
||||||
|
p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
position->mWidth.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// align: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mTextAlign = value.GetIntValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// valign: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
||||||
|
}
|
||||||
|
}
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableColElement::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
nsHTMLTableColElement::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
||||||
{
|
{
|
||||||
@@ -184,3 +283,16 @@ nsHTMLTableColElement::HandleDOMEvent(nsIPresContext& aPresContext,
|
|||||||
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
||||||
aFlags, aEventStatus);
|
aFlags, aEventStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_METHOD nsHTMLTableColElement::GetSpanValue(PRInt32* aSpan)
|
||||||
|
{
|
||||||
|
if (nsnull!=aSpan)
|
||||||
|
{
|
||||||
|
PRInt32 span=-1;
|
||||||
|
GetSpan(&span);
|
||||||
|
if (-1==span)
|
||||||
|
span=1; // the default;
|
||||||
|
*aSpan = span;
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -156,6 +157,9 @@ nsHTMLTableElement::CloneNode(nsIDOMNode** aReturn)
|
|||||||
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the DOM spec says border, cellpadding, cellSpacing are all "wstring"
|
||||||
|
// in fact, they are integers or they are meaningless. so we store them here as ints.
|
||||||
|
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableElement, Align, align, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableElement, Align, align, eSetAttrNotify_Reflow)
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableElement, BgColor, bgcolor, eSetAttrNotify_Render)
|
NS_IMPL_STRING_ATTR(nsHTMLTableElement, BgColor, bgcolor, eSetAttrNotify_Render)
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableElement, Border, border, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableElement, Border, border, eSetAttrNotify_Reflow)
|
||||||
@@ -283,12 +287,109 @@ nsHTMLTableElement::DeleteRow(PRInt32 aValue)
|
|||||||
return NS_OK; // XXX write me
|
return NS_OK; // XXX write me
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kFrameTable[] = {
|
||||||
|
{ "void", NS_STYLE_TABLE_FRAME_NONE },
|
||||||
|
{ "above", NS_STYLE_TABLE_FRAME_ABOVE },
|
||||||
|
{ "below", NS_STYLE_TABLE_FRAME_BELOW },
|
||||||
|
{ "hsides", NS_STYLE_TABLE_FRAME_HSIDES },
|
||||||
|
{ "lhs", NS_STYLE_TABLE_FRAME_LEFT },
|
||||||
|
{ "rhs", NS_STYLE_TABLE_FRAME_RIGHT },
|
||||||
|
{ "vsides", NS_STYLE_TABLE_FRAME_VSIDES },
|
||||||
|
{ "box", NS_STYLE_TABLE_FRAME_BOX },
|
||||||
|
{ "border", NS_STYLE_TABLE_FRAME_BORDER },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kRulesTable[] = {
|
||||||
|
{ "none", NS_STYLE_TABLE_RULES_NONE },
|
||||||
|
{ "groups", NS_STYLE_TABLE_RULES_GROUPS },
|
||||||
|
{ "rows", NS_STYLE_TABLE_RULES_ROWS },
|
||||||
|
{ "cols", NS_STYLE_TABLE_RULES_COLS },
|
||||||
|
{ "all", NS_STYLE_TABLE_RULES_ALL },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableElement::StringToAttribute(nsIAtom* aAttribute,
|
nsHTMLTableElement::StringToAttribute(nsIAtom* aAttribute,
|
||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore summary, just a string */
|
||||||
|
/* attributes that resolve to pixels */
|
||||||
|
if ((aAttribute == nsHTMLAtoms::cellspacing) ||
|
||||||
|
(aAttribute == nsHTMLAtoms::cellpadding)) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that are either empty, or integers */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::cols) {
|
||||||
|
nsAutoString tmp(aValue);
|
||||||
|
tmp.StripWhitespace();
|
||||||
|
if (0 == tmp.Length()) {
|
||||||
|
// Just set COLS, same as COLS=number of columns
|
||||||
|
aResult.SetEmptyValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
}
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that are either empty, or pixels */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::cols) {
|
||||||
|
nsAutoString tmp(aValue);
|
||||||
|
tmp.StripWhitespace();
|
||||||
|
if (0 == tmp.Length()) {
|
||||||
|
// Just enable the border; same as border=1
|
||||||
|
aResult.SetEmptyValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Pixel);
|
||||||
|
}
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::height) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercent(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents or proportions */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::width) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercentOrProportional(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::background) {
|
||||||
|
nsAutoString href(aValue);
|
||||||
|
href.StripWhitespace();
|
||||||
|
aResult.SetStringValue(href);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::bgcolor) {
|
||||||
|
nsGenericHTMLElement::ParseColor(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::frame) {
|
||||||
|
nsGenericHTMLElement::ParseEnumValue(aValue, kFrameTable, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::rules) {
|
||||||
|
nsGenericHTMLElement::ParseEnumValue(aValue, kRulesTable, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,17 +398,164 @@ nsHTMLTableElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore summary, just a string */
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
border, cellpadding, cellspacing, cols, height, width, background, bgcolor
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::frame) {
|
||||||
|
if (nsGenericHTMLElement::EnumValueToString(aValue, kFrameTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::rules) {
|
||||||
|
if (nsGenericHTMLElement::EnumValueToString(aValue, kRulesTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX: this is only sufficient for Nav4/HTML3.2
|
||||||
|
// XXX: needs to be filled in for HTML4
|
||||||
|
static void
|
||||||
|
MapTableBorderInto(nsIHTMLAttributes* aAttributes,
|
||||||
|
nsIStyleContext* aContext,
|
||||||
|
nsIPresContext* aPresContext)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
nsHTMLValue value;
|
||||||
|
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::border, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_String)
|
||||||
|
{
|
||||||
|
nsAutoString borderAsString;
|
||||||
|
value.GetStringValue(borderAsString);
|
||||||
|
nsGenericHTMLElement::ParseValue(borderAsString, 0, value, eHTMLUnit_Pixel);
|
||||||
|
}
|
||||||
|
if ((value.GetUnit() == eHTMLUnit_Pixel) ||
|
||||||
|
(value.GetUnit() == eHTMLUnit_Empty)) {
|
||||||
|
nsStyleSpacing* spacing = (nsStyleSpacing*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Spacing);
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsStyleCoord twips;
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Empty) {
|
||||||
|
twips.SetCoordValue(NSIntPixelsToTwips(1, p2t));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
twips.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
}
|
||||||
|
|
||||||
|
spacing->mBorder.SetTop(twips);
|
||||||
|
spacing->mBorder.SetRight(twips);
|
||||||
|
spacing->mBorder.SetBottom(twips);
|
||||||
|
spacing->mBorder.SetLeft(twips);
|
||||||
|
|
||||||
|
if (spacing->mBorderStyle[0] == NS_STYLE_BORDER_STYLE_NONE) {
|
||||||
|
spacing->mBorderStyle[0] = NS_STYLE_BORDER_STYLE_SOLID;
|
||||||
|
}
|
||||||
|
if (spacing->mBorderStyle[1] == NS_STYLE_BORDER_STYLE_NONE) {
|
||||||
|
spacing->mBorderStyle[1] = NS_STYLE_BORDER_STYLE_SOLID;
|
||||||
|
}
|
||||||
|
if (spacing->mBorderStyle[2] == NS_STYLE_BORDER_STYLE_NONE) {
|
||||||
|
spacing->mBorderStyle[2] = NS_STYLE_BORDER_STYLE_SOLID;
|
||||||
|
}
|
||||||
|
if (spacing->mBorderStyle[3] == NS_STYLE_BORDER_STYLE_NONE) {
|
||||||
|
spacing->mBorderStyle[3] = NS_STYLE_BORDER_STYLE_SOLID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
if (nsnull!=aAttributes)
|
||||||
|
{
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsHTMLValue value;
|
||||||
|
|
||||||
|
// width
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::width, value);
|
||||||
|
if (value.GetUnit() != eHTMLUnit_Null) {
|
||||||
|
nsStylePosition* position = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
switch (value.GetUnit()) {
|
||||||
|
case eHTMLUnit_Percent:
|
||||||
|
position->mWidth.SetPercentValue(value.GetPercentValue());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case eHTMLUnit_Pixel:
|
||||||
|
position->mWidth.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// border
|
||||||
|
MapTableBorderInto(aAttributes, aContext, aPresContext);
|
||||||
|
|
||||||
|
// align
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated) { // it may be another type if illegal
|
||||||
|
nsStyleDisplay* display = (nsStyleDisplay*)aContext->GetMutableStyleData(eStyleStruct_Display);
|
||||||
|
switch (value.GetIntValue()) {
|
||||||
|
case NS_STYLE_TEXT_ALIGN_LEFT:
|
||||||
|
display->mFloats = NS_STYLE_FLOAT_LEFT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NS_STYLE_TEXT_ALIGN_RIGHT:
|
||||||
|
display->mFloats = NS_STYLE_FLOAT_RIGHT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// cellpadding
|
||||||
|
nsStyleTable* tableStyle=nsnull;
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::cellpadding, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
||||||
|
tableStyle->mCellPadding.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
}
|
||||||
|
|
||||||
|
// cellspacing (reuses tableStyle if already resolved)
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::cellspacing, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
if (nsnull==tableStyle)
|
||||||
|
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
||||||
|
tableStyle->mCellSpacing.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // XXX: remove me as soon as we get this from the style sheet
|
||||||
|
if (nsnull==tableStyle)
|
||||||
|
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
||||||
|
tableStyle->mCellSpacing.SetCoordValue(NSIntPixelsToTwips(2, p2t));
|
||||||
|
}
|
||||||
|
|
||||||
|
// cols
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::cols, value);
|
||||||
|
if (value.GetUnit() != eHTMLUnit_Null) {
|
||||||
|
if (nsnull==tableStyle)
|
||||||
|
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Integer)
|
||||||
|
tableStyle->mCols = value.GetIntValue();
|
||||||
|
else // COLS had no value, so it refers to all columns
|
||||||
|
tableStyle->mCols = NS_STYLE_TABLE_COLS_ALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//background: color
|
||||||
|
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -204,12 +205,54 @@ NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, Ch, ch, eSetAttrNotify_Reflow)
|
|||||||
NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, ChOff, choff, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, ChOff, choff, eSetAttrNotify_Reflow)
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, VAlign, valign, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, VAlign, valign, eSetAttrNotify_Reflow)
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableRowElement::StringToAttribute(nsIAtom* aAttribute,
|
nsHTMLTableRowElement::StringToAttribute(nsIAtom* aAttribute,
|
||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored simply as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* attributes that resolve to integers */
|
||||||
|
if (aAttribute == nsHTMLAtoms::choff) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::height) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercent(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents or proportions */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::width) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercentOrProportional(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::background) {
|
||||||
|
nsAutoString href(aValue);
|
||||||
|
href.StripWhitespace();
|
||||||
|
aResult.SetStringValue(href);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::bgcolor) {
|
||||||
|
nsGenericHTMLElement::ParseColor(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableVAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,7 +261,22 @@ nsHTMLTableRowElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored already as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
choff, height, width, background, bgcolor
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::TableVAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,8 +285,44 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
if (nsnull!=aAttributes)
|
||||||
|
{
|
||||||
|
nsHTMLValue value;
|
||||||
|
nsHTMLValue widthValue;
|
||||||
|
nsStyleText* textStyle = nsnull;
|
||||||
|
|
||||||
|
// align: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mTextAlign = value.GetIntValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// valign: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
||||||
|
}
|
||||||
|
|
||||||
|
// height: pixel
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::height, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsStylePosition* pos = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
nscoord twips = NSIntPixelsToTwips(value.GetPixelValue(), p2t);
|
||||||
|
pos->mHeight.SetCoordValue(twips);
|
||||||
|
}
|
||||||
|
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -29,6 +30,8 @@
|
|||||||
|
|
||||||
static NS_DEFINE_IID(kIDOMHTMLTableSectionElementIID, NS_IDOMHTMLTABLESECTIONELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLTableSectionElementIID, NS_IDOMHTMLTABLESECTIONELEMENT_IID);
|
||||||
|
|
||||||
|
// you will see the phrases "rowgroup" and "section" used interchangably
|
||||||
|
|
||||||
class nsHTMLTableSectionElement : public nsIDOMHTMLTableSectionElement,
|
class nsHTMLTableSectionElement : public nsIDOMHTMLTableSectionElement,
|
||||||
public nsIScriptObjectOwner,
|
public nsIScriptObjectOwner,
|
||||||
public nsIDOMEventReceiver,
|
public nsIDOMEventReceiver,
|
||||||
@@ -166,7 +169,43 @@ nsHTMLTableSectionElement::StringToAttribute(nsIAtom* aAttribute,
|
|||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored simply as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* attributes that resolve to integers */
|
||||||
|
if (aAttribute == nsHTMLAtoms::choff) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::height) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercent(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::background) {
|
||||||
|
nsAutoString href(aValue);
|
||||||
|
href.StripWhitespace();
|
||||||
|
aResult.SetStringValue(href);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::bgcolor) {
|
||||||
|
nsGenericHTMLElement::ParseColor(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableVAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,7 +214,22 @@ nsHTMLTableSectionElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored already as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
choff, height, width, background, bgcolor
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::TableVAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,8 +238,45 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
if (nsnull!=aAttributes)
|
||||||
|
{
|
||||||
|
nsHTMLValue value;
|
||||||
|
nsHTMLValue widthValue;
|
||||||
|
nsStyleText* textStyle = nsnull;
|
||||||
|
|
||||||
|
// align: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mTextAlign = value.GetIntValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// valign: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
||||||
|
}
|
||||||
|
|
||||||
|
// height: pixel
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::height, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsStylePosition* pos = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
nscoord twips = NSIntPixelsToTwips(value.GetPixelValue(), p2t);
|
||||||
|
pos->mHeight.SetCoordValue(twips);
|
||||||
|
}
|
||||||
|
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -34,10 +34,6 @@
|
|||||||
#include "nsHTMLParts.h"
|
#include "nsHTMLParts.h"
|
||||||
#include "nsITextContent.h"
|
#include "nsITextContent.h"
|
||||||
|
|
||||||
|
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsTableRow.h"
|
|
||||||
#include "nsTableCell.h"
|
|
||||||
#include "nsIDOMText.h"
|
#include "nsIDOMText.h"
|
||||||
|
|
||||||
#include "nsHTMLForms.h"
|
#include "nsHTMLForms.h"
|
||||||
@@ -487,13 +483,13 @@ MakeContentObject(nsHTMLTag aNodeType,
|
|||||||
rv = NS_NewHTMLBRElement(aResult, aAtom);
|
rv = NS_NewHTMLBRElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_caption:
|
case eHTMLTag_caption:
|
||||||
rv = NS_NewTableCaptionPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableCaptionElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_col:
|
case eHTMLTag_col:
|
||||||
rv = NS_NewTableColPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableColElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_colgroup:
|
case eHTMLTag_colgroup:
|
||||||
rv = NS_NewTableColGroupPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableColGroupElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_dir:
|
case eHTMLTag_dir:
|
||||||
rv = NS_NewHTMLDirectoryElement(aResult, aAtom);
|
rv = NS_NewHTMLDirectoryElement(aResult, aAtom);
|
||||||
@@ -603,16 +599,16 @@ MakeContentObject(nsHTMLTag aNodeType,
|
|||||||
rv = NS_NewHTMLStyleElement(aResult, aAtom);
|
rv = NS_NewHTMLStyleElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_table:
|
case eHTMLTag_table:
|
||||||
rv = NS_NewTablePart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_tbody:
|
case eHTMLTag_tbody:
|
||||||
case eHTMLTag_thead:
|
case eHTMLTag_thead:
|
||||||
case eHTMLTag_tfoot:
|
case eHTMLTag_tfoot:
|
||||||
rv = NS_NewTableRowGroupPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableSectionElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_td:
|
case eHTMLTag_td:
|
||||||
case eHTMLTag_th:
|
case eHTMLTag_th:
|
||||||
rv = NS_NewTableCellPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableCellElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_textarea:
|
case eHTMLTag_textarea:
|
||||||
rv = NS_NewHTMLTextAreaElement(aResult, aAtom);
|
rv = NS_NewHTMLTextAreaElement(aResult, aAtom);
|
||||||
@@ -621,7 +617,7 @@ MakeContentObject(nsHTMLTag aNodeType,
|
|||||||
rv = NS_NewHTMLTitleElement(aResult, aAtom);
|
rv = NS_NewHTMLTitleElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_tr:
|
case eHTMLTag_tr:
|
||||||
rv = NS_NewTableRowPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableRowElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_ul:
|
case eHTMLTag_ul:
|
||||||
rv = NS_NewHTMLUListElement(aResult, aAtom);
|
rv = NS_NewHTMLUListElement(aResult, aAtom);
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
#include "nsILinkHandler.h"
|
#include "nsILinkHandler.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsTableCell.h"
|
#include "nsIHTMLTableCellElement.h"
|
||||||
#include "nsTableColFrame.h"
|
#include "nsTableColFrame.h"
|
||||||
#include "nsTableFrame.h"
|
#include "nsTableFrame.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -46,6 +46,7 @@ static NS_DEFINE_IID(kIHTMLStyleSheetIID, NS_IHTML_STYLE_SHEET_IID);
|
|||||||
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
|
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
|
||||||
static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID);
|
static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID);
|
||||||
static NS_DEFINE_IID(kIStyleFrameConstructionIID, NS_ISTYLE_FRAME_CONSTRUCTION_IID);
|
static NS_DEFINE_IID(kIStyleFrameConstructionIID, NS_ISTYLE_FRAME_CONSTRUCTION_IID);
|
||||||
|
static NS_DEFINE_IID(kIHTMLTableCellElementIID, NS_IHTMLTABLECELLELEMENT_IID);
|
||||||
|
|
||||||
|
|
||||||
class HTMLAnchorRule : public nsIStyleRule {
|
class HTMLAnchorRule : public nsIStyleRule {
|
||||||
@@ -520,8 +521,6 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
|
|||||||
// makes table cells process attributes from other content
|
// makes table cells process attributes from other content
|
||||||
// inherit based style (ie: font-size: 110%) can double on row & cell
|
// inherit based style (ie: font-size: 110%) can double on row & cell
|
||||||
PRInt32 backstopInsertPoint = 0;
|
PRInt32 backstopInsertPoint = 0;
|
||||||
nsTableCell* cell = (nsTableCell*)aContent;
|
|
||||||
PRInt32 colIndex = cell->GetColIndex();
|
|
||||||
|
|
||||||
nsIFrame* rowFrame = aParentFrame;
|
nsIFrame* rowFrame = aParentFrame;
|
||||||
nsIFrame* rowGroupFrame;
|
nsIFrame* rowGroupFrame;
|
||||||
@@ -530,17 +529,24 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
|
|||||||
rowFrame->GetContentParent(rowGroupFrame);
|
rowFrame->GetContentParent(rowGroupFrame);
|
||||||
rowGroupFrame->GetContentParent(tableFrame);
|
rowGroupFrame->GetContentParent(tableFrame);
|
||||||
|
|
||||||
nsTableColFrame* colFrame;
|
nsIHTMLTableCellElement* cell=nsnull;
|
||||||
nsIFrame* colGroupFrame;
|
nsresult rv = aContent->QueryInterface(kIHTMLTableCellElementIID,
|
||||||
|
(void **)&cell); // cell: REFCNT++
|
||||||
|
if (NS_SUCCEEDED(rv)) {
|
||||||
|
PRInt32 colIndex;
|
||||||
|
rv = cell->GetColIndex(&colIndex);
|
||||||
|
nsTableColFrame* colFrame;
|
||||||
|
nsIFrame* colGroupFrame;
|
||||||
|
|
||||||
((nsTableFrame*)tableFrame)->GetColumnFrame(colIndex, colFrame);
|
((nsTableFrame*)tableFrame)->GetColumnFrame(colIndex, colFrame);
|
||||||
colFrame->GetContentParent(colGroupFrame);
|
colFrame->GetContentParent(colGroupFrame);
|
||||||
|
|
||||||
matchCount += AppendRulesFrom(colGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(colGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
matchCount += AppendRulesFrom(colFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(colFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
|
NS_RELEASE(cell); // cell: REFCNT--
|
||||||
|
}
|
||||||
matchCount += AppendRulesFrom(rowGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(rowGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
matchCount += AppendRulesFrom(rowFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(rowFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
|
|
||||||
} // end TD/TH tag
|
} // end TD/TH tag
|
||||||
|
|
||||||
// just get the one and only style rule from the content
|
// just get the one and only style rule from the content
|
||||||
@@ -1055,9 +1061,6 @@ NS_IMETHODIMP HTMLStyleSheetImpl::ConstructFrame(nsIPresContext* aPresContext,
|
|||||||
else if (nsHTMLAtoms::wbr == aTag) {
|
else if (nsHTMLAtoms::wbr == aTag) {
|
||||||
rv = NS_NewWBRFrame(aContent, aParentFrame, frame);
|
rv = NS_NewWBRFrame(aContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
else if (nsHTMLAtoms::table == aTag) {
|
|
||||||
rv = nsTableOuterFrame::NewFrame(&frame, aContent, aParentFrame);
|
|
||||||
}
|
|
||||||
else if (nsHTMLAtoms::input == aTag) {
|
else if (nsHTMLAtoms::input == aTag) {
|
||||||
rv = CreateInputFrame(aContent, aParentFrame, frame);
|
rv = CreateInputFrame(aContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
@@ -1071,6 +1074,32 @@ NS_IMETHODIMP HTMLStyleSheetImpl::ConstructFrame(nsIPresContext* aPresContext,
|
|||||||
rv = NS_NewHTMLFrameOuterFrame(aContent, aParentFrame, frame);
|
rv = NS_NewHTMLFrameOuterFrame(aContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the table content frames...
|
||||||
|
else if (nsHTMLAtoms::caption == aTag) {
|
||||||
|
rv = NS_NewBodyFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::table == aTag) {
|
||||||
|
rv = NS_NewTableOuterFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((nsHTMLAtoms::tbody == aTag) ||
|
||||||
|
(nsHTMLAtoms::thead == aTag) ||
|
||||||
|
(nsHTMLAtoms::tfoot == aTag)) {
|
||||||
|
rv = NS_NewTableRowGroupFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::tr == aTag) {
|
||||||
|
rv = NS_NewTableRowFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::colgroup == aTag) {
|
||||||
|
rv = NS_NewTableColGroupFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::col == aTag) {
|
||||||
|
rv = NS_NewTableColFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((nsHTMLAtoms::td == aTag) ||
|
||||||
|
(nsHTMLAtoms::th == aTag)) {
|
||||||
|
rv = NS_NewTableCellFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
|
||||||
if (NS_OK != rv) {
|
if (NS_OK != rv) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ public:
|
|||||||
static nsIAtom* bottompadding;
|
static nsIAtom* bottompadding;
|
||||||
static nsIAtom* br;
|
static nsIAtom* br;
|
||||||
|
|
||||||
|
static nsIAtom* caption;
|
||||||
static nsIAtom* cellpadding;
|
static nsIAtom* cellpadding;
|
||||||
static nsIAtom* cellspacing;
|
static nsIAtom* cellspacing;
|
||||||
static nsIAtom* ch;
|
static nsIAtom* ch;
|
||||||
@@ -79,6 +80,8 @@ public:
|
|||||||
static nsIAtom* codebase;
|
static nsIAtom* codebase;
|
||||||
static nsIAtom* codetype;
|
static nsIAtom* codetype;
|
||||||
static nsIAtom* color;
|
static nsIAtom* color;
|
||||||
|
static nsIAtom* col;
|
||||||
|
static nsIAtom* colgroup;
|
||||||
static nsIAtom* cols;
|
static nsIAtom* cols;
|
||||||
static nsIAtom* colspan;
|
static nsIAtom* colspan;
|
||||||
static nsIAtom* columnPseudo;
|
static nsIAtom* columnPseudo;
|
||||||
@@ -224,13 +227,17 @@ public:
|
|||||||
static nsIAtom* table;
|
static nsIAtom* table;
|
||||||
static nsIAtom* tabstop;
|
static nsIAtom* tabstop;
|
||||||
static nsIAtom* target;
|
static nsIAtom* target;
|
||||||
|
static nsIAtom* tbody;
|
||||||
static nsIAtom* td;
|
static nsIAtom* td;
|
||||||
|
static nsIAtom* tfoot;
|
||||||
|
static nsIAtom* thead;
|
||||||
static nsIAtom* text;
|
static nsIAtom* text;
|
||||||
static nsIAtom* textarea;
|
static nsIAtom* textarea;
|
||||||
static nsIAtom* th;
|
static nsIAtom* th;
|
||||||
static nsIAtom* title;
|
static nsIAtom* title;
|
||||||
static nsIAtom* top;
|
static nsIAtom* top;
|
||||||
static nsIAtom* toppadding;
|
static nsIAtom* toppadding;
|
||||||
|
static nsIAtom* tr;
|
||||||
static nsIAtom* type;
|
static nsIAtom* type;
|
||||||
|
|
||||||
static nsIAtom* ul;
|
static nsIAtom* ul;
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ nsIAtom* nsHTMLAtoms::border;
|
|||||||
nsIAtom* nsHTMLAtoms::bordercolor;
|
nsIAtom* nsHTMLAtoms::bordercolor;
|
||||||
nsIAtom* nsHTMLAtoms::bottompadding;
|
nsIAtom* nsHTMLAtoms::bottompadding;
|
||||||
nsIAtom* nsHTMLAtoms::br;
|
nsIAtom* nsHTMLAtoms::br;
|
||||||
|
nsIAtom* nsHTMLAtoms::caption;
|
||||||
nsIAtom* nsHTMLAtoms::cellpadding;
|
nsIAtom* nsHTMLAtoms::cellpadding;
|
||||||
nsIAtom* nsHTMLAtoms::cellspacing;
|
nsIAtom* nsHTMLAtoms::cellspacing;
|
||||||
nsIAtom* nsHTMLAtoms::ch;
|
nsIAtom* nsHTMLAtoms::ch;
|
||||||
@@ -58,6 +59,8 @@ nsIAtom* nsHTMLAtoms::code;
|
|||||||
nsIAtom* nsHTMLAtoms::codebase;
|
nsIAtom* nsHTMLAtoms::codebase;
|
||||||
nsIAtom* nsHTMLAtoms::codetype;
|
nsIAtom* nsHTMLAtoms::codetype;
|
||||||
nsIAtom* nsHTMLAtoms::color;
|
nsIAtom* nsHTMLAtoms::color;
|
||||||
|
nsIAtom* nsHTMLAtoms::col;
|
||||||
|
nsIAtom* nsHTMLAtoms::colgroup;
|
||||||
nsIAtom* nsHTMLAtoms::cols;
|
nsIAtom* nsHTMLAtoms::cols;
|
||||||
nsIAtom* nsHTMLAtoms::colspan;
|
nsIAtom* nsHTMLAtoms::colspan;
|
||||||
nsIAtom* nsHTMLAtoms::columnPseudo;
|
nsIAtom* nsHTMLAtoms::columnPseudo;
|
||||||
@@ -189,13 +192,17 @@ nsIAtom* nsHTMLAtoms::tabindex;
|
|||||||
nsIAtom* nsHTMLAtoms::table;
|
nsIAtom* nsHTMLAtoms::table;
|
||||||
nsIAtom* nsHTMLAtoms::tabstop;
|
nsIAtom* nsHTMLAtoms::tabstop;
|
||||||
nsIAtom* nsHTMLAtoms::target;
|
nsIAtom* nsHTMLAtoms::target;
|
||||||
|
nsIAtom* nsHTMLAtoms::tbody;
|
||||||
nsIAtom* nsHTMLAtoms::td;
|
nsIAtom* nsHTMLAtoms::td;
|
||||||
|
nsIAtom* nsHTMLAtoms::tfoot;
|
||||||
|
nsIAtom* nsHTMLAtoms::thead;
|
||||||
nsIAtom* nsHTMLAtoms::text;
|
nsIAtom* nsHTMLAtoms::text;
|
||||||
nsIAtom* nsHTMLAtoms::textarea;
|
nsIAtom* nsHTMLAtoms::textarea;
|
||||||
nsIAtom* nsHTMLAtoms::th;
|
nsIAtom* nsHTMLAtoms::th;
|
||||||
nsIAtom* nsHTMLAtoms::title;
|
nsIAtom* nsHTMLAtoms::title;
|
||||||
nsIAtom* nsHTMLAtoms::top;
|
nsIAtom* nsHTMLAtoms::top;
|
||||||
nsIAtom* nsHTMLAtoms::toppadding;
|
nsIAtom* nsHTMLAtoms::toppadding;
|
||||||
|
nsIAtom* nsHTMLAtoms::tr;
|
||||||
nsIAtom* nsHTMLAtoms::type;
|
nsIAtom* nsHTMLAtoms::type;
|
||||||
nsIAtom* nsHTMLAtoms::ul;
|
nsIAtom* nsHTMLAtoms::ul;
|
||||||
nsIAtom* nsHTMLAtoms::usemap;
|
nsIAtom* nsHTMLAtoms::usemap;
|
||||||
@@ -243,6 +250,7 @@ void nsHTMLAtoms::AddrefAtoms()
|
|||||||
bordercolor = NS_NewAtom("BORDERCOLOR");
|
bordercolor = NS_NewAtom("BORDERCOLOR");
|
||||||
bottompadding = NS_NewAtom("BOTTOMPADDING");
|
bottompadding = NS_NewAtom("BOTTOMPADDING");
|
||||||
br = NS_NewAtom("BR");
|
br = NS_NewAtom("BR");
|
||||||
|
caption = NS_NewAtom("CAPTION");
|
||||||
cellpadding = NS_NewAtom("CELLPADDING");
|
cellpadding = NS_NewAtom("CELLPADDING");
|
||||||
cellspacing = NS_NewAtom("CELLSPACING");
|
cellspacing = NS_NewAtom("CELLSPACING");
|
||||||
ch = NS_NewAtom("CH");
|
ch = NS_NewAtom("CH");
|
||||||
@@ -258,6 +266,8 @@ void nsHTMLAtoms::AddrefAtoms()
|
|||||||
codebase = NS_NewAtom("CODEBASE");
|
codebase = NS_NewAtom("CODEBASE");
|
||||||
codetype = NS_NewAtom("CODETYPE");
|
codetype = NS_NewAtom("CODETYPE");
|
||||||
color = NS_NewAtom("COLOR");
|
color = NS_NewAtom("COLOR");
|
||||||
|
col = NS_NewAtom("COL");
|
||||||
|
colgroup = NS_NewAtom("COLGROUP");
|
||||||
cols = NS_NewAtom("COLS");
|
cols = NS_NewAtom("COLS");
|
||||||
colspan = NS_NewAtom("COLSPAN");
|
colspan = NS_NewAtom("COLSPAN");
|
||||||
columnPseudo = NS_NewAtom(":BODY-COLUMN");
|
columnPseudo = NS_NewAtom(":BODY-COLUMN");
|
||||||
@@ -388,13 +398,17 @@ void nsHTMLAtoms::AddrefAtoms()
|
|||||||
table = NS_NewAtom("TABLE");
|
table = NS_NewAtom("TABLE");
|
||||||
tabstop = NS_NewAtom("TABSTOP");
|
tabstop = NS_NewAtom("TABSTOP");
|
||||||
target = NS_NewAtom("TARGET");
|
target = NS_NewAtom("TARGET");
|
||||||
|
tbody = NS_NewAtom("TBODY");
|
||||||
td = NS_NewAtom("TD");
|
td = NS_NewAtom("TD");
|
||||||
|
tfoot = NS_NewAtom("TFOOT");
|
||||||
|
thead = NS_NewAtom("THEAD");
|
||||||
text = NS_NewAtom("TEXT");
|
text = NS_NewAtom("TEXT");
|
||||||
textarea = NS_NewAtom("TEXTAREA");
|
textarea = NS_NewAtom("TEXTAREA");
|
||||||
th = NS_NewAtom("TH");
|
th = NS_NewAtom("TH");
|
||||||
title = NS_NewAtom("TITLE");
|
title = NS_NewAtom("TITLE");
|
||||||
top = NS_NewAtom("TOP");
|
top = NS_NewAtom("TOP");
|
||||||
toppadding = NS_NewAtom("TOPPADDING");
|
toppadding = NS_NewAtom("TOPPADDING");
|
||||||
|
tr = NS_NewAtom("TR");
|
||||||
type = NS_NewAtom("TYPE");
|
type = NS_NewAtom("TYPE");
|
||||||
ul = NS_NewAtom("UL");
|
ul = NS_NewAtom("UL");
|
||||||
usemap = NS_NewAtom("USEMAP");
|
usemap = NS_NewAtom("USEMAP");
|
||||||
@@ -440,6 +454,7 @@ void nsHTMLAtoms::ReleaseAtoms()
|
|||||||
NS_RELEASE(bordercolor);
|
NS_RELEASE(bordercolor);
|
||||||
NS_RELEASE(bottompadding);
|
NS_RELEASE(bottompadding);
|
||||||
NS_RELEASE(br);
|
NS_RELEASE(br);
|
||||||
|
NS_RELEASE(caption);
|
||||||
NS_RELEASE(cellpadding);
|
NS_RELEASE(cellpadding);
|
||||||
NS_RELEASE(cellspacing);
|
NS_RELEASE(cellspacing);
|
||||||
NS_RELEASE(ch);
|
NS_RELEASE(ch);
|
||||||
@@ -455,6 +470,8 @@ void nsHTMLAtoms::ReleaseAtoms()
|
|||||||
NS_RELEASE(codebase);
|
NS_RELEASE(codebase);
|
||||||
NS_RELEASE(codetype);
|
NS_RELEASE(codetype);
|
||||||
NS_RELEASE(color);
|
NS_RELEASE(color);
|
||||||
|
NS_RELEASE(col);
|
||||||
|
NS_RELEASE(colgroup);
|
||||||
NS_RELEASE(cols);
|
NS_RELEASE(cols);
|
||||||
NS_RELEASE(colspan);
|
NS_RELEASE(colspan);
|
||||||
NS_RELEASE(columnPseudo);
|
NS_RELEASE(columnPseudo);
|
||||||
@@ -579,12 +596,16 @@ void nsHTMLAtoms::ReleaseAtoms()
|
|||||||
NS_RELEASE(table);
|
NS_RELEASE(table);
|
||||||
NS_RELEASE(tabstop);
|
NS_RELEASE(tabstop);
|
||||||
NS_RELEASE(target);
|
NS_RELEASE(target);
|
||||||
|
NS_RELEASE(tbody);
|
||||||
NS_RELEASE(td);
|
NS_RELEASE(td);
|
||||||
|
NS_RELEASE(tfoot);
|
||||||
|
NS_RELEASE(thead);
|
||||||
NS_RELEASE(text);
|
NS_RELEASE(text);
|
||||||
NS_RELEASE(textarea);
|
NS_RELEASE(textarea);
|
||||||
NS_RELEASE(th);
|
NS_RELEASE(th);
|
||||||
NS_RELEASE(top);
|
NS_RELEASE(top);
|
||||||
NS_RELEASE(toppadding);
|
NS_RELEASE(toppadding);
|
||||||
|
NS_RELEASE(tr);
|
||||||
NS_RELEASE(type);
|
NS_RELEASE(type);
|
||||||
NS_RELEASE(ul);
|
NS_RELEASE(ul);
|
||||||
NS_RELEASE(usemap);
|
NS_RELEASE(usemap);
|
||||||
|
|||||||
@@ -206,6 +206,7 @@
|
|||||||
#define NS_STYLE_TEXT_ALIGN_RIGHT 2
|
#define NS_STYLE_TEXT_ALIGN_RIGHT 2
|
||||||
#define NS_STYLE_TEXT_ALIGN_CENTER 3
|
#define NS_STYLE_TEXT_ALIGN_CENTER 3
|
||||||
#define NS_STYLE_TEXT_ALIGN_JUSTIFY 4
|
#define NS_STYLE_TEXT_ALIGN_JUSTIFY 4
|
||||||
|
#define NS_STYLE_TEXT_ALIGN_CHAR 5 //align based on a certain character, for table cell
|
||||||
|
|
||||||
// See nsStyleText, nsStyleFont
|
// See nsStyleText, nsStyleFont
|
||||||
#define NS_STYLE_TEXT_DECORATION_NONE 0
|
#define NS_STYLE_TEXT_DECORATION_NONE 0
|
||||||
@@ -265,4 +266,11 @@
|
|||||||
#define NS_STYLE_TABLE_COLS_NONE (-1)
|
#define NS_STYLE_TABLE_COLS_NONE (-1)
|
||||||
#define NS_STYLE_TABLE_COLS_ALL PRInt32(1 << 30)
|
#define NS_STYLE_TABLE_COLS_ALL PRInt32(1 << 30)
|
||||||
|
|
||||||
|
// constants for cell "scope" attribute
|
||||||
|
#define NS_STYLE_CELL_SCOPE_ROW 0
|
||||||
|
#define NS_STYLE_CELL_SCOPE_COL 1
|
||||||
|
#define NS_STYLE_CELL_SCOPE_ROWGROUP 2
|
||||||
|
#define NS_STYLE_CELL_SCOPE_COLGROUP 3
|
||||||
|
|
||||||
|
|
||||||
#endif /* nsStyleConsts_h___ */
|
#endif /* nsStyleConsts_h___ */
|
||||||
|
|||||||
@@ -187,6 +187,9 @@ NS_NewHTMLTableCellElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
|||||||
extern nsresult
|
extern nsresult
|
||||||
NS_NewHTMLTableColElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
NS_NewHTMLTableColElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewHTMLTableColGroupElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
||||||
|
|
||||||
extern nsresult
|
extern nsresult
|
||||||
NS_NewHTMLTableElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
NS_NewHTMLTableElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
||||||
|
|
||||||
@@ -322,6 +325,40 @@ extern nsresult
|
|||||||
NS_NewBulletFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
NS_NewBulletFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
nsIFrame*& aResult);
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
// table frame factories
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableOuterFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableCaptionFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableColFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableColGroupFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableRowFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableRowGroupFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableCellFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
// Everything below this line is obsolete...
|
// Everything below this line is obsolete...
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// XXX naming consistency puhleeze!
|
// XXX naming consistency puhleeze!
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ nsIAtom* nsHTMLAtoms::border;
|
|||||||
nsIAtom* nsHTMLAtoms::bordercolor;
|
nsIAtom* nsHTMLAtoms::bordercolor;
|
||||||
nsIAtom* nsHTMLAtoms::bottompadding;
|
nsIAtom* nsHTMLAtoms::bottompadding;
|
||||||
nsIAtom* nsHTMLAtoms::br;
|
nsIAtom* nsHTMLAtoms::br;
|
||||||
|
nsIAtom* nsHTMLAtoms::caption;
|
||||||
nsIAtom* nsHTMLAtoms::cellpadding;
|
nsIAtom* nsHTMLAtoms::cellpadding;
|
||||||
nsIAtom* nsHTMLAtoms::cellspacing;
|
nsIAtom* nsHTMLAtoms::cellspacing;
|
||||||
nsIAtom* nsHTMLAtoms::ch;
|
nsIAtom* nsHTMLAtoms::ch;
|
||||||
@@ -58,6 +59,8 @@ nsIAtom* nsHTMLAtoms::code;
|
|||||||
nsIAtom* nsHTMLAtoms::codebase;
|
nsIAtom* nsHTMLAtoms::codebase;
|
||||||
nsIAtom* nsHTMLAtoms::codetype;
|
nsIAtom* nsHTMLAtoms::codetype;
|
||||||
nsIAtom* nsHTMLAtoms::color;
|
nsIAtom* nsHTMLAtoms::color;
|
||||||
|
nsIAtom* nsHTMLAtoms::col;
|
||||||
|
nsIAtom* nsHTMLAtoms::colgroup;
|
||||||
nsIAtom* nsHTMLAtoms::cols;
|
nsIAtom* nsHTMLAtoms::cols;
|
||||||
nsIAtom* nsHTMLAtoms::colspan;
|
nsIAtom* nsHTMLAtoms::colspan;
|
||||||
nsIAtom* nsHTMLAtoms::columnPseudo;
|
nsIAtom* nsHTMLAtoms::columnPseudo;
|
||||||
@@ -189,13 +192,17 @@ nsIAtom* nsHTMLAtoms::tabindex;
|
|||||||
nsIAtom* nsHTMLAtoms::table;
|
nsIAtom* nsHTMLAtoms::table;
|
||||||
nsIAtom* nsHTMLAtoms::tabstop;
|
nsIAtom* nsHTMLAtoms::tabstop;
|
||||||
nsIAtom* nsHTMLAtoms::target;
|
nsIAtom* nsHTMLAtoms::target;
|
||||||
|
nsIAtom* nsHTMLAtoms::tbody;
|
||||||
nsIAtom* nsHTMLAtoms::td;
|
nsIAtom* nsHTMLAtoms::td;
|
||||||
|
nsIAtom* nsHTMLAtoms::tfoot;
|
||||||
|
nsIAtom* nsHTMLAtoms::thead;
|
||||||
nsIAtom* nsHTMLAtoms::text;
|
nsIAtom* nsHTMLAtoms::text;
|
||||||
nsIAtom* nsHTMLAtoms::textarea;
|
nsIAtom* nsHTMLAtoms::textarea;
|
||||||
nsIAtom* nsHTMLAtoms::th;
|
nsIAtom* nsHTMLAtoms::th;
|
||||||
nsIAtom* nsHTMLAtoms::title;
|
nsIAtom* nsHTMLAtoms::title;
|
||||||
nsIAtom* nsHTMLAtoms::top;
|
nsIAtom* nsHTMLAtoms::top;
|
||||||
nsIAtom* nsHTMLAtoms::toppadding;
|
nsIAtom* nsHTMLAtoms::toppadding;
|
||||||
|
nsIAtom* nsHTMLAtoms::tr;
|
||||||
nsIAtom* nsHTMLAtoms::type;
|
nsIAtom* nsHTMLAtoms::type;
|
||||||
nsIAtom* nsHTMLAtoms::ul;
|
nsIAtom* nsHTMLAtoms::ul;
|
||||||
nsIAtom* nsHTMLAtoms::usemap;
|
nsIAtom* nsHTMLAtoms::usemap;
|
||||||
@@ -243,6 +250,7 @@ void nsHTMLAtoms::AddrefAtoms()
|
|||||||
bordercolor = NS_NewAtom("BORDERCOLOR");
|
bordercolor = NS_NewAtom("BORDERCOLOR");
|
||||||
bottompadding = NS_NewAtom("BOTTOMPADDING");
|
bottompadding = NS_NewAtom("BOTTOMPADDING");
|
||||||
br = NS_NewAtom("BR");
|
br = NS_NewAtom("BR");
|
||||||
|
caption = NS_NewAtom("CAPTION");
|
||||||
cellpadding = NS_NewAtom("CELLPADDING");
|
cellpadding = NS_NewAtom("CELLPADDING");
|
||||||
cellspacing = NS_NewAtom("CELLSPACING");
|
cellspacing = NS_NewAtom("CELLSPACING");
|
||||||
ch = NS_NewAtom("CH");
|
ch = NS_NewAtom("CH");
|
||||||
@@ -258,6 +266,8 @@ void nsHTMLAtoms::AddrefAtoms()
|
|||||||
codebase = NS_NewAtom("CODEBASE");
|
codebase = NS_NewAtom("CODEBASE");
|
||||||
codetype = NS_NewAtom("CODETYPE");
|
codetype = NS_NewAtom("CODETYPE");
|
||||||
color = NS_NewAtom("COLOR");
|
color = NS_NewAtom("COLOR");
|
||||||
|
col = NS_NewAtom("COL");
|
||||||
|
colgroup = NS_NewAtom("COLGROUP");
|
||||||
cols = NS_NewAtom("COLS");
|
cols = NS_NewAtom("COLS");
|
||||||
colspan = NS_NewAtom("COLSPAN");
|
colspan = NS_NewAtom("COLSPAN");
|
||||||
columnPseudo = NS_NewAtom(":BODY-COLUMN");
|
columnPseudo = NS_NewAtom(":BODY-COLUMN");
|
||||||
@@ -388,13 +398,17 @@ void nsHTMLAtoms::AddrefAtoms()
|
|||||||
table = NS_NewAtom("TABLE");
|
table = NS_NewAtom("TABLE");
|
||||||
tabstop = NS_NewAtom("TABSTOP");
|
tabstop = NS_NewAtom("TABSTOP");
|
||||||
target = NS_NewAtom("TARGET");
|
target = NS_NewAtom("TARGET");
|
||||||
|
tbody = NS_NewAtom("TBODY");
|
||||||
td = NS_NewAtom("TD");
|
td = NS_NewAtom("TD");
|
||||||
|
tfoot = NS_NewAtom("TFOOT");
|
||||||
|
thead = NS_NewAtom("THEAD");
|
||||||
text = NS_NewAtom("TEXT");
|
text = NS_NewAtom("TEXT");
|
||||||
textarea = NS_NewAtom("TEXTAREA");
|
textarea = NS_NewAtom("TEXTAREA");
|
||||||
th = NS_NewAtom("TH");
|
th = NS_NewAtom("TH");
|
||||||
title = NS_NewAtom("TITLE");
|
title = NS_NewAtom("TITLE");
|
||||||
top = NS_NewAtom("TOP");
|
top = NS_NewAtom("TOP");
|
||||||
toppadding = NS_NewAtom("TOPPADDING");
|
toppadding = NS_NewAtom("TOPPADDING");
|
||||||
|
tr = NS_NewAtom("TR");
|
||||||
type = NS_NewAtom("TYPE");
|
type = NS_NewAtom("TYPE");
|
||||||
ul = NS_NewAtom("UL");
|
ul = NS_NewAtom("UL");
|
||||||
usemap = NS_NewAtom("USEMAP");
|
usemap = NS_NewAtom("USEMAP");
|
||||||
@@ -440,6 +454,7 @@ void nsHTMLAtoms::ReleaseAtoms()
|
|||||||
NS_RELEASE(bordercolor);
|
NS_RELEASE(bordercolor);
|
||||||
NS_RELEASE(bottompadding);
|
NS_RELEASE(bottompadding);
|
||||||
NS_RELEASE(br);
|
NS_RELEASE(br);
|
||||||
|
NS_RELEASE(caption);
|
||||||
NS_RELEASE(cellpadding);
|
NS_RELEASE(cellpadding);
|
||||||
NS_RELEASE(cellspacing);
|
NS_RELEASE(cellspacing);
|
||||||
NS_RELEASE(ch);
|
NS_RELEASE(ch);
|
||||||
@@ -455,6 +470,8 @@ void nsHTMLAtoms::ReleaseAtoms()
|
|||||||
NS_RELEASE(codebase);
|
NS_RELEASE(codebase);
|
||||||
NS_RELEASE(codetype);
|
NS_RELEASE(codetype);
|
||||||
NS_RELEASE(color);
|
NS_RELEASE(color);
|
||||||
|
NS_RELEASE(col);
|
||||||
|
NS_RELEASE(colgroup);
|
||||||
NS_RELEASE(cols);
|
NS_RELEASE(cols);
|
||||||
NS_RELEASE(colspan);
|
NS_RELEASE(colspan);
|
||||||
NS_RELEASE(columnPseudo);
|
NS_RELEASE(columnPseudo);
|
||||||
@@ -579,12 +596,16 @@ void nsHTMLAtoms::ReleaseAtoms()
|
|||||||
NS_RELEASE(table);
|
NS_RELEASE(table);
|
||||||
NS_RELEASE(tabstop);
|
NS_RELEASE(tabstop);
|
||||||
NS_RELEASE(target);
|
NS_RELEASE(target);
|
||||||
|
NS_RELEASE(tbody);
|
||||||
NS_RELEASE(td);
|
NS_RELEASE(td);
|
||||||
|
NS_RELEASE(tfoot);
|
||||||
|
NS_RELEASE(thead);
|
||||||
NS_RELEASE(text);
|
NS_RELEASE(text);
|
||||||
NS_RELEASE(textarea);
|
NS_RELEASE(textarea);
|
||||||
NS_RELEASE(th);
|
NS_RELEASE(th);
|
||||||
NS_RELEASE(top);
|
NS_RELEASE(top);
|
||||||
NS_RELEASE(toppadding);
|
NS_RELEASE(toppadding);
|
||||||
|
NS_RELEASE(tr);
|
||||||
NS_RELEASE(type);
|
NS_RELEASE(type);
|
||||||
NS_RELEASE(ul);
|
NS_RELEASE(ul);
|
||||||
NS_RELEASE(usemap);
|
NS_RELEASE(usemap);
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ public:
|
|||||||
static nsIAtom* bottompadding;
|
static nsIAtom* bottompadding;
|
||||||
static nsIAtom* br;
|
static nsIAtom* br;
|
||||||
|
|
||||||
|
static nsIAtom* caption;
|
||||||
static nsIAtom* cellpadding;
|
static nsIAtom* cellpadding;
|
||||||
static nsIAtom* cellspacing;
|
static nsIAtom* cellspacing;
|
||||||
static nsIAtom* ch;
|
static nsIAtom* ch;
|
||||||
@@ -79,6 +80,8 @@ public:
|
|||||||
static nsIAtom* codebase;
|
static nsIAtom* codebase;
|
||||||
static nsIAtom* codetype;
|
static nsIAtom* codetype;
|
||||||
static nsIAtom* color;
|
static nsIAtom* color;
|
||||||
|
static nsIAtom* col;
|
||||||
|
static nsIAtom* colgroup;
|
||||||
static nsIAtom* cols;
|
static nsIAtom* cols;
|
||||||
static nsIAtom* colspan;
|
static nsIAtom* colspan;
|
||||||
static nsIAtom* columnPseudo;
|
static nsIAtom* columnPseudo;
|
||||||
@@ -224,13 +227,17 @@ public:
|
|||||||
static nsIAtom* table;
|
static nsIAtom* table;
|
||||||
static nsIAtom* tabstop;
|
static nsIAtom* tabstop;
|
||||||
static nsIAtom* target;
|
static nsIAtom* target;
|
||||||
|
static nsIAtom* tbody;
|
||||||
static nsIAtom* td;
|
static nsIAtom* td;
|
||||||
|
static nsIAtom* tfoot;
|
||||||
|
static nsIAtom* thead;
|
||||||
static nsIAtom* text;
|
static nsIAtom* text;
|
||||||
static nsIAtom* textarea;
|
static nsIAtom* textarea;
|
||||||
static nsIAtom* th;
|
static nsIAtom* th;
|
||||||
static nsIAtom* title;
|
static nsIAtom* title;
|
||||||
static nsIAtom* top;
|
static nsIAtom* top;
|
||||||
static nsIAtom* toppadding;
|
static nsIAtom* toppadding;
|
||||||
|
static nsIAtom* tr;
|
||||||
static nsIAtom* type;
|
static nsIAtom* type;
|
||||||
|
|
||||||
static nsIAtom* ul;
|
static nsIAtom* ul;
|
||||||
|
|||||||
@@ -187,6 +187,9 @@ NS_NewHTMLTableCellElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
|||||||
extern nsresult
|
extern nsresult
|
||||||
NS_NewHTMLTableColElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
NS_NewHTMLTableColElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewHTMLTableColGroupElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
||||||
|
|
||||||
extern nsresult
|
extern nsresult
|
||||||
NS_NewHTMLTableElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
NS_NewHTMLTableElement(nsIHTMLContent** aResult, nsIAtom* aTag);
|
||||||
|
|
||||||
@@ -322,6 +325,40 @@ extern nsresult
|
|||||||
NS_NewBulletFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
NS_NewBulletFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
nsIFrame*& aResult);
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
// table frame factories
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableOuterFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableCaptionFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableColFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableColGroupFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableRowFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableRowGroupFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewTableCellFrame(nsIContent* aContent, nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
// Everything below this line is obsolete...
|
// Everything below this line is obsolete...
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// XXX naming consistency puhleeze!
|
// XXX naming consistency puhleeze!
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ CPPSRCS= \
|
|||||||
nsHTMLTableCaptionElement.cpp \
|
nsHTMLTableCaptionElement.cpp \
|
||||||
nsHTMLTableCellElement.cpp \
|
nsHTMLTableCellElement.cpp \
|
||||||
nsHTMLTableColElement.cpp \
|
nsHTMLTableColElement.cpp \
|
||||||
|
nsHTMLTableColGroupElement.cpp \
|
||||||
nsHTMLTableRowElement.cpp \
|
nsHTMLTableRowElement.cpp \
|
||||||
nsHTMLTableSectionElement.cpp \
|
nsHTMLTableSectionElement.cpp \
|
||||||
nsHTMLTextAreaElement.cpp \
|
nsHTMLTextAreaElement.cpp \
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ CPPSRCS= \
|
|||||||
nsHTMLTableCaptionElement.cpp \
|
nsHTMLTableCaptionElement.cpp \
|
||||||
nsHTMLTableCellElement.cpp \
|
nsHTMLTableCellElement.cpp \
|
||||||
nsHTMLTableColElement.cpp \
|
nsHTMLTableColElement.cpp \
|
||||||
|
nsHTMLTableColGroupElement.cpp \
|
||||||
nsHTMLTableRowElement.cpp \
|
nsHTMLTableRowElement.cpp \
|
||||||
nsHTMLTableSectionElement.cpp \
|
nsHTMLTableSectionElement.cpp \
|
||||||
nsHTMLTextAreaElement.cpp \
|
nsHTMLTextAreaElement.cpp \
|
||||||
@@ -143,6 +144,7 @@ CPP_OBJS= \
|
|||||||
.\$(OBJDIR)\nsHTMLTableCaptionElement.obj \
|
.\$(OBJDIR)\nsHTMLTableCaptionElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTableCellElement.obj \
|
.\$(OBJDIR)\nsHTMLTableCellElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTableColElement.obj \
|
.\$(OBJDIR)\nsHTMLTableColElement.obj \
|
||||||
|
.\$(OBJDIR)\nsHTMLTableColGroupElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTableRowElement.obj \
|
.\$(OBJDIR)\nsHTMLTableRowElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTableSectionElement.obj \
|
.\$(OBJDIR)\nsHTMLTableSectionElement.obj \
|
||||||
.\$(OBJDIR)\nsHTMLTextAreaElement.obj \
|
.\$(OBJDIR)\nsHTMLTextAreaElement.obj \
|
||||||
|
|||||||
@@ -1866,6 +1866,32 @@ nsGenericHTMLElement::CreateFrame(nsIPresContext* aPresContext,
|
|||||||
rv = NS_NewWBRFrame(mContent, aParentFrame, frame);
|
rv = NS_NewWBRFrame(mContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the table content frames...
|
||||||
|
else if (mTag == nsHTMLAtoms::caption) {
|
||||||
|
rv = NS_NewBodyFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (mTag == nsHTMLAtoms::table) {
|
||||||
|
rv = NS_NewTableFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((mTag == nsHTMLAtoms::tbody) ||
|
||||||
|
(mTag == nsHTMLAtoms::thead) ||
|
||||||
|
(mTag == nsHTMLAtoms::tfoot)) {
|
||||||
|
rv = NS_NewTableRowGroupFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (mTag == nsHTMLAtoms::tr) {
|
||||||
|
rv = NS_NewTableRowFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (mTag == nsHTMLAtoms::colgroup) {
|
||||||
|
rv = NS_NewTableColGroupFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (mTag == nsHTMLAtoms::col) {
|
||||||
|
rv = NS_NewTableColFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((mTag == nsHTMLAtoms::td) ||
|
||||||
|
(mTag == nsHTMLAtoms::th)) {
|
||||||
|
rv = NS_NewTableCellFrame(mContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
|
||||||
if (NS_OK != rv) {
|
if (NS_OK != rv) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
@@ -2489,6 +2515,23 @@ static nsGenericHTMLElement::EnumTable kScrollingStandardTable[] = {
|
|||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kTableHAlignTable[] = {
|
||||||
|
{ "left", NS_STYLE_TEXT_ALIGN_LEFT },
|
||||||
|
{ "right", NS_STYLE_TEXT_ALIGN_RIGHT },
|
||||||
|
{ "center", NS_STYLE_TEXT_ALIGN_CENTER },
|
||||||
|
{ "char", NS_STYLE_TEXT_ALIGN_CHAR },
|
||||||
|
{ "justify",NS_STYLE_TEXT_ALIGN_JUSTIFY },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kTableVAlignTable[] = {
|
||||||
|
{ "top", NS_STYLE_VERTICAL_ALIGN_TOP },
|
||||||
|
{ "middle", NS_STYLE_VERTICAL_ALIGN_MIDDLE },
|
||||||
|
{ "bottom", NS_STYLE_VERTICAL_ALIGN_BOTTOM },
|
||||||
|
{ "baseline",NS_STYLE_VERTICAL_ALIGN_BASELINE },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
nsGenericHTMLElement::ParseAlignValue(const nsString& aString,
|
nsGenericHTMLElement::ParseAlignValue(const nsString& aString,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
@@ -2496,6 +2539,20 @@ nsGenericHTMLElement::ParseAlignValue(const nsString& aString,
|
|||||||
return ParseEnumValue(aString, kAlignTable, aResult);
|
return ParseEnumValue(aString, kAlignTable, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsGenericHTMLElement::ParseTableHAlignValue(const nsString& aString,
|
||||||
|
nsHTMLValue& aResult)
|
||||||
|
{
|
||||||
|
return ParseEnumValue(aString, kTableHAlignTable, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsGenericHTMLElement::ParseTableVAlignValue(const nsString& aString,
|
||||||
|
nsHTMLValue& aResult)
|
||||||
|
{
|
||||||
|
return ParseEnumValue(aString, kTableVAlignTable, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
nsGenericHTMLElement::AlignValueToString(const nsHTMLValue& aValue,
|
nsGenericHTMLElement::AlignValueToString(const nsHTMLValue& aValue,
|
||||||
nsString& aResult)
|
nsString& aResult)
|
||||||
@@ -2503,6 +2560,20 @@ nsGenericHTMLElement::AlignValueToString(const nsHTMLValue& aValue,
|
|||||||
return EnumValueToString(aValue, kAlignTable, aResult);
|
return EnumValueToString(aValue, kAlignTable, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsGenericHTMLElement::TableHAlignValueToString(const nsHTMLValue& aValue,
|
||||||
|
nsString& aResult)
|
||||||
|
{
|
||||||
|
return EnumValueToString(aValue, kTableHAlignTable, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsGenericHTMLElement::TableVAlignValueToString(const nsHTMLValue& aValue,
|
||||||
|
nsString& aResult)
|
||||||
|
{
|
||||||
|
return EnumValueToString(aValue, kTableVAlignTable, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
nsGenericHTMLElement::ParseDivAlignValue(const nsString& aString,
|
nsGenericHTMLElement::ParseDivAlignValue(const nsString& aString,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
|
|||||||
@@ -238,6 +238,18 @@ public:
|
|||||||
static PRBool ParseDivAlignValue(const nsString& aString,
|
static PRBool ParseDivAlignValue(const nsString& aString,
|
||||||
nsHTMLValue& aResult);
|
nsHTMLValue& aResult);
|
||||||
|
|
||||||
|
static PRBool ParseTableHAlignValue(const nsString& aString,
|
||||||
|
nsHTMLValue& aResult);
|
||||||
|
|
||||||
|
static PRBool ParseTableVAlignValue(const nsString& aString,
|
||||||
|
nsHTMLValue& aResult);
|
||||||
|
|
||||||
|
static PRBool TableHAlignValueToString(const nsHTMLValue& aValue,
|
||||||
|
nsString& aResult);
|
||||||
|
|
||||||
|
static PRBool TableVAlignValueToString(const nsHTMLValue& aValue,
|
||||||
|
nsString& aResult);
|
||||||
|
|
||||||
static PRBool AlignValueToString(const nsHTMLValue& aValue,
|
static PRBool AlignValueToString(const nsHTMLValue& aValue,
|
||||||
nsString& aResult);
|
nsString& aResult);
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
#include "nsStyleConsts.h"
|
#include "nsStyleConsts.h"
|
||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
|
|
||||||
static NS_DEFINE_IID(kIDOMHTMLTableCaptionElementIID, NS_IDOMHTMLTABLECAPTIONELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLTableCaptionElementIID, NS_IDOMHTMLTABLECAPTIONELEMENT_IID);
|
||||||
|
|
||||||
@@ -124,12 +125,24 @@ nsHTMLTableCaptionElement::CloneNode(nsIDOMNode** aReturn)
|
|||||||
|
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableCaptionElement, Align, align, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableCaptionElement, Align, align, eSetAttrNotify_Reflow)
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kTableCaptionAlignTable[] = {
|
||||||
|
{ "left", NS_STYLE_TEXT_ALIGN_LEFT },
|
||||||
|
{ "right", NS_STYLE_TEXT_ALIGN_RIGHT },
|
||||||
|
{ "top", NS_STYLE_VERTICAL_ALIGN_TOP},
|
||||||
|
{ "bottom",NS_STYLE_VERTICAL_ALIGN_BOTTOM},
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableCaptionElement::StringToAttribute(nsIAtom* aAttribute,
|
nsHTMLTableCaptionElement::StringToAttribute(nsIAtom* aAttribute,
|
||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseEnumValue(aValue, kTableCaptionAlignTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +151,12 @@ nsHTMLTableCaptionElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (eHTMLUnit_Enumerated == aValue.GetUnit()) {
|
||||||
|
nsGenericHTMLElement::AlignValueToString(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,7 +165,32 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
if (nsnull != aAttributes) {
|
||||||
|
nsHTMLValue value;
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated) {
|
||||||
|
PRUint8 align = value.GetIntValue();
|
||||||
|
nsStyleText* text = (nsStyleText*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
switch (align) {
|
||||||
|
case NS_STYLE_VERTICAL_ALIGN_TOP:
|
||||||
|
case NS_STYLE_VERTICAL_ALIGN_BOTTOM:
|
||||||
|
text->mVerticalAlign.SetIntValue(align, eStyleUnit_Enumerated);
|
||||||
|
break;
|
||||||
|
// XXX: this is not right, it sets the content's h-align
|
||||||
|
// what it should do is actually move the caption to the left or right of the table!
|
||||||
|
/*
|
||||||
|
case NS_STYLE_TEXT_ALIGN_LEFT:
|
||||||
|
case NS_STYLE_TEXT_ALIGN_RIGHT:
|
||||||
|
text->mTextAlign = align;
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
// illegal value -- ignore it.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,12 @@
|
|||||||
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||||
* Netscape Communications Corporation. All Rights Reserved.
|
* Netscape Communications Corporation. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
#include "nsIHTMLTableCellElement.h"
|
||||||
#include "nsIDOMHTMLTableCellElement.h"
|
#include "nsIDOMHTMLTableCellElement.h"
|
||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -28,29 +30,40 @@
|
|||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
|
|
||||||
static NS_DEFINE_IID(kIDOMHTMLTableCellElementIID, NS_IDOMHTMLTABLECELLELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLTableCellElementIID, NS_IDOMHTMLTABLECELLELEMENT_IID);
|
||||||
|
static NS_DEFINE_IID(kIHTMLTableCellElementIID, NS_IHTMLTABLECELLELEMENT_IID);
|
||||||
|
|
||||||
class nsHTMLTableCellElement : public nsIDOMHTMLTableCellElement,
|
class nsHTMLTableCellElement : public nsIHTMLTableCellElement,
|
||||||
public nsIScriptObjectOwner,
|
public nsIDOMHTMLTableCellElement,
|
||||||
public nsIDOMEventReceiver,
|
public nsIScriptObjectOwner,
|
||||||
public nsIHTMLContent
|
public nsIDOMEventReceiver,
|
||||||
|
public nsIHTMLContent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsHTMLTableCellElement(nsIAtom* aTag);
|
nsHTMLTableCellElement(nsIAtom* aTag);
|
||||||
~nsHTMLTableCellElement();
|
~nsHTMLTableCellElement();
|
||||||
|
|
||||||
// nsISupports
|
// nsISupports
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
// nsIDOMNode
|
// nsIHTMLTableCellElement
|
||||||
|
|
||||||
|
/** @return the starting column for this cell. Always >= 1 */
|
||||||
|
NS_METHOD GetColIndex (PRInt32* aColIndex);
|
||||||
|
|
||||||
|
/** set the starting column for this cell. Always >= 1 */
|
||||||
|
NS_METHOD SetColIndex (PRInt32 aColIndex);
|
||||||
|
|
||||||
|
|
||||||
|
// nsIDOMNode
|
||||||
NS_IMPL_IDOMNODE_USING_GENERIC(mInner)
|
NS_IMPL_IDOMNODE_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIDOMElement
|
// nsIDOMElement
|
||||||
NS_IMPL_IDOMELEMENT_USING_GENERIC(mInner)
|
NS_IMPL_IDOMELEMENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIDOMHTMLElement
|
// nsIDOMHTMLElement
|
||||||
NS_IMPL_IDOMHTMLELEMENT_USING_GENERIC(mInner)
|
NS_IMPL_IDOMHTMLELEMENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIDOMHTMLTableCellElement
|
// nsIDOMHTMLTableCellElement
|
||||||
NS_IMETHOD GetCellIndex(PRInt32* aCellIndex);
|
NS_IMETHOD GetCellIndex(PRInt32* aCellIndex);
|
||||||
NS_IMETHOD SetCellIndex(PRInt32 aCellIndex);
|
NS_IMETHOD SetCellIndex(PRInt32 aCellIndex);
|
||||||
NS_IMETHOD GetAbbr(nsString& aAbbr);
|
NS_IMETHOD GetAbbr(nsString& aAbbr);
|
||||||
@@ -82,20 +95,21 @@ public:
|
|||||||
NS_IMETHOD GetWidth(nsString& aWidth);
|
NS_IMETHOD GetWidth(nsString& aWidth);
|
||||||
NS_IMETHOD SetWidth(const nsString& aWidth);
|
NS_IMETHOD SetWidth(const nsString& aWidth);
|
||||||
|
|
||||||
// nsIScriptObjectOwner
|
// nsIScriptObjectOwner
|
||||||
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC(mInner)
|
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIDOMEventReceiver
|
// nsIDOMEventReceiver
|
||||||
NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC(mInner)
|
NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIContent
|
// nsIContent
|
||||||
NS_IMPL_ICONTENT_USING_GENERIC(mInner)
|
NS_IMPL_ICONTENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
// nsIHTMLContent
|
// nsIHTMLContent
|
||||||
NS_IMPL_IHTMLCONTENT_USING_GENERIC(mInner)
|
NS_IMPL_IHTMLCONTENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsGenericHTMLContainerElement mInner;
|
nsGenericHTMLContainerElement mInner;
|
||||||
|
PRInt32 mColIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
@@ -116,6 +130,7 @@ nsHTMLTableCellElement::nsHTMLTableCellElement(nsIAtom* aTag)
|
|||||||
{
|
{
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
mInner.Init(this, aTag);
|
mInner.Init(this, aTag);
|
||||||
|
mColIndex=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsHTMLTableCellElement::~nsHTMLTableCellElement()
|
nsHTMLTableCellElement::~nsHTMLTableCellElement()
|
||||||
@@ -136,6 +151,12 @@ nsHTMLTableCellElement::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|||||||
mRefCnt++;
|
mRefCnt++;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
else if (aIID.Equals(kIHTMLTableCellElementIID)) {
|
||||||
|
nsIHTMLTableCellElement* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
mRefCnt++;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
return NS_NOINTERFACE;
|
return NS_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,6 +171,20 @@ nsHTMLTableCellElement::CloneNode(nsIDOMNode** aReturn)
|
|||||||
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return the starting column for this cell in aColIndex. Always >= 1 */
|
||||||
|
NS_METHOD nsHTMLTableCellElement::GetColIndex (PRInt32* aColIndex)
|
||||||
|
{
|
||||||
|
*aColIndex = mColIndex;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** set the starting column for this cell. Always >= 1 */
|
||||||
|
NS_METHOD nsHTMLTableCellElement::SetColIndex (PRInt32 aColIndex)
|
||||||
|
{
|
||||||
|
mColIndex = aColIndex;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableCellElement::GetCellIndex(PRInt32* aCellIndex)
|
nsHTMLTableCellElement::GetCellIndex(PRInt32* aCellIndex)
|
||||||
{
|
{
|
||||||
@@ -179,12 +214,73 @@ NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, Scope, scope, eSetAttrNotify_None)
|
|||||||
NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, VAlign, valign, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, VAlign, valign, eSetAttrNotify_Reflow)
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, Width, width, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableCellElement, Width, width, eSetAttrNotify_Reflow)
|
||||||
|
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kCellScopeTable[] = {
|
||||||
|
{ "row", NS_STYLE_CELL_SCOPE_ROW },
|
||||||
|
{ "col", NS_STYLE_CELL_SCOPE_COL },
|
||||||
|
{ "rowgroup", NS_STYLE_CELL_SCOPE_ROWGROUP },
|
||||||
|
{ "colgroup", NS_STYLE_CELL_SCOPE_COLGROUP },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableCellElement::StringToAttribute(nsIAtom* aAttribute,
|
nsHTMLTableCellElement::StringToAttribute(nsIAtom* aAttribute,
|
||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored simply as strings
|
||||||
|
abbr, axis, ch, headers
|
||||||
|
*/
|
||||||
|
/* attributes that resolve to integers */
|
||||||
|
if ((aAttribute == nsHTMLAtoms::choff) ||
|
||||||
|
(aAttribute == nsHTMLAtoms::colspan) ||
|
||||||
|
(aAttribute == nsHTMLAtoms::rowspan)) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::height) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercent(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents or proportions */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::width) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercentOrProportional(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::background) {
|
||||||
|
nsAutoString href(aValue);
|
||||||
|
href.StripWhitespace();
|
||||||
|
aResult.SetStringValue(href);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::bgcolor) {
|
||||||
|
nsGenericHTMLElement::ParseColor(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::nowrap) {
|
||||||
|
aResult.SetEmptyValue();
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::scope) {
|
||||||
|
if (nsGenericHTMLElement::ParseEnumValue(aValue, kCellScopeTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableVAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,7 +289,27 @@ nsHTMLTableCellElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored already as strings
|
||||||
|
abbr, axis, ch, headers
|
||||||
|
*/
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
choff, colspan, rowspan, height, width, nowrap, background, bgcolor
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::scope) {
|
||||||
|
if (nsGenericHTMLElement::EnumValueToString(aValue, kCellScopeTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::TableVAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,8 +318,68 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
if (nsnull!=aAttributes)
|
||||||
|
{
|
||||||
|
nsHTMLValue value;
|
||||||
|
nsHTMLValue widthValue;
|
||||||
|
nsStyleText* textStyle = nsnull;
|
||||||
|
|
||||||
|
// align: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mTextAlign = value.GetIntValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// valign: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
||||||
|
}
|
||||||
|
|
||||||
|
// width: pixel
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsStylePosition* pos = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::width, widthValue);
|
||||||
|
if (widthValue.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
nscoord twips = NSIntPixelsToTwips(widthValue.GetPixelValue(), p2t);
|
||||||
|
pos->mWidth.SetCoordValue(twips);
|
||||||
|
}
|
||||||
|
else if (widthValue.GetUnit() == eHTMLUnit_Percent) {
|
||||||
|
pos->mWidth.SetPercentValue(widthValue.GetPercentValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
// height: pixel
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::height, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
nscoord twips = NSIntPixelsToTwips(value.GetPixelValue(), p2t);
|
||||||
|
pos->mHeight.SetCoordValue(twips);
|
||||||
|
}
|
||||||
|
|
||||||
|
// nowrap
|
||||||
|
// nowrap depends on the width attribute, so be sure to handle it after width is mapped!
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::nowrap, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Empty)
|
||||||
|
{
|
||||||
|
if (widthValue.GetUnit() != eHTMLUnit_Pixel)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mWhiteSpace = NS_STYLE_WHITESPACE_NOWRAP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -17,9 +17,11 @@
|
|||||||
* Netscape Communications Corporation. All Rights Reserved.
|
* Netscape Communications Corporation. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
#include "nsIDOMHTMLTableColElement.h"
|
#include "nsIDOMHTMLTableColElement.h"
|
||||||
|
#include "nsIHTMLTableColElement.h"
|
||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -28,11 +30,13 @@
|
|||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
|
|
||||||
static NS_DEFINE_IID(kIDOMHTMLTableColElementIID, NS_IDOMHTMLTABLECOLELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLTableColElementIID, NS_IDOMHTMLTABLECOLELEMENT_IID);
|
||||||
|
static NS_DEFINE_IID(kIHTMLTableColElementIID, NS_IHTMLTABLECOLELEMENT_IID);
|
||||||
|
|
||||||
class nsHTMLTableColElement : public nsIDOMHTMLTableColElement,
|
class nsHTMLTableColElement : public nsIDOMHTMLTableColElement,
|
||||||
public nsIScriptObjectOwner,
|
public nsIScriptObjectOwner,
|
||||||
public nsIDOMEventReceiver,
|
public nsIDOMEventReceiver,
|
||||||
public nsIHTMLContent
|
public nsIHTMLContent,
|
||||||
|
public nsIHTMLTableColElement
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsHTMLTableColElement(nsIAtom* aTag);
|
nsHTMLTableColElement(nsIAtom* aTag);
|
||||||
@@ -76,6 +80,9 @@ public:
|
|||||||
// nsIHTMLContent
|
// nsIHTMLContent
|
||||||
NS_IMPL_IHTMLCONTENT_USING_GENERIC(mInner)
|
NS_IMPL_IHTMLCONTENT_USING_GENERIC(mInner)
|
||||||
|
|
||||||
|
// nsIHTMLTableColElement
|
||||||
|
NS_IMETHOD GetSpanValue(PRInt32* aSpan);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsGenericHTMLContainerElement mInner;
|
nsGenericHTMLContainerElement mInner;
|
||||||
};
|
};
|
||||||
@@ -118,6 +125,12 @@ nsHTMLTableColElement::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|||||||
mRefCnt++;
|
mRefCnt++;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
if (aIID.Equals(kIHTMLTableColElementIID)) {
|
||||||
|
nsIHTMLTableColElement* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
mRefCnt++;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
return NS_NOINTERFACE;
|
return NS_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +157,36 @@ nsHTMLTableColElement::StringToAttribute(nsIAtom* aAttribute,
|
|||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored simply as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* attributes that resolve to integers */
|
||||||
|
if (aAttribute == nsHTMLAtoms::choff) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::repeat) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 1, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents or proportions */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::width) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercentOrProportional(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableVAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +195,22 @@ nsHTMLTableColElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored already as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
choff, repeat, width
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::TableVAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,10 +219,52 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
if (nsnull != aAttributes) {
|
||||||
|
|
||||||
|
float p2t;
|
||||||
|
nsHTMLValue value;
|
||||||
|
nsStyleText* textStyle = nsnull;
|
||||||
|
|
||||||
|
// width
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::width, value);
|
||||||
|
if (value.GetUnit() != eHTMLUnit_Null) {
|
||||||
|
nsStylePosition* position = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
switch (value.GetUnit()) {
|
||||||
|
case eHTMLUnit_Percent:
|
||||||
|
position->mWidth.SetPercentValue(value.GetPercentValue());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case eHTMLUnit_Pixel:
|
||||||
|
p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
position->mWidth.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// align: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mTextAlign = value.GetIntValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// valign: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
||||||
|
}
|
||||||
|
}
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableColElement::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
nsHTMLTableColElement::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
||||||
{
|
{
|
||||||
@@ -184,3 +283,16 @@ nsHTMLTableColElement::HandleDOMEvent(nsIPresContext& aPresContext,
|
|||||||
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
||||||
aFlags, aEventStatus);
|
aFlags, aEventStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_METHOD nsHTMLTableColElement::GetSpanValue(PRInt32* aSpan)
|
||||||
|
{
|
||||||
|
if (nsnull!=aSpan)
|
||||||
|
{
|
||||||
|
PRInt32 span=-1;
|
||||||
|
GetSpan(&span);
|
||||||
|
if (-1==span)
|
||||||
|
span=1; // the default;
|
||||||
|
*aSpan = span;
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -156,6 +157,9 @@ nsHTMLTableElement::CloneNode(nsIDOMNode** aReturn)
|
|||||||
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the DOM spec says border, cellpadding, cellSpacing are all "wstring"
|
||||||
|
// in fact, they are integers or they are meaningless. so we store them here as ints.
|
||||||
|
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableElement, Align, align, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableElement, Align, align, eSetAttrNotify_Reflow)
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableElement, BgColor, bgcolor, eSetAttrNotify_Render)
|
NS_IMPL_STRING_ATTR(nsHTMLTableElement, BgColor, bgcolor, eSetAttrNotify_Render)
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableElement, Border, border, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableElement, Border, border, eSetAttrNotify_Reflow)
|
||||||
@@ -283,12 +287,109 @@ nsHTMLTableElement::DeleteRow(PRInt32 aValue)
|
|||||||
return NS_OK; // XXX write me
|
return NS_OK; // XXX write me
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kFrameTable[] = {
|
||||||
|
{ "void", NS_STYLE_TABLE_FRAME_NONE },
|
||||||
|
{ "above", NS_STYLE_TABLE_FRAME_ABOVE },
|
||||||
|
{ "below", NS_STYLE_TABLE_FRAME_BELOW },
|
||||||
|
{ "hsides", NS_STYLE_TABLE_FRAME_HSIDES },
|
||||||
|
{ "lhs", NS_STYLE_TABLE_FRAME_LEFT },
|
||||||
|
{ "rhs", NS_STYLE_TABLE_FRAME_RIGHT },
|
||||||
|
{ "vsides", NS_STYLE_TABLE_FRAME_VSIDES },
|
||||||
|
{ "box", NS_STYLE_TABLE_FRAME_BOX },
|
||||||
|
{ "border", NS_STYLE_TABLE_FRAME_BORDER },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static nsGenericHTMLElement::EnumTable kRulesTable[] = {
|
||||||
|
{ "none", NS_STYLE_TABLE_RULES_NONE },
|
||||||
|
{ "groups", NS_STYLE_TABLE_RULES_GROUPS },
|
||||||
|
{ "rows", NS_STYLE_TABLE_RULES_ROWS },
|
||||||
|
{ "cols", NS_STYLE_TABLE_RULES_COLS },
|
||||||
|
{ "all", NS_STYLE_TABLE_RULES_ALL },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableElement::StringToAttribute(nsIAtom* aAttribute,
|
nsHTMLTableElement::StringToAttribute(nsIAtom* aAttribute,
|
||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore summary, just a string */
|
||||||
|
/* attributes that resolve to pixels */
|
||||||
|
if ((aAttribute == nsHTMLAtoms::cellspacing) ||
|
||||||
|
(aAttribute == nsHTMLAtoms::cellpadding)) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that are either empty, or integers */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::cols) {
|
||||||
|
nsAutoString tmp(aValue);
|
||||||
|
tmp.StripWhitespace();
|
||||||
|
if (0 == tmp.Length()) {
|
||||||
|
// Just set COLS, same as COLS=number of columns
|
||||||
|
aResult.SetEmptyValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
}
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that are either empty, or pixels */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::cols) {
|
||||||
|
nsAutoString tmp(aValue);
|
||||||
|
tmp.StripWhitespace();
|
||||||
|
if (0 == tmp.Length()) {
|
||||||
|
// Just enable the border; same as border=1
|
||||||
|
aResult.SetEmptyValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Pixel);
|
||||||
|
}
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::height) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercent(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents or proportions */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::width) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercentOrProportional(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::background) {
|
||||||
|
nsAutoString href(aValue);
|
||||||
|
href.StripWhitespace();
|
||||||
|
aResult.SetStringValue(href);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::bgcolor) {
|
||||||
|
nsGenericHTMLElement::ParseColor(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::frame) {
|
||||||
|
nsGenericHTMLElement::ParseEnumValue(aValue, kFrameTable, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::rules) {
|
||||||
|
nsGenericHTMLElement::ParseEnumValue(aValue, kRulesTable, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,17 +398,164 @@ nsHTMLTableElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore summary, just a string */
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
border, cellpadding, cellspacing, cols, height, width, background, bgcolor
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::frame) {
|
||||||
|
if (nsGenericHTMLElement::EnumValueToString(aValue, kFrameTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::rules) {
|
||||||
|
if (nsGenericHTMLElement::EnumValueToString(aValue, kRulesTable, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX: this is only sufficient for Nav4/HTML3.2
|
||||||
|
// XXX: needs to be filled in for HTML4
|
||||||
|
static void
|
||||||
|
MapTableBorderInto(nsIHTMLAttributes* aAttributes,
|
||||||
|
nsIStyleContext* aContext,
|
||||||
|
nsIPresContext* aPresContext)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
nsHTMLValue value;
|
||||||
|
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::border, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_String)
|
||||||
|
{
|
||||||
|
nsAutoString borderAsString;
|
||||||
|
value.GetStringValue(borderAsString);
|
||||||
|
nsGenericHTMLElement::ParseValue(borderAsString, 0, value, eHTMLUnit_Pixel);
|
||||||
|
}
|
||||||
|
if ((value.GetUnit() == eHTMLUnit_Pixel) ||
|
||||||
|
(value.GetUnit() == eHTMLUnit_Empty)) {
|
||||||
|
nsStyleSpacing* spacing = (nsStyleSpacing*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Spacing);
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsStyleCoord twips;
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Empty) {
|
||||||
|
twips.SetCoordValue(NSIntPixelsToTwips(1, p2t));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
twips.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
}
|
||||||
|
|
||||||
|
spacing->mBorder.SetTop(twips);
|
||||||
|
spacing->mBorder.SetRight(twips);
|
||||||
|
spacing->mBorder.SetBottom(twips);
|
||||||
|
spacing->mBorder.SetLeft(twips);
|
||||||
|
|
||||||
|
if (spacing->mBorderStyle[0] == NS_STYLE_BORDER_STYLE_NONE) {
|
||||||
|
spacing->mBorderStyle[0] = NS_STYLE_BORDER_STYLE_SOLID;
|
||||||
|
}
|
||||||
|
if (spacing->mBorderStyle[1] == NS_STYLE_BORDER_STYLE_NONE) {
|
||||||
|
spacing->mBorderStyle[1] = NS_STYLE_BORDER_STYLE_SOLID;
|
||||||
|
}
|
||||||
|
if (spacing->mBorderStyle[2] == NS_STYLE_BORDER_STYLE_NONE) {
|
||||||
|
spacing->mBorderStyle[2] = NS_STYLE_BORDER_STYLE_SOLID;
|
||||||
|
}
|
||||||
|
if (spacing->mBorderStyle[3] == NS_STYLE_BORDER_STYLE_NONE) {
|
||||||
|
spacing->mBorderStyle[3] = NS_STYLE_BORDER_STYLE_SOLID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
if (nsnull!=aAttributes)
|
||||||
|
{
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsHTMLValue value;
|
||||||
|
|
||||||
|
// width
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::width, value);
|
||||||
|
if (value.GetUnit() != eHTMLUnit_Null) {
|
||||||
|
nsStylePosition* position = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
switch (value.GetUnit()) {
|
||||||
|
case eHTMLUnit_Percent:
|
||||||
|
position->mWidth.SetPercentValue(value.GetPercentValue());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case eHTMLUnit_Pixel:
|
||||||
|
position->mWidth.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// border
|
||||||
|
MapTableBorderInto(aAttributes, aContext, aPresContext);
|
||||||
|
|
||||||
|
// align
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated) { // it may be another type if illegal
|
||||||
|
nsStyleDisplay* display = (nsStyleDisplay*)aContext->GetMutableStyleData(eStyleStruct_Display);
|
||||||
|
switch (value.GetIntValue()) {
|
||||||
|
case NS_STYLE_TEXT_ALIGN_LEFT:
|
||||||
|
display->mFloats = NS_STYLE_FLOAT_LEFT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NS_STYLE_TEXT_ALIGN_RIGHT:
|
||||||
|
display->mFloats = NS_STYLE_FLOAT_RIGHT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// cellpadding
|
||||||
|
nsStyleTable* tableStyle=nsnull;
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::cellpadding, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
||||||
|
tableStyle->mCellPadding.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
}
|
||||||
|
|
||||||
|
// cellspacing (reuses tableStyle if already resolved)
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::cellspacing, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
if (nsnull==tableStyle)
|
||||||
|
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
||||||
|
tableStyle->mCellSpacing.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // XXX: remove me as soon as we get this from the style sheet
|
||||||
|
if (nsnull==tableStyle)
|
||||||
|
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
||||||
|
tableStyle->mCellSpacing.SetCoordValue(NSIntPixelsToTwips(2, p2t));
|
||||||
|
}
|
||||||
|
|
||||||
|
// cols
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::cols, value);
|
||||||
|
if (value.GetUnit() != eHTMLUnit_Null) {
|
||||||
|
if (nsnull==tableStyle)
|
||||||
|
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Integer)
|
||||||
|
tableStyle->mCols = value.GetIntValue();
|
||||||
|
else // COLS had no value, so it refers to all columns
|
||||||
|
tableStyle->mCols = NS_STYLE_TABLE_COLS_ALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//background: color
|
||||||
|
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -204,12 +205,54 @@ NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, Ch, ch, eSetAttrNotify_Reflow)
|
|||||||
NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, ChOff, choff, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, ChOff, choff, eSetAttrNotify_Reflow)
|
||||||
NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, VAlign, valign, eSetAttrNotify_Reflow)
|
NS_IMPL_STRING_ATTR(nsHTMLTableRowElement, VAlign, valign, eSetAttrNotify_Reflow)
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLTableRowElement::StringToAttribute(nsIAtom* aAttribute,
|
nsHTMLTableRowElement::StringToAttribute(nsIAtom* aAttribute,
|
||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored simply as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* attributes that resolve to integers */
|
||||||
|
if (aAttribute == nsHTMLAtoms::choff) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::height) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercent(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents or proportions */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::width) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercentOrProportional(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::background) {
|
||||||
|
nsAutoString href(aValue);
|
||||||
|
href.StripWhitespace();
|
||||||
|
aResult.SetStringValue(href);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::bgcolor) {
|
||||||
|
nsGenericHTMLElement::ParseColor(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableVAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,7 +261,22 @@ nsHTMLTableRowElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored already as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
choff, height, width, background, bgcolor
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::TableVAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,8 +285,44 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
if (nsnull!=aAttributes)
|
||||||
|
{
|
||||||
|
nsHTMLValue value;
|
||||||
|
nsHTMLValue widthValue;
|
||||||
|
nsStyleText* textStyle = nsnull;
|
||||||
|
|
||||||
|
// align: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mTextAlign = value.GetIntValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// valign: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
||||||
|
}
|
||||||
|
|
||||||
|
// height: pixel
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::height, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsStylePosition* pos = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
nscoord twips = NSIntPixelsToTwips(value.GetPixelValue(), p2t);
|
||||||
|
pos->mHeight.SetCoordValue(twips);
|
||||||
|
}
|
||||||
|
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -29,6 +30,8 @@
|
|||||||
|
|
||||||
static NS_DEFINE_IID(kIDOMHTMLTableSectionElementIID, NS_IDOMHTMLTABLESECTIONELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLTableSectionElementIID, NS_IDOMHTMLTABLESECTIONELEMENT_IID);
|
||||||
|
|
||||||
|
// you will see the phrases "rowgroup" and "section" used interchangably
|
||||||
|
|
||||||
class nsHTMLTableSectionElement : public nsIDOMHTMLTableSectionElement,
|
class nsHTMLTableSectionElement : public nsIDOMHTMLTableSectionElement,
|
||||||
public nsIScriptObjectOwner,
|
public nsIScriptObjectOwner,
|
||||||
public nsIDOMEventReceiver,
|
public nsIDOMEventReceiver,
|
||||||
@@ -166,7 +169,43 @@ nsHTMLTableSectionElement::StringToAttribute(nsIAtom* aAttribute,
|
|||||||
const nsString& aValue,
|
const nsString& aValue,
|
||||||
nsHTMLValue& aResult)
|
nsHTMLValue& aResult)
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored simply as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* attributes that resolve to integers */
|
||||||
|
if (aAttribute == nsHTMLAtoms::choff) {
|
||||||
|
nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attributes that resolve to integers or percents */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::height) {
|
||||||
|
nsGenericHTMLElement::ParseValueOrPercent(aValue, aResult, eHTMLUnit_Pixel);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other attributes */
|
||||||
|
else if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableHAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::background) {
|
||||||
|
nsAutoString href(aValue);
|
||||||
|
href.StripWhitespace();
|
||||||
|
aResult.SetStringValue(href);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::bgcolor) {
|
||||||
|
nsGenericHTMLElement::ParseColor(aValue, aResult);
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::ParseTableVAlignValue(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return NS_CONTENT_ATTR_NOT_THERE;
|
return NS_CONTENT_ATTR_NOT_THERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,7 +214,22 @@ nsHTMLTableSectionElement::AttributeToString(nsIAtom* aAttribute,
|
|||||||
nsHTMLValue& aValue,
|
nsHTMLValue& aValue,
|
||||||
nsString& aResult) const
|
nsString& aResult) const
|
||||||
{
|
{
|
||||||
// XXX write me
|
/* ignore these attributes, stored already as strings
|
||||||
|
ch
|
||||||
|
*/
|
||||||
|
/* ignore attributes that are of standard types
|
||||||
|
choff, height, width, background, bgcolor
|
||||||
|
*/
|
||||||
|
if (aAttribute == nsHTMLAtoms::align) {
|
||||||
|
if (nsGenericHTMLElement::TableHAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (aAttribute == nsHTMLAtoms::valign) {
|
||||||
|
if (nsGenericHTMLElement::TableVAlignValueToString(aValue, aResult)) {
|
||||||
|
return NS_CONTENT_ATTR_HAS_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
return mInner.AttributeToString(aAttribute, aValue, aResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,8 +238,45 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIPresContext* aPresContext)
|
nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// XXX write me
|
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
||||||
|
|
||||||
|
if (nsnull!=aAttributes)
|
||||||
|
{
|
||||||
|
nsHTMLValue value;
|
||||||
|
nsHTMLValue widthValue;
|
||||||
|
nsStyleText* textStyle = nsnull;
|
||||||
|
|
||||||
|
// align: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mTextAlign = value.GetIntValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// valign: enum
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
||||||
|
{
|
||||||
|
if (nsnull==textStyle)
|
||||||
|
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
||||||
|
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
||||||
|
}
|
||||||
|
|
||||||
|
// height: pixel
|
||||||
|
aAttributes->GetAttribute(nsHTMLAtoms::height, value);
|
||||||
|
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
nsStylePosition* pos = (nsStylePosition*)
|
||||||
|
aContext->GetMutableStyleData(eStyleStruct_Position);
|
||||||
|
nscoord twips = NSIntPixelsToTwips(value.GetPixelValue(), p2t);
|
||||||
|
pos->mHeight.SetCoordValue(twips);
|
||||||
|
}
|
||||||
|
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -34,10 +34,6 @@
|
|||||||
#include "nsHTMLParts.h"
|
#include "nsHTMLParts.h"
|
||||||
#include "nsITextContent.h"
|
#include "nsITextContent.h"
|
||||||
|
|
||||||
|
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsTableRow.h"
|
|
||||||
#include "nsTableCell.h"
|
|
||||||
#include "nsIDOMText.h"
|
#include "nsIDOMText.h"
|
||||||
|
|
||||||
#include "nsHTMLForms.h"
|
#include "nsHTMLForms.h"
|
||||||
@@ -487,13 +483,13 @@ MakeContentObject(nsHTMLTag aNodeType,
|
|||||||
rv = NS_NewHTMLBRElement(aResult, aAtom);
|
rv = NS_NewHTMLBRElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_caption:
|
case eHTMLTag_caption:
|
||||||
rv = NS_NewTableCaptionPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableCaptionElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_col:
|
case eHTMLTag_col:
|
||||||
rv = NS_NewTableColPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableColElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_colgroup:
|
case eHTMLTag_colgroup:
|
||||||
rv = NS_NewTableColGroupPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableColGroupElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_dir:
|
case eHTMLTag_dir:
|
||||||
rv = NS_NewHTMLDirectoryElement(aResult, aAtom);
|
rv = NS_NewHTMLDirectoryElement(aResult, aAtom);
|
||||||
@@ -603,16 +599,16 @@ MakeContentObject(nsHTMLTag aNodeType,
|
|||||||
rv = NS_NewHTMLStyleElement(aResult, aAtom);
|
rv = NS_NewHTMLStyleElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_table:
|
case eHTMLTag_table:
|
||||||
rv = NS_NewTablePart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_tbody:
|
case eHTMLTag_tbody:
|
||||||
case eHTMLTag_thead:
|
case eHTMLTag_thead:
|
||||||
case eHTMLTag_tfoot:
|
case eHTMLTag_tfoot:
|
||||||
rv = NS_NewTableRowGroupPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableSectionElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_td:
|
case eHTMLTag_td:
|
||||||
case eHTMLTag_th:
|
case eHTMLTag_th:
|
||||||
rv = NS_NewTableCellPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableCellElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_textarea:
|
case eHTMLTag_textarea:
|
||||||
rv = NS_NewHTMLTextAreaElement(aResult, aAtom);
|
rv = NS_NewHTMLTextAreaElement(aResult, aAtom);
|
||||||
@@ -621,7 +617,7 @@ MakeContentObject(nsHTMLTag aNodeType,
|
|||||||
rv = NS_NewHTMLTitleElement(aResult, aAtom);
|
rv = NS_NewHTMLTitleElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_tr:
|
case eHTMLTag_tr:
|
||||||
rv = NS_NewTableRowPart(aResult, aAtom);/* XXX old style */
|
rv = NS_NewHTMLTableRowElement(aResult, aAtom);
|
||||||
break;
|
break;
|
||||||
case eHTMLTag_ul:
|
case eHTMLTag_ul:
|
||||||
rv = NS_NewHTMLUListElement(aResult, aAtom);
|
rv = NS_NewHTMLUListElement(aResult, aAtom);
|
||||||
|
|||||||
@@ -17,6 +17,6 @@
|
|||||||
|
|
||||||
DEPTH=..\..
|
DEPTH=..\..
|
||||||
|
|
||||||
DIRS = base content document forms style table tests
|
DIRS = base content document forms style table
|
||||||
|
|
||||||
include <$(DEPTH)\layout\config\rules.mak>
|
include <$(DEPTH)\layout\config\rules.mak>
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ EXPORTS = \
|
|||||||
|
|
||||||
MODULE = raptor
|
MODULE = raptor
|
||||||
|
|
||||||
INCLUDES += -I../../base/src -I../../../base/src -I../../table/src -I.
|
INCLUDES += -I../../base/src -I../../../base/src -I../../table/src -I../../content/src -I.
|
||||||
|
|
||||||
REQUIRES = xpcom raptor dom netlib js
|
REQUIRES = xpcom raptor dom netlib js
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ CPP_OBJS=.\$(OBJDIR)\nsCSSKeywords.obj .\$(OBJDIR)\nsCSSLayout.obj \
|
|||||||
|
|
||||||
LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\netlib \
|
LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\netlib \
|
||||||
-I..\..\..\base\src \
|
-I..\..\..\base\src \
|
||||||
-I..\..\base\src -I..\..\table\src -I$(PUBLIC)\js -I$(PUBLIC)\dom
|
-I..\..\base\src -I..\..\table\src -I..\..\content\src -I$(PUBLIC)\js -I$(PUBLIC)\dom
|
||||||
|
|
||||||
LCFLAGS = \
|
LCFLAGS = \
|
||||||
$(LCFLAGS) \
|
$(LCFLAGS) \
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
#include "nsILinkHandler.h"
|
#include "nsILinkHandler.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsTableCell.h"
|
#include "nsIHTMLTableCellElement.h"
|
||||||
#include "nsTableColFrame.h"
|
#include "nsTableColFrame.h"
|
||||||
#include "nsTableFrame.h"
|
#include "nsTableFrame.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -46,6 +46,7 @@ static NS_DEFINE_IID(kIHTMLStyleSheetIID, NS_IHTML_STYLE_SHEET_IID);
|
|||||||
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
|
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
|
||||||
static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID);
|
static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID);
|
||||||
static NS_DEFINE_IID(kIStyleFrameConstructionIID, NS_ISTYLE_FRAME_CONSTRUCTION_IID);
|
static NS_DEFINE_IID(kIStyleFrameConstructionIID, NS_ISTYLE_FRAME_CONSTRUCTION_IID);
|
||||||
|
static NS_DEFINE_IID(kIHTMLTableCellElementIID, NS_IHTMLTABLECELLELEMENT_IID);
|
||||||
|
|
||||||
|
|
||||||
class HTMLAnchorRule : public nsIStyleRule {
|
class HTMLAnchorRule : public nsIStyleRule {
|
||||||
@@ -520,8 +521,6 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
|
|||||||
// makes table cells process attributes from other content
|
// makes table cells process attributes from other content
|
||||||
// inherit based style (ie: font-size: 110%) can double on row & cell
|
// inherit based style (ie: font-size: 110%) can double on row & cell
|
||||||
PRInt32 backstopInsertPoint = 0;
|
PRInt32 backstopInsertPoint = 0;
|
||||||
nsTableCell* cell = (nsTableCell*)aContent;
|
|
||||||
PRInt32 colIndex = cell->GetColIndex();
|
|
||||||
|
|
||||||
nsIFrame* rowFrame = aParentFrame;
|
nsIFrame* rowFrame = aParentFrame;
|
||||||
nsIFrame* rowGroupFrame;
|
nsIFrame* rowGroupFrame;
|
||||||
@@ -530,17 +529,24 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
|
|||||||
rowFrame->GetContentParent(rowGroupFrame);
|
rowFrame->GetContentParent(rowGroupFrame);
|
||||||
rowGroupFrame->GetContentParent(tableFrame);
|
rowGroupFrame->GetContentParent(tableFrame);
|
||||||
|
|
||||||
nsTableColFrame* colFrame;
|
nsIHTMLTableCellElement* cell=nsnull;
|
||||||
nsIFrame* colGroupFrame;
|
nsresult rv = aContent->QueryInterface(kIHTMLTableCellElementIID,
|
||||||
|
(void **)&cell); // cell: REFCNT++
|
||||||
|
if (NS_SUCCEEDED(rv)) {
|
||||||
|
PRInt32 colIndex;
|
||||||
|
rv = cell->GetColIndex(&colIndex);
|
||||||
|
nsTableColFrame* colFrame;
|
||||||
|
nsIFrame* colGroupFrame;
|
||||||
|
|
||||||
((nsTableFrame*)tableFrame)->GetColumnFrame(colIndex, colFrame);
|
((nsTableFrame*)tableFrame)->GetColumnFrame(colIndex, colFrame);
|
||||||
colFrame->GetContentParent(colGroupFrame);
|
colFrame->GetContentParent(colGroupFrame);
|
||||||
|
|
||||||
matchCount += AppendRulesFrom(colGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(colGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
matchCount += AppendRulesFrom(colFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(colFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
|
NS_RELEASE(cell); // cell: REFCNT--
|
||||||
|
}
|
||||||
matchCount += AppendRulesFrom(rowGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(rowGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
matchCount += AppendRulesFrom(rowFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(rowFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
|
|
||||||
} // end TD/TH tag
|
} // end TD/TH tag
|
||||||
|
|
||||||
// just get the one and only style rule from the content
|
// just get the one and only style rule from the content
|
||||||
@@ -1055,9 +1061,6 @@ NS_IMETHODIMP HTMLStyleSheetImpl::ConstructFrame(nsIPresContext* aPresContext,
|
|||||||
else if (nsHTMLAtoms::wbr == aTag) {
|
else if (nsHTMLAtoms::wbr == aTag) {
|
||||||
rv = NS_NewWBRFrame(aContent, aParentFrame, frame);
|
rv = NS_NewWBRFrame(aContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
else if (nsHTMLAtoms::table == aTag) {
|
|
||||||
rv = nsTableOuterFrame::NewFrame(&frame, aContent, aParentFrame);
|
|
||||||
}
|
|
||||||
else if (nsHTMLAtoms::input == aTag) {
|
else if (nsHTMLAtoms::input == aTag) {
|
||||||
rv = CreateInputFrame(aContent, aParentFrame, frame);
|
rv = CreateInputFrame(aContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
@@ -1071,6 +1074,32 @@ NS_IMETHODIMP HTMLStyleSheetImpl::ConstructFrame(nsIPresContext* aPresContext,
|
|||||||
rv = NS_NewHTMLFrameOuterFrame(aContent, aParentFrame, frame);
|
rv = NS_NewHTMLFrameOuterFrame(aContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the table content frames...
|
||||||
|
else if (nsHTMLAtoms::caption == aTag) {
|
||||||
|
rv = NS_NewBodyFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::table == aTag) {
|
||||||
|
rv = NS_NewTableOuterFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((nsHTMLAtoms::tbody == aTag) ||
|
||||||
|
(nsHTMLAtoms::thead == aTag) ||
|
||||||
|
(nsHTMLAtoms::tfoot == aTag)) {
|
||||||
|
rv = NS_NewTableRowGroupFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::tr == aTag) {
|
||||||
|
rv = NS_NewTableRowFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::colgroup == aTag) {
|
||||||
|
rv = NS_NewTableColGroupFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::col == aTag) {
|
||||||
|
rv = NS_NewTableColFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((nsHTMLAtoms::td == aTag) ||
|
||||||
|
(nsHTMLAtoms::th == aTag)) {
|
||||||
|
rv = NS_NewTableCellFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
|
||||||
if (NS_OK != rv) {
|
if (NS_OK != rv) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,20 +25,12 @@ LIBRARY_NAME = raptorhtmltable_s
|
|||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
BasicTableLayoutStrategy.cpp \
|
BasicTableLayoutStrategy.cpp \
|
||||||
nsCellMap.cpp \
|
nsCellMap.cpp \
|
||||||
nsTableCaption.cpp \
|
|
||||||
nsTableCell.cpp \
|
|
||||||
nsTableCellFrame.cpp \
|
nsTableCellFrame.cpp \
|
||||||
nsTableCol.cpp \
|
|
||||||
nsTableColFrame.cpp \
|
nsTableColFrame.cpp \
|
||||||
nsTableColGroup.cpp \
|
|
||||||
nsTableColGroupFrame.cpp \
|
nsTableColGroupFrame.cpp \
|
||||||
nsTableContent.cpp \
|
|
||||||
nsTableFrame.cpp \
|
nsTableFrame.cpp \
|
||||||
nsTableOuterFrame.cpp \
|
nsTableOuterFrame.cpp \
|
||||||
nsTablePart.cpp \
|
|
||||||
nsTableRow.cpp \
|
|
||||||
nsTableRowFrame.cpp \
|
nsTableRowFrame.cpp \
|
||||||
nsTableRowGroup.cpp \
|
|
||||||
nsTableRowGroupFrame.cpp \
|
nsTableRowGroupFrame.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
|||||||
@@ -23,26 +23,23 @@ REQUIRES=xpcom raptor js
|
|||||||
|
|
||||||
DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN
|
DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
CPPSRCS= nsCellMap.cpp \
|
CPPSRCS= nsCellMap.cpp \
|
||||||
nsTableCaption.cpp \
|
nsTableCellFrame.cpp \
|
||||||
nsTableCell.cpp nsTableCol.cpp \
|
nsTableColFrame.cpp \
|
||||||
nsTableCellFrame.cpp nsTableColFrame.cpp \
|
nsTableColGroupFrame.cpp \
|
||||||
nsTableColGroup.cpp nsTableColGroupFrame.cpp \
|
nsTableFrame.cpp \
|
||||||
nsTableContent.cpp nsTableFrame.cpp \
|
nsTableOuterFrame.cpp \
|
||||||
nsTableOuterFrame.cpp nsTablePart.cpp \
|
nsTableRowFrame.cpp \
|
||||||
nsTableRow.cpp nsTableRowFrame.cpp \
|
nsTableRowGroupFrame.cpp \
|
||||||
nsTableRowGroup.cpp nsTableRowGroupFrame.cpp \
|
|
||||||
BasicTableLayoutStrategy.cpp
|
BasicTableLayoutStrategy.cpp
|
||||||
|
|
||||||
CPP_OBJS= .\$(OBJDIR)\nsCellMap.obj \
|
CPP_OBJS= .\$(OBJDIR)\nsCellMap.obj \
|
||||||
.\$(OBJDIR)\nsTableCaption.obj \
|
|
||||||
.\$(OBJDIR)\nsTableCell.obj .\$(OBJDIR)\nsTableCol.obj \
|
|
||||||
.\$(OBJDIR)\nsTableCellFrame.obj .\$(OBJDIR)\nsTableColFrame.obj \
|
.\$(OBJDIR)\nsTableCellFrame.obj .\$(OBJDIR)\nsTableColFrame.obj \
|
||||||
.\$(OBJDIR)\nsTableColGroup.obj .\$(OBJDIR)\nsTableColGroupFrame.obj \
|
.\$(OBJDIR)\nsTableColGroupFrame.obj \
|
||||||
.\$(OBJDIR)\nsTableContent.obj .\$(OBJDIR)\nsTableFrame.obj \
|
.\$(OBJDIR)\nsTableFrame.obj \
|
||||||
.\$(OBJDIR)\nsTableOuterFrame.obj .\$(OBJDIR)\nsTablePart.obj \
|
.\$(OBJDIR)\nsTableOuterFrame.obj \
|
||||||
.\$(OBJDIR)\nsTableRow.obj .\$(OBJDIR)\nsTableRowFrame.obj \
|
.\$(OBJDIR)\nsTableRowFrame.obj \
|
||||||
.\$(OBJDIR)\nsTableRowGroup.obj .\$(OBJDIR)\nsTableRowGroupFrame.obj \
|
.\$(OBJDIR)\nsTableRowGroupFrame.obj \
|
||||||
.\$(OBJDIR)\BasicTableLayoutStrategy.obj
|
.\$(OBJDIR)\BasicTableLayoutStrategy.obj
|
||||||
|
|
||||||
LINCS=-I$(XPDIST)\public\xpcom -I$(XPDIST)\public\raptor \
|
LINCS=-I$(XPDIST)\public\xpcom -I$(XPDIST)\public\raptor \
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
|
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
#include "celldata.h"
|
#include "celldata.h"
|
||||||
|
#include "nsVoidArray.h"
|
||||||
|
|
||||||
class nsVoidArray;
|
|
||||||
class nsTableColFrame;
|
class nsTableColFrame;
|
||||||
class nsTableCellFrame;
|
class nsTableCellFrame;
|
||||||
|
|
||||||
|
|||||||
@@ -1,86 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#ifndef nsITableContent_h__
|
|
||||||
#define nsITableContent_h__
|
|
||||||
|
|
||||||
#include "nsISupports.h"
|
|
||||||
#include "nscore.h"
|
|
||||||
|
|
||||||
class nsTablePart;
|
|
||||||
|
|
||||||
#define NS_ITABLECONTENT_IID \
|
|
||||||
{ /* 34a59b40-a71d-11d1-8f2f-006008159b0c */ \
|
|
||||||
0x34a59b40, 0xa71d, 0x11d1, \
|
|
||||||
{0x8f, 0x2f, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x0c} }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* nsITableContent is a concrete subclass for all content nodes contained directly
|
|
||||||
* within a table.
|
|
||||||
*
|
|
||||||
* @author sclark
|
|
||||||
* @see nsTablePart
|
|
||||||
*/
|
|
||||||
class nsITableContent : public nsISupports
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** constants representing well-known table content types */
|
|
||||||
static const int kTableRowGroupType;
|
|
||||||
static const int kTableRowType;
|
|
||||||
static const int kTableColGroupType;
|
|
||||||
static const int kTableColType;
|
|
||||||
static const int kTableCaptionType;
|
|
||||||
static const int kTableCellType;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/** protected constructor. Never create an object of type nsITableContent directly.*/
|
|
||||||
nsITableContent ();
|
|
||||||
|
|
||||||
public:
|
|
||||||
/** returns the TablePart that contains this content node.
|
|
||||||
* every table content has one and only one parent,
|
|
||||||
* and may not be replicated within different hierarchies.
|
|
||||||
*/
|
|
||||||
virtual nsTablePart *GetTable ()=0;
|
|
||||||
|
|
||||||
/** set the parent of this table content object.
|
|
||||||
* @param aTable the new parent. May be null to disconnect this object from
|
|
||||||
* the hierarchy it is in. Note that we don't have formalized
|
|
||||||
* relationship objects, so the caller must also remove this
|
|
||||||
* from it's prarent's child list.
|
|
||||||
*/
|
|
||||||
virtual void SetTable (nsTablePart *aTable)=0;
|
|
||||||
|
|
||||||
/** returns PR_TRUE if there is an actual input tag corresponding to
|
|
||||||
* this content object.
|
|
||||||
*/
|
|
||||||
NS_IMETHOD IsSynthetic(PRBool& aResult) = 0;
|
|
||||||
|
|
||||||
/** returns PR_TRUE if this content object should NOT be written to the output stream.
|
|
||||||
* for example, we don't generally want to output implicit tags when saving.
|
|
||||||
*/
|
|
||||||
virtual PRBool SkipSelfForSaving ()=0;
|
|
||||||
|
|
||||||
/** return the type of TableContent this object represents. */
|
|
||||||
virtual int GetType()=0;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1,173 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#include "nsTableCaption.h"
|
|
||||||
#include "nsBodyFrame.h"
|
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsHTMLParts.h"
|
|
||||||
#include "nsHTMLContainer.h"
|
|
||||||
#include "nsContainerFrame.h"
|
|
||||||
#include "nsIReflowCommand.h"
|
|
||||||
#include "nsIStyleContext.h"
|
|
||||||
#include "nsStyleConsts.h"
|
|
||||||
#include "nsIPresContext.h"
|
|
||||||
#include "nsHTMLIIDs.h"
|
|
||||||
#include "nsHTMLAtoms.h"
|
|
||||||
#include "nsIHTMLAttributes.h"
|
|
||||||
#include "nsGenericHTMLElement.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
|
||||||
static PRBool gsDebug = PR_FALSE;
|
|
||||||
static PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#else
|
|
||||||
static const PRBool gsDebug = PR_FALSE;
|
|
||||||
static const PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
nsTableCaption::nsTableCaption(nsIAtom* aTag)
|
|
||||||
: nsTableContent(aTag)
|
|
||||||
{
|
|
||||||
mImplicit = PR_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableCaption::nsTableCaption(PRBool aImplicit)
|
|
||||||
: nsTableContent(NS_NewAtom(nsTablePart::kCaptionTagString))
|
|
||||||
{
|
|
||||||
mImplicit = aImplicit;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableCaption::~nsTableCaption()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
nsrefcnt nsTableCaption::AddRef(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs) printf("Add Ref: %x, nsTableCaption cnt = %d \n",this, mRefCnt+1);
|
|
||||||
return ++mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsrefcnt nsTableCaption::Release(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Release: %x, nsTableCaption cnt = %d \n",this, mRefCnt-1);
|
|
||||||
if (--mRefCnt == 0) {
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Delete: %x, nsTableCaption \n",this);
|
|
||||||
delete this;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nsTableCaption::GetType()
|
|
||||||
{
|
|
||||||
return nsITableContent::kTableCaptionType;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableCaption::SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
nsHTMLValue val;
|
|
||||||
|
|
||||||
if (aAttribute == nsHTMLAtoms::align) {
|
|
||||||
if (ParseTableCaptionAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nsTableContent::SetAttribute(aAttribute, aValue, aNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIPresContext* aPresContext)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
|
||||||
|
|
||||||
nsHTMLValue value;
|
|
||||||
|
|
||||||
// align
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
|
||||||
if (value.GetUnit() != eHTMLUnit_Null) {
|
|
||||||
NS_ASSERTION(value.GetUnit() == eHTMLUnit_Enumerated, "unexpected unit");
|
|
||||||
|
|
||||||
PRUint8 alignValue = value.GetIntValue();
|
|
||||||
// this code relies on top, bottom, left, and right all being unique values
|
|
||||||
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==alignValue ||
|
|
||||||
NS_STYLE_VERTICAL_ALIGN_TOP==alignValue)
|
|
||||||
{
|
|
||||||
nsStyleText* textStyle =
|
|
||||||
(nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mVerticalAlign.SetIntValue(alignValue, eStyleUnit_Enumerated);
|
|
||||||
}
|
|
||||||
// XXX: this isn't the right place to put this attribute! probably on the float guy
|
|
||||||
// talk to Peter and Troy
|
|
||||||
else if (NS_STYLE_TEXT_ALIGN_LEFT==alignValue ||
|
|
||||||
NS_STYLE_TEXT_ALIGN_RIGHT==alignValue)
|
|
||||||
{
|
|
||||||
nsStyleText* textStyle =
|
|
||||||
(nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mTextAlign = alignValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableCaption::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
|
||||||
{
|
|
||||||
aMapFunc = &MapAttributesInto;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableCaption::CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad arg");
|
|
||||||
|
|
||||||
nsIFrame* frame;
|
|
||||||
nsresult rv = NS_NewBodyFrame(this, aParentFrame, frame);
|
|
||||||
if (NS_OK != rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
frame->SetStyleContext(aPresContext, aStyleContext);
|
|
||||||
aResult = frame;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
NS_NewTableCaptionPart(nsIHTMLContent** aInstancePtrResult,
|
|
||||||
nsIAtom* aTag)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "nsnull ptr");
|
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIHTMLContent* body = new nsTableCaption(aTag);
|
|
||||||
if (nsnull == body) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
return body->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult);
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#ifndef nsTableCaption_h__
|
|
||||||
#define nsTableCaption_h__
|
|
||||||
|
|
||||||
#include "nscore.h"
|
|
||||||
#include "nsTableContent.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* nsTableCaption is the content object that represents table captions
|
|
||||||
* (HTML tag CAPTION). This class cannot be reused
|
|
||||||
* outside of an nsTablePart. It assumes that its parent is an nsTablePart, and
|
|
||||||
* it has a single nsBodyPart child.
|
|
||||||
*
|
|
||||||
* @see nsTablePart
|
|
||||||
* @see nsTableRow
|
|
||||||
* @see nsBodyPart
|
|
||||||
*
|
|
||||||
* @author sclark
|
|
||||||
*/
|
|
||||||
class nsTableCaption : public nsTableContent
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aImplicit PR_TRUE if there is no actual input tag corresponding to
|
|
||||||
* this caption.
|
|
||||||
*/
|
|
||||||
nsTableCaption (PRBool aImplicit);
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this caption to get constructed.
|
|
||||||
*/
|
|
||||||
nsTableCaption (nsIAtom* aTag);
|
|
||||||
|
|
||||||
/** destructor, not responsible for any memory destruction itself */
|
|
||||||
virtual ~nsTableCaption();
|
|
||||||
|
|
||||||
// For debugging purposes only
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef();
|
|
||||||
NS_IMETHOD_(nsrefcnt) Release();
|
|
||||||
|
|
||||||
/** returns nsITableContent::kTableCaptionType */
|
|
||||||
virtual int GetType();
|
|
||||||
|
|
||||||
/* ---------- overrides ---------- */
|
|
||||||
NS_IMETHOD SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const;
|
|
||||||
|
|
||||||
/** @see nsIHTMLContent::CreateFrame */
|
|
||||||
NS_IMETHOD CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,353 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#include "nsTableCell.h"
|
|
||||||
#include "nsTableCellFrame.h"
|
|
||||||
#include "nsHTMLParts.h"
|
|
||||||
#include "nsIStyleContext.h"
|
|
||||||
#include "nsStyleConsts.h"
|
|
||||||
#include "nsIPresContext.h"
|
|
||||||
#include "nsIDocument.h"
|
|
||||||
#include "nsIURL.h"
|
|
||||||
#include "nsHTMLIIDs.h"
|
|
||||||
#include "nsHTMLAtoms.h"
|
|
||||||
#include "nsIPtr.h"
|
|
||||||
#include "nsIHTMLAttributes.h"
|
|
||||||
#include "nsGenericHTMLElement.h"
|
|
||||||
|
|
||||||
// hack, remove when hack in nsTableCol constructor is removed
|
|
||||||
static PRInt32 HACKcounter=0;
|
|
||||||
static nsIAtom *HACKattribute=nsnull;
|
|
||||||
#include "prprf.h" // remove when nsTableCol constructor hack is removed
|
|
||||||
// end hack code
|
|
||||||
|
|
||||||
|
|
||||||
NS_DEF_PTR(nsIStyleContext);
|
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
|
||||||
static PRBool gsDebug = PR_FALSE;
|
|
||||||
static PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#else
|
|
||||||
static const PRBool gsDebug = PR_FALSE;
|
|
||||||
static const PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// nsTableContent checks aTag
|
|
||||||
nsTableCell::nsTableCell(nsIAtom* aTag)
|
|
||||||
: nsTableContent(aTag),
|
|
||||||
mRow(0),
|
|
||||||
mRowSpan(1),
|
|
||||||
mColSpan(1),
|
|
||||||
mColIndex(0)
|
|
||||||
{
|
|
||||||
mImplicit = PR_FALSE;
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableCell::nsTableCell(PRBool aImplicit)
|
|
||||||
: nsTableContent(NS_NewAtom(nsTablePart::kDataCellTagString)),
|
|
||||||
mRow(0),
|
|
||||||
mRowSpan(1),
|
|
||||||
mColSpan(1),
|
|
||||||
mColIndex(0)
|
|
||||||
{
|
|
||||||
mImplicit = aImplicit;
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
// nsTableContent checks aTag
|
|
||||||
nsTableCell::nsTableCell (nsIAtom* aTag, int aRowSpan, int aColSpan)
|
|
||||||
: nsTableContent(aTag),
|
|
||||||
mRow(0),
|
|
||||||
mRowSpan(aRowSpan),
|
|
||||||
mColSpan(aColSpan),
|
|
||||||
mColIndex(0)
|
|
||||||
{
|
|
||||||
NS_ASSERTION(0<aRowSpan, "bad row span");
|
|
||||||
NS_ASSERTION(0<aColSpan, "bad col span");
|
|
||||||
mImplicit = PR_FALSE;
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableCell::Init()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableCell::~nsTableCell()
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
// XXX Circular reference between table row and table cell
|
|
||||||
NS_IF_RELEASE(mRow);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// for debugging only
|
|
||||||
nsrefcnt nsTableCell::AddRef(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs) printf("Add Ref: %x, nsTableCell cnt = %d \n",this, mRefCnt+1);
|
|
||||||
return ++mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
// for debugging only
|
|
||||||
nsrefcnt nsTableCell::Release(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Release: %x, nsTableCell cnt = %d \n",this, mRefCnt-1);
|
|
||||||
if (--mRefCnt == 0) {
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Delete: %x, nsTableCell \n",this);
|
|
||||||
delete this;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nsTableCell::GetType()
|
|
||||||
{
|
|
||||||
return nsITableContent::kTableCellType;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nsTableCell::GetRowSpan ()
|
|
||||||
{
|
|
||||||
NS_ASSERTION(0<mRowSpan, "bad row span");
|
|
||||||
return mRowSpan;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nsTableCell::GetColSpan ()
|
|
||||||
{
|
|
||||||
NS_ASSERTION(0<mColSpan, "bad col span");
|
|
||||||
return mColSpan;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableRow * nsTableCell::GetRow ()
|
|
||||||
{
|
|
||||||
NS_IF_ADDREF(mRow);
|
|
||||||
return mRow;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableCell::SetRow (nsTableRow * aRow)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
// XXX Circular reference between table row and table cell
|
|
||||||
NS_IF_RELEASE(mRow);
|
|
||||||
mRow = aRow;
|
|
||||||
NS_IF_ADDREF(aRow);
|
|
||||||
#else
|
|
||||||
mRow = aRow;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int nsTableCell::GetColIndex ()
|
|
||||||
{
|
|
||||||
NS_ASSERTION(0<=mColIndex, "bad column index");
|
|
||||||
return mColIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableCell::SetColIndex (int aColIndex)
|
|
||||||
{
|
|
||||||
NS_ASSERTION(0<=aColIndex, "illegal negative column index.");
|
|
||||||
mColIndex = aColIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsTableCell::CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad arg");
|
|
||||||
|
|
||||||
nsIFrame* frame;
|
|
||||||
nsresult rv = nsTableCellFrame::NewFrame(&frame, this, aParentFrame);
|
|
||||||
if (NS_OK != rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
((nsTableCellFrame*)frame)->Init(mRowSpan, mColSpan, mColIndex);
|
|
||||||
frame->SetStyleContext(aPresContext, aStyleContext);
|
|
||||||
aResult = frame;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableCell::SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aAttribute, "bad attribute arg");
|
|
||||||
nsHTMLValue val;
|
|
||||||
if ((aAttribute == nsHTMLAtoms::align) &&
|
|
||||||
ParseDivAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if ((aAttribute == nsHTMLAtoms::valign) &&
|
|
||||||
ParseAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if (aAttribute == nsHTMLAtoms::background) {
|
|
||||||
nsAutoString href(aValue);
|
|
||||||
href.StripWhitespace();
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, href, aNotify);
|
|
||||||
}
|
|
||||||
if (aAttribute == nsHTMLAtoms::bgcolor) {
|
|
||||||
ParseColor(aValue, val);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if (aAttribute == nsHTMLAtoms::rowspan) {
|
|
||||||
ParseValue(aValue, 1, 10000, val, eHTMLUnit_Integer);
|
|
||||||
SetRowSpan(val.GetIntValue());
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if (aAttribute == nsHTMLAtoms::colspan) {
|
|
||||||
ParseValue(aValue, 1, 1000, val, eHTMLUnit_Integer);
|
|
||||||
SetColSpan(val.GetIntValue());
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if (aAttribute == nsHTMLAtoms::width) {
|
|
||||||
ParseValueOrPercent(aValue, val, eHTMLUnit_Pixel);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if (aAttribute == nsHTMLAtoms::height) {
|
|
||||||
ParseValueOrPercent(aValue, val, eHTMLUnit_Pixel);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if (aAttribute == nsHTMLAtoms::nowrap) {
|
|
||||||
val.SetEmptyValue();
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use default attribute catching code
|
|
||||||
return nsTableContent::SetAttribute(aAttribute, aValue, aNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIPresContext* aPresContext)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
|
||||||
|
|
||||||
nsHTMLValue value;
|
|
||||||
nsHTMLValue widthValue;
|
|
||||||
nsStyleText* textStyle = nsnull;
|
|
||||||
|
|
||||||
// align: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mTextAlign = value.GetIntValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
// valign: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
if (nsnull==textStyle)
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
|
||||||
}
|
|
||||||
|
|
||||||
// width: pixel
|
|
||||||
float p2t = aPresContext->GetPixelsToTwips();
|
|
||||||
nsStylePosition* pos = (nsStylePosition*)
|
|
||||||
aContext->GetMutableStyleData(eStyleStruct_Position);
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::width, widthValue);
|
|
||||||
if (widthValue.GetUnit() == eHTMLUnit_Pixel) {
|
|
||||||
nscoord twips = NSIntPixelsToTwips(widthValue.GetPixelValue(), p2t);
|
|
||||||
pos->mWidth.SetCoordValue(twips);
|
|
||||||
}
|
|
||||||
else if (widthValue.GetUnit() == eHTMLUnit_Percent) {
|
|
||||||
pos->mWidth.SetPercentValue(widthValue.GetPercentValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
// height: pixel
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::height, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
|
||||||
nscoord twips = NSIntPixelsToTwips(value.GetPixelValue(), p2t);
|
|
||||||
pos->mHeight.SetCoordValue(twips);
|
|
||||||
}
|
|
||||||
|
|
||||||
// nowrap
|
|
||||||
// nowrap depends on the width attribute, so be sure to handle it after width is mapped!
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::nowrap, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Empty)
|
|
||||||
{
|
|
||||||
if (widthValue.GetUnit() != eHTMLUnit_Pixel)
|
|
||||||
{
|
|
||||||
if (nsnull==textStyle)
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mWhiteSpace = NS_STYLE_WHITESPACE_NOWRAP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableCell::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
|
||||||
{
|
|
||||||
aMapFunc = &MapAttributesInto;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableCell::AttributeToString(nsIAtom* aAttribute,
|
|
||||||
nsHTMLValue& aValue,
|
|
||||||
nsString& aResult) const
|
|
||||||
{
|
|
||||||
nsresult ca = NS_CONTENT_ATTR_NOT_THERE;
|
|
||||||
if (aAttribute == nsHTMLAtoms::valign) {
|
|
||||||
AlignParamToString(aValue, aResult);
|
|
||||||
ca = NS_CONTENT_ATTR_HAS_VALUE;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ca = nsTableContent::AttributeToString(aAttribute, aValue, aResult);
|
|
||||||
}
|
|
||||||
return ca;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableCell::SetRowSpan(int aRowSpan)
|
|
||||||
{
|
|
||||||
NS_ASSERTION(0<aRowSpan, "bad row span");
|
|
||||||
int oldSpan = mRowSpan;
|
|
||||||
mRowSpan = aRowSpan;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableCell::SetColSpan (int aColSpan)
|
|
||||||
{
|
|
||||||
NS_ASSERTION(0<aColSpan, "bad col span");
|
|
||||||
int oldSpan = mColSpan;
|
|
||||||
mColSpan = aColSpan;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
NS_NewTableCellPart(nsIHTMLContent** aInstancePtrResult,
|
|
||||||
nsIAtom* aTag)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "nsnull ptr");
|
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIHTMLContent* body = new nsTableCell(aTag);
|
|
||||||
if (nsnull == body) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
return body->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult);
|
|
||||||
}
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#ifndef nsTableCell_h__
|
|
||||||
#define nsTableCell_h__
|
|
||||||
|
|
||||||
#include "nsCoord.h"
|
|
||||||
#include "nscore.h"
|
|
||||||
#include "nsTableContent.h"
|
|
||||||
#include "nsTableRow.h"
|
|
||||||
|
|
||||||
// forward declarations
|
|
||||||
struct nsStyleColor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* nsTableCell is the content object that represents table cells
|
|
||||||
* (HTML tags TD and TH). This class cannot be reused
|
|
||||||
* outside of an nsTableRow. It assumes that its parent is an nsTableRow, and
|
|
||||||
* it has a single nsBodyPart child.
|
|
||||||
*
|
|
||||||
* @see nsTablePart
|
|
||||||
* @see nsTableRow
|
|
||||||
* @see nsBodyPart
|
|
||||||
*
|
|
||||||
* @author sclark
|
|
||||||
*/
|
|
||||||
class nsTableCell : public nsTableContent
|
|
||||||
{
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/** parent pointer */
|
|
||||||
nsTableRow * mRow;
|
|
||||||
|
|
||||||
/** the number of rows spanned by this cell */
|
|
||||||
int mRowSpan;
|
|
||||||
|
|
||||||
/** the number of columns spanned by this cell */
|
|
||||||
int mColSpan;
|
|
||||||
|
|
||||||
/** the starting column for this cell */
|
|
||||||
int mColIndex;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aImplicit PR_TRUE if there is no actual input tag corresponding to
|
|
||||||
* this cell.
|
|
||||||
*/
|
|
||||||
nsTableCell (PRBool aImplicit);
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this cell to get constructed.
|
|
||||||
*/
|
|
||||||
nsTableCell (nsIAtom* aTag);
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this caption to get constructed.
|
|
||||||
* @param aRowSpan the number of rows spanned
|
|
||||||
* @param aColSpan the number of columns spanned
|
|
||||||
*/
|
|
||||||
nsTableCell (nsIAtom* aTag, int aRowSpan, int aColSpan);
|
|
||||||
|
|
||||||
/** destructor, not responsible for any memory destruction itself */
|
|
||||||
virtual ~nsTableCell();
|
|
||||||
|
|
||||||
// For debugging purposes only
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef();
|
|
||||||
NS_IMETHOD_(nsrefcnt) Release();
|
|
||||||
|
|
||||||
|
|
||||||
/** returns nsITableContent::kTableCellType */
|
|
||||||
virtual int GetType();
|
|
||||||
|
|
||||||
/** @see nsIHTMLContent::CreateFrame */
|
|
||||||
NS_IMETHOD CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult);
|
|
||||||
|
|
||||||
NS_IMETHOD SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const;
|
|
||||||
|
|
||||||
NS_IMETHOD AttributeToString(nsIAtom* aAttribute,
|
|
||||||
nsHTMLValue& aValue,
|
|
||||||
nsString& aResult) const;
|
|
||||||
|
|
||||||
|
|
||||||
/** @return the number of rows spanned by this cell. Always >= 1 */
|
|
||||||
virtual int GetRowSpan ();
|
|
||||||
|
|
||||||
/** set the number of rows spanned. Must be >= 1 */
|
|
||||||
virtual void SetRowSpan (int aRowSpan);
|
|
||||||
|
|
||||||
/** @return the number of columns spanned by this cell. Always >= 1 */
|
|
||||||
virtual int GetColSpan ();
|
|
||||||
|
|
||||||
/** set the number of columns spanned. Must be >= 1 */
|
|
||||||
virtual void SetColSpan (int aColSpan);
|
|
||||||
|
|
||||||
/** return a pointer to this cell's parent, the row containing the cell */
|
|
||||||
virtual nsTableRow * GetRow ();
|
|
||||||
|
|
||||||
/** set this cell's parent.
|
|
||||||
* Note: Since mRow is the parent of the table cell,
|
|
||||||
* reference counting should not be done on
|
|
||||||
* this variable when setting the row.
|
|
||||||
* see /ns/raptor/doc/MemoryModel.html
|
|
||||||
*/
|
|
||||||
virtual void SetRow (nsTableRow * aRow);
|
|
||||||
|
|
||||||
/** @return the starting column for this cell. Always >= 1 */
|
|
||||||
virtual int GetColIndex ();
|
|
||||||
|
|
||||||
/** set the starting column for this cell. Always >= 1 */
|
|
||||||
virtual void SetColIndex (int aColIndex);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual void Init();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -25,6 +25,8 @@
|
|||||||
#include "nsCSSRendering.h"
|
#include "nsCSSRendering.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsIContentDelegate.h"
|
#include "nsIContentDelegate.h"
|
||||||
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsHTMLIIDs.h"
|
||||||
#include "nsCSSLayout.h"
|
#include "nsCSSLayout.h"
|
||||||
#include "nsHTMLValue.h"
|
#include "nsHTMLValue.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
@@ -55,8 +57,6 @@ nsTableCellFrame::nsTableCellFrame(nsIContent* aContent,
|
|||||||
nsIFrame* aParentFrame)
|
nsIFrame* aParentFrame)
|
||||||
: nsContainerFrame(aContent, aParentFrame)
|
: nsContainerFrame(aContent, aParentFrame)
|
||||||
{
|
{
|
||||||
mRowSpan=1;
|
|
||||||
mColSpan=1;
|
|
||||||
mColIndex=0;
|
mColIndex=0;
|
||||||
mPriorAvailWidth=0;
|
mPriorAvailWidth=0;
|
||||||
mDesiredSize.width=0;
|
mDesiredSize.width=0;
|
||||||
@@ -216,7 +216,39 @@ nsTableFrame* nsTableCellFrame::GetTableFrame()
|
|||||||
return (nsTableFrame*)frame;
|
return (nsTableFrame*)frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRInt32 nsTableCellFrame::GetRowSpan()
|
||||||
|
{
|
||||||
|
PRInt32 rowSpan=1;
|
||||||
|
nsIHTMLContent *hc=nsnull;
|
||||||
|
nsresult rv = mContent->QueryInterface(kIHTMLContentIID, (void**) &hc);
|
||||||
|
if (NS_OK==rv)
|
||||||
|
{
|
||||||
|
nsHTMLValue val;
|
||||||
|
hc->GetAttribute(nsHTMLAtoms::rowspan, val);
|
||||||
|
if (eHTMLUnit_Integer == val.GetUnit()) {
|
||||||
|
rowSpan=val.GetIntValue();
|
||||||
|
}
|
||||||
|
NS_RELEASE(hc);
|
||||||
|
}
|
||||||
|
return rowSpan;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt32 nsTableCellFrame::GetColSpan()
|
||||||
|
{
|
||||||
|
PRInt32 colSpan=1;
|
||||||
|
nsIHTMLContent *hc=nsnull;
|
||||||
|
nsresult rv = mContent->QueryInterface(kIHTMLContentIID, (void**) &hc);
|
||||||
|
if (NS_OK==rv)
|
||||||
|
{
|
||||||
|
nsHTMLValue val;
|
||||||
|
hc->GetAttribute(nsHTMLAtoms::colspan, val);
|
||||||
|
if (eHTMLUnit_Integer == val.GetUnit()) {
|
||||||
|
colSpan=val.GetIntValue();
|
||||||
|
}
|
||||||
|
NS_RELEASE(hc);
|
||||||
|
}
|
||||||
|
return colSpan;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -510,7 +542,7 @@ void nsTableCellFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
|||||||
nscoord border = 1;
|
nscoord border = 1;
|
||||||
|
|
||||||
nsTableFrame* tableFrame = GetTableFrame();
|
nsTableFrame* tableFrame = GetTableFrame();
|
||||||
tableFrame->GetGeometricParent((nsIFrame *&)tableFrame); // get the outer frame
|
//tableFrame->GetGeometricParent((nsIFrame *&)tableFrame); // get the outer frame
|
||||||
NS_ASSERTION(tableFrame,"Table Must not be null");
|
NS_ASSERTION(tableFrame,"Table Must not be null");
|
||||||
if (!tableFrame)
|
if (!tableFrame)
|
||||||
return;
|
return;
|
||||||
@@ -579,21 +611,18 @@ nsTableCellFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|||||||
return nsContainerFrame::QueryInterface(aIID, aInstancePtr);
|
return nsContainerFrame::QueryInterface(aIID, aInstancePtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----- static methods ----- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableCellFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableCellFrame( nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableCellFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableCellFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,11 +41,19 @@ class nsTableCellFrame : public nsContainerFrame
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void Init(PRInt32 aRowSpan, PRInt32 aColSpan, PRInt32 aColIndex);
|
void InitCellFrame(PRInt32 aColIndex);
|
||||||
|
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
/** instantiate a new instance of nsTableCellFrame.
|
||||||
nsIContent* aContent,
|
* @param aResult the new object is returned in this out-param
|
||||||
nsIFrame* aParent);
|
* @param aContent the table object to map
|
||||||
|
* @param aParent the parent of the new frame
|
||||||
|
*
|
||||||
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
|
*/
|
||||||
|
friend nsresult
|
||||||
|
NS_NewTableCellFrame(nsIContent* aContent,
|
||||||
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
// nsISupports
|
// nsISupports
|
||||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||||
@@ -206,11 +214,6 @@ protected:
|
|||||||
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** the number of rows spanned by this cell */
|
|
||||||
int mRowSpan;
|
|
||||||
|
|
||||||
/** the number of columns spanned by this cell */
|
|
||||||
int mColSpan;
|
|
||||||
|
|
||||||
/** the starting column for this cell */
|
/** the starting column for this cell */
|
||||||
int mColIndex;
|
int mColIndex;
|
||||||
@@ -232,18 +235,12 @@ protected:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void nsTableCellFrame::Init(PRInt32 aRowSpan, PRInt32 aColSpan, PRInt32 aColIndex)
|
inline void nsTableCellFrame::InitCellFrame(PRInt32 aColIndex)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(0<aRowSpan, "bad row span arg");
|
|
||||||
NS_PRECONDITION(0<aColSpan, "bad col span arg");
|
|
||||||
NS_PRECONDITION(0<=aColIndex, "bad col index arg");
|
NS_PRECONDITION(0<=aColIndex, "bad col index arg");
|
||||||
mRowSpan = aRowSpan;
|
|
||||||
mColSpan = aColSpan;
|
|
||||||
mColIndex = aColIndex;
|
mColIndex = aColIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PRInt32 nsTableCellFrame::GetRowSpan()
|
|
||||||
{ return mRowSpan;}
|
|
||||||
|
|
||||||
inline PRInt32 nsTableCellFrame::GetRowIndex()
|
inline PRInt32 nsTableCellFrame::GetRowIndex()
|
||||||
{
|
{
|
||||||
@@ -255,9 +252,6 @@ inline PRInt32 nsTableCellFrame::GetRowIndex()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PRInt32 nsTableCellFrame::GetColSpan()
|
|
||||||
{ return mColSpan;}
|
|
||||||
|
|
||||||
inline PRInt32 nsTableCellFrame::GetColIndex()
|
inline PRInt32 nsTableCellFrame::GetColIndex()
|
||||||
{ return mColIndex;}
|
{ return mColIndex;}
|
||||||
|
|
||||||
|
|||||||
@@ -1,227 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#include "nsTableCol.h"
|
|
||||||
#include "nsTableColFrame.h"
|
|
||||||
#include "nsTableColGroup.h"
|
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsHTMLParts.h"
|
|
||||||
#include "nsHTMLContainer.h"
|
|
||||||
#include "nsIStyleContext.h"
|
|
||||||
#include "nsStyleConsts.h"
|
|
||||||
#include "nsIPresContext.h"
|
|
||||||
#include "nsHTMLIIDs.h"
|
|
||||||
#include "nsHTMLAtoms.h"
|
|
||||||
#include "nsIHTMLAttributes.h"
|
|
||||||
#include "nsGenericHTMLElement.h"
|
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
|
||||||
static PRBool gsDebug = PR_FALSE;
|
|
||||||
static PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#else
|
|
||||||
static const PRBool gsDebug = PR_FALSE;
|
|
||||||
static const PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
nsTableCol::nsTableCol(nsIAtom* aTag)
|
|
||||||
: nsTableContent(aTag),
|
|
||||||
mColGroup(0),
|
|
||||||
mColIndex(0),
|
|
||||||
mRepeat(1)
|
|
||||||
{
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableCol::nsTableCol()
|
|
||||||
: nsTableContent(NS_NewAtom(nsTablePart::kColTagString)),
|
|
||||||
mColGroup(0),
|
|
||||||
mColIndex(0),
|
|
||||||
mRepeat(1)
|
|
||||||
{
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableCol::nsTableCol (PRBool aImplicit)
|
|
||||||
: nsTableContent(NS_NewAtom(nsTablePart::kColTagString)),
|
|
||||||
mColGroup(0),
|
|
||||||
mColIndex(0),
|
|
||||||
mRepeat(1)
|
|
||||||
{
|
|
||||||
mImplicit = aImplicit;
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableCol::Init()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableCol::~nsTableCol()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Added for debuging purposes -- remove from final build
|
|
||||||
nsrefcnt nsTableCol::AddRef(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Add Ref: %x, nsTableCol cnt = %d \n",this, mRefCnt+1);
|
|
||||||
return ++mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsrefcnt nsTableCol::Release(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Release: %x, nsTableCol cnt = %d \n",this,mRefCnt-1);
|
|
||||||
if (--mRefCnt == 0) {
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Delete: %x, nsTableCol \n",this);
|
|
||||||
delete this;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableCol::SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
nsHTMLValue val;
|
|
||||||
|
|
||||||
if (aAttribute == nsHTMLAtoms::width)
|
|
||||||
{
|
|
||||||
ParseValueOrPercentOrProportional(aValue, val, eHTMLUnit_Pixel);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
else if ( aAttribute == nsHTMLAtoms::repeat)
|
|
||||||
{
|
|
||||||
ParseValue(aValue, 0, val, eHTMLUnit_Integer);
|
|
||||||
SetRepeat(val.GetIntValue());
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
else if (aAttribute == nsHTMLAtoms::align) {
|
|
||||||
nsHTMLValue val;
|
|
||||||
if (ParseTableAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (aAttribute == nsHTMLAtoms::valign) {
|
|
||||||
nsHTMLValue val;
|
|
||||||
if (ParseTableAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// unknown attributes are handled by my parent
|
|
||||||
return nsTableContent::SetAttribute(aAttribute, aValue, aNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIPresContext* aPresContext)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
|
||||||
if (nsnull != aAttributes) {
|
|
||||||
|
|
||||||
float p2t;
|
|
||||||
nsHTMLValue value;
|
|
||||||
nsStyleText* textStyle = nsnull;
|
|
||||||
|
|
||||||
// width
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::width, value);
|
|
||||||
if (value.GetUnit() != eHTMLUnit_Null) {
|
|
||||||
nsStylePosition* position = (nsStylePosition*)
|
|
||||||
aContext->GetMutableStyleData(eStyleStruct_Position);
|
|
||||||
switch (value.GetUnit()) {
|
|
||||||
case eHTMLUnit_Percent:
|
|
||||||
position->mWidth.SetPercentValue(value.GetPercentValue());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case eHTMLUnit_Pixel:
|
|
||||||
p2t = aPresContext->GetPixelsToTwips();
|
|
||||||
position->mWidth.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// align: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mTextAlign = value.GetIntValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
// valign: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
if (nsnull==textStyle)
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableCol::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
|
||||||
{
|
|
||||||
aMapFunc = &MapAttributesInto;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableCol::CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad arg");
|
|
||||||
|
|
||||||
nsIFrame* frame;
|
|
||||||
nsresult rv = nsTableColFrame::NewFrame(&frame, this, aParentFrame);
|
|
||||||
if (NS_OK != rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
((nsTableColFrame*)frame)->Init(mColIndex, mRepeat);
|
|
||||||
frame->SetStyleContext(aPresContext, aStyleContext);
|
|
||||||
aResult = frame;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableCol::ResetColumns ()
|
|
||||||
{
|
|
||||||
if (nsnull != mColGroup)
|
|
||||||
mColGroup->ResetColumns ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------- Global Functions ---------- */
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
NS_NewTableColPart(nsIHTMLContent** aInstancePtrResult,
|
|
||||||
nsIAtom* aTag)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIHTMLContent* body = new nsTableCol(aTag);
|
|
||||||
if (nsnull == body) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
return body->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult);
|
|
||||||
}
|
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#ifndef nsTableCol_h__
|
|
||||||
#define nsTableCol_h__
|
|
||||||
|
|
||||||
#include "nscore.h"
|
|
||||||
#include "nsTableContent.h"
|
|
||||||
#include "nsTableColGroup.h"
|
|
||||||
|
|
||||||
class nsTablePart;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* nsTableCol is the content object that represents table cols
|
|
||||||
* (HTML tag COL). This class cannot be reused
|
|
||||||
* outside of an nsTableColGroup. It assumes that its parent is an nsTableColGroup, and
|
|
||||||
* it has no children.
|
|
||||||
*
|
|
||||||
* @see nsTablePart
|
|
||||||
* @see nsTableColGroup
|
|
||||||
*
|
|
||||||
* @author sclark
|
|
||||||
*/
|
|
||||||
class nsTableCol : public nsTableContent
|
|
||||||
{
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/** parent pointer, the column group to which this column belongs */
|
|
||||||
nsTableColGroup * mColGroup;
|
|
||||||
|
|
||||||
/** the starting index of the column (starting at 0) that this col object represents */
|
|
||||||
PRInt32 mColIndex;
|
|
||||||
|
|
||||||
/** the number of columns that the attributes of this column extend to */
|
|
||||||
PRInt32 mRepeat;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** default constructor */
|
|
||||||
nsTableCol ();
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aImplicit PR_TRUE if there is no actual input tag corresponding to
|
|
||||||
* this col.
|
|
||||||
*/
|
|
||||||
nsTableCol (PRBool aImplicit);
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this col to get constructed.
|
|
||||||
*/
|
|
||||||
nsTableCol (nsIAtom* aTag);
|
|
||||||
|
|
||||||
/** destructor, not responsible for any memory destruction itself */
|
|
||||||
virtual ~nsTableCol();
|
|
||||||
|
|
||||||
// For debugging purposes only
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef();
|
|
||||||
NS_IMETHOD_(nsrefcnt) Release();
|
|
||||||
|
|
||||||
/** returns nsITableContent::kTableCellType */
|
|
||||||
virtual int GetType();
|
|
||||||
|
|
||||||
NS_IMETHOD SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const;
|
|
||||||
|
|
||||||
/** @see nsIHTMLContent::CreateFrame */
|
|
||||||
NS_IMETHOD CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult);
|
|
||||||
|
|
||||||
/** return the number of columns this content object represents. always >= 1*/
|
|
||||||
virtual int GetRepeat ();
|
|
||||||
|
|
||||||
/** set the number of columns this content object represents. must be >= 1*/
|
|
||||||
void SetRepeat (int aRepeat);
|
|
||||||
|
|
||||||
virtual nsTableColGroup *GetColGroup ();
|
|
||||||
|
|
||||||
/** set the parent col group.<br>
|
|
||||||
* NOTE: Since mColGroup is the parent of the table column,
|
|
||||||
* reference counting should NOT be done on
|
|
||||||
* this variable when setting the row.
|
|
||||||
* see /ns/raptor/doc/MemoryModel.html
|
|
||||||
**/
|
|
||||||
virtual void SetColGroup (nsTableColGroup * aColGroup);
|
|
||||||
|
|
||||||
/** return the index of the column this content object represents. always >= 0 */
|
|
||||||
virtual int GetColumnIndex ();
|
|
||||||
|
|
||||||
/** set the index of the column this content object represents. must be >= 0 */
|
|
||||||
virtual void SetColumnIndex (int aColIndex);
|
|
||||||
|
|
||||||
virtual void ResetColumns ();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void Init();
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ---------- inlines ---------- */
|
|
||||||
|
|
||||||
|
|
||||||
inline int nsTableCol::GetType()
|
|
||||||
{ return nsITableContent::kTableColType;}
|
|
||||||
|
|
||||||
inline int nsTableCol::GetRepeat ()
|
|
||||||
{
|
|
||||||
if (0 < mRepeat)
|
|
||||||
return mRepeat;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline nsTableColGroup * nsTableCol::GetColGroup ()
|
|
||||||
{
|
|
||||||
NS_IF_ADDREF(mColGroup);
|
|
||||||
return mColGroup;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void nsTableCol::SetColGroup (nsTableColGroup * aColGroup)
|
|
||||||
{ mColGroup = aColGroup;}
|
|
||||||
|
|
||||||
inline int nsTableCol::GetColumnIndex ()
|
|
||||||
{ return mColIndex;}
|
|
||||||
|
|
||||||
inline void nsTableCol::SetColumnIndex (int aColIndex)
|
|
||||||
{ mColIndex = aColIndex;}
|
|
||||||
|
|
||||||
inline void nsTableCol::SetRepeat (int aRepeat)
|
|
||||||
{
|
|
||||||
mRepeat = aRepeat;
|
|
||||||
ResetColumns ();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ nsTableColFrame::nsTableColFrame(nsIContent* aContent, nsIFrame* aParentFrame)
|
|||||||
: nsFrame(aContent, aParentFrame)
|
: nsFrame(aContent, aParentFrame)
|
||||||
{
|
{
|
||||||
mColIndex = 0;
|
mColIndex = 0;
|
||||||
mRepeat = 0;
|
mRepeat = 1;
|
||||||
mMaxColWidth = 0;
|
mMaxColWidth = 0;
|
||||||
mMinColWidth = 0;
|
mMinColWidth = 0;
|
||||||
mMaxEffectiveColWidth = 0;
|
mMaxEffectiveColWidth = 0;
|
||||||
@@ -79,21 +79,18 @@ NS_METHOD nsTableColFrame::Reflow(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ----- static methods ------ */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableColFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableColFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableColFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableColFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,11 +29,19 @@ public:
|
|||||||
eWIDTH_SOURCE_CELL_WITH_SPAN=2 // a cell implicitly specified a width via colspan
|
eWIDTH_SOURCE_CELL_WITH_SPAN=2 // a cell implicitly specified a width via colspan
|
||||||
};
|
};
|
||||||
|
|
||||||
void Init(PRInt32 aColIndex, PRInt32 aRepeat);
|
void InitColFrame(PRInt32 aColIndex, PRInt32 aRepeat);
|
||||||
|
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
/** instantiate a new instance of nsTableColFrame.
|
||||||
nsIContent* aContent,
|
* @param aResult the new object is returned in this out-param
|
||||||
nsIFrame* aParent);
|
* @param aContent the table object to map
|
||||||
|
* @param aParent the parent of the new frame
|
||||||
|
*
|
||||||
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
|
*/
|
||||||
|
friend nsresult
|
||||||
|
NS_NewTableColFrame(nsIContent* aContent,
|
||||||
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -104,7 +112,7 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
inline void nsTableColFrame::Init(PRInt32 aColIndex, PRInt32 aRepeat)
|
inline void nsTableColFrame::InitColFrame(PRInt32 aColIndex, PRInt32 aRepeat)
|
||||||
{
|
{
|
||||||
NS_ASSERTION(0<=aColIndex, "bad col index param");
|
NS_ASSERTION(0<=aColIndex, "bad col index param");
|
||||||
NS_ASSERTION(0<=aRepeat, "bad repeat param");
|
NS_ASSERTION(0<=aRepeat, "bad repeat param");
|
||||||
|
|||||||
@@ -1,417 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#include "nsTableColGroup.h"
|
|
||||||
#include "nsTableColGroupFrame.h"
|
|
||||||
#include "nsTableCol.h"
|
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsContainerFrame.h"
|
|
||||||
#include "nsIReflowCommand.h"
|
|
||||||
#include "nsIStyleContext.h"
|
|
||||||
#include "nsStyleConsts.h"
|
|
||||||
#include "nsIPresContext.h"
|
|
||||||
#include "nsHTMLIIDs.h"
|
|
||||||
#include "nsHTMLAtoms.h"
|
|
||||||
#include "nsIHTMLAttributes.h"
|
|
||||||
#include "nsGenericHTMLElement.h"
|
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
|
||||||
static PRBool gsDebug = PR_FALSE;
|
|
||||||
static PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#else
|
|
||||||
static const PRBool gsDebug = PR_FALSE;
|
|
||||||
static const PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
|
||||||
|
|
||||||
|
|
||||||
nsTableColGroup::nsTableColGroup(nsIAtom* aTag, int aSpan)
|
|
||||||
: nsTableContent(aTag),
|
|
||||||
mSpan(aSpan),
|
|
||||||
mStartColIndex(0),
|
|
||||||
mColCount(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableColGroup::nsTableColGroup (PRBool aImplicit)
|
|
||||||
: nsTableContent(NS_NewAtom(nsTablePart::kColGroupTagString)),
|
|
||||||
mSpan(0),
|
|
||||||
mStartColIndex(0),
|
|
||||||
mColCount(0)
|
|
||||||
{
|
|
||||||
mImplicit = aImplicit;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
nsTableColGroup::~nsTableColGroup()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Added for debuging purposes -- remove from final build
|
|
||||||
nsrefcnt nsTableColGroup::AddRef(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE)
|
|
||||||
printf("Add Ref: %x, nsTableColGroup cnt = %d \n",this,mRefCnt+1);
|
|
||||||
return ++mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsrefcnt nsTableColGroup::Release(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE)
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Release: %x, nsTableColGroup cnt = %d \n",this,mRefCnt-1);
|
|
||||||
if (--mRefCnt == 0) {
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Delete: %x, nsTableColGroup \n",this);
|
|
||||||
delete this;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** returns the number of columns represented by this group.
|
|
||||||
* if there are col children, count them (taking into account the span of each)
|
|
||||||
* else, check my own span attribute.
|
|
||||||
*/
|
|
||||||
int nsTableColGroup::GetColumnCount ()
|
|
||||||
{
|
|
||||||
if (0 == mColCount)
|
|
||||||
{
|
|
||||||
int count;
|
|
||||||
ChildCount (count);
|
|
||||||
if (0 < count)
|
|
||||||
{
|
|
||||||
for (int index = 0; index < count; index++)
|
|
||||||
{
|
|
||||||
nsIContent * child;
|
|
||||||
ChildAt (index, child); // child: REFCNT++
|
|
||||||
NS_ASSERTION(nsnull!=child, "bad child");
|
|
||||||
// is child a column?
|
|
||||||
nsTableContent *tableContent = (nsTableContent *)child;
|
|
||||||
if (tableContent->GetType() == nsITableContent::kTableColType)
|
|
||||||
{
|
|
||||||
nsTableCol * col = (nsTableCol *)tableContent;
|
|
||||||
col->SetColumnIndex (mStartColIndex + mColCount);
|
|
||||||
mColCount += col->GetRepeat ();
|
|
||||||
}
|
|
||||||
NS_RELEASE(child); // child: REFCNT--
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
mColCount = GetSpan ();
|
|
||||||
}
|
|
||||||
return mColCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableColGroup::ResetColumns ()
|
|
||||||
{
|
|
||||||
mColCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableColGroup::AppendChildTo (nsIContent *aContent, PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_ASSERTION(nsnull!=aContent, "bad arg");
|
|
||||||
|
|
||||||
// is aContent a TableRow?
|
|
||||||
PRBool isCol = IsCol(aContent);
|
|
||||||
|
|
||||||
if (PR_FALSE==isCol)
|
|
||||||
{
|
|
||||||
// you should go talk to my parent if you want to insert something other than a column
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult result = NS_ERROR_FAILURE;
|
|
||||||
PRBool contentHandled = PR_FALSE;
|
|
||||||
// SEC: TODO verify that aContent is table content
|
|
||||||
nsTableContent *tableContent = (nsTableContent *)aContent;
|
|
||||||
PRBool isImplicit;
|
|
||||||
tableContent->IsSynthetic(isImplicit);
|
|
||||||
if (PR_FALSE==isImplicit)
|
|
||||||
{
|
|
||||||
/* if aContent is not implicit,
|
|
||||||
* and if we already have an implicit column for this actual column,
|
|
||||||
* then replace the implicit col with this actual col.
|
|
||||||
*/
|
|
||||||
PRInt32 childCount;
|
|
||||||
ChildCount(childCount);
|
|
||||||
for (PRInt32 colIndex=0; colIndex<childCount; colIndex++)
|
|
||||||
{
|
|
||||||
nsTableContent *col;
|
|
||||||
ChildAt(colIndex, (nsIContent*&)col);
|
|
||||||
NS_ASSERTION(nsnull!=col, "bad child");
|
|
||||||
PRBool colIsImplicit;
|
|
||||||
col->IsSynthetic(colIsImplicit);
|
|
||||||
if (PR_TRUE==colIsImplicit)
|
|
||||||
{
|
|
||||||
ReplaceChildAt(aContent, colIndex, aNotify);
|
|
||||||
contentHandled = PR_TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (PR_FALSE==contentHandled)
|
|
||||||
result = nsTableContent::AppendChildTo (aContent, aNotify);
|
|
||||||
if (NS_OK==result)
|
|
||||||
{
|
|
||||||
((nsTableCol *)aContent)->SetColGroup (this);
|
|
||||||
((nsTableCol *)aContent)->SetColumnIndex (mStartColIndex + mColCount);
|
|
||||||
ResetColumns ();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableColGroup::InsertChildAt (nsIContent *aContent, PRInt32 aIndex,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_ASSERTION(nsnull!=aContent, "bad arg");
|
|
||||||
|
|
||||||
// is aContent a TableCol?
|
|
||||||
PRBool isCol = IsCol(aContent);
|
|
||||||
|
|
||||||
// if not, ignore the request to add aContent
|
|
||||||
if (PR_FALSE==isCol)
|
|
||||||
{
|
|
||||||
// you should go talk to my parent if you want to insert something other than a column
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if so, add the row to this group
|
|
||||||
nsresult result = nsTableContent::InsertChildAt (aContent, aIndex, aNotify);
|
|
||||||
if (NS_OK==result)
|
|
||||||
{
|
|
||||||
((nsTableCol *)aContent)->SetColGroup (this);
|
|
||||||
ResetColumns ();
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableColGroup::ReplaceChildAt (nsIContent * aContent, PRInt32 aIndex,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
PRInt32 numKids;
|
|
||||||
ChildCount(numKids);
|
|
||||||
NS_ASSERTION(nsnull!=aContent, "bad arg");
|
|
||||||
NS_ASSERTION((0<=aIndex && numKids>aIndex), "bad arg");
|
|
||||||
if ((nsnull==aContent) || !(0<=aIndex && numKids>aIndex))
|
|
||||||
return PR_FALSE;
|
|
||||||
|
|
||||||
// is aContent a TableRow?
|
|
||||||
PRBool isCol = IsCol(aContent);
|
|
||||||
|
|
||||||
// if not, ignore the request to replace the child at aIndex
|
|
||||||
if (PR_FALSE==isCol)
|
|
||||||
{
|
|
||||||
// you should go talk to my parent if you want to insert something other than a column
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsIContent * lastChild;
|
|
||||||
ChildAt (aIndex, lastChild); // lastChild : REFCNT++
|
|
||||||
NS_ASSERTION(nsnull!=lastChild, "bad child");
|
|
||||||
nsresult result = nsTableContent::ReplaceChildAt (aContent, aIndex, aNotify);
|
|
||||||
if (NS_OK==result)
|
|
||||||
{
|
|
||||||
((nsTableCol *)aContent)->SetColGroup (this);
|
|
||||||
if (nsnull != lastChild)
|
|
||||||
((nsTableCol *)lastChild)->SetColGroup (nsnull);
|
|
||||||
ResetColumns ();
|
|
||||||
}
|
|
||||||
NS_RELEASE(lastChild); // lastChild : REFCNT--
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a child at the given position. The method is ignored if
|
|
||||||
* the index is invalid (too small or too large).
|
|
||||||
*/
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableColGroup::RemoveChildAt (PRInt32 aIndex, PRBool aNotify)
|
|
||||||
{
|
|
||||||
#ifdef NS_DEBUG
|
|
||||||
PRInt32 numKids;
|
|
||||||
ChildCount(numKids);
|
|
||||||
NS_ASSERTION((0<=aIndex && numKids>aIndex), "bad arg");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nsIContent * lastChild;
|
|
||||||
ChildAt (aIndex, lastChild); // lastChild: REFCNT++
|
|
||||||
NS_ASSERTION(nsnull!=lastChild, "bad child");
|
|
||||||
nsresult result = nsTableContent::RemoveChildAt (aIndex, aNotify);
|
|
||||||
if (NS_OK==result)
|
|
||||||
{
|
|
||||||
if (nsnull != lastChild)
|
|
||||||
((nsTableCol *)lastChild)->SetColGroup (nsnull);
|
|
||||||
ResetColumns ();
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(lastChild); // lastChild REFCNT--
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** support method to determine if the param aContent is an nsTableCol object */
|
|
||||||
PRBool nsTableColGroup::IsCol(nsIContent * aContent) const
|
|
||||||
{
|
|
||||||
PRBool result = PR_FALSE;
|
|
||||||
if (nsnull!=aContent)
|
|
||||||
{
|
|
||||||
// is aContent a col?
|
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
|
||||||
nsresult rv = aContent->QueryInterface(kITableContentIID,
|
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(rv))
|
|
||||||
{
|
|
||||||
const int contentType = tableContentInterface->GetType();
|
|
||||||
NS_RELEASE(tableContentInterface);
|
|
||||||
if (contentType == nsITableContent::kTableColType)
|
|
||||||
result = PR_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableColGroup::SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
nsHTMLValue val;
|
|
||||||
|
|
||||||
if (aAttribute == nsHTMLAtoms::width)
|
|
||||||
{
|
|
||||||
ParseValueOrPercentOrProportional(aValue, val, eHTMLUnit_Pixel);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
else if ( aAttribute == nsHTMLAtoms::span)
|
|
||||||
{
|
|
||||||
ParseValue(aValue, 0, val, eHTMLUnit_Integer);
|
|
||||||
SetSpan(val.GetIntValue());
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
else if (aAttribute == nsHTMLAtoms::align) {
|
|
||||||
nsHTMLValue val;
|
|
||||||
if (ParseTableAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (aAttribute == nsHTMLAtoms::valign) {
|
|
||||||
nsHTMLValue val;
|
|
||||||
if (ParseTableAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nsTableContent::SetAttribute(aAttribute, aValue, aNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIPresContext* aPresContext)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
|
||||||
if (nsnull != aAttributes) {
|
|
||||||
|
|
||||||
float p2t;
|
|
||||||
nsHTMLValue value;
|
|
||||||
nsStyleText* textStyle = nsnull;
|
|
||||||
|
|
||||||
// width
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::width, value);
|
|
||||||
if (value.GetUnit() != eHTMLUnit_Null) {
|
|
||||||
nsStylePosition* position = (nsStylePosition*)
|
|
||||||
aContext->GetMutableStyleData(eStyleStruct_Position);
|
|
||||||
switch (value.GetUnit()) {
|
|
||||||
case eHTMLUnit_Percent:
|
|
||||||
position->mWidth.SetPercentValue(value.GetPercentValue());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case eHTMLUnit_Pixel:
|
|
||||||
p2t = aPresContext->GetPixelsToTwips();
|
|
||||||
position->mWidth.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// align: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mTextAlign = value.GetIntValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
// valign: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
if (nsnull==textStyle)
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableColGroup::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
|
||||||
{
|
|
||||||
aMapFunc = &MapAttributesInto;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableColGroup::CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad arg");
|
|
||||||
|
|
||||||
nsIFrame* frame;
|
|
||||||
nsresult rv = nsTableColGroupFrame::NewFrame(&frame, this, aParentFrame);
|
|
||||||
if (NS_OK != rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
frame->SetStyleContext(aPresContext, aStyleContext);
|
|
||||||
aResult = frame;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------- Global Functions ---------- */
|
|
||||||
|
|
||||||
NS_HTML nsresult
|
|
||||||
NS_NewTableColGroupPart(nsIHTMLContent** aInstancePtrResult,
|
|
||||||
nsIAtom* aTag)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "nsnull ptr");
|
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIHTMLContent* body = new nsTableColGroup(aTag, 0);
|
|
||||||
if (nsnull == body) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
return body->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult);
|
|
||||||
}
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#ifndef nsTableColGroup_h__
|
|
||||||
#define nsTableColGroup_h__
|
|
||||||
|
|
||||||
#include "nscore.h"
|
|
||||||
#include "nsTableContent.h"
|
|
||||||
|
|
||||||
class nsIPresContext;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* nsTableColGroup is the content object that represents table col groups
|
|
||||||
* (HTML tag COLGROUP). This class cannot be reused
|
|
||||||
* outside of an nsTablePart. It assumes that its parent is an nsTablePart, and
|
|
||||||
* its children are nsTableCols.
|
|
||||||
*
|
|
||||||
* @see nsTablePart
|
|
||||||
* @see nsTableCol
|
|
||||||
*
|
|
||||||
* @author sclark
|
|
||||||
*/
|
|
||||||
class nsTableColGroup : public nsTableContent
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/** the number of columns this col group represents. Must be >=1.
|
|
||||||
* Default is 1.
|
|
||||||
* Must be ignored if the colgroup contains any explicit col content objects.
|
|
||||||
*/
|
|
||||||
int mSpan;
|
|
||||||
|
|
||||||
/** the starting column index this col group represents. Must be >= 0. */
|
|
||||||
int mStartColIndex;
|
|
||||||
|
|
||||||
/** the number of columns represented by this col group when col content
|
|
||||||
* objects are contained herein. If no col children, then mSpan is the
|
|
||||||
* proper place to check.
|
|
||||||
* @see GetColumnCount
|
|
||||||
*/
|
|
||||||
int mColCount;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aImplicit PR_TRUE if there is no actual input tag corresponding to
|
|
||||||
* this col group.
|
|
||||||
*/
|
|
||||||
nsTableColGroup (PRBool aImplicit);
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this caption to get constructed.
|
|
||||||
* @param aSpan the number of columns this col group represents
|
|
||||||
* (unless overridden by col children.)
|
|
||||||
*/
|
|
||||||
nsTableColGroup (nsIAtom* aTag, int aSpan);
|
|
||||||
|
|
||||||
/** destructor, not responsible for any memory destruction itself */
|
|
||||||
virtual ~nsTableColGroup();
|
|
||||||
|
|
||||||
// For debugging purposes only
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef();
|
|
||||||
NS_IMETHOD_(nsrefcnt) Release();
|
|
||||||
|
|
||||||
NS_IMETHOD SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const;
|
|
||||||
|
|
||||||
/** @see nsIHTMLContent::CreateFrame */
|
|
||||||
NS_IMETHOD CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult);
|
|
||||||
|
|
||||||
/** returns nsITableContent::kTableColGroupType */
|
|
||||||
virtual int GetType();
|
|
||||||
|
|
||||||
/** returns the span attribute, always >= 1. Not necessarily representative
|
|
||||||
* of the number of columns spanned, since span is overridden by any COL
|
|
||||||
* children.
|
|
||||||
* @see GetColumnCount
|
|
||||||
*/
|
|
||||||
virtual int GetSpan ();
|
|
||||||
|
|
||||||
/** set the span attribute, must be >= 1. */
|
|
||||||
virtual void SetSpan (int aSpan);
|
|
||||||
|
|
||||||
/** get the starting column index, always >= 0. */
|
|
||||||
virtual int GetStartColumnIndex ();
|
|
||||||
|
|
||||||
/** set the starting column index, must be >= 0. */
|
|
||||||
virtual void SetStartColumnIndex (int aIndex);
|
|
||||||
|
|
||||||
/** called whenever the col structure changes.
|
|
||||||
* Propogates change notification up to the nsTablePart parent
|
|
||||||
*/
|
|
||||||
virtual void ResetColumns ();
|
|
||||||
|
|
||||||
/** returns the number of columns represented by this group.
|
|
||||||
* if there are col children, count them (taking into account the span of each)
|
|
||||||
* else, check my own span attribute.
|
|
||||||
*/
|
|
||||||
virtual int GetColumnCount ();
|
|
||||||
|
|
||||||
/** helper routine returns PR_TRUE if aContent represents a column */
|
|
||||||
virtual PRBool IsCol(nsIContent * aContent) const;
|
|
||||||
|
|
||||||
/** can only append objects that are columns (implement nsITableContent and are .
|
|
||||||
* of type nsITableContent::kTableColType.)
|
|
||||||
* @see nsIContent::AppendChildTo
|
|
||||||
*/
|
|
||||||
NS_IMETHOD AppendChildTo(nsIContent* aKid, PRBool aNotify);
|
|
||||||
|
|
||||||
/** can only insert objects that are columns (implement nsITableContent and are .
|
|
||||||
* of type nsITableContent::kTableColType.)
|
|
||||||
* @see nsIContent::InsertChildAt
|
|
||||||
*/
|
|
||||||
NS_IMETHOD InsertChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
/** can only replace child objects with objects that are columns
|
|
||||||
* (implement nsITableContent and are * of type nsITableContent::kTableColType.)
|
|
||||||
* @param aContent the object to insert, must be a column
|
|
||||||
* @param aIndex the index of the object to replace. Must be in the range
|
|
||||||
* 0<=aIndex<ChildCount().
|
|
||||||
* @see nsIContent::ReplaceChildAt
|
|
||||||
*/
|
|
||||||
NS_IMETHOD ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
/** @see nsIContent::InsertChildAt */
|
|
||||||
NS_IMETHOD RemoveChildAt(PRInt32 aIndex, PRBool aNotify);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- inlines ---------- */
|
|
||||||
|
|
||||||
inline int nsTableColGroup::GetType()
|
|
||||||
{ return nsITableContent::kTableColGroupType;}
|
|
||||||
|
|
||||||
inline int nsTableColGroup::GetSpan ()
|
|
||||||
{
|
|
||||||
if (0 < mSpan)
|
|
||||||
return mSpan;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int nsTableColGroup::GetStartColumnIndex ()
|
|
||||||
{ return mStartColIndex;}
|
|
||||||
|
|
||||||
inline void nsTableColGroup::SetStartColumnIndex (int aIndex)
|
|
||||||
{
|
|
||||||
if (aIndex != mStartColIndex)
|
|
||||||
mColCount = 0; // our index is being changed, trigger reset of col indicies, don't propogate back to table
|
|
||||||
mStartColIndex = aIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void nsTableColGroup::SetSpan (int aSpan)
|
|
||||||
{
|
|
||||||
mSpan = aSpan;
|
|
||||||
PRInt32 n;
|
|
||||||
ChildCount (n);
|
|
||||||
if (0 < n) // span is only relevant if we don't have children
|
|
||||||
ResetColumns ();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
#include "nsTableColGroupFrame.h"
|
#include "nsTableColGroupFrame.h"
|
||||||
#include "nsTableColFrame.h"
|
#include "nsTableColFrame.h"
|
||||||
#include "nsTableFrame.h"
|
#include "nsTableFrame.h"
|
||||||
#include "nsITableContent.h"
|
#include "nsIHTMLTableColElement.h"
|
||||||
#include "nsIReflowCommand.h"
|
#include "nsIReflowCommand.h"
|
||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
#include "nsStyleConsts.h"
|
#include "nsStyleConsts.h"
|
||||||
@@ -30,7 +30,8 @@
|
|||||||
NS_DEF_PTR(nsIContent);
|
NS_DEF_PTR(nsIContent);
|
||||||
NS_DEF_PTR(nsIStyleContext);
|
NS_DEF_PTR(nsIStyleContext);
|
||||||
|
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
static NS_DEFINE_IID(kIHTMLTableColElementIID, NS_IHTMLTABLECOLELEMENT_IID);
|
||||||
|
|
||||||
|
|
||||||
static PRBool gsDebug = PR_FALSE;
|
static PRBool gsDebug = PR_FALSE;
|
||||||
|
|
||||||
@@ -67,6 +68,7 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext& aPresContext,
|
|||||||
|
|
||||||
// for every content child that (is a column thingy and does not already have a frame)
|
// for every content child that (is a column thingy and does not already have a frame)
|
||||||
// create a frame and adjust it's style
|
// create a frame and adjust it's style
|
||||||
|
nsresult rv;
|
||||||
nsIFrame* kidFrame = nsnull;
|
nsIFrame* kidFrame = nsnull;
|
||||||
nsIFrame* prevKidFrame;
|
nsIFrame* prevKidFrame;
|
||||||
|
|
||||||
@@ -82,9 +84,11 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext& aPresContext,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//XXX: with the new content code, this check is no longer valid
|
||||||
|
/*
|
||||||
// verify that we're dealing with table content. If so, we know it's a column
|
// verify that we're dealing with table content. If so, we know it's a column
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
nsITableContent *tableContentInterface = nsnull;
|
||||||
nsresult rv = kid->QueryInterface(kITableContentIID,
|
rv = kid->QueryInterface(kITableContentIID,
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
||||||
if (NS_FAILED(rv))
|
if (NS_FAILED(rv))
|
||||||
{
|
{
|
||||||
@@ -92,7 +96,7 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext& aPresContext,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
NS_RELEASE(tableContentInterface); // tableContentInterface: REFCNT--
|
NS_RELEASE(tableContentInterface); // tableContentInterface: REFCNT--
|
||||||
|
*/
|
||||||
if (mChildCount<=colIndex)
|
if (mChildCount<=colIndex)
|
||||||
{
|
{
|
||||||
// Resolve style
|
// Resolve style
|
||||||
@@ -106,6 +110,21 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext& aPresContext,
|
|||||||
kidDel = kid->GetDelegate(&aPresContext);
|
kidDel = kid->GetDelegate(&aPresContext);
|
||||||
rv = kidDel->CreateFrame(&aPresContext, kid, this, kidSC, kidFrame);
|
rv = kidDel->CreateFrame(&aPresContext, kid, this, kidSC, kidFrame);
|
||||||
NS_RELEASE(kidDel);
|
NS_RELEASE(kidDel);
|
||||||
|
if (NS_FAILED(rv))
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
// set the preliminary values for the column frame
|
||||||
|
PRInt32 repeat=1;
|
||||||
|
nsIHTMLTableColElement* colContent = nsnull;
|
||||||
|
kid->QueryInterface(kIHTMLTableColElementIID,
|
||||||
|
(void**) &colContent); // colContent: ADDREF++
|
||||||
|
if (rv==NS_OK)
|
||||||
|
{
|
||||||
|
colContent->GetSpanValue(&repeat);
|
||||||
|
NS_RELEASE(colContent);
|
||||||
|
}
|
||||||
|
((nsTableColFrame *)(kidFrame))->InitColFrame (mStartColIndex + mColCount, repeat);
|
||||||
|
mColCount+= repeat;
|
||||||
|
|
||||||
// give the child frame a chance to reflow, even though we know it'll have 0 size
|
// give the child frame a chance to reflow, even though we know it'll have 0 size
|
||||||
nsReflowMetrics kidSize(nsnull);
|
nsReflowMetrics kidSize(nsnull);
|
||||||
@@ -238,21 +257,18 @@ int nsTableColGroupFrame::GetColumnCount ()
|
|||||||
return mColCount;
|
return mColCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----- static methods ----- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableColGroupFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableColGroupFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableColGroupFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableColGroupFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,9 +31,17 @@
|
|||||||
class nsTableColGroupFrame : public nsContainerFrame
|
class nsTableColGroupFrame : public nsContainerFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
/** instantiate a new instance of nsTableColGroupFrame.
|
||||||
nsIContent* aContent,
|
* @param aResult the new object is returned in this out-param
|
||||||
nsIFrame* aParent);
|
* @param aContent the table object to map
|
||||||
|
* @param aParent the parent of the new frame
|
||||||
|
*
|
||||||
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
|
*/
|
||||||
|
friend nsresult
|
||||||
|
NS_NewTableColGroupFrame(nsIContent* aContent,
|
||||||
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#ifndef nsTableContent_h__
|
|
||||||
#define nsTableContent_h__
|
|
||||||
|
|
||||||
#include "nscore.h"
|
|
||||||
#include "nsITableContent.h"
|
|
||||||
#include "nsHTMLContainer.h"
|
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsIAtom.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TableContent is a concrete base class for all content nodes contained directly
|
|
||||||
* within a table.
|
|
||||||
*
|
|
||||||
* @author sclark
|
|
||||||
* @version $Revision: 3.8 $
|
|
||||||
* @see
|
|
||||||
*/
|
|
||||||
class nsTableContent : public nsHTMLContainer, public nsITableContent
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/** the table to which this content belongs */
|
|
||||||
nsTablePart *mTable;
|
|
||||||
|
|
||||||
/** PR_TRUE if this content was generated in response to incomplete input,
|
|
||||||
* meaning there is no actual input tag matching this container.
|
|
||||||
*/
|
|
||||||
PRBool mImplicit;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this caption to get constructed.
|
|
||||||
*/
|
|
||||||
nsTableContent (nsIAtom* aTag);
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this caption to get constructed.
|
|
||||||
* @param aImplicit PR_TRUE if there is no actual input tag corresponding to
|
|
||||||
* this caption.
|
|
||||||
*/
|
|
||||||
nsTableContent (nsIAtom* aTag, PRBool aImplicit);
|
|
||||||
|
|
||||||
virtual ~nsTableContent();
|
|
||||||
|
|
||||||
/** supports implementation */
|
|
||||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtrResult);
|
|
||||||
|
|
||||||
// For debugging purposes only
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef();
|
|
||||||
NS_IMETHOD_(nsrefcnt) Release();
|
|
||||||
|
|
||||||
/** @see nsITableContent::GetTable */
|
|
||||||
nsTablePart* GetTable ();
|
|
||||||
|
|
||||||
/** @see nsITableContent::SetTable
|
|
||||||
* Note: Since mColGroup is the parent of the table column,
|
|
||||||
* reference counting should NOT be done.
|
|
||||||
* see /ns/raptor/doc/MemoryModel.html
|
|
||||||
**/
|
|
||||||
void SetTable (nsTablePart *aTable);
|
|
||||||
|
|
||||||
|
|
||||||
/** Set the children of this piece of content to
|
|
||||||
* be aTable
|
|
||||||
**/
|
|
||||||
void SetTableForChildren(nsTablePart *aTable);
|
|
||||||
|
|
||||||
|
|
||||||
/** @see nsITableContent::IsImplicit */
|
|
||||||
NS_IMETHOD IsSynthetic(PRBool& aResult);
|
|
||||||
|
|
||||||
/** @see nsITableContent::SkipSelfForSaving */
|
|
||||||
virtual PRBool SkipSelfForSaving ();
|
|
||||||
|
|
||||||
/** @see nsITableContent::GetType */
|
|
||||||
virtual int GetType()=0;
|
|
||||||
|
|
||||||
/** debug method prints out this and all child frames */
|
|
||||||
NS_IMETHOD List(FILE* out, PRInt32 aIndent) const;
|
|
||||||
|
|
||||||
NS_IMETHOD InsertChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
NS_IMETHOD ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
NS_IMETHOD AppendChildTo(nsIContent* aKid, PRBool aNotify);
|
|
||||||
NS_IMETHOD RemoveChildAt(PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* If the content is a nsTableContent then call SetTable on
|
|
||||||
* aContent, otherwise, do nothing.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void SetTableForTableContent(nsIContent* aContent, nsTablePart *aTable);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -16,19 +16,18 @@
|
|||||||
* Reserved.
|
* Reserved.
|
||||||
*/
|
*/
|
||||||
#include "nsTableFrame.h"
|
#include "nsTableFrame.h"
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsIRenderingContext.h"
|
#include "nsIRenderingContext.h"
|
||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsIContentDelegate.h"
|
#include "nsIContentDelegate.h"
|
||||||
#include "nsCellMap.h"
|
#include "nsCellMap.h"
|
||||||
#include "nsTableCellFrame.h"
|
#include "nsTableCellFrame.h"
|
||||||
#include "nsTableCol.h" // needed for building implicit columns
|
#include "nsHTMLParts.h"
|
||||||
#include "nsTableColGroup.h" // needed for building implicit colgroups
|
|
||||||
#include "nsTableColFrame.h"
|
#include "nsTableColFrame.h"
|
||||||
#include "nsTableColGroupFrame.h"
|
#include "nsTableColGroupFrame.h"
|
||||||
#include "nsTableRowFrame.h"
|
#include "nsTableRowFrame.h"
|
||||||
#include "nsTableRowGroupFrame.h"
|
#include "nsTableRowGroupFrame.h"
|
||||||
|
#include "nsIHTMLContent.h"
|
||||||
|
|
||||||
#include "BasicTableLayoutStrategy.h"
|
#include "BasicTableLayoutStrategy.h"
|
||||||
|
|
||||||
@@ -495,11 +494,8 @@ PRInt32 nsTableFrame::GetEffectiveCOLSAttribute()
|
|||||||
NS_PRECONDITION (nsnull!=cellMap, "bad call, cellMap not yet allocated.");
|
NS_PRECONDITION (nsnull!=cellMap, "bad call, cellMap not yet allocated.");
|
||||||
PRInt32 result;
|
PRInt32 result;
|
||||||
nsIFrame *tableFrame = this;
|
nsIFrame *tableFrame = this;
|
||||||
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED! XXX
|
nsStyleTable *tableStyle=nsnull;
|
||||||
tableFrame->GetGeometricParent(tableFrame);
|
GetStyleData(eStyleStruct_Table, (nsStyleStruct *&)tableStyle);
|
||||||
// end REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED! XXX
|
|
||||||
nsStyleTable *tableStyle;
|
|
||||||
tableFrame->GetStyleData(eStyleStruct_Table, (nsStyleStruct *&)tableStyle);
|
|
||||||
result = tableStyle->mCols;
|
result = tableStyle->mCols;
|
||||||
PRInt32 numCols = GetColCount();
|
PRInt32 numCols = GetColCount();
|
||||||
if (result>numCols)
|
if (result>numCols)
|
||||||
@@ -526,6 +522,7 @@ void nsTableFrame::EnsureColumns(nsIPresContext* aPresContext,
|
|||||||
const nsReflowState& aReflowState,
|
const nsReflowState& aReflowState,
|
||||||
nsReflowStatus& aStatus)
|
nsReflowStatus& aStatus)
|
||||||
{
|
{
|
||||||
|
#ifdef XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||||
// XXX sec should only be called on firstInFlow
|
// XXX sec should only be called on firstInFlow
|
||||||
SetMinColSpanForTable();
|
SetMinColSpanForTable();
|
||||||
if (nsnull==mCellMap)
|
if (nsnull==mCellMap)
|
||||||
@@ -564,14 +561,9 @@ void nsTableFrame::EnsureColumns(nsIPresContext* aPresContext,
|
|||||||
nsTableColGroup *lastColGroup=nsnull;
|
nsTableColGroup *lastColGroup=nsnull;
|
||||||
if (nsnull==lastColGroupFrame)
|
if (nsnull==lastColGroupFrame)
|
||||||
{
|
{
|
||||||
//QQQ
|
|
||||||
// need to find the generic way to stamp out this content, and ::AppendChildTo it
|
|
||||||
// this might be ok. no matter what my mcontent is, I know it needs a colgroup as a kid?
|
|
||||||
|
|
||||||
lastColGroup = new nsTableColGroup (PR_TRUE); // create an implicit colgroup
|
lastColGroup = new nsTableColGroup (PR_TRUE); // create an implicit colgroup
|
||||||
// XXX: instead of Append, maybe this should be insertAt(0)?
|
// XXX: instead of Append, maybe this should be insertAt(0)?
|
||||||
mContent->AppendChildTo(lastColGroup, PR_FALSE); // add the implicit colgroup to my content
|
mContent->AppendChildTo(lastColGroup, PR_FALSE); // add the implicit colgroup to my content
|
||||||
NS_ADDREF(lastColGroup); // ADDREF a: lastColGroup++
|
|
||||||
// Resolve style for the child
|
// Resolve style for the child
|
||||||
nsIStyleContext* colGroupStyleContext =
|
nsIStyleContext* colGroupStyleContext =
|
||||||
aPresContext->ResolveStyleContextFor(lastColGroup, this, PR_TRUE); // kidStyleContext: REFCNT++
|
aPresContext->ResolveStyleContextFor(lastColGroup, this, PR_TRUE); // kidStyleContext: REFCNT++
|
||||||
@@ -613,24 +605,26 @@ void nsTableFrame::EnsureColumns(nsIPresContext* aPresContext,
|
|||||||
{ //QQQ
|
{ //QQQ
|
||||||
// need to find the generic way to stamp out this content, and ::AppendChildTo it
|
// need to find the generic way to stamp out this content, and ::AppendChildTo it
|
||||||
nsTableCol *col = new nsTableCol(PR_TRUE);
|
nsTableCol *col = new nsTableCol(PR_TRUE);
|
||||||
NS_ADDREF(col);
|
|
||||||
lastColGroup->AppendChildTo (col, PR_FALSE);
|
lastColGroup->AppendChildTo (col, PR_FALSE);
|
||||||
}
|
}
|
||||||
NS_RELEASE(lastColGroup); // ADDREF: lastColGroup--
|
NS_RELEASE(lastColGroup); // ADDREF: lastColGroup--
|
||||||
lastColGroupFrame->Reflow(*aPresContext, aDesiredSize, aReflowState, aStatus);
|
lastColGroupFrame->Reflow(*aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/** sum the columns represented by all nsTableColGroup objects
|
/** sum the columns represented by all nsTableColGroup objects
|
||||||
* if the cell map says there are more columns than this,
|
* if the cell map says there are more columns than this,
|
||||||
* add extra implicit columns to the content tree.
|
* add extra implicit columns to the content tree.
|
||||||
*/
|
*/
|
||||||
|
// XXX should be nsresult, not void
|
||||||
void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
||||||
nsIPresContext* aPresContext,
|
nsIPresContext* aPresContext,
|
||||||
nsReflowMetrics& aDesiredSize,
|
nsReflowMetrics& aDesiredSize,
|
||||||
const nsReflowState& aReflowState,
|
const nsReflowState& aReflowState,
|
||||||
nsReflowStatus& aStatus)
|
nsReflowStatus& aStatus)
|
||||||
{
|
{
|
||||||
|
nsresult rv;
|
||||||
PRInt32 actualColumns = 0;
|
PRInt32 actualColumns = 0;
|
||||||
nsTableColGroupFrame *lastColGroupFrame = nsnull;
|
nsTableColGroupFrame *lastColGroupFrame = nsnull;
|
||||||
nsIFrame * firstRowGroupFrame=nsnull;
|
nsIFrame * firstRowGroupFrame=nsnull;
|
||||||
@@ -646,7 +640,7 @@ void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
|||||||
actualColumns += numCols;
|
actualColumns += numCols;
|
||||||
lastColGroupFrame = (nsTableColGroupFrame *)childFrame;
|
lastColGroupFrame = (nsTableColGroupFrame *)childFrame;
|
||||||
if (actualColumns > aColIndex)
|
if (actualColumns > aColIndex)
|
||||||
break; // we gave enough col frames at this point
|
break; // we have enough col frames at this point
|
||||||
}
|
}
|
||||||
else if (NS_STYLE_DISPLAY_TABLE_ROW_GROUP == childDisplay->mDisplay ||
|
else if (NS_STYLE_DISPLAY_TABLE_ROW_GROUP == childDisplay->mDisplay ||
|
||||||
NS_STYLE_DISPLAY_TABLE_HEADER_GROUP == childDisplay->mDisplay ||
|
NS_STYLE_DISPLAY_TABLE_HEADER_GROUP == childDisplay->mDisplay ||
|
||||||
@@ -660,18 +654,21 @@ void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
|||||||
}
|
}
|
||||||
if (actualColumns <= aColIndex)
|
if (actualColumns <= aColIndex)
|
||||||
{
|
{
|
||||||
nsTableColGroup *lastColGroup=nsnull;
|
nsIHTMLContent *lastColGroup=nsnull;
|
||||||
if (nsnull==lastColGroupFrame)
|
if (nsnull==lastColGroupFrame)
|
||||||
{
|
{
|
||||||
lastColGroup = new nsTableColGroup (PR_TRUE); // create an implicit colgroup
|
// create an implicit colgroup
|
||||||
|
nsAutoString colGroupTag;
|
||||||
|
nsHTMLAtoms::colgroup->ToString(colGroupTag);
|
||||||
|
rv = NS_CreateHTMLElement(&lastColGroup, colGroupTag); // ADDREF a: lastColGroup++
|
||||||
|
//XXX mark it as implicit!
|
||||||
mContent->AppendChildTo(lastColGroup, PR_FALSE); // add the implicit colgroup to my content
|
mContent->AppendChildTo(lastColGroup, PR_FALSE); // add the implicit colgroup to my content
|
||||||
NS_ADDREF(lastColGroup); // ADDREF a: lastColGroup++
|
|
||||||
// Resolve style for the child
|
// Resolve style for the child
|
||||||
nsIStyleContext* colGroupStyleContext =
|
nsIStyleContext* colGroupStyleContext =
|
||||||
aPresContext->ResolveStyleContextFor(lastColGroup, this, PR_TRUE); // kidStyleContext: REFCNT++
|
aPresContext->ResolveStyleContextFor(lastColGroup, this, PR_TRUE); // kidStyleContext: REFCNT++
|
||||||
nsIContentDelegate* kidDel = nsnull;
|
nsIContentDelegate* kidDel = nsnull;
|
||||||
kidDel = lastColGroup->GetDelegate(aPresContext); // kidDel: REFCNT++
|
kidDel = lastColGroup->GetDelegate(aPresContext); // kidDel: REFCNT++
|
||||||
nsresult rv = kidDel->CreateFrame(aPresContext, lastColGroup, this,
|
rv = kidDel->CreateFrame(aPresContext, lastColGroup, this,
|
||||||
colGroupStyleContext, (nsIFrame *&)lastColGroupFrame);
|
colGroupStyleContext, (nsIFrame *&)lastColGroupFrame);
|
||||||
NS_RELEASE(kidDel); // kidDel: REFCNT--
|
NS_RELEASE(kidDel); // kidDel: REFCNT--
|
||||||
NS_RELEASE(colGroupStyleContext); // kidStyleContenxt: REFCNT--
|
NS_RELEASE(colGroupStyleContext); // kidStyleContenxt: REFCNT--
|
||||||
@@ -702,12 +699,17 @@ void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
|||||||
lastColGroupFrame->GetContent((nsIContent *&)lastColGroup); // ADDREF b: lastColGroup++
|
lastColGroupFrame->GetContent((nsIContent *&)lastColGroup); // ADDREF b: lastColGroup++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsAutoString colTag;
|
||||||
|
nsHTMLAtoms::col->ToString(colTag);
|
||||||
PRInt32 excessColumns = aColIndex - actualColumns;
|
PRInt32 excessColumns = aColIndex - actualColumns;
|
||||||
for ( ; excessColumns >= 0; excessColumns--)
|
for ( ; excessColumns >= 0; excessColumns--)
|
||||||
{
|
{
|
||||||
nsTableCol *col = new nsTableCol(PR_TRUE);
|
nsIHTMLContent *col=nsnull;
|
||||||
NS_ADDREF(col);
|
// create an implicit col
|
||||||
lastColGroup->AppendChildTo(col, PR_FALSE);
|
rv = NS_CreateHTMLElement(&col, colTag); // ADDREF: col++
|
||||||
|
//XXX mark the col implicit
|
||||||
|
lastColGroup->AppendChildTo((nsIContent*)col, PR_FALSE);
|
||||||
|
NS_RELEASE(col); // ADDREF: col--
|
||||||
}
|
}
|
||||||
NS_RELEASE(lastColGroup); // ADDREF: lastColGroup--
|
NS_RELEASE(lastColGroup); // ADDREF: lastColGroup--
|
||||||
lastColGroupFrame->Reflow(*aPresContext, aDesiredSize, aReflowState, aStatus);
|
lastColGroupFrame->Reflow(*aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||||
@@ -2480,21 +2482,9 @@ void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
|
|||||||
// need to figure out the overall table width constraint
|
// need to figure out the overall table width constraint
|
||||||
// default case, get 100% of available space
|
// default case, get 100% of available space
|
||||||
|
|
||||||
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
|
||||||
nsIFrame * outerTableFrame = nsnull;
|
|
||||||
const nsStylePosition* position;
|
|
||||||
GetGeometricParent(outerTableFrame);
|
|
||||||
outerTableFrame->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)position));
|
|
||||||
// end REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PRInt32 maxWidth;
|
PRInt32 maxWidth;
|
||||||
/*
|
|
||||||
const nsStylePosition* position =
|
const nsStylePosition* position =
|
||||||
(const nsStylePosition*)mStyleContext->GetStyleData(eStyleStruct_Position);
|
(const nsStylePosition*)mStyleContext->GetStyleData(eStyleStruct_Position);
|
||||||
use this line when tableFrame contains its own position style info
|
|
||||||
*/
|
|
||||||
switch (position->mWidth.GetUnit()) {
|
switch (position->mWidth.GetUnit()) {
|
||||||
case eStyleUnit_Coord:
|
case eStyleUnit_Coord:
|
||||||
maxWidth = position->mWidth.GetCoordValue();
|
maxWidth = position->mWidth.GetCoordValue();
|
||||||
@@ -2849,8 +2839,6 @@ nsTableFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
nsIFrame * rg = nsnull;
|
nsIFrame * rg = nsnull;
|
||||||
firstInFlow->FirstChild(rg);
|
firstInFlow->FirstChild(rg);
|
||||||
NS_ASSERTION (nsnull!=rg, "previous frame has no children");
|
NS_ASSERTION (nsnull!=rg, "previous frame has no children");
|
||||||
nsIAtom * tHeadTag = NS_NewAtom(nsTablePart::kRowGroupHeadTagString); // tHeadTag: REFCNT++
|
|
||||||
nsIAtom * tFootTag = NS_NewAtom(nsTablePart::kRowGroupFootTagString); // tFootTag: REFCNT++
|
|
||||||
PRInt32 index = 0;
|
PRInt32 index = 0;
|
||||||
nsIFrame * bodyRowGroupFromOverflow = mOverflowList;
|
nsIFrame * bodyRowGroupFromOverflow = mOverflowList;
|
||||||
nsIFrame * lastSib = nsnull;
|
nsIFrame * lastSib = nsnull;
|
||||||
@@ -2859,10 +2847,10 @@ nsTableFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
nsIContent *content = nsnull;
|
nsIContent *content = nsnull;
|
||||||
rg->GetContent(content); // content: REFCNT++
|
rg->GetContent(content); // content: REFCNT++
|
||||||
NS_ASSERTION(nsnull!=content, "bad frame, returned null content.");
|
NS_ASSERTION(nsnull!=content, "bad frame, returned null content.");
|
||||||
nsIAtom * rgTag;
|
const nsStyleDisplay* display;
|
||||||
content->GetTag(rgTag);
|
GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&)display);
|
||||||
// if we've found a header or a footer, replicate it
|
if ((display->mDisplay == NS_STYLE_DISPLAY_TABLE_HEADER_GROUP) ||
|
||||||
if (tHeadTag==rgTag || tFootTag==rgTag)
|
(display->mDisplay == NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP))
|
||||||
{
|
{
|
||||||
printf("found a head or foot in continuing frame\n");
|
printf("found a head or foot in continuing frame\n");
|
||||||
// Resolve style for the child
|
// Resolve style for the child
|
||||||
@@ -2887,13 +2875,10 @@ nsTableFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
duplicateFrame->SetNextSibling(bodyRowGroupFromOverflow);
|
duplicateFrame->SetNextSibling(bodyRowGroupFromOverflow);
|
||||||
lastSib = duplicateFrame;
|
lastSib = duplicateFrame;
|
||||||
}
|
}
|
||||||
NS_IF_RELEASE(rgTag);
|
|
||||||
NS_RELEASE(content); // content: REFCNT--
|
NS_RELEASE(content); // content: REFCNT--
|
||||||
// get the next row group
|
// get the next row group
|
||||||
rg->GetNextSibling(rg);
|
rg->GetNextSibling(rg);
|
||||||
}
|
}
|
||||||
NS_RELEASE(tFootTag); // tHeadTag: REFCNT --
|
|
||||||
NS_RELEASE(tHeadTag); // tFootTag: REFCNT --
|
|
||||||
aContinuingFrame = cf;
|
aContinuingFrame = cf;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@@ -3020,6 +3005,7 @@ PRBool nsTableFrame::ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault,
|
|||||||
|
|
||||||
void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
// Check to see if the table has either cell padding or
|
// Check to see if the table has either cell padding or
|
||||||
// Cell spacing defined for the table. If true, then
|
// Cell spacing defined for the table. If true, then
|
||||||
// this setting overrides any specific border, margin or
|
// this setting overrides any specific border, margin or
|
||||||
@@ -3039,7 +3025,7 @@ void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
|||||||
|
|
||||||
float p2t = aPresContext->GetPixelsToTwips();
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
|
||||||
nsTablePart* table = (nsTablePart*)mContent;
|
nsIHTMLContent* table = (nsIHTMLContent*)mContent;
|
||||||
|
|
||||||
NS_ASSERTION(table,"Table Must not be null");
|
NS_ASSERTION(table,"Table Must not be null");
|
||||||
if (!table)
|
if (!table)
|
||||||
@@ -3056,6 +3042,7 @@ void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
|||||||
border = NSIntPixelsToTwips(intValue, p2t);
|
border = NSIntPixelsToTwips(intValue, p2t);
|
||||||
}
|
}
|
||||||
MapHTMLBorderStyle(*spacingData,border);
|
MapHTMLBorderStyle(*spacingData,border);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -3066,13 +3053,6 @@ NS_METHOD nsTableFrame::DidSetStyleContext(nsIPresContext* aPresContext)
|
|||||||
{
|
{
|
||||||
#ifdef NOISY_STYLE
|
#ifdef NOISY_STYLE
|
||||||
printf("nsTableFrame::DidSetStyleContext \n");
|
printf("nsTableFrame::DidSetStyleContext \n");
|
||||||
#endif
|
|
||||||
// XXX This may have been needed before we had a style system, but it's not
|
|
||||||
// needed now. It's forcing the table to always have a border (which is bad),
|
|
||||||
// and it's duplicating the border-syle and border-color information that's
|
|
||||||
// in the ua.css
|
|
||||||
#if 0
|
|
||||||
MapBorderMarginPadding(aPresContext);
|
|
||||||
#endif
|
#endif
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@@ -3092,10 +3072,8 @@ NS_METHOD nsTableFrame::GetCellMarginData(nsTableCellFrame* aKidFrame, nsMargin&
|
|||||||
nscoord nsTableFrame::GetCellSpacing()
|
nscoord nsTableFrame::GetCellSpacing()
|
||||||
{
|
{
|
||||||
nsTableFrame* tableFrame = this;
|
nsTableFrame* tableFrame = this;
|
||||||
//XXX remove when table style is fully resolved!
|
|
||||||
GetGeometricParent((nsIFrame *&)tableFrame); // get the outer frame
|
|
||||||
nsStyleTable* tableStyle;
|
nsStyleTable* tableStyle;
|
||||||
tableFrame->GetStyleData(eStyleStruct_Table, (nsStyleStruct *&)tableStyle);
|
GetStyleData(eStyleStruct_Table, (nsStyleStruct *&)tableStyle);
|
||||||
nscoord cellSpacing = 0;
|
nscoord cellSpacing = 0;
|
||||||
if (tableStyle->mCellSpacing.GetUnit() == eStyleUnit_Coord)
|
if (tableStyle->mCellSpacing.GetUnit() == eStyleUnit_Coord)
|
||||||
cellSpacing = tableStyle->mCellSpacing.GetCoordValue();
|
cellSpacing = tableStyle->mCellSpacing.GetCoordValue();
|
||||||
@@ -3125,27 +3103,25 @@ nsTableFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ---------- static methods ---------- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* helper method for determining if this is a nested table or not */
|
/* helper method for determining if this is a nested table or not */
|
||||||
PRBool nsTableFrame::IsNested(const nsReflowState& aReflowState, nsStylePosition *& aPosition) const
|
PRBool nsTableFrame::IsNested(const nsReflowState& aReflowState, nsStylePosition *& aPosition) const
|
||||||
{
|
{
|
||||||
|
nsresult rv;
|
||||||
PRBool result = PR_FALSE;
|
PRBool result = PR_FALSE;
|
||||||
#ifdef NS_DEBUG
|
#ifdef NS_DEBUG
|
||||||
PRInt32 counter=0;
|
PRInt32 counter=0;
|
||||||
@@ -3159,8 +3135,8 @@ PRBool nsTableFrame::IsNested(const nsReflowState& aReflowState, nsStylePosition
|
|||||||
NS_ASSERTION(counter<100000, "infinite loop in IsNested");
|
NS_ASSERTION(counter<100000, "infinite loop in IsNested");
|
||||||
#endif
|
#endif
|
||||||
nsIFrame* parentTable = nsnull;
|
nsIFrame* parentTable = nsnull;
|
||||||
rs->frame->QueryInterface(kTableFrameCID, (void**) &parentTable);
|
rv = rs->frame->QueryInterface(kTableFrameCID, (void**) &parentTable);
|
||||||
if (nsnull!=parentTable)
|
if (NS_OK==rv)
|
||||||
{
|
{
|
||||||
result = PR_TRUE;
|
result = PR_TRUE;
|
||||||
parentTable->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)aPosition));
|
parentTable->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)aPosition));
|
||||||
@@ -3174,6 +3150,7 @@ PRBool nsTableFrame::IsNested(const nsReflowState& aReflowState, nsStylePosition
|
|||||||
/* helper method for getting the width of the table's containing block */
|
/* helper method for getting the width of the table's containing block */
|
||||||
nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
||||||
{
|
{
|
||||||
|
nsresult rv;
|
||||||
nscoord parentWidth = aReflowState.maxSize.width;
|
nscoord parentWidth = aReflowState.maxSize.width;
|
||||||
|
|
||||||
// Walk up the reflow state chain until we find a block
|
// Walk up the reflow state chain until we find a block
|
||||||
@@ -3186,8 +3163,8 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
{
|
{
|
||||||
// if it's a block, use its max width
|
// if it's a block, use its max width
|
||||||
nsIFrame* block = nsnull;
|
nsIFrame* block = nsnull;
|
||||||
rs->frame->QueryInterface(kBlockFrameCID, (void**) &block);
|
rv = rs->frame->QueryInterface(kBlockFrameCID, (void**) &block);
|
||||||
if (nsnull != block)
|
if (NS_OK==rv)
|
||||||
{ // we found a block, see if it's really a table cell (which means we're a nested table)
|
{ // we found a block, see if it's really a table cell (which means we're a nested table)
|
||||||
PRBool skipThisBlock=PR_FALSE;
|
PRBool skipThisBlock=PR_FALSE;
|
||||||
if (PR_TRUE==((nsContainerFrame*)block)->IsPseudoFrame())
|
if (PR_TRUE==((nsContainerFrame*)block)->IsPseudoFrame())
|
||||||
@@ -3199,8 +3176,8 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
if (nsnull!=parentRS)
|
if (nsnull!=parentRS)
|
||||||
{
|
{
|
||||||
nsIFrame* cell = nsnull;
|
nsIFrame* cell = nsnull;
|
||||||
parentRS->frame->QueryInterface(kTableCellFrameCID, (void**) &cell);
|
rv = parentRS->frame->QueryInterface(kTableCellFrameCID, (void**) &cell);
|
||||||
if (nsnull != cell) {
|
if (rv == NS_OK) {
|
||||||
if (PR_TRUE==gsDebugNT)
|
if (PR_TRUE==gsDebugNT)
|
||||||
printf("%p: found a block pframe %p in a cell, skipping it.\n", aReflowState.frame, block);
|
printf("%p: found a block pframe %p in a cell, skipping it.\n", aReflowState.frame, block);
|
||||||
skipThisBlock = PR_TRUE;
|
skipThisBlock = PR_TRUE;
|
||||||
@@ -3229,9 +3206,9 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
const nsStylePosition* tablePosition;
|
const nsStylePosition* tablePosition;
|
||||||
const nsStyleSpacing* spacing;
|
const nsStyleSpacing* spacing;
|
||||||
nsIFrame* cell = nsnull;
|
nsIFrame* cell = nsnull;
|
||||||
rs->frame->QueryInterface(kTableCellFrameCID, (void**) &cell);
|
rv = rs->frame->QueryInterface(kTableCellFrameCID, (void**) &cell);
|
||||||
// if the cell has a specified width, use it
|
// if the cell has a specified width, use it
|
||||||
if (nsnull != cell)
|
if (NS_OK==rv)
|
||||||
{
|
{
|
||||||
// Compute and subtract out the insets (sum of border and padding) for the table
|
// Compute and subtract out the insets (sum of border and padding) for the table
|
||||||
cell->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)tablePosition));
|
cell->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)tablePosition));
|
||||||
@@ -3268,8 +3245,8 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
nsIFrame* table = nsnull;
|
nsIFrame* table = nsnull;
|
||||||
rs->frame->QueryInterface(kTableFrameCID, (void**) &table);
|
rv = rs->frame->QueryInterface(kTableFrameCID, (void**) &table);
|
||||||
if (nsnull != table) {
|
if (NS_OK==rv) {
|
||||||
/* We found the nearest containing table (actually, the inner table).
|
/* We found the nearest containing table (actually, the inner table).
|
||||||
This defines what our percentage size is relative to. Use its desired width
|
This defines what our percentage size is relative to. Use its desired width
|
||||||
as the basis for computing our width.
|
as the basis for computing our width.
|
||||||
@@ -3280,14 +3257,8 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
**********************************************************************************
|
**********************************************************************************
|
||||||
*/
|
*/
|
||||||
// Compute and subtract out the insets (sum of border and padding) for the table
|
// Compute and subtract out the insets (sum of border and padding) for the table
|
||||||
/* the following hack is because the outer table really holds the position info */
|
table->GetStyleData(eStyleStruct_Position, (const nsStyleStruct *&)tablePosition);
|
||||||
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
table->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
|
||||||
nsIFrame * outerTableFrame = nsnull;
|
|
||||||
table->GetGeometricParent(outerTableFrame);
|
|
||||||
outerTableFrame->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)tablePosition));
|
|
||||||
outerTableFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
|
|
||||||
// end REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
|
||||||
|
|
||||||
if (eStyleUnit_Auto == tablePosition->mWidth.GetUnit())
|
if (eStyleUnit_Auto == tablePosition->mWidth.GetUnit())
|
||||||
{
|
{
|
||||||
parentWidth = NS_UNCONSTRAINEDSIZE;
|
parentWidth = NS_UNCONSTRAINEDSIZE;
|
||||||
@@ -3399,17 +3370,7 @@ PRBool nsTableFrame::TableIsAutoWidth(nsTableFrame *aTableFrame,
|
|||||||
PRBool result = PR_TRUE; // the default
|
PRBool result = PR_TRUE; // the default
|
||||||
if (nsnull!=aTableStyle)
|
if (nsnull!=aTableStyle)
|
||||||
{
|
{
|
||||||
//nsStylePosition* tablePosition = (nsStylePosition*)aTableStyle->GetData(eStyleStruct_Position);
|
nsStylePosition* tablePosition = (nsStylePosition*)aTableStyle->GetStyleData(eStyleStruct_Position);
|
||||||
/* this is sick and wrong, but what the hell
|
|
||||||
we grab the style of our parent (nsTableOuterFrame) and ask it for width info,
|
|
||||||
until the style resolution stuff does the cool stuff about splitting style between outer and inner
|
|
||||||
*/
|
|
||||||
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
|
||||||
nsIFrame * parent = nsnull;
|
|
||||||
aTableFrame->GetGeometricParent(parent);
|
|
||||||
const nsStylePosition* tablePosition;
|
|
||||||
parent->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)tablePosition));
|
|
||||||
// end REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
|
||||||
nsMargin borderPadding;
|
nsMargin borderPadding;
|
||||||
const nsStyleSpacing* spacing;
|
const nsStyleSpacing* spacing;
|
||||||
switch (tablePosition->mWidth.GetUnit()) {
|
switch (tablePosition->mWidth.GetUnit()) {
|
||||||
|
|||||||
@@ -60,15 +60,16 @@ public:
|
|||||||
friend class nsTableOuterFrame;
|
friend class nsTableOuterFrame;
|
||||||
|
|
||||||
/** instantiate a new instance of nsTableFrame.
|
/** instantiate a new instance of nsTableFrame.
|
||||||
* @param aInstancePtrResult the new object is returned in this out-param
|
* @param aResult the new object is returned in this out-param
|
||||||
* @param aContent the table object to map
|
* @param aContent the table object to map
|
||||||
* @param aParent the parent of the new frame
|
* @param aParent the parent of the new frame
|
||||||
*
|
*
|
||||||
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
*/
|
*/
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
friend nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent);
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
// nsISupports
|
// nsISupports
|
||||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||||
|
|||||||
@@ -17,8 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
#include "nsTableOuterFrame.h"
|
#include "nsTableOuterFrame.h"
|
||||||
#include "nsTableFrame.h"
|
#include "nsTableFrame.h"
|
||||||
#include "nsITableContent.h"
|
|
||||||
#include "nsTableContent.h"
|
|
||||||
#include "nsBodyFrame.h"
|
#include "nsBodyFrame.h"
|
||||||
#include "nsIReflowCommand.h"
|
#include "nsIReflowCommand.h"
|
||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
@@ -45,8 +43,6 @@ static const PRBool gsDebug = PR_FALSE;
|
|||||||
static const PRBool gsTiming = PR_FALSE;
|
static const PRBool gsTiming = PR_FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
|
||||||
|
|
||||||
NS_DEF_PTR(nsIStyleContext);
|
NS_DEF_PTR(nsIStyleContext);
|
||||||
NS_DEF_PTR(nsIContent);
|
NS_DEF_PTR(nsIContent);
|
||||||
|
|
||||||
@@ -623,13 +619,13 @@ nsresult nsTableOuterFrame::CreateChildFrames(nsIPresContext* aPresContext)
|
|||||||
if (NS_STYLE_DISPLAY_TABLE_CAPTION == childDisplay->mDisplay)
|
if (NS_STYLE_DISPLAY_TABLE_CAPTION == childDisplay->mDisplay)
|
||||||
{
|
{
|
||||||
// Create the caption frame.
|
// Create the caption frame.
|
||||||
// XXX In general (e.g. in an XML document) there's no reason to assume
|
nsIContentDelegate* kidDel = nsnull;
|
||||||
// that the content object is of type nsIHTMLContent
|
kidDel = caption->GetDelegate(aPresContext);
|
||||||
result = ((nsIHTMLContent*)(nsIContent*)caption)->CreateFrame(aPresContext,
|
nsresult rv = kidDel->CreateFrame(aPresContext, caption, this, captionSC,
|
||||||
this, captionSC,
|
mCaptionFrame);
|
||||||
mCaptionFrame);
|
NS_RELEASE(kidDel);
|
||||||
if (NS_OK != result) {
|
if (NS_OK != rv) {
|
||||||
return result;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine if the caption is a top or bottom caption
|
// Determine if the caption is a top or bottom caption
|
||||||
@@ -849,21 +845,18 @@ nsresult nsTableOuterFrame::CreateInnerTableFrame(nsIPresContext* aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----- static methods ----- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableOuterFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableOuterFrame( nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableOuterFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableOuterFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,16 +38,17 @@ class nsTableOuterFrame : public nsContainerFrame
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** instantiate a new instance of nsTableFrame.
|
/** instantiate a new instance of nsTableOuterFrame.
|
||||||
* @param aInstancePtrResult the new object is returned in this out-param
|
* @param aResult the new object is returned in this out-param
|
||||||
* @param aContent the table object to map
|
* @param aContent the table object to map
|
||||||
* @param aParent the parent of the new frame
|
* @param aParent the parent of the new frame
|
||||||
*
|
*
|
||||||
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
*/
|
*/
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
friend nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableOuterFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent);
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
/** @see nsIFrame::Paint */
|
/** @see nsIFrame::Paint */
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
|
|||||||
@@ -1,883 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsTableOuterFrame.h"
|
|
||||||
#include "nsITableContent.h"
|
|
||||||
#include "nsTableCol.h"
|
|
||||||
#include "nsTableColGroup.h"
|
|
||||||
#include "nsTableRowGroup.h"
|
|
||||||
#include "nsTableCaption.h"
|
|
||||||
#include "nsTableRow.h"
|
|
||||||
#include "nsTableCell.h"
|
|
||||||
#include "nsHTMLParts.h"
|
|
||||||
#include "nsIPresContext.h"
|
|
||||||
#include "nsContainerFrame.h"
|
|
||||||
#include "nsIRenderingContext.h"
|
|
||||||
#include "nsHTMLIIDs.h"
|
|
||||||
#include "nsIAtom.h"
|
|
||||||
#include "nsIStyleContext.h"
|
|
||||||
#include "nsHTMLAtoms.h"
|
|
||||||
#include "nsStyleConsts.h"
|
|
||||||
#include "nsUnitConversion.h"
|
|
||||||
#include "nsIHTMLAttributes.h"
|
|
||||||
#include "nsGenericHTMLElement.h"
|
|
||||||
|
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
|
||||||
static PRBool gsDebug = PR_FALSE;
|
|
||||||
static PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
static PRBool gsDebugWarnings = PR_TRUE;
|
|
||||||
#else
|
|
||||||
static const PRBool gsDebug = PR_FALSE;
|
|
||||||
static const PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
static const PRBool gsDebugWarnings = PR_FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *nsTablePart::kCaptionTagString="CAPTION";
|
|
||||||
const char *nsTablePart::kRowGroupBodyTagString="TBODY";
|
|
||||||
const char *nsTablePart::kRowGroupHeadTagString="THEAD";
|
|
||||||
const char *nsTablePart::kRowGroupFootTagString="TFOOT";
|
|
||||||
const char *nsTablePart::kRowTagString="TR";
|
|
||||||
const char *nsTablePart::kColGroupTagString="COLGROUP";
|
|
||||||
const char *nsTablePart::kColTagString="COL";
|
|
||||||
const char *nsTablePart::kDataCellTagString="TD";
|
|
||||||
const char *nsTablePart::kHeaderCellTagString="TH";
|
|
||||||
|
|
||||||
/*---------- nsTablePart implementation -----------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* BUGS:
|
|
||||||
* <ul>
|
|
||||||
* <li>centering (etc.) is leaking into table cell's from the outer environment
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
* TODO:
|
|
||||||
* <ul>
|
|
||||||
* <li>colspan creating empty cells on rows w/o matching cells
|
|
||||||
* <li>draw table borders ala navigator
|
|
||||||
* <li>border sizing
|
|
||||||
* <li>bordercolor
|
|
||||||
* <li>draw cell borders ala navigator
|
|
||||||
* <li>cellspacing
|
|
||||||
* <li>colspan not the last cell
|
|
||||||
* <li>floaters in table cells
|
|
||||||
* <ul>
|
|
||||||
* <li>rowspan truncation (rowspan sticking out past the bottom of the table)
|
|
||||||
* <li>effect on subsequent row structure
|
|
||||||
* </ul>
|
|
||||||
* <li>inherit table border color ala nav4 (use inherited text color) when
|
|
||||||
* the border is enabled and the bordercolor value nsnull.
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* CSS1:
|
|
||||||
* <ul>
|
|
||||||
* <li>table margin
|
|
||||||
* <li>table border-width
|
|
||||||
* <li>table padding
|
|
||||||
* <li>row margin
|
|
||||||
* <li>row border-width
|
|
||||||
* <li>row padding
|
|
||||||
* <li>cell margin
|
|
||||||
* <li>cell border-width
|
|
||||||
* <li>cell padding
|
|
||||||
* <li>what about colgroup, thead, tbody, tfoot margin/border-width/padding?
|
|
||||||
* <li>map css1 style (borders, padding, margins) in some sensible manner
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
* CSS2:
|
|
||||||
* <ul>
|
|
||||||
* <li>watch it
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
//QQQ can remove mColCount?
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* I do not check or addref aTag because my superclass does that for me
|
|
||||||
*/
|
|
||||||
nsTablePart::nsTablePart(nsIAtom* aTag)
|
|
||||||
: nsHTMLContainer(aTag)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
nsTablePart::~nsTablePart()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
nsTablePart::void compact() {
|
|
||||||
compact();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// for debugging only
|
|
||||||
nsrefcnt nsTablePart::AddRef(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Add Ref: nsTablePart cnt = %d \n",mRefCnt+1);
|
|
||||||
return ++mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
// for debugging only
|
|
||||||
nsrefcnt nsTablePart::Release(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Release: nsTablePart cnt = %d \n",mRefCnt-1);
|
|
||||||
if (--mRefCnt == 0) {
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Delete: nsTablePart \n");
|
|
||||||
delete this;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** add a child to the table content.
|
|
||||||
* tables are special because they require the content to be normalized, in order.
|
|
||||||
* so this function doesn't really "append" the content, but adds it in the proper place,
|
|
||||||
* possibly nested inside of implicit parents.
|
|
||||||
* order is:
|
|
||||||
* Captions (optional)
|
|
||||||
* Column Groups (1 or more, possibly implicit)
|
|
||||||
* Row Groups
|
|
||||||
* THEADs (optional)
|
|
||||||
* TFOOTs (optional)
|
|
||||||
* TBODY (at least 1, possibly implicit)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTablePart::AppendChildTo (nsIContent * aContent, PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "bad arg");
|
|
||||||
PRBool contentHandled = PR_FALSE;
|
|
||||||
|
|
||||||
// wait, stop! need to check to see if this is really tableContent or not!
|
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
|
||||||
PRBool result = PR_TRUE; // to be removed when called methods are COM-ized
|
|
||||||
nsresult rv = aContent->QueryInterface(kITableContentIID,
|
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
{ // hold onto the non-table content, but do nothing with it
|
|
||||||
if (PR_TRUE==gsDebugWarnings)
|
|
||||||
printf ("non-table content inserted into table.");
|
|
||||||
rv = nsHTMLContainer::AppendChildTo(aContent, aNotify);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nsTableContent *tableContent = (nsTableContent *)tableContentInterface;
|
|
||||||
const int contentType = tableContent->GetType();
|
|
||||||
if ((contentType == nsITableContent::kTableCellType) ||
|
|
||||||
(contentType==nsITableContent::kTableRowType))
|
|
||||||
{
|
|
||||||
if (gsDebug==PR_TRUE)
|
|
||||||
{
|
|
||||||
if (contentType == nsITableContent::kTableRowType)
|
|
||||||
printf ("nsTablePart::AppendChildTo -- adding a row.\n");
|
|
||||||
else
|
|
||||||
printf ("nsTablePart::AppendChildTo -- adding a cell.\n");
|
|
||||||
}
|
|
||||||
// find last row group, if ! implicit, make one, append there
|
|
||||||
nsTableRowGroup *group = nsnull;
|
|
||||||
int index;
|
|
||||||
ChildCount (index);
|
|
||||||
while ((0 < index) && (nsnull==group))
|
|
||||||
{
|
|
||||||
nsIContent *child;
|
|
||||||
ChildAt (--index, child); // child: REFCNT++
|
|
||||||
if (nsnull != child)
|
|
||||||
{
|
|
||||||
nsTableContent * content = (nsTableContent *)child;
|
|
||||||
if (content->GetType()==nsITableContent::kTableRowGroupType)
|
|
||||||
{
|
|
||||||
group = (nsTableRowGroup *)content;
|
|
||||||
NS_ADDREF(group); // group: REFCNT++
|
|
||||||
// SEC: this code might be a space leak for tables >1 row group
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NS_RELEASE(child); // child: REFCNT--
|
|
||||||
}
|
|
||||||
PRBool groupIsImplicit = PR_FALSE;
|
|
||||||
if (nsnull!=group)
|
|
||||||
group->IsSynthetic(groupIsImplicit);
|
|
||||||
if ((nsnull == group) || (PR_FALSE==groupIsImplicit))
|
|
||||||
{
|
|
||||||
if (gsDebug==PR_TRUE) printf ("nsTablePart::AppendChildTo -- creating an implicit row group.\n");
|
|
||||||
nsIAtom * rowGroupTag = NS_NewAtom(kRowGroupBodyTagString); // rowGroupTag: REFCNT++
|
|
||||||
group = new nsTableRowGroup (rowGroupTag, PR_TRUE);
|
|
||||||
NS_ADDREF(group); // group: REFCNT++
|
|
||||||
rv = AppendChildTo (group, PR_FALSE);
|
|
||||||
if (NS_OK==rv)
|
|
||||||
group->SetTable(this);
|
|
||||||
NS_RELEASE(rowGroupTag); // rowGroupTag: REFCNT--
|
|
||||||
}
|
|
||||||
// group is guaranteed to be allocated at this point
|
|
||||||
rv = group->AppendChildTo(aContent, PR_FALSE);
|
|
||||||
contentHandled = PR_TRUE;
|
|
||||||
NS_RELEASE(group); // group: REFCNT--
|
|
||||||
}
|
|
||||||
else if (contentType == nsITableContent::kTableColType)
|
|
||||||
{
|
|
||||||
// TODO: switch Append* to COM interfaces
|
|
||||||
result = AppendColumn((nsTableCol *)aContent);
|
|
||||||
contentHandled = PR_TRUE;
|
|
||||||
}
|
|
||||||
else if (contentType == nsITableContent::kTableCaptionType)
|
|
||||||
{
|
|
||||||
result = AppendCaption((nsTableCaption *)aContent);
|
|
||||||
contentHandled = PR_TRUE; // whether we succeeded or not, we've "handled" this request
|
|
||||||
}
|
|
||||||
else if (contentType == nsITableContent::kTableRowGroupType)
|
|
||||||
{
|
|
||||||
result = AppendRowGroup((nsTableRowGroup *)aContent);
|
|
||||||
if (PR_FALSE==result)
|
|
||||||
rv=NS_ERROR_FAILURE;
|
|
||||||
contentHandled = PR_TRUE; // whether we succeeded or not, we've "handled" this request
|
|
||||||
}
|
|
||||||
else if (contentType == nsITableContent::kTableColGroupType)
|
|
||||||
{
|
|
||||||
result = AppendColGroup((nsTableColGroup *)aContent);
|
|
||||||
if (PR_FALSE==result)
|
|
||||||
rv = NS_ERROR_FAILURE;
|
|
||||||
contentHandled = PR_TRUE; // whether we succeeded or not, we've "handled" this request
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if aContent is not a known content type, make a capion out of it */
|
|
||||||
// SEC the logic here is very suspicious!!!!
|
|
||||||
if (PR_FALSE==contentHandled)
|
|
||||||
{
|
|
||||||
if (gsDebug==PR_TRUE) printf ("nsTablePart::AppendChildTo -- content not handled!!!\n");
|
|
||||||
nsTableCaption *caption = nsnull;
|
|
||||||
nsIContent *lastChild;
|
|
||||||
PRInt32 numKids;
|
|
||||||
ChildCount(numKids);
|
|
||||||
ChildAt (numKids - 1, lastChild); // lastChild: REFCNT++
|
|
||||||
if (nsnull != lastChild)
|
|
||||||
{
|
|
||||||
nsTableContent * content = (nsTableContent *)lastChild;
|
|
||||||
if (content->GetType()==nsITableContent::kTableCaptionType)
|
|
||||||
caption = (nsTableCaption *)content;
|
|
||||||
NS_RELEASE(lastChild); // lastChild: REFCNT--
|
|
||||||
}
|
|
||||||
PRBool captionIsImplicit = PR_FALSE;
|
|
||||||
if (nsnull!=caption)
|
|
||||||
caption->IsSynthetic(captionIsImplicit);
|
|
||||||
if ((nsnull == caption) || (PR_FALSE==captionIsImplicit))
|
|
||||||
{
|
|
||||||
if (gsDebug==PR_TRUE) printf ("nsTablePart::AppendChildTo -- adding an implicit caption.\n");
|
|
||||||
caption = new nsTableCaption (PR_TRUE);
|
|
||||||
result = AppendCaption (caption);
|
|
||||||
// check result
|
|
||||||
}
|
|
||||||
result = caption->AppendChildTo (aContent, PR_FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NS_RELEASE(tableContentInterface); // tableContentInterface: REFCNT--
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* SEC: why can we only insertChildAt (captions or groups) ? */
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTablePart::InsertChildAt(nsIContent * aContent, PRInt32 aIndex,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "bad arg");
|
|
||||||
// aIndex checked in nsHTMLContainer
|
|
||||||
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
nsTableContent *tableContent = (nsTableContent *)aContent;
|
|
||||||
const int contentType = tableContent->GetType();
|
|
||||||
if ((contentType == nsITableContent::kTableCaptionType) ||
|
|
||||||
(contentType == nsITableContent::kTableColGroupType) ||
|
|
||||||
(contentType == nsITableContent::kTableRowGroupType))
|
|
||||||
{
|
|
||||||
rv = nsHTMLContainer::InsertChildAt (aContent, aIndex, PR_FALSE);
|
|
||||||
if (NS_OK == rv)
|
|
||||||
{
|
|
||||||
tableContent->SetTable (this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTablePart::ReplaceChildAt (nsIContent *aContent, PRInt32 aIndex,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
PRInt32 numKids;
|
|
||||||
ChildCount(numKids);
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "bad aContent arg to ReplaceChildAt");
|
|
||||||
NS_PRECONDITION(0<=aIndex && aIndex<numKids, "bad aIndex arg to ReplaceChildAt");
|
|
||||||
if ((nsnull==aContent) || !(0<=aIndex && aIndex<numKids))
|
|
||||||
return NS_OK;
|
|
||||||
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
nsTableContent *tableContent = (nsTableColGroup *)aContent;
|
|
||||||
const int contentType = tableContent->GetType();
|
|
||||||
if ( (contentType == nsITableContent::kTableCaptionType) ||
|
|
||||||
(contentType == nsITableContent::kTableColGroupType) ||
|
|
||||||
(contentType == nsITableContent::kTableRowGroupType))
|
|
||||||
{
|
|
||||||
nsIContent *lastChild;
|
|
||||||
ChildAt (aIndex, lastChild);// lastChild: REFCNT++
|
|
||||||
rv = nsHTMLContainer::ReplaceChildAt (aContent, aIndex, PR_FALSE);
|
|
||||||
if (NS_OK == rv)
|
|
||||||
{
|
|
||||||
if (nsnull != lastChild)
|
|
||||||
tableContent->SetTable (nsnull);
|
|
||||||
tableContent->SetTable (this);
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(lastChild); // lastChild: REFCNT--
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a child at the given position. The method is a no-op if
|
|
||||||
* the index is invalid (too small or too large).
|
|
||||||
*/
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTablePart::RemoveChildAt (PRInt32 aIndex, PRBool aNotify)
|
|
||||||
{
|
|
||||||
PRInt32 numKids;
|
|
||||||
ChildCount(numKids);
|
|
||||||
NS_PRECONDITION(0<=aIndex && aIndex<numKids, "bad aIndex arg to RemoveChildAt");
|
|
||||||
if (!(0<=aIndex && aIndex<numKids))
|
|
||||||
return NS_OK;
|
|
||||||
|
|
||||||
nsIContent * lastChild;
|
|
||||||
ChildAt (aIndex, lastChild); // lastChild: REFCNT++
|
|
||||||
nsresult rv = nsHTMLContainer::RemoveChildAt (aIndex, PR_FALSE);
|
|
||||||
if (NS_OK == rv)
|
|
||||||
{
|
|
||||||
nsTableContent *tableContent = (nsTableColGroup *)lastChild;
|
|
||||||
const int contentType = tableContent->GetType();
|
|
||||||
if (contentType == nsITableContent::kTableRowType)
|
|
||||||
{
|
|
||||||
if (nsnull != lastChild)
|
|
||||||
((nsTableRow *)tableContent)->SetRowGroup (nsnull);
|
|
||||||
tableContent->SetTable(nsnull);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(lastChild);
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** protected method for appending a column group to this table */
|
|
||||||
PRBool nsTablePart::AppendRowGroup (nsTableRowGroup *aContent)
|
|
||||||
{
|
|
||||||
PRInt32 childIndex;
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "null arg.");
|
|
||||||
PRBool result = PR_TRUE;
|
|
||||||
if (gsDebug==PR_TRUE)
|
|
||||||
printf ("nsTablePart::AppendRowGroup -- adding a row group.\n");
|
|
||||||
// find the last row group of this kind and insert this row group after it
|
|
||||||
// if there is no row group of this type already in the table,
|
|
||||||
// find the appropriate slot depending on this row group tag
|
|
||||||
nsIAtom * rowGroupTag;
|
|
||||||
aContent->GetTag(rowGroupTag);
|
|
||||||
PRInt32 childCount;
|
|
||||||
ChildCount (childCount);
|
|
||||||
nsIAtom * tHeadTag = NS_NewAtom(kRowGroupHeadTagString); // tHeadTag: REFCNT++
|
|
||||||
nsIAtom * tFootTag = NS_NewAtom(kRowGroupFootTagString); // tFootTag: REFCNT++
|
|
||||||
nsIAtom * tBodyTag = NS_NewAtom(kRowGroupBodyTagString); // tBodyTag: REFCNT++
|
|
||||||
for (childIndex = 0; childIndex < childCount; childIndex++)
|
|
||||||
{
|
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
|
||||||
nsIContent * child;
|
|
||||||
ChildAt(childIndex, child); // tableChild: REFCNT++
|
|
||||||
nsresult rv = child->QueryInterface(kITableContentIID,
|
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
{
|
|
||||||
NS_RELEASE(child); // tableChild: REFCNT-- (a)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
nsTableContent *tableChild = (nsTableContent *)tableContentInterface;
|
|
||||||
const int tableChildType = tableChild->GetType();
|
|
||||||
// if we've found caption or colgroup, then just skip it and keep going
|
|
||||||
if ((tableChildType == nsITableContent::kTableCaptionType) ||
|
|
||||||
(tableChildType == nsITableContent::kTableColGroupType))
|
|
||||||
{
|
|
||||||
NS_RELEASE(child); // tableChild: REFCNT-- (b)
|
|
||||||
NS_RELEASE(tableContentInterface); // tableContentInterface: REFCNT--
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// if we've found a row group, our action depends on what kind of row group
|
|
||||||
else if (tableChildType == nsITableContent::kTableRowGroupType)
|
|
||||||
{
|
|
||||||
// XXX we are leaking tableChildTag
|
|
||||||
nsIAtom * tableChildTag;
|
|
||||||
tableChild->GetTag(tableChildTag);
|
|
||||||
NS_RELEASE(child); // tableChild: REFCNT-- (c)
|
|
||||||
NS_RELEASE(tableContentInterface); // tableContentInterface: REFCNT--
|
|
||||||
// if aContent is a header and the current child is a header, keep going
|
|
||||||
if (tHeadTag==rowGroupTag && tHeadTag==tableChildTag)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// if aContent is a footer and the current child is either a header or a footer, keep going
|
|
||||||
else if (tFootTag==rowGroupTag &&
|
|
||||||
(tHeadTag==tableChildTag ||
|
|
||||||
tFootTag==tableChildTag))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// if aContent is a body and the current child is a footer, stop, we've found the spot
|
|
||||||
else if (tBodyTag==rowGroupTag && tFootTag==tableChildTag)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// if aContent is a body and we've gotten this far, keep going
|
|
||||||
else if (tBodyTag==rowGroupTag)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// otherwise, we must have found the right spot so stop
|
|
||||||
else
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// otherwise we're already at the right spot, so stop
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NS_RELEASE(child); // tableChild: REFCNT-- (d)
|
|
||||||
NS_RELEASE(tableContentInterface); // tableContentInterface: REFCNT--
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NS_RELEASE(tFootTag);
|
|
||||||
NS_RELEASE(tHeadTag);
|
|
||||||
NS_RELEASE(tBodyTag);
|
|
||||||
|
|
||||||
nsresult rv = nsHTMLContainer::InsertChildAt(aContent, childIndex, PR_FALSE);
|
|
||||||
if (NS_OK==rv)
|
|
||||||
((nsTableContent *)aContent)->SetTable (this);
|
|
||||||
else
|
|
||||||
result = PR_FALSE;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** protected method for appending a column group to this table */
|
|
||||||
PRBool nsTablePart::AppendColGroup(nsTableColGroup *aContent)
|
|
||||||
{
|
|
||||||
PRBool result = PR_TRUE; // to be removed when I'm COM-ized
|
|
||||||
PRInt32 childIndex;
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "null arg.");
|
|
||||||
if (gsDebug==PR_TRUE)
|
|
||||||
printf ("nsTablePart::AppendColGroup -- adding a column group.\n");
|
|
||||||
// find the last column group and insert this column group after it.
|
|
||||||
// if there is no column group already in the table, make this the first child
|
|
||||||
// after any caption
|
|
||||||
PRInt32 childCount;
|
|
||||||
ChildCount (childCount);
|
|
||||||
for (childIndex = 0; childIndex < childCount; childIndex++)
|
|
||||||
{
|
|
||||||
nsIContent *child;
|
|
||||||
ChildAt(childIndex, child); // child: REFCNT++
|
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
|
||||||
nsresult rv = child->QueryInterface(kITableContentIID,
|
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
{
|
|
||||||
NS_RELEASE(child);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const int tableChildType = tableContentInterface->GetType();
|
|
||||||
NS_RELEASE(child); // tableChild: REFCNT--
|
|
||||||
NS_RELEASE(tableContentInterface);
|
|
||||||
if (!((tableChildType == nsITableContent::kTableCaptionType) ||
|
|
||||||
(tableChildType == nsITableContent::kTableColGroupType)))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
nsresult rv = nsHTMLContainer::InsertChildAt(aContent, childIndex, PR_FALSE);
|
|
||||||
if (NS_OK==rv)
|
|
||||||
((nsTableContent *)aContent)->SetTable (this);
|
|
||||||
else
|
|
||||||
result = PR_FALSE;
|
|
||||||
|
|
||||||
// if col group has a SPAN attribute, create implicit columns for
|
|
||||||
// the value of SPAN what sucks is if we then get a COL for this
|
|
||||||
// COLGROUP, we have to delete all the COLs we created for SPAN, and
|
|
||||||
// just contain the explicit COLs.
|
|
||||||
|
|
||||||
// TODO: move this into the OK clause above
|
|
||||||
|
|
||||||
PRInt32 span = 0; // SEC: TODO find a way to really get this
|
|
||||||
for (PRInt32 i=0; i<span; i++)
|
|
||||||
{
|
|
||||||
nsTableCol *col = new nsTableCol(PR_TRUE);
|
|
||||||
rv = aContent->AppendChildTo (col, PR_FALSE);
|
|
||||||
if (NS_OK!=rv)
|
|
||||||
{
|
|
||||||
result = PR_FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** protected method for appending a column group to this table */
|
|
||||||
PRBool nsTablePart::AppendColumn(nsTableCol *aContent)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "null arg.");
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
if (gsDebug==PR_TRUE)
|
|
||||||
printf ("nsTablePart::AppendColumn -- adding a column.\n");
|
|
||||||
// find last col group, if ! implicit, make one, append there
|
|
||||||
nsTableColGroup *group = nsnull;
|
|
||||||
PRBool foundColGroup = PR_FALSE;
|
|
||||||
PRInt32 index;
|
|
||||||
ChildCount (index);
|
|
||||||
while ((0 < index) && (PR_FALSE==foundColGroup))
|
|
||||||
{
|
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
|
||||||
nsIContent *child;
|
|
||||||
ChildAt (--index, child); // child: REFCNT++
|
|
||||||
nsresult rv = child->QueryInterface(kITableContentIID,
|
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
|
||||||
NS_RELEASE(child); // tableChild: REFCNT-- (a)
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
group = (nsTableColGroup *)tableContentInterface;
|
|
||||||
foundColGroup = (PRBool)
|
|
||||||
(group->GetType()==nsITableContent::kTableColGroupType);
|
|
||||||
if (PR_FALSE==foundColGroup)
|
|
||||||
{ // release all the table contents that are not a col group
|
|
||||||
NS_RELEASE(tableContentInterface); // tableContentInterface: REFCNT-- (a)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PRBool groupIsImplicit = PR_FALSE;
|
|
||||||
if (nsnull!=group)
|
|
||||||
group->IsSynthetic(groupIsImplicit);
|
|
||||||
if ((PR_FALSE == foundColGroup) || (PR_FALSE==groupIsImplicit))
|
|
||||||
{
|
|
||||||
if (gsDebug==PR_TRUE)
|
|
||||||
printf ("nsTablePart::AppendChildTo -- creating an implicit column group.\n");
|
|
||||||
group = new nsTableColGroup (PR_TRUE);
|
|
||||||
rv = AppendChildTo (group, PR_FALSE);
|
|
||||||
if (NS_OK==rv)
|
|
||||||
group->SetTable(this);
|
|
||||||
}
|
|
||||||
if (NS_OK==rv)
|
|
||||||
rv = group->AppendChildTo (aContent, PR_FALSE);
|
|
||||||
|
|
||||||
NS_IF_RELEASE(group); // tableContentInterface: REFCNT-- (b)
|
|
||||||
return (PRBool)(NS_OK==rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** protected method for appending a column group to this table */
|
|
||||||
PRBool nsTablePart::AppendCaption(nsTableCaption *aContent)
|
|
||||||
{
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
PRInt32 childIndex;
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "null arg.");
|
|
||||||
if (gsDebug==PR_TRUE)
|
|
||||||
printf ("nsTablePart::AppendCaption -- adding a caption.\n");
|
|
||||||
// find the last caption and insert this caption after it.
|
|
||||||
// if there is no caption already in the table, make this the first child
|
|
||||||
PRInt32 childCount;
|
|
||||||
ChildCount (childCount);
|
|
||||||
for (childIndex = 0; childIndex < childCount; childIndex++)
|
|
||||||
{
|
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
|
||||||
nsIContent *child;
|
|
||||||
ChildAt (childIndex, child); // child: REFCNT++
|
|
||||||
nsresult rv = child->QueryInterface(kITableContentIID,
|
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
|
||||||
NS_RELEASE(child); // tableChild: REFCNT-- (a)
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const int tableChildType = tableContentInterface->GetType();
|
|
||||||
NS_RELEASE(tableContentInterface);
|
|
||||||
if (tableChildType != nsITableContent::kTableCaptionType)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
rv = nsHTMLContainer::InsertChildAt(aContent, childIndex, PR_FALSE);
|
|
||||||
if (NS_OK==rv)
|
|
||||||
((nsTableContent *)aContent)->SetTable (this);
|
|
||||||
|
|
||||||
return (PRBool)(NS_OK==rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a frame object that will layout this table.
|
|
||||||
*/
|
|
||||||
nsresult
|
|
||||||
nsTablePart::CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad arg");
|
|
||||||
|
|
||||||
nsIFrame* frame;
|
|
||||||
nsresult rv = nsTableOuterFrame::NewFrame(&frame, this, aParentFrame);
|
|
||||||
if (NS_OK != rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
frame->SetStyleContext(aPresContext, aStyleContext);
|
|
||||||
aResult = frame;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTablePart::SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
nsHTMLValue val;
|
|
||||||
|
|
||||||
|
|
||||||
if (aAttribute == nsHTMLAtoms::width)
|
|
||||||
{
|
|
||||||
ParseValueOrPercent(aValue, val, eHTMLUnit_Pixel);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
else if ( aAttribute == nsHTMLAtoms::cols)
|
|
||||||
{ // it'll either be empty, or have an integer value
|
|
||||||
nsAutoString tmp(aValue);
|
|
||||||
tmp.StripWhitespace();
|
|
||||||
if (0 == tmp.Length()) {
|
|
||||||
val.SetEmptyValue();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ParseValue(aValue, 0, val, eHTMLUnit_Integer);
|
|
||||||
}
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
else if ( aAttribute == nsHTMLAtoms::border)
|
|
||||||
{
|
|
||||||
nsAutoString tmp(aValue);
|
|
||||||
tmp.StripWhitespace();
|
|
||||||
if (0 == tmp.Length()) {
|
|
||||||
// Just enable the border; same as border=1
|
|
||||||
val.SetEmptyValue();/* XXX pixels? */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ParseValue(aValue, 0, val, eHTMLUnit_Pixel);
|
|
||||||
}
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
else if (aAttribute == nsHTMLAtoms::cellspacing ||
|
|
||||||
aAttribute == nsHTMLAtoms::cellpadding)
|
|
||||||
{
|
|
||||||
ParseValue(aValue, 0, val, eHTMLUnit_Pixel);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
else if (aAttribute == nsHTMLAtoms::bgcolor)
|
|
||||||
{
|
|
||||||
ParseColor(aValue, val);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
else if (aAttribute == nsHTMLAtoms::align) {
|
|
||||||
if (ParseTableAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* HTML 4 attributes */
|
|
||||||
// TODO: only partially implemented
|
|
||||||
else if (aAttribute == nsHTMLAtoms::summary) {
|
|
||||||
val.SetStringValue(aValue);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use default attribute catching code
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, aValue, aNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
MapTableBorderInto(nsIHTMLAttributes* aAttributes,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIPresContext* aPresContext)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
|
||||||
|
|
||||||
nsHTMLValue value;
|
|
||||||
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::border, value);
|
|
||||||
if ((value.GetUnit() == eHTMLUnit_Pixel) ||
|
|
||||||
(value.GetUnit() == eHTMLUnit_Empty)) {
|
|
||||||
nsStyleSpacing* spacing = (nsStyleSpacing*)
|
|
||||||
aContext->GetMutableStyleData(eStyleStruct_Spacing);
|
|
||||||
float p2t = aPresContext->GetPixelsToTwips();
|
|
||||||
nsStyleCoord twips;
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Empty) {
|
|
||||||
twips.SetCoordValue(NSIntPixelsToTwips(1, p2t));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
twips.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
nsStyleCoord two(NSIntPixelsToTwips(2, p2t));
|
|
||||||
|
|
||||||
spacing->mPadding.SetTop(two);
|
|
||||||
spacing->mPadding.SetRight(two);
|
|
||||||
spacing->mPadding.SetBottom(two);
|
|
||||||
spacing->mPadding.SetLeft(two);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
spacing->mBorder.SetTop(twips);
|
|
||||||
spacing->mBorder.SetRight(twips);
|
|
||||||
spacing->mBorder.SetBottom(twips);
|
|
||||||
spacing->mBorder.SetLeft(twips);
|
|
||||||
|
|
||||||
if (spacing->mBorderStyle[0] == NS_STYLE_BORDER_STYLE_NONE) {
|
|
||||||
spacing->mBorderStyle[0] = NS_STYLE_BORDER_STYLE_SOLID;
|
|
||||||
}
|
|
||||||
if (spacing->mBorderStyle[1] == NS_STYLE_BORDER_STYLE_NONE) {
|
|
||||||
spacing->mBorderStyle[1] = NS_STYLE_BORDER_STYLE_SOLID;
|
|
||||||
}
|
|
||||||
if (spacing->mBorderStyle[2] == NS_STYLE_BORDER_STYLE_NONE) {
|
|
||||||
spacing->mBorderStyle[2] = NS_STYLE_BORDER_STYLE_SOLID;
|
|
||||||
}
|
|
||||||
if (spacing->mBorderStyle[3] == NS_STYLE_BORDER_STYLE_NONE) {
|
|
||||||
spacing->mBorderStyle[3] = NS_STYLE_BORDER_STYLE_SOLID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIPresContext* aPresContext)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
|
||||||
|
|
||||||
float p2t = aPresContext->GetPixelsToTwips();
|
|
||||||
nsHTMLValue value;
|
|
||||||
|
|
||||||
// width
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::width, value);
|
|
||||||
if (value.GetUnit() != eHTMLUnit_Null) {
|
|
||||||
nsStylePosition* position = (nsStylePosition*)
|
|
||||||
aContext->GetMutableStyleData(eStyleStruct_Position);
|
|
||||||
switch (value.GetUnit()) {
|
|
||||||
case eHTMLUnit_Percent:
|
|
||||||
position->mWidth.SetPercentValue(value.GetPercentValue());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case eHTMLUnit_Pixel:
|
|
||||||
position->mWidth.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// border
|
|
||||||
MapTableBorderInto(aAttributes, aContext, aPresContext);
|
|
||||||
|
|
||||||
// align
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated) { // it may be another type if illegal
|
|
||||||
nsStyleDisplay* display = (nsStyleDisplay*)aContext->GetMutableStyleData(eStyleStruct_Display);
|
|
||||||
switch (value.GetIntValue()) {
|
|
||||||
case NS_STYLE_TEXT_ALIGN_LEFT:
|
|
||||||
display->mFloats = NS_STYLE_FLOAT_LEFT;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NS_STYLE_TEXT_ALIGN_RIGHT:
|
|
||||||
display->mFloats = NS_STYLE_FLOAT_RIGHT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// cellpadding
|
|
||||||
nsStyleTable* tableStyle=nsnull;
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::cellpadding, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
|
||||||
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
|
||||||
tableStyle->mCellPadding.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
|
||||||
}
|
|
||||||
|
|
||||||
// cellspacing (reuses tableStyle if already resolved)
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::cellspacing, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Pixel) {
|
|
||||||
if (nsnull==tableStyle)
|
|
||||||
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
|
||||||
tableStyle->mCellSpacing.SetCoordValue(NSIntPixelsToTwips(value.GetPixelValue(), p2t));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ // XXX: remove me as soon as we get this from the style sheet
|
|
||||||
if (nsnull==tableStyle)
|
|
||||||
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
|
||||||
tableStyle->mCellSpacing.SetCoordValue(NSIntPixelsToTwips(2, p2t));
|
|
||||||
}
|
|
||||||
|
|
||||||
// cols
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::cols, value);
|
|
||||||
if (value.GetUnit() != eHTMLUnit_Null) {
|
|
||||||
if (nsnull==tableStyle)
|
|
||||||
tableStyle = (nsStyleTable*)aContext->GetMutableStyleData(eStyleStruct_Table);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Integer)
|
|
||||||
tableStyle->mCols = value.GetIntValue();
|
|
||||||
else // COLS had no value, so it refers to all columns
|
|
||||||
tableStyle->mCols = NS_STYLE_TABLE_COLS_ALL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//background: color
|
|
||||||
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTablePart::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
|
||||||
{
|
|
||||||
aMapFunc = &MapAttributesInto;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- Global Functions ---------- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
nsresult
|
|
||||||
NS_NewTablePart(nsIHTMLContent** aInstancePtrResult,
|
|
||||||
nsIAtom* aTag)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "nsnull ptr");
|
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIHTMLContent* table = new nsTablePart(aTag);
|
|
||||||
if (nsnull == table) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
return table->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#ifndef nsTablePart_h___
|
|
||||||
#define nsTablePart_h___
|
|
||||||
|
|
||||||
|
|
||||||
// nsTablePart.h
|
|
||||||
#include "nsHTMLContainer.h"
|
|
||||||
|
|
||||||
// forward declarations
|
|
||||||
class nsTableRowGroup;
|
|
||||||
class nsTableColGroup;
|
|
||||||
class nsTableCol;
|
|
||||||
class nsTableCaption;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Table Content Model.
|
|
||||||
* We build a full rationalized content model, so the structure of a table
|
|
||||||
* will always be regular and predictable.
|
|
||||||
* A Table can contain RowGroups (THEAD, TBODY, TFOOT), ColumnGroups (COLGROUP),
|
|
||||||
* and Captions (CAPTION). Any other table content (TH, TD, COL) belongs in
|
|
||||||
* one of these containers, and if the container doesn't explicitly exist in
|
|
||||||
* the source, an implicit container will get created.
|
|
||||||
*
|
|
||||||
* @author sclark
|
|
||||||
*/
|
|
||||||
class nsTablePart : public nsHTMLContainer {
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** known HTML tags */
|
|
||||||
static const char *kCaptionTagString;
|
|
||||||
static const char *kRowGroupBodyTagString;
|
|
||||||
static const char *kRowGroupHeadTagString;
|
|
||||||
static const char *kRowGroupFootTagString;
|
|
||||||
static const char *kRowTagString;
|
|
||||||
static const char *kColGroupTagString;
|
|
||||||
static const char *kColTagString;
|
|
||||||
static const char *kDataCellTagString;
|
|
||||||
static const char *kHeaderCellTagString;
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag that caused this content node to be instantiated
|
|
||||||
*/
|
|
||||||
nsTablePart(nsIAtom* aTag);
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag that caused this content node to be instantiated
|
|
||||||
* @param aColumnCount the number of columns in this table
|
|
||||||
*/
|
|
||||||
nsTablePart(nsIAtom* aTag, PRInt32 aColumnCount);
|
|
||||||
|
|
||||||
// For debugging purposes only
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef();
|
|
||||||
NS_IMETHOD_(nsrefcnt) Release();
|
|
||||||
|
|
||||||
NS_IMETHOD SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const;
|
|
||||||
|
|
||||||
|
|
||||||
/* overrides from nsHTMLContainer */
|
|
||||||
|
|
||||||
NS_IMETHOD InsertChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
NS_IMETHOD ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
NS_IMETHOD AppendChildTo(nsIContent* aKid, PRBool aNotify);
|
|
||||||
NS_IMETHOD RemoveChildAt(PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult);
|
|
||||||
|
|
||||||
|
|
||||||
static void GetTableBorder(nsIHTMLContent* aContent,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIPresContext* aPresContext);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/** destructor
|
|
||||||
*/
|
|
||||||
virtual ~nsTablePart();
|
|
||||||
|
|
||||||
/** append aContent to my child list
|
|
||||||
* @return PR_TRUE on success, PR_FALSE if aContent could not be appended
|
|
||||||
*/
|
|
||||||
virtual PRBool AppendRowGroup(nsTableRowGroup *aContent);
|
|
||||||
|
|
||||||
/** append aContent to my child list
|
|
||||||
* @return PR_TRUE on success, PR_FALSE if aContent could not be appended
|
|
||||||
*/
|
|
||||||
virtual PRBool AppendColGroup(nsTableColGroup *aContent);
|
|
||||||
|
|
||||||
/** append aContent to my child list
|
|
||||||
* @return PR_TRUE on success, PR_FALSE if aContent could not be appended
|
|
||||||
*/
|
|
||||||
virtual PRBool AppendColumn(nsTableCol *aContent);
|
|
||||||
|
|
||||||
/** append aContent to my child list
|
|
||||||
* @return PR_TRUE on success, PR_FALSE if aContent could not be appended
|
|
||||||
*/
|
|
||||||
virtual PRBool AppendCaption(nsTableCaption *aContent);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
static nsIAtom *kDefaultTag;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // nsTablePart_h___
|
|
||||||
@@ -1,370 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#include "nsTableRow.h"
|
|
||||||
#include "nsTableRowFrame.h"
|
|
||||||
#include "nsTableRowGroup.h"
|
|
||||||
#include "nsTableCell.h"
|
|
||||||
#include "nsTableFrame.h"
|
|
||||||
#include "nsHTMLParts.h"
|
|
||||||
#include "nsHTMLContainer.h"
|
|
||||||
#include "nsTableRowFrame.h"
|
|
||||||
#include "nsIReflowCommand.h"
|
|
||||||
#include "nsIStyleContext.h"
|
|
||||||
#include "nsStyleConsts.h"
|
|
||||||
#include "nsIContentDelegate.h"
|
|
||||||
#include "nsHTMLIIDs.h"
|
|
||||||
#include "nsHTMLAtoms.h"
|
|
||||||
#include "nsIHTMLAttributes.h"
|
|
||||||
#include "nsGenericHTMLElement.h"
|
|
||||||
|
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
|
||||||
static PRBool gsDebug = PR_FALSE;
|
|
||||||
static PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#else
|
|
||||||
static const PRBool gsDebug = PR_FALSE;
|
|
||||||
static const PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// nsTableContent checks aTag
|
|
||||||
nsTableRow::nsTableRow(nsIAtom* aTag)
|
|
||||||
: nsTableContent(aTag),
|
|
||||||
mRowGroup(0),
|
|
||||||
mRowIndex(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// nsTableContent checks aTag
|
|
||||||
nsTableRow::nsTableRow(nsIAtom* aTag, PRBool aImplicit)
|
|
||||||
: nsTableContent(aTag),
|
|
||||||
mRowGroup(0),
|
|
||||||
mRowIndex(0)
|
|
||||||
{
|
|
||||||
mImplicit = aImplicit;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableRow::~nsTableRow()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int nsTableRow::GetType()
|
|
||||||
{
|
|
||||||
return nsITableContent::kTableRowType;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableRowGroup * nsTableRow::GetRowGroup ()
|
|
||||||
{
|
|
||||||
NS_IF_ADDREF(mRowGroup);
|
|
||||||
return mRowGroup;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableRow::SetRowGroup (nsTableRowGroup * aRowGroup)
|
|
||||||
{
|
|
||||||
if (aRowGroup != mRowGroup)
|
|
||||||
{
|
|
||||||
mRowGroup = aRowGroup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PRInt32 nsTableRow::GetRowIndex ()
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(0<=mRowIndex, "bad mRowIndex");
|
|
||||||
return mRowIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsTableRow::SetRowIndex (int aRowIndex)
|
|
||||||
{
|
|
||||||
mRowIndex = aRowIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Added for debuging purposes -- remove from final build
|
|
||||||
nsrefcnt nsTableRow::AddRef(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Add Ref: %x, nsTableRow cnt = %d \n",this, mRefCnt+1);
|
|
||||||
return ++mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsrefcnt nsTableRow::Release(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Release: %x, nsTableRow cnt = %d \n",this,mRefCnt-1);
|
|
||||||
if (--mRefCnt == 0) {
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Delete: %x, nsTableRow \n",this);
|
|
||||||
delete this;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRow::AppendChildTo (nsIContent *aContent, PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull != aContent, "null ptr");
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
if (nsnull!=aContent)
|
|
||||||
{
|
|
||||||
if (!IsTableCell(aContent))
|
|
||||||
{
|
|
||||||
if (gsDebug==PR_TRUE) printf ("nsTableRow::AppendChildTo -- didn't get a cell, giving up to parent.\n");
|
|
||||||
if (nsnull != mRowGroup)
|
|
||||||
return mRowGroup->AppendChildTo (aContent, aNotify); // let parent have it
|
|
||||||
return PR_FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rv = nsTableContent::AppendChildTo (aContent, aNotify);
|
|
||||||
if (NS_OK == rv)
|
|
||||||
{
|
|
||||||
((nsTableCell *)aContent)->SetRow (this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRow::InsertChildAt (nsIContent *aContent, PRInt32 aIndex,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull != aContent, "null ptr");
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
if (nsnull!=aContent)
|
|
||||||
{
|
|
||||||
if (!IsTableCell(aContent))
|
|
||||||
{ // I only insert cells for now
|
|
||||||
// TODO: wrap whatever I'm given here in a cell and insert it
|
|
||||||
NS_ASSERTION(PR_FALSE, "unimplemented attempt to insert a non-cell into a row");
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rv = nsTableContent::InsertChildAt (aContent, aIndex, aNotify);
|
|
||||||
if (NS_OK == rv)
|
|
||||||
{
|
|
||||||
((nsTableCell *)aContent)->SetRow (this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRow::ReplaceChildAt (nsIContent *aContent, PRInt32 aIndex,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
|
|
||||||
PRInt32 numKids;
|
|
||||||
ChildCount(numKids);
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "bad aContent arg to ReplaceChildAt");
|
|
||||||
NS_PRECONDITION(0<=aIndex && aIndex<numKids, "bad aIndex arg to ReplaceChildAt");
|
|
||||||
if ((nsnull==aContent) || !(0<=aIndex && aIndex<numKids))
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!IsTableCell(aContent))
|
|
||||||
{ // I only insert cells for now
|
|
||||||
// TODO: wrap whatever I'm given here in a cell and insert it
|
|
||||||
NS_ASSERTION(PR_FALSE, "unimplemented attempt to insert a non-cell into a row");
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NS_ASSERTION(PR_FALSE, "unimplemented attempt to replace a cell in a row");
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
#if XXX
|
|
||||||
nsIContent * oldChild;
|
|
||||||
ChildAt (aIndex, oldChild); // oldChild: REFCNT++
|
|
||||||
result = nsTableContent::ReplaceChildAt (aContent, aIndex, aNotify);
|
|
||||||
if (result)
|
|
||||||
{
|
|
||||||
((nsTableCell *)aContent)->SetRow (this);
|
|
||||||
if (nsnull!=oldChild)
|
|
||||||
((nsTableCell *)oldChild)->SetRow (nsnull);
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(oldChild); // oldChild: REFCNT--
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a child at the given position. The method is ignored if
|
|
||||||
* the index is invalid (too small or too large).
|
|
||||||
*/
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRow::RemoveChildAt (int aIndex, PRBool aNotify)
|
|
||||||
{
|
|
||||||
PRInt32 numKids;
|
|
||||||
ChildCount(numKids);
|
|
||||||
NS_PRECONDITION(0<=aIndex && aIndex<numKids, "bad aIndex arg to ReplaceChildAt");
|
|
||||||
if (!(0<=aIndex && aIndex<numKids))
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
nsIContent * oldChild;
|
|
||||||
ChildAt (aIndex, oldChild); // oldChild: REFCNT++
|
|
||||||
if (nsnull!=oldChild)
|
|
||||||
{
|
|
||||||
rv = nsTableContent::RemoveChildAt (aIndex, aNotify);
|
|
||||||
if (NS_OK == rv)
|
|
||||||
{
|
|
||||||
if (nsnull != oldChild)
|
|
||||||
((nsTableCell *)oldChild)->SetRow (nsnull);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(oldChild); // oldChild: REFCNT--
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRow::SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aAttribute, "bad attribute arg");
|
|
||||||
nsHTMLValue val;
|
|
||||||
if (aAttribute == nsHTMLAtoms::bgcolor) {
|
|
||||||
ParseColor(aValue, val);
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if ((aAttribute == nsHTMLAtoms::align) &&
|
|
||||||
ParseDivAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if ((aAttribute == nsHTMLAtoms::valign) &&
|
|
||||||
ParseAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
return nsTableContent::SetAttribute(aAttribute, aValue, aNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIPresContext* aPresContext)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
|
||||||
if (nsnull != aAttributes) {
|
|
||||||
nsHTMLValue value;
|
|
||||||
nsStyleText* textStyle = nsnull;
|
|
||||||
|
|
||||||
// align: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mTextAlign = value.GetIntValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
// valign: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
if (nsnull==textStyle)
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
|
||||||
}
|
|
||||||
|
|
||||||
//background: color
|
|
||||||
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
}
|
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRow::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
|
||||||
{
|
|
||||||
aMapFunc = &MapAttributesInto;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRow::AttributeToString(nsIAtom* aAttribute,
|
|
||||||
nsHTMLValue& aValue,
|
|
||||||
nsString& aResult) const
|
|
||||||
{
|
|
||||||
nsresult ca = NS_CONTENT_ATTR_NOT_THERE;
|
|
||||||
if (aAttribute == nsHTMLAtoms::valign) {
|
|
||||||
AlignParamToString(aValue, aResult);
|
|
||||||
ca = NS_CONTENT_ATTR_HAS_VALUE;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ca = nsTableContent::AttributeToString(aAttribute, aValue, aResult);
|
|
||||||
}
|
|
||||||
return ca;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsTableRow::CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad arg");
|
|
||||||
|
|
||||||
nsIFrame* frame;
|
|
||||||
nsresult rv = nsTableRowFrame::NewFrame(&frame, this, aParentFrame);
|
|
||||||
if (NS_OK != rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
((nsTableRowFrame*)frame)->Init(mRowIndex);
|
|
||||||
frame->SetStyleContext(aPresContext, aStyleContext);
|
|
||||||
aResult = frame;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** support method to determine if the param aContent is a TableCell object */
|
|
||||||
PRBool nsTableRow::IsTableCell(nsIContent * aContent) const
|
|
||||||
{
|
|
||||||
PRBool result = PR_FALSE;
|
|
||||||
if (nsnull!=aContent)
|
|
||||||
{
|
|
||||||
// is aContent a table cell?
|
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
|
||||||
nsresult rv = aContent->QueryInterface(kITableContentIID,
|
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
|
||||||
|
|
||||||
const int contentType = tableContentInterface->GetType();
|
|
||||||
NS_RELEASE(tableContentInterface);
|
|
||||||
if (contentType == nsITableContent::kTableCellType)
|
|
||||||
result = PR_TRUE;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------- Global Functions ---------- */
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
NS_NewTableRowPart(nsIHTMLContent** aInstancePtrResult,
|
|
||||||
nsIAtom* aTag)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "nsnull ptr");
|
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIHTMLContent* body = new nsTableRow(aTag);
|
|
||||||
if (nsnull == body) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
return body->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult);
|
|
||||||
}
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#ifndef nsTableRow_h__
|
|
||||||
#define nsTableRow_h__
|
|
||||||
|
|
||||||
#include "nscore.h"
|
|
||||||
#include "nsTableContent.h"
|
|
||||||
#include "nsTableRowGroup.h"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* nsTableRow is the content object that represents table rows
|
|
||||||
* (HTML tag TR). This class cannot be reused
|
|
||||||
* outside of an nsTableRowGroup. It assumes that its parent is an nsTableRowGroup, and
|
|
||||||
* its children are nsTableCells.
|
|
||||||
*
|
|
||||||
* @see nsTablePart
|
|
||||||
* @see nsTableRowGroup
|
|
||||||
* @see nsTableCell
|
|
||||||
*
|
|
||||||
* @author sclark
|
|
||||||
*/
|
|
||||||
class nsTableRow : public nsTableContent
|
|
||||||
{
|
|
||||||
|
|
||||||
private:
|
|
||||||
/** parent pointer */
|
|
||||||
nsTableRowGroup * mRowGroup;
|
|
||||||
|
|
||||||
/** the index of the row this content object represents */
|
|
||||||
PRInt32 mRowIndex;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this row to get constructed.
|
|
||||||
*/
|
|
||||||
nsTableRow (nsIAtom* aTag);
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this row to get constructed.
|
|
||||||
* @param aImplicit PR_TRUE if there is no actual input tag corresponding to
|
|
||||||
* this row.
|
|
||||||
*/
|
|
||||||
nsTableRow (nsIAtom* aTag, PRBool aImplicit);
|
|
||||||
|
|
||||||
/** destructor, not responsible for any memory destruction itself */
|
|
||||||
virtual ~nsTableRow();
|
|
||||||
|
|
||||||
// For debugging purposes only
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef();
|
|
||||||
NS_IMETHOD_(nsrefcnt) Release();
|
|
||||||
|
|
||||||
/** returns nsITableContent::kTableRowType */
|
|
||||||
virtual int GetType();
|
|
||||||
|
|
||||||
NS_IMETHOD SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const;
|
|
||||||
|
|
||||||
/** @see nsIHTMLContent::CreateFrame */
|
|
||||||
NS_IMETHOD CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult);
|
|
||||||
|
|
||||||
NS_IMETHOD AttributeToString(nsIAtom* aAttribute,
|
|
||||||
nsHTMLValue& aValue,
|
|
||||||
nsString& aResult) const;
|
|
||||||
|
|
||||||
/** return the row group that contains me (my parent) */
|
|
||||||
virtual nsTableRowGroup *GetRowGroup ();
|
|
||||||
|
|
||||||
|
|
||||||
/** Set my parent row group.<br>
|
|
||||||
* NOTE: Since mRowGroup is the parent of the table row,
|
|
||||||
* reference counting should not be done on
|
|
||||||
* this variable when setting the row.
|
|
||||||
* see /ns/raptor/doc/MemoryModel.html
|
|
||||||
**/
|
|
||||||
virtual void SetRowGroup (nsTableRowGroup * aRowGroup);
|
|
||||||
|
|
||||||
/** return this row's starting row index */
|
|
||||||
virtual PRInt32 GetRowIndex ();
|
|
||||||
|
|
||||||
/** set this row's starting row index */
|
|
||||||
virtual void SetRowIndex (int aRowIndex);
|
|
||||||
|
|
||||||
|
|
||||||
/* ----------- nsTableContent overrides ----------- */
|
|
||||||
|
|
||||||
/** can only append objects that are cells (implement nsITableContent and are .
|
|
||||||
* of type nsITableContent::kTableCellType.)
|
|
||||||
* @see nsIContent::AppendChildTo
|
|
||||||
*/
|
|
||||||
NS_IMETHOD AppendChildTo(nsIContent* aKid, PRBool aNotify);
|
|
||||||
|
|
||||||
/** can only insert objects that are cells (implement nsITableContent and are .
|
|
||||||
* of type nsITableContent::kTableCellType.)
|
|
||||||
* @see nsIContent::InsertChildAt
|
|
||||||
*/
|
|
||||||
NS_IMETHOD InsertChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
/** can only replace child objects with objects that are cells
|
|
||||||
* (implement nsITableContent and are * of type nsITableContent::kTableCellType.)
|
|
||||||
* @param aContent the object to insert, must be a cell
|
|
||||||
* @param aIndex the index of the object to replace. Must be in the range
|
|
||||||
* 0<=aIndex<ChildCount().
|
|
||||||
* @see nsIContent::ReplaceChildAt
|
|
||||||
*/
|
|
||||||
NS_IMETHOD ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
/** @see nsIContent::InsertChildAt */
|
|
||||||
NS_IMETHOD RemoveChildAt(PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
PRBool IsTableCell(nsIContent * aContent) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -32,9 +32,8 @@
|
|||||||
#include "nsIReflowCommand.h"
|
#include "nsIReflowCommand.h"
|
||||||
#include "nsCSSRendering.h"
|
#include "nsCSSRendering.h"
|
||||||
// the following header files are required for style optimizations that work only when the child content is really a cell
|
// the following header files are required for style optimizations that work only when the child content is really a cell
|
||||||
#include "nsITableContent.h"
|
#include "nsIHTMLTableCellElement.h"
|
||||||
#include "nsTableCell.h"
|
static NS_DEFINE_IID(kIHTMLTableCellElementIID, NS_IHTMLTABLECELLELEMENT_IID);
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
|
||||||
// end includes for style optimizations that require real content knowledge
|
// end includes for style optimizations that require real content knowledge
|
||||||
|
|
||||||
NS_DEF_PTR(nsIStyleContext);
|
NS_DEF_PTR(nsIStyleContext);
|
||||||
@@ -553,18 +552,14 @@ nsTableRowFrame::InitialReflow(nsIPresContext& aPresContext,
|
|||||||
* other tags mapped to table cell display won't benefit from this optimization
|
* other tags mapped to table cell display won't benefit from this optimization
|
||||||
* see nsHTMLStyleSheet::RulesMatching
|
* see nsHTMLStyleSheet::RulesMatching
|
||||||
*/
|
*/
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
nsIHTMLTableCellElement *cellContent = nsnull;
|
||||||
nsresult rv = cell->QueryInterface(kITableContentIID,
|
nsresult rv = cell->QueryInterface(kIHTMLTableCellElementIID,
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
(void **)&cellContent); // cellContent: REFCNT++
|
||||||
if (NS_SUCCEEDED(rv))
|
if (NS_SUCCEEDED(rv))
|
||||||
{ // we know it's a table part of some sort, is it a cell?
|
{ // we know it's a table cell
|
||||||
const int contentType = ((nsTableContent *)tableContentInterface)->GetType();
|
cellContent->SetColIndex(colIndex);
|
||||||
if (contentType == nsITableContent::kTableCellType)
|
if (gsDebug) printf("%p : set cell content %p to col index = %d\n", this, cellContent, colIndex);
|
||||||
{
|
NS_RELEASE(cellContent);
|
||||||
((nsTableCell *)tableContentInterface)->SetColIndex(colIndex);
|
|
||||||
if (gsDebug) printf("%p : set cell content %p to col index = %d\n", this, tableContentInterface, colIndex);
|
|
||||||
}
|
|
||||||
NS_RELEASE(tableContentInterface);
|
|
||||||
}
|
}
|
||||||
// part of the style optimization is to ensure that the column frame for the cell exists
|
// part of the style optimization is to ensure that the column frame for the cell exists
|
||||||
// we used to do this post-pass1, now we do it incrementally for the optimization
|
// we used to do this post-pass1, now we do it incrementally for the optimization
|
||||||
@@ -587,7 +582,7 @@ nsTableRowFrame::InitialReflow(nsIPresContext& aPresContext,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// this sets the frame's notion of it's column index
|
// this sets the frame's notion of it's column index
|
||||||
((nsTableCellFrame *)kidFrame)->SetColIndex(colIndex);
|
((nsTableCellFrame *)kidFrame)->InitCellFrame(colIndex);
|
||||||
if (gsDebug) printf("%p : set cell frame %p to col index = %d\n", this, kidFrame, colIndex);
|
if (gsDebug) printf("%p : set cell frame %p to col index = %d\n", this, kidFrame, colIndex);
|
||||||
// add the cell frame to the table's cell map
|
// add the cell frame to the table's cell map
|
||||||
aState.tableFrame->AddCellToTable(this, (nsTableCellFrame *)kidFrame, isFirst);
|
aState.tableFrame->AddCellToTable(this, (nsTableCellFrame *)kidFrame, isFirst);
|
||||||
@@ -1005,19 +1000,18 @@ nsTableRowFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_ERROR_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult nsTableRowFrame::NewFrame( nsIFrame** aInstancePtrResult,
|
/* ----- global methods ----- */
|
||||||
nsIContent* aContent,
|
|
||||||
nsIFrame* aParent)
|
nsresult
|
||||||
|
NS_NewTableRowFrame(nsIContent* aContent,
|
||||||
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableRowFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableRowFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,15 +42,16 @@ public:
|
|||||||
void Init(PRInt32 aRowIndex);
|
void Init(PRInt32 aRowIndex);
|
||||||
|
|
||||||
/** instantiate a new instance of nsTableRowFrame.
|
/** instantiate a new instance of nsTableRowFrame.
|
||||||
* @param aInstancePtrResult the new object is returned in this out-param
|
* @param aResult the new object is returned in this out-param
|
||||||
* @param aContent the table object to map
|
* @param aContent the table object to map
|
||||||
* @param aParent the parent of the new frame
|
* @param aParent the parent of the new frame
|
||||||
*
|
*
|
||||||
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
*/
|
*/
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
friend nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableRowFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent);
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
/** @see nsIFrame::Paint */
|
/** @see nsIFrame::Paint */
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
|
|||||||
@@ -1,365 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#include "nsTableRowGroup.h"
|
|
||||||
#include "nsTableRowGroupFrame.h"
|
|
||||||
#include "nsTableRowFrame.h"
|
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsTableRow.h"
|
|
||||||
#include "nsHTMLParts.h"
|
|
||||||
#include "nsHTMLContainer.h"
|
|
||||||
#include "nsIContentDelegate.h"
|
|
||||||
#include "nsIReflowCommand.h"
|
|
||||||
#include "nsIStyleContext.h"
|
|
||||||
#include "nsIRenderingContext.h"
|
|
||||||
#include "nsStyleConsts.h"
|
|
||||||
#include "nsIPresContext.h"
|
|
||||||
#include "nsIDocument.h"
|
|
||||||
#include "nsHTMLIIDs.h"
|
|
||||||
#include "nsHTMLAtoms.h"
|
|
||||||
#include "nsIHTMLAttributes.h"
|
|
||||||
#include "nsGenericHTMLElement.h"
|
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
|
||||||
static PRBool gsDebug = PR_FALSE;
|
|
||||||
static PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#else
|
|
||||||
static const PRBool gsDebug = PR_FALSE;
|
|
||||||
static const PRBool gsNoisyRefs = PR_FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
|
||||||
|
|
||||||
// nsTableContent checks aTag
|
|
||||||
nsTableRowGroup::nsTableRowGroup(nsIAtom* aTag)
|
|
||||||
: nsTableContent(aTag)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// nsTableContent checks aTag
|
|
||||||
nsTableRowGroup::nsTableRowGroup(nsIAtom* aTag, PRBool aImplicit)
|
|
||||||
: nsTableContent(aTag)
|
|
||||||
{
|
|
||||||
mImplicit = aImplicit;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsTableRowGroup::~nsTableRowGroup()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Added for debuging purposes -- remove from final build
|
|
||||||
nsrefcnt nsTableRowGroup::AddRef(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE)
|
|
||||||
printf("Add Ref: %x, nsTableRowGroup cnt = %d \n",this,mRefCnt+1);
|
|
||||||
return ++mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsrefcnt nsTableRowGroup::Release(void)
|
|
||||||
{
|
|
||||||
if (gsNoisyRefs==PR_TRUE)
|
|
||||||
printf("Release: %x, nsTableRowGroup cnt = %d \n",this,mRefCnt-1);
|
|
||||||
if (--mRefCnt == 0) {
|
|
||||||
if (gsNoisyRefs==PR_TRUE) printf("Delete: %x, nsTableRowGroup \n",this);
|
|
||||||
delete this;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return mRefCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRowGroup::SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aAttribute, "bad attribute arg");
|
|
||||||
nsHTMLValue val;
|
|
||||||
if ((aAttribute == nsHTMLAtoms::align) &&
|
|
||||||
ParseDivAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
if ((aAttribute == nsHTMLAtoms::valign) &&
|
|
||||||
ParseAlignParam(aValue, val)) {
|
|
||||||
return nsHTMLTagContent::SetAttribute(aAttribute, val, aNotify);
|
|
||||||
}
|
|
||||||
return nsTableContent::SetAttribute(aAttribute, aValue, aNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
MapAttributesInto(nsIHTMLAttributes* aAttributes,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIPresContext* aPresContext)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContext, "bad style context arg");
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad presentation context arg");
|
|
||||||
if (nsnull != aAttributes) {
|
|
||||||
nsHTMLValue value;
|
|
||||||
nsStyleText* textStyle = nsnull;
|
|
||||||
|
|
||||||
// align: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::align, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mTextAlign = value.GetIntValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
// valign: enum
|
|
||||||
aAttributes->GetAttribute(nsHTMLAtoms::valign, value);
|
|
||||||
if (value.GetUnit() == eHTMLUnit_Enumerated)
|
|
||||||
{
|
|
||||||
if (nsnull==textStyle)
|
|
||||||
textStyle = (nsStyleText*)aContext->GetMutableStyleData(eStyleStruct_Text);
|
|
||||||
textStyle->mVerticalAlign.SetIntValue(value.GetIntValue(), eStyleUnit_Enumerated);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aContext, aPresContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRowGroup::GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const
|
|
||||||
{
|
|
||||||
aMapFunc = &MapAttributesInto;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsTableRowGroup::CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aPresContext, "bad arg");
|
|
||||||
|
|
||||||
nsIFrame* frame;
|
|
||||||
nsresult rv = nsTableRowGroupFrame::NewFrame(&frame, this, aParentFrame);
|
|
||||||
if (NS_OK != rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
frame->SetStyleContext(aPresContext, aStyleContext);
|
|
||||||
aResult = frame;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRowGroup::AppendChildTo (nsIContent *aContent, PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "bad arg to AppendChildTo");
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
|
|
||||||
// is aContent a TableRow?
|
|
||||||
PRBool isRow = IsRow(aContent);
|
|
||||||
|
|
||||||
// if so, simply add it
|
|
||||||
if (PR_TRUE==isRow)
|
|
||||||
{
|
|
||||||
if (gsDebug==PR_TRUE) printf ("nsTableRowGroup::AppendChildTo -- inserting a row into this row group.\n");
|
|
||||||
// if it is, we'll add it here
|
|
||||||
result = nsTableContent::AppendChildTo (aContent, PR_FALSE);
|
|
||||||
if (NS_OK==result)
|
|
||||||
{
|
|
||||||
((nsTableRow *)aContent)->SetRowGroup (this);
|
|
||||||
// make sure the table cell map gets rebuilt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// otherwise, if it's a cell, create an implicit row for it
|
|
||||||
else if (IsTableCell(aContent))
|
|
||||||
{
|
|
||||||
// find last row, if ! implicit, make one, append there
|
|
||||||
nsTableRow *row = nsnull;
|
|
||||||
PRInt32 index;
|
|
||||||
ChildCount (index);
|
|
||||||
while ((0 < index) && (nsnull==row))
|
|
||||||
{
|
|
||||||
nsIContent *child;
|
|
||||||
ChildAt (--index, child); // child: REFCNT++
|
|
||||||
if (nsnull != child)
|
|
||||||
{
|
|
||||||
if (IsRow(child))
|
|
||||||
row = (nsTableRow *)child;
|
|
||||||
NS_RELEASE(child); // child: REFCNT--
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PRBool rowIsImplicit = PR_FALSE;
|
|
||||||
if (nsnull!=row)
|
|
||||||
row->IsSynthetic(rowIsImplicit);
|
|
||||||
if ((nsnull == row) || (PR_FALSE==rowIsImplicit))
|
|
||||||
{
|
|
||||||
printf ("nsTableRow::AppendChildTo -- creating an implicit row.\n");
|
|
||||||
nsIAtom * trDefaultTag = NS_NewAtom(nsTablePart::kRowTagString); // trDefaultTag: REFCNT++
|
|
||||||
row = new nsTableRow (trDefaultTag, PR_TRUE);
|
|
||||||
NS_RELEASE(trDefaultTag); // trDefaultTag: REFCNT--
|
|
||||||
result = AppendChildTo (row, PR_FALSE);
|
|
||||||
// SEC: check result
|
|
||||||
}
|
|
||||||
// group is guaranteed to be allocated at this point
|
|
||||||
result = row->AppendChildTo(aContent, PR_FALSE);
|
|
||||||
}
|
|
||||||
// otherwise, punt and let the table try to insert it. Or maybe just return a failure?
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// you should go talk to my parent if you want to insert something other than a row
|
|
||||||
result = NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRowGroup::InsertChildAt (nsIContent *aContent, PRInt32 aIndex,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "bad arg to InsertChildAt");
|
|
||||||
|
|
||||||
// is aContent a TableRow?
|
|
||||||
PRBool isRow = IsRow(aContent);
|
|
||||||
|
|
||||||
// if not, ignore the request to add aContent
|
|
||||||
if (PR_FALSE==isRow)
|
|
||||||
{
|
|
||||||
// you should go talk to my parent if you want to insert something other than a column
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if so, add the row to this group
|
|
||||||
nsresult result = nsTableContent::InsertChildAt (aContent, aIndex, PR_FALSE);
|
|
||||||
if (NS_OK==result)
|
|
||||||
{
|
|
||||||
((nsTableRow *)aContent)->SetRowGroup (this);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRowGroup::ReplaceChildAt (nsIContent *aContent, PRInt32 aIndex,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
PRInt32 numKids;
|
|
||||||
ChildCount(numKids);
|
|
||||||
NS_PRECONDITION(nsnull!=aContent, "bad aContent arg to ReplaceChildAt");
|
|
||||||
NS_PRECONDITION(0<=aIndex && aIndex<numKids, "bad aIndex arg to ReplaceChildAt");
|
|
||||||
if ((nsnull==aContent) || !(0<=aIndex && aIndex<numKids))
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
|
|
||||||
// is aContent a TableRow?
|
|
||||||
PRBool isRow = IsRow(aContent);
|
|
||||||
|
|
||||||
// if not, ignore the request to replace the child at aIndex
|
|
||||||
if (PR_FALSE==isRow)
|
|
||||||
{
|
|
||||||
// you should go talk to my parent if you want to insert something other than a column
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsIContent * lastChild;
|
|
||||||
ChildAt (aIndex, lastChild); // lastChild: REFCNT++
|
|
||||||
nsresult result = nsTableContent::ReplaceChildAt (aContent, aIndex, PR_FALSE);
|
|
||||||
if (NS_OK==result)
|
|
||||||
{
|
|
||||||
((nsTableRow *)aContent)->SetRowGroup (this);
|
|
||||||
if (nsnull != lastChild)
|
|
||||||
((nsTableRow *)lastChild)->SetRowGroup (nsnull);
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(lastChild); // lastChild: REFCNT--
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a child at the given position. The method is ignored if
|
|
||||||
* the index is invalid (too small or too large).
|
|
||||||
*/
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTableRowGroup::RemoveChildAt (PRInt32 aIndex, PRBool aNotify)
|
|
||||||
{
|
|
||||||
PRInt32 numKids;
|
|
||||||
ChildCount(numKids);
|
|
||||||
NS_PRECONDITION(0<=aIndex && aIndex<numKids, "bad aIndex arg to RemoveChildAt");
|
|
||||||
if (!(0<=aIndex && aIndex<numKids))
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
|
|
||||||
nsIContent * lastChild;
|
|
||||||
ChildAt (aIndex, lastChild); // lastChild: REFCNT++
|
|
||||||
nsresult result = nsTableContent::RemoveChildAt (aIndex, PR_FALSE);
|
|
||||||
if (NS_OK==result)
|
|
||||||
{
|
|
||||||
if (nsnull != lastChild)
|
|
||||||
((nsTableRow *)lastChild)->SetRowGroup (nsnull);
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(lastChild); // lastChild: REFCNT--
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** support method to determine if the param aContent is a TableRow object */
|
|
||||||
PRBool nsTableRowGroup::IsRow(nsIContent * aContent) const
|
|
||||||
{
|
|
||||||
PRBool result = PR_FALSE;
|
|
||||||
if (nsnull!=aContent)
|
|
||||||
{
|
|
||||||
// is aContent a row?
|
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
|
||||||
nsresult rv = aContent->QueryInterface(kITableContentIID,
|
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(rv))
|
|
||||||
{
|
|
||||||
const int contentType = tableContentInterface->GetType();
|
|
||||||
NS_RELEASE(tableContentInterface);
|
|
||||||
if (contentType == nsITableContent::kTableRowType)
|
|
||||||
result = PR_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** support method to determine if the param aContent is a TableCell object */
|
|
||||||
PRBool nsTableRowGroup::IsTableCell(nsIContent * aContent) const
|
|
||||||
{
|
|
||||||
PRBool result = PR_FALSE;
|
|
||||||
if (nsnull!=aContent)
|
|
||||||
{
|
|
||||||
// is aContent a table cell?
|
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
|
||||||
nsresult rv = aContent->QueryInterface(kITableContentIID,
|
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
|
||||||
if (NS_SUCCEEDED(rv))
|
|
||||||
{
|
|
||||||
const int contentType = tableContentInterface->GetType();
|
|
||||||
NS_RELEASE(tableContentInterface);
|
|
||||||
if (contentType == nsITableContent::kTableCellType)
|
|
||||||
result = PR_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ----------- Global Functions ---------- */
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
NS_NewTableRowGroupPart(nsIHTMLContent** aInstancePtrResult,
|
|
||||||
nsIAtom* aTag)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "nsnull ptr");
|
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIHTMLContent* content = new nsTableRowGroup(aTag);
|
|
||||||
if (nsnull == content) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
return content->QueryInterface(kIHTMLContentIID, (void **) aInstancePtrResult);
|
|
||||||
}
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public License
|
|
||||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
||||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
||||||
* http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* NPL.
|
|
||||||
*
|
|
||||||
* The Initial Developer of this code under the NPL is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
||||||
* Reserved.
|
|
||||||
*/
|
|
||||||
#ifndef nsTableRowGroup_h__
|
|
||||||
#define nsTableRowGroup_h__
|
|
||||||
|
|
||||||
#include "nscore.h"
|
|
||||||
#include "nsTableContent.h"
|
|
||||||
|
|
||||||
class nsIPresContext;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* nsTableRowGroup is the content object that represents table row groups
|
|
||||||
* (HTML tags THEAD, TFOOT, and TBODY). This class cannot be reused
|
|
||||||
* outside of an nsTablePart. It assumes that its parent is an nsTableParte, and
|
|
||||||
* its children are nsTableRows.
|
|
||||||
*
|
|
||||||
* @see nsTablePart
|
|
||||||
* @see nsTableRow
|
|
||||||
*
|
|
||||||
* @author sclark
|
|
||||||
* TODO: make getter/setters inline
|
|
||||||
*/
|
|
||||||
class nsTableRowGroup : public nsTableContent
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this row group to get constructed.
|
|
||||||
*/
|
|
||||||
nsTableRowGroup (nsIAtom* aTag);
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param aTag the HTML tag causing this row group to get constructed.
|
|
||||||
* @param aImplicit PR_TRUE if there is no actual input tag corresponding to
|
|
||||||
* this row group.
|
|
||||||
*/
|
|
||||||
nsTableRowGroup (nsIAtom* aTag, PRBool aImplicit);
|
|
||||||
|
|
||||||
/** destructor, not responsible for any memory destruction itself */
|
|
||||||
virtual ~nsTableRowGroup();
|
|
||||||
|
|
||||||
// For debugging purposes only
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef();
|
|
||||||
NS_IMETHOD_(nsrefcnt) Release();
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHOD SetAttribute(nsIAtom* aAttribute, const nsString& aValue,
|
|
||||||
PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD GetAttributeMappingFunction(nsMapAttributesFunc& aMapFunc) const;
|
|
||||||
|
|
||||||
/** @see nsIHTMLContent::CreateFrame */
|
|
||||||
NS_IMETHOD CreateFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
nsIStyleContext* aStyleContext,
|
|
||||||
nsIFrame*& aResult);
|
|
||||||
|
|
||||||
/** returns nsITableContent::kTableRowGroupType */
|
|
||||||
virtual int GetType();
|
|
||||||
|
|
||||||
/* ----------- overrides from nsTableContent ---------- */
|
|
||||||
|
|
||||||
/** can only append objects that are rows (implement nsITableContent and are .
|
|
||||||
* of type nsITableContent::kTableRowType.)
|
|
||||||
* @see nsIContent::AppendChildTo
|
|
||||||
*/
|
|
||||||
NS_IMETHOD AppendChildTo(nsIContent* aKid, PRBool aNotify);
|
|
||||||
|
|
||||||
/** can only insert objects that are rows (implement nsITableContent and are .
|
|
||||||
* of type nsITableContent::kTableRowType.)
|
|
||||||
* @see nsIContent::InsertChildAt
|
|
||||||
*/
|
|
||||||
NS_IMETHOD InsertChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
/** can only replace child objects with objects that are rows
|
|
||||||
* (implement nsITableContent and are * of type nsITableContent::kTableRowe.)
|
|
||||||
* @param aContent the object to insert, must be a row
|
|
||||||
* @param aIndex the index of the object to replace. Must be in the range
|
|
||||||
* 0<=aIndex<ChildCount().
|
|
||||||
* @see nsIContent::ReplaceChildAt
|
|
||||||
*/
|
|
||||||
NS_IMETHOD ReplaceChildAt(nsIContent* aKid, PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
/** @see nsIContent::InsertChildAt */
|
|
||||||
NS_IMETHOD RemoveChildAt(PRInt32 aIndex, PRBool aNotify);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual PRBool IsRow(nsIContent * aContent) const;
|
|
||||||
PRBool IsTableCell(nsIContent * aContent) const;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// XXX this is a virtual method so inlining just causes code
|
|
||||||
// duplication. don't do this!
|
|
||||||
|
|
||||||
/** returns nsITableContent::kTableRowGroupType */
|
|
||||||
inline int nsTableRowGroup::GetType()
|
|
||||||
{
|
|
||||||
return nsITableContent::kTableRowGroupType;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1195,21 +1195,18 @@ nsTableRowGroupFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----- static methods ----- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableRowGroupFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableRowGroupFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableRowGroupFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableRowGroupFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,15 +40,16 @@ class nsTableRowGroupFrame : public nsContainerFrame
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
/** instantiate a new instance of nsTableRowGroupFrame.
|
/** instantiate a new instance of nsTableRowGroupFrame.
|
||||||
* @param aInstancePtrResult the new object is returned in this out-param
|
* @param aResult the new object is returned in this out-param
|
||||||
* @param aContent the table object to map
|
* @param aContent the table object to map
|
||||||
* @param aParent the parent of the new frame
|
* @param aParent the parent of the new frame
|
||||||
*
|
*
|
||||||
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
*/
|
*/
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
friend nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableRowGroupFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent);
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
/** @see nsIFrame::Paint */
|
/** @see nsIFrame::Paint */
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ LLIBS= \
|
|||||||
$(DIST)\lib\nglhtmlcon_s.lib \
|
$(DIST)\lib\nglhtmlcon_s.lib \
|
||||||
$(DIST)\lib\raptorhtmldoc_s.lib \
|
$(DIST)\lib\raptorhtmldoc_s.lib \
|
||||||
$(DIST)\lib\raptorhtmlstyle_s.lib \
|
$(DIST)\lib\raptorhtmlstyle_s.lib \
|
||||||
|
$(DIST)\lib\raptorhtmltable_s.lib \
|
||||||
$(DIST)\lib\raptorlayout_s.lib \
|
$(DIST)\lib\raptorlayout_s.lib \
|
||||||
$(DIST)\lib\raptorgfxwin.lib \
|
$(DIST)\lib\raptorgfxwin.lib \
|
||||||
$(DIST)\lib\raptorbase.lib \
|
$(DIST)\lib\raptorbase.lib \
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
#include "nsILinkHandler.h"
|
#include "nsILinkHandler.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsTableCell.h"
|
#include "nsIHTMLTableCellElement.h"
|
||||||
#include "nsTableColFrame.h"
|
#include "nsTableColFrame.h"
|
||||||
#include "nsTableFrame.h"
|
#include "nsTableFrame.h"
|
||||||
#include "nsHTMLIIDs.h"
|
#include "nsHTMLIIDs.h"
|
||||||
@@ -46,6 +46,7 @@ static NS_DEFINE_IID(kIHTMLStyleSheetIID, NS_IHTML_STYLE_SHEET_IID);
|
|||||||
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
|
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
|
||||||
static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID);
|
static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID);
|
||||||
static NS_DEFINE_IID(kIStyleFrameConstructionIID, NS_ISTYLE_FRAME_CONSTRUCTION_IID);
|
static NS_DEFINE_IID(kIStyleFrameConstructionIID, NS_ISTYLE_FRAME_CONSTRUCTION_IID);
|
||||||
|
static NS_DEFINE_IID(kIHTMLTableCellElementIID, NS_IHTMLTABLECELLELEMENT_IID);
|
||||||
|
|
||||||
|
|
||||||
class HTMLAnchorRule : public nsIStyleRule {
|
class HTMLAnchorRule : public nsIStyleRule {
|
||||||
@@ -520,8 +521,6 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
|
|||||||
// makes table cells process attributes from other content
|
// makes table cells process attributes from other content
|
||||||
// inherit based style (ie: font-size: 110%) can double on row & cell
|
// inherit based style (ie: font-size: 110%) can double on row & cell
|
||||||
PRInt32 backstopInsertPoint = 0;
|
PRInt32 backstopInsertPoint = 0;
|
||||||
nsTableCell* cell = (nsTableCell*)aContent;
|
|
||||||
PRInt32 colIndex = cell->GetColIndex();
|
|
||||||
|
|
||||||
nsIFrame* rowFrame = aParentFrame;
|
nsIFrame* rowFrame = aParentFrame;
|
||||||
nsIFrame* rowGroupFrame;
|
nsIFrame* rowGroupFrame;
|
||||||
@@ -530,17 +529,24 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
|
|||||||
rowFrame->GetContentParent(rowGroupFrame);
|
rowFrame->GetContentParent(rowGroupFrame);
|
||||||
rowGroupFrame->GetContentParent(tableFrame);
|
rowGroupFrame->GetContentParent(tableFrame);
|
||||||
|
|
||||||
nsTableColFrame* colFrame;
|
nsIHTMLTableCellElement* cell=nsnull;
|
||||||
nsIFrame* colGroupFrame;
|
nsresult rv = aContent->QueryInterface(kIHTMLTableCellElementIID,
|
||||||
|
(void **)&cell); // cell: REFCNT++
|
||||||
|
if (NS_SUCCEEDED(rv)) {
|
||||||
|
PRInt32 colIndex;
|
||||||
|
rv = cell->GetColIndex(&colIndex);
|
||||||
|
nsTableColFrame* colFrame;
|
||||||
|
nsIFrame* colGroupFrame;
|
||||||
|
|
||||||
((nsTableFrame*)tableFrame)->GetColumnFrame(colIndex, colFrame);
|
((nsTableFrame*)tableFrame)->GetColumnFrame(colIndex, colFrame);
|
||||||
colFrame->GetContentParent(colGroupFrame);
|
colFrame->GetContentParent(colGroupFrame);
|
||||||
|
|
||||||
matchCount += AppendRulesFrom(colGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(colGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
matchCount += AppendRulesFrom(colFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(colFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
|
NS_RELEASE(cell); // cell: REFCNT--
|
||||||
|
}
|
||||||
matchCount += AppendRulesFrom(rowGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(rowGroupFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
matchCount += AppendRulesFrom(rowFrame, aPresContext, backstopInsertPoint, aResults);
|
matchCount += AppendRulesFrom(rowFrame, aPresContext, backstopInsertPoint, aResults);
|
||||||
|
|
||||||
} // end TD/TH tag
|
} // end TD/TH tag
|
||||||
|
|
||||||
// just get the one and only style rule from the content
|
// just get the one and only style rule from the content
|
||||||
@@ -1055,9 +1061,6 @@ NS_IMETHODIMP HTMLStyleSheetImpl::ConstructFrame(nsIPresContext* aPresContext,
|
|||||||
else if (nsHTMLAtoms::wbr == aTag) {
|
else if (nsHTMLAtoms::wbr == aTag) {
|
||||||
rv = NS_NewWBRFrame(aContent, aParentFrame, frame);
|
rv = NS_NewWBRFrame(aContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
else if (nsHTMLAtoms::table == aTag) {
|
|
||||||
rv = nsTableOuterFrame::NewFrame(&frame, aContent, aParentFrame);
|
|
||||||
}
|
|
||||||
else if (nsHTMLAtoms::input == aTag) {
|
else if (nsHTMLAtoms::input == aTag) {
|
||||||
rv = CreateInputFrame(aContent, aParentFrame, frame);
|
rv = CreateInputFrame(aContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
@@ -1071,6 +1074,32 @@ NS_IMETHODIMP HTMLStyleSheetImpl::ConstructFrame(nsIPresContext* aPresContext,
|
|||||||
rv = NS_NewHTMLFrameOuterFrame(aContent, aParentFrame, frame);
|
rv = NS_NewHTMLFrameOuterFrame(aContent, aParentFrame, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the table content frames...
|
||||||
|
else if (nsHTMLAtoms::caption == aTag) {
|
||||||
|
rv = NS_NewBodyFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::table == aTag) {
|
||||||
|
rv = NS_NewTableOuterFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((nsHTMLAtoms::tbody == aTag) ||
|
||||||
|
(nsHTMLAtoms::thead == aTag) ||
|
||||||
|
(nsHTMLAtoms::tfoot == aTag)) {
|
||||||
|
rv = NS_NewTableRowGroupFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::tr == aTag) {
|
||||||
|
rv = NS_NewTableRowFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::colgroup == aTag) {
|
||||||
|
rv = NS_NewTableColGroupFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if (nsHTMLAtoms::col == aTag) {
|
||||||
|
rv = NS_NewTableColFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
else if ((nsHTMLAtoms::td == aTag) ||
|
||||||
|
(nsHTMLAtoms::th == aTag)) {
|
||||||
|
rv = NS_NewTableCellFrame(aContent, aParentFrame, frame);
|
||||||
|
}
|
||||||
|
|
||||||
if (NS_OK != rv) {
|
if (NS_OK != rv) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
|
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
#include "celldata.h"
|
#include "celldata.h"
|
||||||
|
#include "nsVoidArray.h"
|
||||||
|
|
||||||
class nsVoidArray;
|
|
||||||
class nsTableColFrame;
|
class nsTableColFrame;
|
||||||
class nsTableCellFrame;
|
class nsTableCellFrame;
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
#include "nsCSSRendering.h"
|
#include "nsCSSRendering.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsIContentDelegate.h"
|
#include "nsIContentDelegate.h"
|
||||||
|
#include "nsIHTMLContent.h"
|
||||||
|
#include "nsHTMLIIDs.h"
|
||||||
#include "nsCSSLayout.h"
|
#include "nsCSSLayout.h"
|
||||||
#include "nsHTMLValue.h"
|
#include "nsHTMLValue.h"
|
||||||
#include "nsHTMLAtoms.h"
|
#include "nsHTMLAtoms.h"
|
||||||
@@ -55,8 +57,6 @@ nsTableCellFrame::nsTableCellFrame(nsIContent* aContent,
|
|||||||
nsIFrame* aParentFrame)
|
nsIFrame* aParentFrame)
|
||||||
: nsContainerFrame(aContent, aParentFrame)
|
: nsContainerFrame(aContent, aParentFrame)
|
||||||
{
|
{
|
||||||
mRowSpan=1;
|
|
||||||
mColSpan=1;
|
|
||||||
mColIndex=0;
|
mColIndex=0;
|
||||||
mPriorAvailWidth=0;
|
mPriorAvailWidth=0;
|
||||||
mDesiredSize.width=0;
|
mDesiredSize.width=0;
|
||||||
@@ -216,7 +216,39 @@ nsTableFrame* nsTableCellFrame::GetTableFrame()
|
|||||||
return (nsTableFrame*)frame;
|
return (nsTableFrame*)frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRInt32 nsTableCellFrame::GetRowSpan()
|
||||||
|
{
|
||||||
|
PRInt32 rowSpan=1;
|
||||||
|
nsIHTMLContent *hc=nsnull;
|
||||||
|
nsresult rv = mContent->QueryInterface(kIHTMLContentIID, (void**) &hc);
|
||||||
|
if (NS_OK==rv)
|
||||||
|
{
|
||||||
|
nsHTMLValue val;
|
||||||
|
hc->GetAttribute(nsHTMLAtoms::rowspan, val);
|
||||||
|
if (eHTMLUnit_Integer == val.GetUnit()) {
|
||||||
|
rowSpan=val.GetIntValue();
|
||||||
|
}
|
||||||
|
NS_RELEASE(hc);
|
||||||
|
}
|
||||||
|
return rowSpan;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt32 nsTableCellFrame::GetColSpan()
|
||||||
|
{
|
||||||
|
PRInt32 colSpan=1;
|
||||||
|
nsIHTMLContent *hc=nsnull;
|
||||||
|
nsresult rv = mContent->QueryInterface(kIHTMLContentIID, (void**) &hc);
|
||||||
|
if (NS_OK==rv)
|
||||||
|
{
|
||||||
|
nsHTMLValue val;
|
||||||
|
hc->GetAttribute(nsHTMLAtoms::colspan, val);
|
||||||
|
if (eHTMLUnit_Integer == val.GetUnit()) {
|
||||||
|
colSpan=val.GetIntValue();
|
||||||
|
}
|
||||||
|
NS_RELEASE(hc);
|
||||||
|
}
|
||||||
|
return colSpan;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -510,7 +542,7 @@ void nsTableCellFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
|||||||
nscoord border = 1;
|
nscoord border = 1;
|
||||||
|
|
||||||
nsTableFrame* tableFrame = GetTableFrame();
|
nsTableFrame* tableFrame = GetTableFrame();
|
||||||
tableFrame->GetGeometricParent((nsIFrame *&)tableFrame); // get the outer frame
|
//tableFrame->GetGeometricParent((nsIFrame *&)tableFrame); // get the outer frame
|
||||||
NS_ASSERTION(tableFrame,"Table Must not be null");
|
NS_ASSERTION(tableFrame,"Table Must not be null");
|
||||||
if (!tableFrame)
|
if (!tableFrame)
|
||||||
return;
|
return;
|
||||||
@@ -579,21 +611,18 @@ nsTableCellFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|||||||
return nsContainerFrame::QueryInterface(aIID, aInstancePtr);
|
return nsContainerFrame::QueryInterface(aIID, aInstancePtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----- static methods ----- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableCellFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableCellFrame( nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableCellFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableCellFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,11 +41,19 @@ class nsTableCellFrame : public nsContainerFrame
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void Init(PRInt32 aRowSpan, PRInt32 aColSpan, PRInt32 aColIndex);
|
void InitCellFrame(PRInt32 aColIndex);
|
||||||
|
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
/** instantiate a new instance of nsTableCellFrame.
|
||||||
nsIContent* aContent,
|
* @param aResult the new object is returned in this out-param
|
||||||
nsIFrame* aParent);
|
* @param aContent the table object to map
|
||||||
|
* @param aParent the parent of the new frame
|
||||||
|
*
|
||||||
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
|
*/
|
||||||
|
friend nsresult
|
||||||
|
NS_NewTableCellFrame(nsIContent* aContent,
|
||||||
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
// nsISupports
|
// nsISupports
|
||||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||||
@@ -206,11 +214,6 @@ protected:
|
|||||||
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** the number of rows spanned by this cell */
|
|
||||||
int mRowSpan;
|
|
||||||
|
|
||||||
/** the number of columns spanned by this cell */
|
|
||||||
int mColSpan;
|
|
||||||
|
|
||||||
/** the starting column for this cell */
|
/** the starting column for this cell */
|
||||||
int mColIndex;
|
int mColIndex;
|
||||||
@@ -232,18 +235,12 @@ protected:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void nsTableCellFrame::Init(PRInt32 aRowSpan, PRInt32 aColSpan, PRInt32 aColIndex)
|
inline void nsTableCellFrame::InitCellFrame(PRInt32 aColIndex)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(0<aRowSpan, "bad row span arg");
|
|
||||||
NS_PRECONDITION(0<aColSpan, "bad col span arg");
|
|
||||||
NS_PRECONDITION(0<=aColIndex, "bad col index arg");
|
NS_PRECONDITION(0<=aColIndex, "bad col index arg");
|
||||||
mRowSpan = aRowSpan;
|
|
||||||
mColSpan = aColSpan;
|
|
||||||
mColIndex = aColIndex;
|
mColIndex = aColIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PRInt32 nsTableCellFrame::GetRowSpan()
|
|
||||||
{ return mRowSpan;}
|
|
||||||
|
|
||||||
inline PRInt32 nsTableCellFrame::GetRowIndex()
|
inline PRInt32 nsTableCellFrame::GetRowIndex()
|
||||||
{
|
{
|
||||||
@@ -255,9 +252,6 @@ inline PRInt32 nsTableCellFrame::GetRowIndex()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PRInt32 nsTableCellFrame::GetColSpan()
|
|
||||||
{ return mColSpan;}
|
|
||||||
|
|
||||||
inline PRInt32 nsTableCellFrame::GetColIndex()
|
inline PRInt32 nsTableCellFrame::GetColIndex()
|
||||||
{ return mColIndex;}
|
{ return mColIndex;}
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ nsTableColFrame::nsTableColFrame(nsIContent* aContent, nsIFrame* aParentFrame)
|
|||||||
: nsFrame(aContent, aParentFrame)
|
: nsFrame(aContent, aParentFrame)
|
||||||
{
|
{
|
||||||
mColIndex = 0;
|
mColIndex = 0;
|
||||||
mRepeat = 0;
|
mRepeat = 1;
|
||||||
mMaxColWidth = 0;
|
mMaxColWidth = 0;
|
||||||
mMinColWidth = 0;
|
mMinColWidth = 0;
|
||||||
mMaxEffectiveColWidth = 0;
|
mMaxEffectiveColWidth = 0;
|
||||||
@@ -79,21 +79,18 @@ NS_METHOD nsTableColFrame::Reflow(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ----- static methods ------ */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableColFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableColFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableColFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableColFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,11 +29,19 @@ public:
|
|||||||
eWIDTH_SOURCE_CELL_WITH_SPAN=2 // a cell implicitly specified a width via colspan
|
eWIDTH_SOURCE_CELL_WITH_SPAN=2 // a cell implicitly specified a width via colspan
|
||||||
};
|
};
|
||||||
|
|
||||||
void Init(PRInt32 aColIndex, PRInt32 aRepeat);
|
void InitColFrame(PRInt32 aColIndex, PRInt32 aRepeat);
|
||||||
|
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
/** instantiate a new instance of nsTableColFrame.
|
||||||
nsIContent* aContent,
|
* @param aResult the new object is returned in this out-param
|
||||||
nsIFrame* aParent);
|
* @param aContent the table object to map
|
||||||
|
* @param aParent the parent of the new frame
|
||||||
|
*
|
||||||
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
|
*/
|
||||||
|
friend nsresult
|
||||||
|
NS_NewTableColFrame(nsIContent* aContent,
|
||||||
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -104,7 +112,7 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
inline void nsTableColFrame::Init(PRInt32 aColIndex, PRInt32 aRepeat)
|
inline void nsTableColFrame::InitColFrame(PRInt32 aColIndex, PRInt32 aRepeat)
|
||||||
{
|
{
|
||||||
NS_ASSERTION(0<=aColIndex, "bad col index param");
|
NS_ASSERTION(0<=aColIndex, "bad col index param");
|
||||||
NS_ASSERTION(0<=aRepeat, "bad repeat param");
|
NS_ASSERTION(0<=aRepeat, "bad repeat param");
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
#include "nsTableColGroupFrame.h"
|
#include "nsTableColGroupFrame.h"
|
||||||
#include "nsTableColFrame.h"
|
#include "nsTableColFrame.h"
|
||||||
#include "nsTableFrame.h"
|
#include "nsTableFrame.h"
|
||||||
#include "nsITableContent.h"
|
#include "nsIHTMLTableColElement.h"
|
||||||
#include "nsIReflowCommand.h"
|
#include "nsIReflowCommand.h"
|
||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
#include "nsStyleConsts.h"
|
#include "nsStyleConsts.h"
|
||||||
@@ -30,7 +30,8 @@
|
|||||||
NS_DEF_PTR(nsIContent);
|
NS_DEF_PTR(nsIContent);
|
||||||
NS_DEF_PTR(nsIStyleContext);
|
NS_DEF_PTR(nsIStyleContext);
|
||||||
|
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
static NS_DEFINE_IID(kIHTMLTableColElementIID, NS_IHTMLTABLECOLELEMENT_IID);
|
||||||
|
|
||||||
|
|
||||||
static PRBool gsDebug = PR_FALSE;
|
static PRBool gsDebug = PR_FALSE;
|
||||||
|
|
||||||
@@ -67,6 +68,7 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext& aPresContext,
|
|||||||
|
|
||||||
// for every content child that (is a column thingy and does not already have a frame)
|
// for every content child that (is a column thingy and does not already have a frame)
|
||||||
// create a frame and adjust it's style
|
// create a frame and adjust it's style
|
||||||
|
nsresult rv;
|
||||||
nsIFrame* kidFrame = nsnull;
|
nsIFrame* kidFrame = nsnull;
|
||||||
nsIFrame* prevKidFrame;
|
nsIFrame* prevKidFrame;
|
||||||
|
|
||||||
@@ -82,9 +84,11 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext& aPresContext,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//XXX: with the new content code, this check is no longer valid
|
||||||
|
/*
|
||||||
// verify that we're dealing with table content. If so, we know it's a column
|
// verify that we're dealing with table content. If so, we know it's a column
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
nsITableContent *tableContentInterface = nsnull;
|
||||||
nsresult rv = kid->QueryInterface(kITableContentIID,
|
rv = kid->QueryInterface(kITableContentIID,
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
||||||
if (NS_FAILED(rv))
|
if (NS_FAILED(rv))
|
||||||
{
|
{
|
||||||
@@ -92,7 +96,7 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext& aPresContext,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
NS_RELEASE(tableContentInterface); // tableContentInterface: REFCNT--
|
NS_RELEASE(tableContentInterface); // tableContentInterface: REFCNT--
|
||||||
|
*/
|
||||||
if (mChildCount<=colIndex)
|
if (mChildCount<=colIndex)
|
||||||
{
|
{
|
||||||
// Resolve style
|
// Resolve style
|
||||||
@@ -106,6 +110,21 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext& aPresContext,
|
|||||||
kidDel = kid->GetDelegate(&aPresContext);
|
kidDel = kid->GetDelegate(&aPresContext);
|
||||||
rv = kidDel->CreateFrame(&aPresContext, kid, this, kidSC, kidFrame);
|
rv = kidDel->CreateFrame(&aPresContext, kid, this, kidSC, kidFrame);
|
||||||
NS_RELEASE(kidDel);
|
NS_RELEASE(kidDel);
|
||||||
|
if (NS_FAILED(rv))
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
// set the preliminary values for the column frame
|
||||||
|
PRInt32 repeat=1;
|
||||||
|
nsIHTMLTableColElement* colContent = nsnull;
|
||||||
|
kid->QueryInterface(kIHTMLTableColElementIID,
|
||||||
|
(void**) &colContent); // colContent: ADDREF++
|
||||||
|
if (rv==NS_OK)
|
||||||
|
{
|
||||||
|
colContent->GetSpanValue(&repeat);
|
||||||
|
NS_RELEASE(colContent);
|
||||||
|
}
|
||||||
|
((nsTableColFrame *)(kidFrame))->InitColFrame (mStartColIndex + mColCount, repeat);
|
||||||
|
mColCount+= repeat;
|
||||||
|
|
||||||
// give the child frame a chance to reflow, even though we know it'll have 0 size
|
// give the child frame a chance to reflow, even though we know it'll have 0 size
|
||||||
nsReflowMetrics kidSize(nsnull);
|
nsReflowMetrics kidSize(nsnull);
|
||||||
@@ -238,21 +257,18 @@ int nsTableColGroupFrame::GetColumnCount ()
|
|||||||
return mColCount;
|
return mColCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----- static methods ----- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableColGroupFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableColGroupFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableColGroupFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableColGroupFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,9 +31,17 @@
|
|||||||
class nsTableColGroupFrame : public nsContainerFrame
|
class nsTableColGroupFrame : public nsContainerFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
/** instantiate a new instance of nsTableColGroupFrame.
|
||||||
nsIContent* aContent,
|
* @param aResult the new object is returned in this out-param
|
||||||
nsIFrame* aParent);
|
* @param aContent the table object to map
|
||||||
|
* @param aParent the parent of the new frame
|
||||||
|
*
|
||||||
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
|
*/
|
||||||
|
friend nsresult
|
||||||
|
NS_NewTableColGroupFrame(nsIContent* aContent,
|
||||||
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
|
|||||||
@@ -16,19 +16,18 @@
|
|||||||
* Reserved.
|
* Reserved.
|
||||||
*/
|
*/
|
||||||
#include "nsTableFrame.h"
|
#include "nsTableFrame.h"
|
||||||
#include "nsTablePart.h"
|
|
||||||
#include "nsIRenderingContext.h"
|
#include "nsIRenderingContext.h"
|
||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsIContentDelegate.h"
|
#include "nsIContentDelegate.h"
|
||||||
#include "nsCellMap.h"
|
#include "nsCellMap.h"
|
||||||
#include "nsTableCellFrame.h"
|
#include "nsTableCellFrame.h"
|
||||||
#include "nsTableCol.h" // needed for building implicit columns
|
#include "nsHTMLParts.h"
|
||||||
#include "nsTableColGroup.h" // needed for building implicit colgroups
|
|
||||||
#include "nsTableColFrame.h"
|
#include "nsTableColFrame.h"
|
||||||
#include "nsTableColGroupFrame.h"
|
#include "nsTableColGroupFrame.h"
|
||||||
#include "nsTableRowFrame.h"
|
#include "nsTableRowFrame.h"
|
||||||
#include "nsTableRowGroupFrame.h"
|
#include "nsTableRowGroupFrame.h"
|
||||||
|
#include "nsIHTMLContent.h"
|
||||||
|
|
||||||
#include "BasicTableLayoutStrategy.h"
|
#include "BasicTableLayoutStrategy.h"
|
||||||
|
|
||||||
@@ -495,11 +494,8 @@ PRInt32 nsTableFrame::GetEffectiveCOLSAttribute()
|
|||||||
NS_PRECONDITION (nsnull!=cellMap, "bad call, cellMap not yet allocated.");
|
NS_PRECONDITION (nsnull!=cellMap, "bad call, cellMap not yet allocated.");
|
||||||
PRInt32 result;
|
PRInt32 result;
|
||||||
nsIFrame *tableFrame = this;
|
nsIFrame *tableFrame = this;
|
||||||
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED! XXX
|
nsStyleTable *tableStyle=nsnull;
|
||||||
tableFrame->GetGeometricParent(tableFrame);
|
GetStyleData(eStyleStruct_Table, (nsStyleStruct *&)tableStyle);
|
||||||
// end REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED! XXX
|
|
||||||
nsStyleTable *tableStyle;
|
|
||||||
tableFrame->GetStyleData(eStyleStruct_Table, (nsStyleStruct *&)tableStyle);
|
|
||||||
result = tableStyle->mCols;
|
result = tableStyle->mCols;
|
||||||
PRInt32 numCols = GetColCount();
|
PRInt32 numCols = GetColCount();
|
||||||
if (result>numCols)
|
if (result>numCols)
|
||||||
@@ -526,6 +522,7 @@ void nsTableFrame::EnsureColumns(nsIPresContext* aPresContext,
|
|||||||
const nsReflowState& aReflowState,
|
const nsReflowState& aReflowState,
|
||||||
nsReflowStatus& aStatus)
|
nsReflowStatus& aStatus)
|
||||||
{
|
{
|
||||||
|
#ifdef XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||||
// XXX sec should only be called on firstInFlow
|
// XXX sec should only be called on firstInFlow
|
||||||
SetMinColSpanForTable();
|
SetMinColSpanForTable();
|
||||||
if (nsnull==mCellMap)
|
if (nsnull==mCellMap)
|
||||||
@@ -564,14 +561,9 @@ void nsTableFrame::EnsureColumns(nsIPresContext* aPresContext,
|
|||||||
nsTableColGroup *lastColGroup=nsnull;
|
nsTableColGroup *lastColGroup=nsnull;
|
||||||
if (nsnull==lastColGroupFrame)
|
if (nsnull==lastColGroupFrame)
|
||||||
{
|
{
|
||||||
//QQQ
|
|
||||||
// need to find the generic way to stamp out this content, and ::AppendChildTo it
|
|
||||||
// this might be ok. no matter what my mcontent is, I know it needs a colgroup as a kid?
|
|
||||||
|
|
||||||
lastColGroup = new nsTableColGroup (PR_TRUE); // create an implicit colgroup
|
lastColGroup = new nsTableColGroup (PR_TRUE); // create an implicit colgroup
|
||||||
// XXX: instead of Append, maybe this should be insertAt(0)?
|
// XXX: instead of Append, maybe this should be insertAt(0)?
|
||||||
mContent->AppendChildTo(lastColGroup, PR_FALSE); // add the implicit colgroup to my content
|
mContent->AppendChildTo(lastColGroup, PR_FALSE); // add the implicit colgroup to my content
|
||||||
NS_ADDREF(lastColGroup); // ADDREF a: lastColGroup++
|
|
||||||
// Resolve style for the child
|
// Resolve style for the child
|
||||||
nsIStyleContext* colGroupStyleContext =
|
nsIStyleContext* colGroupStyleContext =
|
||||||
aPresContext->ResolveStyleContextFor(lastColGroup, this, PR_TRUE); // kidStyleContext: REFCNT++
|
aPresContext->ResolveStyleContextFor(lastColGroup, this, PR_TRUE); // kidStyleContext: REFCNT++
|
||||||
@@ -613,24 +605,26 @@ void nsTableFrame::EnsureColumns(nsIPresContext* aPresContext,
|
|||||||
{ //QQQ
|
{ //QQQ
|
||||||
// need to find the generic way to stamp out this content, and ::AppendChildTo it
|
// need to find the generic way to stamp out this content, and ::AppendChildTo it
|
||||||
nsTableCol *col = new nsTableCol(PR_TRUE);
|
nsTableCol *col = new nsTableCol(PR_TRUE);
|
||||||
NS_ADDREF(col);
|
|
||||||
lastColGroup->AppendChildTo (col, PR_FALSE);
|
lastColGroup->AppendChildTo (col, PR_FALSE);
|
||||||
}
|
}
|
||||||
NS_RELEASE(lastColGroup); // ADDREF: lastColGroup--
|
NS_RELEASE(lastColGroup); // ADDREF: lastColGroup--
|
||||||
lastColGroupFrame->Reflow(*aPresContext, aDesiredSize, aReflowState, aStatus);
|
lastColGroupFrame->Reflow(*aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/** sum the columns represented by all nsTableColGroup objects
|
/** sum the columns represented by all nsTableColGroup objects
|
||||||
* if the cell map says there are more columns than this,
|
* if the cell map says there are more columns than this,
|
||||||
* add extra implicit columns to the content tree.
|
* add extra implicit columns to the content tree.
|
||||||
*/
|
*/
|
||||||
|
// XXX should be nsresult, not void
|
||||||
void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
||||||
nsIPresContext* aPresContext,
|
nsIPresContext* aPresContext,
|
||||||
nsReflowMetrics& aDesiredSize,
|
nsReflowMetrics& aDesiredSize,
|
||||||
const nsReflowState& aReflowState,
|
const nsReflowState& aReflowState,
|
||||||
nsReflowStatus& aStatus)
|
nsReflowStatus& aStatus)
|
||||||
{
|
{
|
||||||
|
nsresult rv;
|
||||||
PRInt32 actualColumns = 0;
|
PRInt32 actualColumns = 0;
|
||||||
nsTableColGroupFrame *lastColGroupFrame = nsnull;
|
nsTableColGroupFrame *lastColGroupFrame = nsnull;
|
||||||
nsIFrame * firstRowGroupFrame=nsnull;
|
nsIFrame * firstRowGroupFrame=nsnull;
|
||||||
@@ -646,7 +640,7 @@ void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
|||||||
actualColumns += numCols;
|
actualColumns += numCols;
|
||||||
lastColGroupFrame = (nsTableColGroupFrame *)childFrame;
|
lastColGroupFrame = (nsTableColGroupFrame *)childFrame;
|
||||||
if (actualColumns > aColIndex)
|
if (actualColumns > aColIndex)
|
||||||
break; // we gave enough col frames at this point
|
break; // we have enough col frames at this point
|
||||||
}
|
}
|
||||||
else if (NS_STYLE_DISPLAY_TABLE_ROW_GROUP == childDisplay->mDisplay ||
|
else if (NS_STYLE_DISPLAY_TABLE_ROW_GROUP == childDisplay->mDisplay ||
|
||||||
NS_STYLE_DISPLAY_TABLE_HEADER_GROUP == childDisplay->mDisplay ||
|
NS_STYLE_DISPLAY_TABLE_HEADER_GROUP == childDisplay->mDisplay ||
|
||||||
@@ -660,18 +654,21 @@ void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
|||||||
}
|
}
|
||||||
if (actualColumns <= aColIndex)
|
if (actualColumns <= aColIndex)
|
||||||
{
|
{
|
||||||
nsTableColGroup *lastColGroup=nsnull;
|
nsIHTMLContent *lastColGroup=nsnull;
|
||||||
if (nsnull==lastColGroupFrame)
|
if (nsnull==lastColGroupFrame)
|
||||||
{
|
{
|
||||||
lastColGroup = new nsTableColGroup (PR_TRUE); // create an implicit colgroup
|
// create an implicit colgroup
|
||||||
|
nsAutoString colGroupTag;
|
||||||
|
nsHTMLAtoms::colgroup->ToString(colGroupTag);
|
||||||
|
rv = NS_CreateHTMLElement(&lastColGroup, colGroupTag); // ADDREF a: lastColGroup++
|
||||||
|
//XXX mark it as implicit!
|
||||||
mContent->AppendChildTo(lastColGroup, PR_FALSE); // add the implicit colgroup to my content
|
mContent->AppendChildTo(lastColGroup, PR_FALSE); // add the implicit colgroup to my content
|
||||||
NS_ADDREF(lastColGroup); // ADDREF a: lastColGroup++
|
|
||||||
// Resolve style for the child
|
// Resolve style for the child
|
||||||
nsIStyleContext* colGroupStyleContext =
|
nsIStyleContext* colGroupStyleContext =
|
||||||
aPresContext->ResolveStyleContextFor(lastColGroup, this, PR_TRUE); // kidStyleContext: REFCNT++
|
aPresContext->ResolveStyleContextFor(lastColGroup, this, PR_TRUE); // kidStyleContext: REFCNT++
|
||||||
nsIContentDelegate* kidDel = nsnull;
|
nsIContentDelegate* kidDel = nsnull;
|
||||||
kidDel = lastColGroup->GetDelegate(aPresContext); // kidDel: REFCNT++
|
kidDel = lastColGroup->GetDelegate(aPresContext); // kidDel: REFCNT++
|
||||||
nsresult rv = kidDel->CreateFrame(aPresContext, lastColGroup, this,
|
rv = kidDel->CreateFrame(aPresContext, lastColGroup, this,
|
||||||
colGroupStyleContext, (nsIFrame *&)lastColGroupFrame);
|
colGroupStyleContext, (nsIFrame *&)lastColGroupFrame);
|
||||||
NS_RELEASE(kidDel); // kidDel: REFCNT--
|
NS_RELEASE(kidDel); // kidDel: REFCNT--
|
||||||
NS_RELEASE(colGroupStyleContext); // kidStyleContenxt: REFCNT--
|
NS_RELEASE(colGroupStyleContext); // kidStyleContenxt: REFCNT--
|
||||||
@@ -702,12 +699,17 @@ void nsTableFrame::EnsureColumnFrameAt(PRInt32 aColIndex,
|
|||||||
lastColGroupFrame->GetContent((nsIContent *&)lastColGroup); // ADDREF b: lastColGroup++
|
lastColGroupFrame->GetContent((nsIContent *&)lastColGroup); // ADDREF b: lastColGroup++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsAutoString colTag;
|
||||||
|
nsHTMLAtoms::col->ToString(colTag);
|
||||||
PRInt32 excessColumns = aColIndex - actualColumns;
|
PRInt32 excessColumns = aColIndex - actualColumns;
|
||||||
for ( ; excessColumns >= 0; excessColumns--)
|
for ( ; excessColumns >= 0; excessColumns--)
|
||||||
{
|
{
|
||||||
nsTableCol *col = new nsTableCol(PR_TRUE);
|
nsIHTMLContent *col=nsnull;
|
||||||
NS_ADDREF(col);
|
// create an implicit col
|
||||||
lastColGroup->AppendChildTo(col, PR_FALSE);
|
rv = NS_CreateHTMLElement(&col, colTag); // ADDREF: col++
|
||||||
|
//XXX mark the col implicit
|
||||||
|
lastColGroup->AppendChildTo((nsIContent*)col, PR_FALSE);
|
||||||
|
NS_RELEASE(col); // ADDREF: col--
|
||||||
}
|
}
|
||||||
NS_RELEASE(lastColGroup); // ADDREF: lastColGroup--
|
NS_RELEASE(lastColGroup); // ADDREF: lastColGroup--
|
||||||
lastColGroupFrame->Reflow(*aPresContext, aDesiredSize, aReflowState, aStatus);
|
lastColGroupFrame->Reflow(*aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||||
@@ -2480,21 +2482,9 @@ void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
|
|||||||
// need to figure out the overall table width constraint
|
// need to figure out the overall table width constraint
|
||||||
// default case, get 100% of available space
|
// default case, get 100% of available space
|
||||||
|
|
||||||
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
|
||||||
nsIFrame * outerTableFrame = nsnull;
|
|
||||||
const nsStylePosition* position;
|
|
||||||
GetGeometricParent(outerTableFrame);
|
|
||||||
outerTableFrame->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)position));
|
|
||||||
// end REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PRInt32 maxWidth;
|
PRInt32 maxWidth;
|
||||||
/*
|
|
||||||
const nsStylePosition* position =
|
const nsStylePosition* position =
|
||||||
(const nsStylePosition*)mStyleContext->GetStyleData(eStyleStruct_Position);
|
(const nsStylePosition*)mStyleContext->GetStyleData(eStyleStruct_Position);
|
||||||
use this line when tableFrame contains its own position style info
|
|
||||||
*/
|
|
||||||
switch (position->mWidth.GetUnit()) {
|
switch (position->mWidth.GetUnit()) {
|
||||||
case eStyleUnit_Coord:
|
case eStyleUnit_Coord:
|
||||||
maxWidth = position->mWidth.GetCoordValue();
|
maxWidth = position->mWidth.GetCoordValue();
|
||||||
@@ -2849,8 +2839,6 @@ nsTableFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
nsIFrame * rg = nsnull;
|
nsIFrame * rg = nsnull;
|
||||||
firstInFlow->FirstChild(rg);
|
firstInFlow->FirstChild(rg);
|
||||||
NS_ASSERTION (nsnull!=rg, "previous frame has no children");
|
NS_ASSERTION (nsnull!=rg, "previous frame has no children");
|
||||||
nsIAtom * tHeadTag = NS_NewAtom(nsTablePart::kRowGroupHeadTagString); // tHeadTag: REFCNT++
|
|
||||||
nsIAtom * tFootTag = NS_NewAtom(nsTablePart::kRowGroupFootTagString); // tFootTag: REFCNT++
|
|
||||||
PRInt32 index = 0;
|
PRInt32 index = 0;
|
||||||
nsIFrame * bodyRowGroupFromOverflow = mOverflowList;
|
nsIFrame * bodyRowGroupFromOverflow = mOverflowList;
|
||||||
nsIFrame * lastSib = nsnull;
|
nsIFrame * lastSib = nsnull;
|
||||||
@@ -2859,10 +2847,10 @@ nsTableFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
nsIContent *content = nsnull;
|
nsIContent *content = nsnull;
|
||||||
rg->GetContent(content); // content: REFCNT++
|
rg->GetContent(content); // content: REFCNT++
|
||||||
NS_ASSERTION(nsnull!=content, "bad frame, returned null content.");
|
NS_ASSERTION(nsnull!=content, "bad frame, returned null content.");
|
||||||
nsIAtom * rgTag;
|
const nsStyleDisplay* display;
|
||||||
content->GetTag(rgTag);
|
GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&)display);
|
||||||
// if we've found a header or a footer, replicate it
|
if ((display->mDisplay == NS_STYLE_DISPLAY_TABLE_HEADER_GROUP) ||
|
||||||
if (tHeadTag==rgTag || tFootTag==rgTag)
|
(display->mDisplay == NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP))
|
||||||
{
|
{
|
||||||
printf("found a head or foot in continuing frame\n");
|
printf("found a head or foot in continuing frame\n");
|
||||||
// Resolve style for the child
|
// Resolve style for the child
|
||||||
@@ -2887,13 +2875,10 @@ nsTableFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
duplicateFrame->SetNextSibling(bodyRowGroupFromOverflow);
|
duplicateFrame->SetNextSibling(bodyRowGroupFromOverflow);
|
||||||
lastSib = duplicateFrame;
|
lastSib = duplicateFrame;
|
||||||
}
|
}
|
||||||
NS_IF_RELEASE(rgTag);
|
|
||||||
NS_RELEASE(content); // content: REFCNT--
|
NS_RELEASE(content); // content: REFCNT--
|
||||||
// get the next row group
|
// get the next row group
|
||||||
rg->GetNextSibling(rg);
|
rg->GetNextSibling(rg);
|
||||||
}
|
}
|
||||||
NS_RELEASE(tFootTag); // tHeadTag: REFCNT --
|
|
||||||
NS_RELEASE(tHeadTag); // tFootTag: REFCNT --
|
|
||||||
aContinuingFrame = cf;
|
aContinuingFrame = cf;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@@ -3020,6 +3005,7 @@ PRBool nsTableFrame::ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault,
|
|||||||
|
|
||||||
void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
// Check to see if the table has either cell padding or
|
// Check to see if the table has either cell padding or
|
||||||
// Cell spacing defined for the table. If true, then
|
// Cell spacing defined for the table. If true, then
|
||||||
// this setting overrides any specific border, margin or
|
// this setting overrides any specific border, margin or
|
||||||
@@ -3039,7 +3025,7 @@ void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
|||||||
|
|
||||||
float p2t = aPresContext->GetPixelsToTwips();
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
|
||||||
nsTablePart* table = (nsTablePart*)mContent;
|
nsIHTMLContent* table = (nsIHTMLContent*)mContent;
|
||||||
|
|
||||||
NS_ASSERTION(table,"Table Must not be null");
|
NS_ASSERTION(table,"Table Must not be null");
|
||||||
if (!table)
|
if (!table)
|
||||||
@@ -3056,6 +3042,7 @@ void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
|||||||
border = NSIntPixelsToTwips(intValue, p2t);
|
border = NSIntPixelsToTwips(intValue, p2t);
|
||||||
}
|
}
|
||||||
MapHTMLBorderStyle(*spacingData,border);
|
MapHTMLBorderStyle(*spacingData,border);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -3066,13 +3053,6 @@ NS_METHOD nsTableFrame::DidSetStyleContext(nsIPresContext* aPresContext)
|
|||||||
{
|
{
|
||||||
#ifdef NOISY_STYLE
|
#ifdef NOISY_STYLE
|
||||||
printf("nsTableFrame::DidSetStyleContext \n");
|
printf("nsTableFrame::DidSetStyleContext \n");
|
||||||
#endif
|
|
||||||
// XXX This may have been needed before we had a style system, but it's not
|
|
||||||
// needed now. It's forcing the table to always have a border (which is bad),
|
|
||||||
// and it's duplicating the border-syle and border-color information that's
|
|
||||||
// in the ua.css
|
|
||||||
#if 0
|
|
||||||
MapBorderMarginPadding(aPresContext);
|
|
||||||
#endif
|
#endif
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@@ -3092,10 +3072,8 @@ NS_METHOD nsTableFrame::GetCellMarginData(nsTableCellFrame* aKidFrame, nsMargin&
|
|||||||
nscoord nsTableFrame::GetCellSpacing()
|
nscoord nsTableFrame::GetCellSpacing()
|
||||||
{
|
{
|
||||||
nsTableFrame* tableFrame = this;
|
nsTableFrame* tableFrame = this;
|
||||||
//XXX remove when table style is fully resolved!
|
|
||||||
GetGeometricParent((nsIFrame *&)tableFrame); // get the outer frame
|
|
||||||
nsStyleTable* tableStyle;
|
nsStyleTable* tableStyle;
|
||||||
tableFrame->GetStyleData(eStyleStruct_Table, (nsStyleStruct *&)tableStyle);
|
GetStyleData(eStyleStruct_Table, (nsStyleStruct *&)tableStyle);
|
||||||
nscoord cellSpacing = 0;
|
nscoord cellSpacing = 0;
|
||||||
if (tableStyle->mCellSpacing.GetUnit() == eStyleUnit_Coord)
|
if (tableStyle->mCellSpacing.GetUnit() == eStyleUnit_Coord)
|
||||||
cellSpacing = tableStyle->mCellSpacing.GetCoordValue();
|
cellSpacing = tableStyle->mCellSpacing.GetCoordValue();
|
||||||
@@ -3125,27 +3103,25 @@ nsTableFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ---------- static methods ---------- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* helper method for determining if this is a nested table or not */
|
/* helper method for determining if this is a nested table or not */
|
||||||
PRBool nsTableFrame::IsNested(const nsReflowState& aReflowState, nsStylePosition *& aPosition) const
|
PRBool nsTableFrame::IsNested(const nsReflowState& aReflowState, nsStylePosition *& aPosition) const
|
||||||
{
|
{
|
||||||
|
nsresult rv;
|
||||||
PRBool result = PR_FALSE;
|
PRBool result = PR_FALSE;
|
||||||
#ifdef NS_DEBUG
|
#ifdef NS_DEBUG
|
||||||
PRInt32 counter=0;
|
PRInt32 counter=0;
|
||||||
@@ -3159,8 +3135,8 @@ PRBool nsTableFrame::IsNested(const nsReflowState& aReflowState, nsStylePosition
|
|||||||
NS_ASSERTION(counter<100000, "infinite loop in IsNested");
|
NS_ASSERTION(counter<100000, "infinite loop in IsNested");
|
||||||
#endif
|
#endif
|
||||||
nsIFrame* parentTable = nsnull;
|
nsIFrame* parentTable = nsnull;
|
||||||
rs->frame->QueryInterface(kTableFrameCID, (void**) &parentTable);
|
rv = rs->frame->QueryInterface(kTableFrameCID, (void**) &parentTable);
|
||||||
if (nsnull!=parentTable)
|
if (NS_OK==rv)
|
||||||
{
|
{
|
||||||
result = PR_TRUE;
|
result = PR_TRUE;
|
||||||
parentTable->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)aPosition));
|
parentTable->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)aPosition));
|
||||||
@@ -3174,6 +3150,7 @@ PRBool nsTableFrame::IsNested(const nsReflowState& aReflowState, nsStylePosition
|
|||||||
/* helper method for getting the width of the table's containing block */
|
/* helper method for getting the width of the table's containing block */
|
||||||
nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
||||||
{
|
{
|
||||||
|
nsresult rv;
|
||||||
nscoord parentWidth = aReflowState.maxSize.width;
|
nscoord parentWidth = aReflowState.maxSize.width;
|
||||||
|
|
||||||
// Walk up the reflow state chain until we find a block
|
// Walk up the reflow state chain until we find a block
|
||||||
@@ -3186,8 +3163,8 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
{
|
{
|
||||||
// if it's a block, use its max width
|
// if it's a block, use its max width
|
||||||
nsIFrame* block = nsnull;
|
nsIFrame* block = nsnull;
|
||||||
rs->frame->QueryInterface(kBlockFrameCID, (void**) &block);
|
rv = rs->frame->QueryInterface(kBlockFrameCID, (void**) &block);
|
||||||
if (nsnull != block)
|
if (NS_OK==rv)
|
||||||
{ // we found a block, see if it's really a table cell (which means we're a nested table)
|
{ // we found a block, see if it's really a table cell (which means we're a nested table)
|
||||||
PRBool skipThisBlock=PR_FALSE;
|
PRBool skipThisBlock=PR_FALSE;
|
||||||
if (PR_TRUE==((nsContainerFrame*)block)->IsPseudoFrame())
|
if (PR_TRUE==((nsContainerFrame*)block)->IsPseudoFrame())
|
||||||
@@ -3199,8 +3176,8 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
if (nsnull!=parentRS)
|
if (nsnull!=parentRS)
|
||||||
{
|
{
|
||||||
nsIFrame* cell = nsnull;
|
nsIFrame* cell = nsnull;
|
||||||
parentRS->frame->QueryInterface(kTableCellFrameCID, (void**) &cell);
|
rv = parentRS->frame->QueryInterface(kTableCellFrameCID, (void**) &cell);
|
||||||
if (nsnull != cell) {
|
if (rv == NS_OK) {
|
||||||
if (PR_TRUE==gsDebugNT)
|
if (PR_TRUE==gsDebugNT)
|
||||||
printf("%p: found a block pframe %p in a cell, skipping it.\n", aReflowState.frame, block);
|
printf("%p: found a block pframe %p in a cell, skipping it.\n", aReflowState.frame, block);
|
||||||
skipThisBlock = PR_TRUE;
|
skipThisBlock = PR_TRUE;
|
||||||
@@ -3229,9 +3206,9 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
const nsStylePosition* tablePosition;
|
const nsStylePosition* tablePosition;
|
||||||
const nsStyleSpacing* spacing;
|
const nsStyleSpacing* spacing;
|
||||||
nsIFrame* cell = nsnull;
|
nsIFrame* cell = nsnull;
|
||||||
rs->frame->QueryInterface(kTableCellFrameCID, (void**) &cell);
|
rv = rs->frame->QueryInterface(kTableCellFrameCID, (void**) &cell);
|
||||||
// if the cell has a specified width, use it
|
// if the cell has a specified width, use it
|
||||||
if (nsnull != cell)
|
if (NS_OK==rv)
|
||||||
{
|
{
|
||||||
// Compute and subtract out the insets (sum of border and padding) for the table
|
// Compute and subtract out the insets (sum of border and padding) for the table
|
||||||
cell->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)tablePosition));
|
cell->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)tablePosition));
|
||||||
@@ -3268,8 +3245,8 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
nsIFrame* table = nsnull;
|
nsIFrame* table = nsnull;
|
||||||
rs->frame->QueryInterface(kTableFrameCID, (void**) &table);
|
rv = rs->frame->QueryInterface(kTableFrameCID, (void**) &table);
|
||||||
if (nsnull != table) {
|
if (NS_OK==rv) {
|
||||||
/* We found the nearest containing table (actually, the inner table).
|
/* We found the nearest containing table (actually, the inner table).
|
||||||
This defines what our percentage size is relative to. Use its desired width
|
This defines what our percentage size is relative to. Use its desired width
|
||||||
as the basis for computing our width.
|
as the basis for computing our width.
|
||||||
@@ -3280,14 +3257,8 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
|
|||||||
**********************************************************************************
|
**********************************************************************************
|
||||||
*/
|
*/
|
||||||
// Compute and subtract out the insets (sum of border and padding) for the table
|
// Compute and subtract out the insets (sum of border and padding) for the table
|
||||||
/* the following hack is because the outer table really holds the position info */
|
table->GetStyleData(eStyleStruct_Position, (const nsStyleStruct *&)tablePosition);
|
||||||
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
table->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
|
||||||
nsIFrame * outerTableFrame = nsnull;
|
|
||||||
table->GetGeometricParent(outerTableFrame);
|
|
||||||
outerTableFrame->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)tablePosition));
|
|
||||||
outerTableFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
|
|
||||||
// end REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
|
||||||
|
|
||||||
if (eStyleUnit_Auto == tablePosition->mWidth.GetUnit())
|
if (eStyleUnit_Auto == tablePosition->mWidth.GetUnit())
|
||||||
{
|
{
|
||||||
parentWidth = NS_UNCONSTRAINEDSIZE;
|
parentWidth = NS_UNCONSTRAINEDSIZE;
|
||||||
@@ -3399,17 +3370,7 @@ PRBool nsTableFrame::TableIsAutoWidth(nsTableFrame *aTableFrame,
|
|||||||
PRBool result = PR_TRUE; // the default
|
PRBool result = PR_TRUE; // the default
|
||||||
if (nsnull!=aTableStyle)
|
if (nsnull!=aTableStyle)
|
||||||
{
|
{
|
||||||
//nsStylePosition* tablePosition = (nsStylePosition*)aTableStyle->GetData(eStyleStruct_Position);
|
nsStylePosition* tablePosition = (nsStylePosition*)aTableStyle->GetStyleData(eStyleStruct_Position);
|
||||||
/* this is sick and wrong, but what the hell
|
|
||||||
we grab the style of our parent (nsTableOuterFrame) and ask it for width info,
|
|
||||||
until the style resolution stuff does the cool stuff about splitting style between outer and inner
|
|
||||||
*/
|
|
||||||
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
|
||||||
nsIFrame * parent = nsnull;
|
|
||||||
aTableFrame->GetGeometricParent(parent);
|
|
||||||
const nsStylePosition* tablePosition;
|
|
||||||
parent->GetStyleData(eStyleStruct_Position, ((nsStyleStruct *&)tablePosition));
|
|
||||||
// end REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED!
|
|
||||||
nsMargin borderPadding;
|
nsMargin borderPadding;
|
||||||
const nsStyleSpacing* spacing;
|
const nsStyleSpacing* spacing;
|
||||||
switch (tablePosition->mWidth.GetUnit()) {
|
switch (tablePosition->mWidth.GetUnit()) {
|
||||||
|
|||||||
@@ -60,15 +60,16 @@ public:
|
|||||||
friend class nsTableOuterFrame;
|
friend class nsTableOuterFrame;
|
||||||
|
|
||||||
/** instantiate a new instance of nsTableFrame.
|
/** instantiate a new instance of nsTableFrame.
|
||||||
* @param aInstancePtrResult the new object is returned in this out-param
|
* @param aResult the new object is returned in this out-param
|
||||||
* @param aContent the table object to map
|
* @param aContent the table object to map
|
||||||
* @param aParent the parent of the new frame
|
* @param aParent the parent of the new frame
|
||||||
*
|
*
|
||||||
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
*/
|
*/
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
friend nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent);
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
// nsISupports
|
// nsISupports
|
||||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||||
|
|||||||
@@ -17,8 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
#include "nsTableOuterFrame.h"
|
#include "nsTableOuterFrame.h"
|
||||||
#include "nsTableFrame.h"
|
#include "nsTableFrame.h"
|
||||||
#include "nsITableContent.h"
|
|
||||||
#include "nsTableContent.h"
|
|
||||||
#include "nsBodyFrame.h"
|
#include "nsBodyFrame.h"
|
||||||
#include "nsIReflowCommand.h"
|
#include "nsIReflowCommand.h"
|
||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
@@ -45,8 +43,6 @@ static const PRBool gsDebug = PR_FALSE;
|
|||||||
static const PRBool gsTiming = PR_FALSE;
|
static const PRBool gsTiming = PR_FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
|
||||||
|
|
||||||
NS_DEF_PTR(nsIStyleContext);
|
NS_DEF_PTR(nsIStyleContext);
|
||||||
NS_DEF_PTR(nsIContent);
|
NS_DEF_PTR(nsIContent);
|
||||||
|
|
||||||
@@ -623,13 +619,13 @@ nsresult nsTableOuterFrame::CreateChildFrames(nsIPresContext* aPresContext)
|
|||||||
if (NS_STYLE_DISPLAY_TABLE_CAPTION == childDisplay->mDisplay)
|
if (NS_STYLE_DISPLAY_TABLE_CAPTION == childDisplay->mDisplay)
|
||||||
{
|
{
|
||||||
// Create the caption frame.
|
// Create the caption frame.
|
||||||
// XXX In general (e.g. in an XML document) there's no reason to assume
|
nsIContentDelegate* kidDel = nsnull;
|
||||||
// that the content object is of type nsIHTMLContent
|
kidDel = caption->GetDelegate(aPresContext);
|
||||||
result = ((nsIHTMLContent*)(nsIContent*)caption)->CreateFrame(aPresContext,
|
nsresult rv = kidDel->CreateFrame(aPresContext, caption, this, captionSC,
|
||||||
this, captionSC,
|
mCaptionFrame);
|
||||||
mCaptionFrame);
|
NS_RELEASE(kidDel);
|
||||||
if (NS_OK != result) {
|
if (NS_OK != rv) {
|
||||||
return result;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine if the caption is a top or bottom caption
|
// Determine if the caption is a top or bottom caption
|
||||||
@@ -849,21 +845,18 @@ nsresult nsTableOuterFrame::CreateInnerTableFrame(nsIPresContext* aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----- static methods ----- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableOuterFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableOuterFrame( nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableOuterFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableOuterFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,16 +38,17 @@ class nsTableOuterFrame : public nsContainerFrame
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** instantiate a new instance of nsTableFrame.
|
/** instantiate a new instance of nsTableOuterFrame.
|
||||||
* @param aInstancePtrResult the new object is returned in this out-param
|
* @param aResult the new object is returned in this out-param
|
||||||
* @param aContent the table object to map
|
* @param aContent the table object to map
|
||||||
* @param aParent the parent of the new frame
|
* @param aParent the parent of the new frame
|
||||||
*
|
*
|
||||||
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
*/
|
*/
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
friend nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableOuterFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent);
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
/** @see nsIFrame::Paint */
|
/** @see nsIFrame::Paint */
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
|
|||||||
@@ -32,9 +32,8 @@
|
|||||||
#include "nsIReflowCommand.h"
|
#include "nsIReflowCommand.h"
|
||||||
#include "nsCSSRendering.h"
|
#include "nsCSSRendering.h"
|
||||||
// the following header files are required for style optimizations that work only when the child content is really a cell
|
// the following header files are required for style optimizations that work only when the child content is really a cell
|
||||||
#include "nsITableContent.h"
|
#include "nsIHTMLTableCellElement.h"
|
||||||
#include "nsTableCell.h"
|
static NS_DEFINE_IID(kIHTMLTableCellElementIID, NS_IHTMLTABLECELLELEMENT_IID);
|
||||||
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
|
|
||||||
// end includes for style optimizations that require real content knowledge
|
// end includes for style optimizations that require real content knowledge
|
||||||
|
|
||||||
NS_DEF_PTR(nsIStyleContext);
|
NS_DEF_PTR(nsIStyleContext);
|
||||||
@@ -553,18 +552,14 @@ nsTableRowFrame::InitialReflow(nsIPresContext& aPresContext,
|
|||||||
* other tags mapped to table cell display won't benefit from this optimization
|
* other tags mapped to table cell display won't benefit from this optimization
|
||||||
* see nsHTMLStyleSheet::RulesMatching
|
* see nsHTMLStyleSheet::RulesMatching
|
||||||
*/
|
*/
|
||||||
nsITableContent *tableContentInterface = nsnull;
|
nsIHTMLTableCellElement *cellContent = nsnull;
|
||||||
nsresult rv = cell->QueryInterface(kITableContentIID,
|
nsresult rv = cell->QueryInterface(kIHTMLTableCellElementIID,
|
||||||
(void **)&tableContentInterface); // tableContentInterface: REFCNT++
|
(void **)&cellContent); // cellContent: REFCNT++
|
||||||
if (NS_SUCCEEDED(rv))
|
if (NS_SUCCEEDED(rv))
|
||||||
{ // we know it's a table part of some sort, is it a cell?
|
{ // we know it's a table cell
|
||||||
const int contentType = ((nsTableContent *)tableContentInterface)->GetType();
|
cellContent->SetColIndex(colIndex);
|
||||||
if (contentType == nsITableContent::kTableCellType)
|
if (gsDebug) printf("%p : set cell content %p to col index = %d\n", this, cellContent, colIndex);
|
||||||
{
|
NS_RELEASE(cellContent);
|
||||||
((nsTableCell *)tableContentInterface)->SetColIndex(colIndex);
|
|
||||||
if (gsDebug) printf("%p : set cell content %p to col index = %d\n", this, tableContentInterface, colIndex);
|
|
||||||
}
|
|
||||||
NS_RELEASE(tableContentInterface);
|
|
||||||
}
|
}
|
||||||
// part of the style optimization is to ensure that the column frame for the cell exists
|
// part of the style optimization is to ensure that the column frame for the cell exists
|
||||||
// we used to do this post-pass1, now we do it incrementally for the optimization
|
// we used to do this post-pass1, now we do it incrementally for the optimization
|
||||||
@@ -587,7 +582,7 @@ nsTableRowFrame::InitialReflow(nsIPresContext& aPresContext,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// this sets the frame's notion of it's column index
|
// this sets the frame's notion of it's column index
|
||||||
((nsTableCellFrame *)kidFrame)->SetColIndex(colIndex);
|
((nsTableCellFrame *)kidFrame)->InitCellFrame(colIndex);
|
||||||
if (gsDebug) printf("%p : set cell frame %p to col index = %d\n", this, kidFrame, colIndex);
|
if (gsDebug) printf("%p : set cell frame %p to col index = %d\n", this, kidFrame, colIndex);
|
||||||
// add the cell frame to the table's cell map
|
// add the cell frame to the table's cell map
|
||||||
aState.tableFrame->AddCellToTable(this, (nsTableCellFrame *)kidFrame, isFirst);
|
aState.tableFrame->AddCellToTable(this, (nsTableCellFrame *)kidFrame, isFirst);
|
||||||
@@ -1005,19 +1000,18 @@ nsTableRowFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_ERROR_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult nsTableRowFrame::NewFrame( nsIFrame** aInstancePtrResult,
|
/* ----- global methods ----- */
|
||||||
nsIContent* aContent,
|
|
||||||
nsIFrame* aParent)
|
nsresult
|
||||||
|
NS_NewTableRowFrame(nsIContent* aContent,
|
||||||
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableRowFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableRowFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,15 +42,16 @@ public:
|
|||||||
void Init(PRInt32 aRowIndex);
|
void Init(PRInt32 aRowIndex);
|
||||||
|
|
||||||
/** instantiate a new instance of nsTableRowFrame.
|
/** instantiate a new instance of nsTableRowFrame.
|
||||||
* @param aInstancePtrResult the new object is returned in this out-param
|
* @param aResult the new object is returned in this out-param
|
||||||
* @param aContent the table object to map
|
* @param aContent the table object to map
|
||||||
* @param aParent the parent of the new frame
|
* @param aParent the parent of the new frame
|
||||||
*
|
*
|
||||||
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
*/
|
*/
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
friend nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableRowFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent);
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
/** @see nsIFrame::Paint */
|
/** @see nsIFrame::Paint */
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
|
|||||||
@@ -1195,21 +1195,18 @@ nsTableRowGroupFrame::CreateContinuingFrame(nsIPresContext& aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----- static methods ----- */
|
/* ----- global methods ----- */
|
||||||
|
|
||||||
nsresult nsTableRowGroupFrame::NewFrame(nsIFrame** aInstancePtrResult,
|
nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableRowGroupFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent)
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
nsIFrame* it = new nsTableRowGroupFrame(aContent, aParentFrame);
|
||||||
if (nsnull == aInstancePtrResult) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsIFrame* it = new nsTableRowGroupFrame(aContent, aParent);
|
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*aInstancePtrResult = it;
|
aResult = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,15 +40,16 @@ class nsTableRowGroupFrame : public nsContainerFrame
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
/** instantiate a new instance of nsTableRowGroupFrame.
|
/** instantiate a new instance of nsTableRowGroupFrame.
|
||||||
* @param aInstancePtrResult the new object is returned in this out-param
|
* @param aResult the new object is returned in this out-param
|
||||||
* @param aContent the table object to map
|
* @param aContent the table object to map
|
||||||
* @param aParent the parent of the new frame
|
* @param aParent the parent of the new frame
|
||||||
*
|
*
|
||||||
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
||||||
*/
|
*/
|
||||||
static nsresult NewFrame(nsIFrame** aInstancePtrResult,
|
friend nsresult
|
||||||
nsIContent* aContent,
|
NS_NewTableRowGroupFrame(nsIContent* aContent,
|
||||||
nsIFrame* aParent);
|
nsIFrame* aParentFrame,
|
||||||
|
nsIFrame*& aResult);
|
||||||
|
|
||||||
/** @see nsIFrame::Paint */
|
/** @see nsIFrame::Paint */
|
||||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||||
|
|||||||
Reference in New Issue
Block a user