?? css_valueimpl.cpp
字號(hào):
}
DOMString CSSMutableStyleDeclarationImpl::item( unsigned long /*index*/ ) const
{
// ###
//return m_lstValues->at(index);
return DOMString();
}
CSSRuleImpl *CSSStyleDeclarationImpl::parentRule() const
{
return (m_parent && m_parent->isRule() ) ?
static_cast<CSSRuleImpl *>(m_parent) : 0;
}
DOM::DOMString CSSMutableStyleDeclarationImpl::cssText() const
{
DOMString result = "";
QValueListConstIterator<CSSProperty> end;
for (QValueListConstIterator<CSSProperty> it = m_values.begin(); it != end; ++it)
result += (*it).cssText();
return result;
}
void CSSMutableStyleDeclarationImpl::setCssText(const DOM::DOMString& text, int &exceptionCode)
{
exceptionCode = 0;
m_values.clear();
CSSParser parser(strictParsing);
parser.parseDeclaration(this, text);
// FIXME: Detect syntax errors and set exceptionCode.
setChanged();
}
void CSSMutableStyleDeclarationImpl::merge(CSSMutableStyleDeclarationImpl *other, bool argOverridesOnConflict)
{
QValueListConstIterator<CSSProperty> end;
for (QValueListConstIterator<CSSProperty> it = other->valuesIterator(); it != end; ++it) {
const CSSProperty &property = *it;
CSSValueImpl *value = getPropertyCSSValue(property.id());
if (value) {
value->ref();
value->deref();
if (!argOverridesOnConflict)
continue;
removeProperty(property.id());
}
m_values.append(property);
}
// FIXME: This probably should have a call to setChanged() if something changed. We may also wish to add
// a notifyChanged argument to this function to follow the model of other functions in this class.
}
void CSSStyleDeclarationImpl::diff(CSSMutableStyleDeclarationImpl *style) const
{
if (!style)
return;
QValueList<int> properties;
QValueListConstIterator<CSSProperty> end;
for (QValueListConstIterator<CSSProperty> it(style->valuesIterator()); it != end; ++it) {
const CSSProperty &property = *it;
CSSValueImpl *value = getPropertyCSSValue(property.id());
if (value) {
value->ref();
if (value->cssText() == property.value()->cssText()) {
properties.append(property.id());
}
value->deref();
}
}
for (QValueListIterator<int> it(properties.begin()); it != properties.end(); ++it)
style->removeProperty(*it);
}
// This is the list of properties we want to copy in the copyInheritableProperties() function.
// It is the intersection of the list of inherited CSS properties and the
// properties for which we have a computed implementation in this file.
const int inheritableProperties[] = {
CSS_PROP_BORDER_COLLAPSE,
CSS_PROP_BORDER_SPACING,
CSS_PROP_COLOR,
CSS_PROP_FONT_FAMILY,
CSS_PROP_FONT_SIZE,
CSS_PROP_FONT_STYLE,
CSS_PROP_FONT_VARIANT,
CSS_PROP_FONT_WEIGHT,
CSS_PROP_LETTER_SPACING,
CSS_PROP_LINE_HEIGHT,
CSS_PROP_TEXT_ALIGN,
CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT,
CSS_PROP_TEXT_INDENT,
CSS_PROP__APPLE_TEXT_SIZE_ADJUST,
CSS_PROP_TEXT_TRANSFORM,
CSS_PROP_ORPHANS,
CSS_PROP_WHITE_SPACE,
CSS_PROP_WIDOWS,
CSS_PROP_WORD_SPACING,
};
const unsigned numInheritableProperties = sizeof(inheritableProperties) / sizeof(inheritableProperties[0]);
// This is the list of properties we want to copy in the copyBlockProperties() function.
// It is the list of CSS properties that apply to specially to block-level elements.
static const int blockProperties[] = {
CSS_PROP_ORPHANS,
CSS_PROP_OVERFLOW, // This can be also be applied to replaced elements
CSS_PROP_PAGE_BREAK_AFTER,
CSS_PROP_PAGE_BREAK_BEFORE,
CSS_PROP_PAGE_BREAK_INSIDE,
CSS_PROP_TEXT_ALIGN,
CSS_PROP_TEXT_INDENT,
CSS_PROP_WIDOWS
};
const unsigned numBlockProperties = sizeof(blockProperties) / sizeof(blockProperties[0]);
CSSMutableStyleDeclarationImpl *CSSMutableStyleDeclarationImpl::copyBlockProperties() const
{
return copyPropertiesInSet(blockProperties, numBlockProperties);
}
void CSSMutableStyleDeclarationImpl::removeBlockProperties()
{
removePropertiesInSet(blockProperties, numBlockProperties);
}
void CSSMutableStyleDeclarationImpl::removeInheritableProperties()
{
removePropertiesInSet(inheritableProperties, numInheritableProperties);
}
CSSMutableStyleDeclarationImpl *CSSStyleDeclarationImpl::copyPropertiesInSet(const int *set, unsigned length) const
{
QValueList<CSSProperty> list;
for (unsigned i = 0; i < length; i++) {
CSSValueImpl *value = getPropertyCSSValue(set[i]);
if (value)
list.append(CSSProperty(set[i], value, false));
}
return new CSSMutableStyleDeclarationImpl(0, list);
}
void CSSMutableStyleDeclarationImpl::removePropertiesInSet(const int *set, unsigned length)
{
bool changed = false;
for (unsigned i = 0; i < length; i++) {
CSSValueImpl *value = getPropertyCSSValue(set[i]);
if (value) {
m_values.remove(CSSProperty(set[i], value, false));
changed = true;
}
}
if (changed)
setChanged();
}
CSSMutableStyleDeclarationImpl *CSSMutableStyleDeclarationImpl::makeMutable()
{
return this;
}
CSSMutableStyleDeclarationImpl *CSSMutableStyleDeclarationImpl::copy() const
{
return new CSSMutableStyleDeclarationImpl(0, m_values);
}
// --------------------------------------------------------------------------------------
unsigned short CSSInheritedValueImpl::cssValueType() const
{
return CSSValue::CSS_INHERIT;
}
DOM::DOMString CSSInheritedValueImpl::cssText() const
{
return DOMString("inherit");
}
unsigned short CSSInitialValueImpl::cssValueType() const
{
return CSSValue::CSS_INITIAL;
}
DOM::DOMString CSSInitialValueImpl::cssText() const
{
return DOMString("initial");
}
// ----------------------------------------------------------------------------------------
CSSValueListImpl::CSSValueListImpl()
{
}
CSSValueListImpl::~CSSValueListImpl()
{
CSSValueImpl *val = m_values.first();
while( val ) {
val->deref();
val = m_values.next();
}
}
unsigned short CSSValueListImpl::cssValueType() const
{
return CSSValue::CSS_VALUE_LIST;
}
void CSSValueListImpl::append(CSSValueImpl *val)
{
m_values.append(val);
val->ref();
}
DOM::DOMString CSSValueListImpl::cssText() const
{
DOMString result = "";
for (QPtrListIterator<CSSValueImpl> iterator(m_values); iterator.current(); ++iterator) {
if (result.length() != 0) {
result += ", ";
}
result += iterator.current()->cssText();
}
return result;
}
// -------------------------------------------------------------------------------------
CSSPrimitiveValueImpl::CSSPrimitiveValueImpl()
: CSSValueImpl()
{
m_type = 0;
}
CSSPrimitiveValueImpl::CSSPrimitiveValueImpl(int ident)
: CSSValueImpl()
{
m_value.ident = ident;
m_type = CSSPrimitiveValue::CSS_IDENT;
}
CSSPrimitiveValueImpl::CSSPrimitiveValueImpl(double num, CSSPrimitiveValue::UnitTypes type)
{
m_value.num = num;
m_type = type;
}
CSSPrimitiveValueImpl::CSSPrimitiveValueImpl(const DOMString &str, CSSPrimitiveValue::UnitTypes type)
{
m_value.string = str.implementation();
if(m_value.string) m_value.string->ref();
m_type = type;
}
CSSPrimitiveValueImpl::CSSPrimitiveValueImpl(const Counter &c)
{
m_value.counter = c.handle();
if (m_value.counter)
m_value.counter->ref();
m_type = CSSPrimitiveValue::CSS_COUNTER;
}
CSSPrimitiveValueImpl::CSSPrimitiveValueImpl( RectImpl *r)
{
m_value.rect = r;
if (m_value.rect)
m_value.rect->ref();
m_type = CSSPrimitiveValue::CSS_RECT;
}
CSSPrimitiveValueImpl::CSSPrimitiveValueImpl( DashboardRegionImpl *r)
{
m_value.region = r;
if (m_value.region)
m_value.region->ref();
m_type = CSSPrimitiveValue::CSS_DASHBOARD_REGION;
}
CSSPrimitiveValueImpl::CSSPrimitiveValueImpl(QRgb color)
{
m_value.rgbcolor = color;
m_type = CSSPrimitiveValue::CSS_RGBCOLOR;
}
CSSPrimitiveValueImpl::~CSSPrimitiveValueImpl()
{
cleanup();
}
void CSSPrimitiveValueImpl::cleanup()
{
switch(m_type) {
case CSSPrimitiveValue::CSS_STRING:
case CSSPrimitiveValue::CSS_URI:
case CSSPrimitiveValue::CSS_ATTR:
if(m_value.string) m_value.string->deref();
break;
case CSSPrimitiveValue::CSS_COUNTER:
m_value.counter->deref();
break;
case CSSPrimitiveValue::CSS_RECT:
m_value.rect->deref();
break;
case CSSPrimitiveValue::CSS_DASHBOARD_REGION:
if (m_value.region)
m_value.region->deref();
break;
default:
break;
}
m_type = 0;
}
int CSSPrimitiveValueImpl::computeLength( khtml::RenderStyle *style, QPaintDeviceMetrics *devMetrics )
{
double result = computeLengthFloat( style, devMetrics );
#if APPLE_CHANGES
// This conversion is imprecise, often resulting in values of, e.g., 44.99998. We
// need to go ahead and round if we're really close to the next integer value.
int intResult = (int)(result + (result < 0 ? -0.01 : +0.01));
#else
int intResult = (int)result;
#endif
return intResult;
}
int CSSPrimitiveValueImpl::computeLength( khtml::RenderStyle *style, QPaintDeviceMetrics *devMetrics,
double multiplier )
{
double result = multiplier * computeLengthFloat( style, devMetrics );
#if APPLE_CHANGES
// This conversion is imprecise, often resulting in values of, e.g., 44.99998. We
// need to go ahead and round if we're really close to the next integer value.
int intResult = (int)(result + (result < 0 ? -0.01 : +0.01));
#else
int intResult = (int)result;
#endif
return intResult;
}
double CSSPrimitiveValueImpl::computeLengthFloat( khtml::RenderStyle *style, QPaintDeviceMetrics *devMetrics,
bool applyZoomFactor )
{
unsigned short type = primitiveType();
double dpiY = 72.; // fallback
if ( devMetrics )
dpiY = devMetrics->logicalDpiY();
if ( !khtml::printpainter && dpiY < 96 )
dpiY = 96.;
double factor = 1.;
switch(type)
{
case CSSPrimitiveValue::CSS_EMS:
factor = applyZoomFactor ?
style->htmlFont().getFontDef().computedSize :
style->htmlFont().getFontDef().specifiedSize;
break;
case CSSPrimitiveValue::CSS_EXS:
// FIXME: We have a bug right now where the zoom will be applied multiple times to EX units.
// We really need to compute EX using fontMetrics for the original specifiedSize and not use
// our actual constructed rendering font.
{
QFontMetrics fm = style->fontMetrics();
#if APPLE_CHANGES
factor = fm.xHeight();
#else
QRect b = fm.boundingRect('x');
factor = b.height();
#endif
break;
}
case CSSPrimitiveValue::CSS_PX:
break;
case CSSPrimitiveValue::CSS_CM:
factor = dpiY/2.54; //72dpi/(2.54 cm/in)
break;
case CSSPrimitiveValue::CSS_MM:
factor = dpiY/25.4;
break;
case CSSPrimitiveValue::CSS_IN:
factor = dpiY;
break;
case CSSPrimitiveValue::CSS_PT:
factor = dpiY/72.;
break;
case CSSPrimitiveValue::CSS_PC:
// 1 pc == 12 pt
factor = dpiY*12./72.;
break;
default:
return -1;
}
return getFloatValue(type)*factor;
}
void CSSPrimitiveValueImpl::setFloatValue( unsigned short unitType, double floatValue, int &exceptioncode )
{
exceptioncode = 0;
cleanup();
// ### check if property supports this type
if(m_type > CSSPrimitiveValue::CSS_DIMENSION) {
exceptioncode = CSSException::SYNTAX_ERR + CSSException::_EXCEPTION_OFFSET;
return;
}
//if(m_type > CSSPrimitiveValue::CSS_DIMENSION) throw DOMException(DOMException::INVALID_ACCESS_ERR);
m_value.num = floatValue;
m_type = unitType;
}
void CSSPrimitiveValueImpl::setStringValue( unsigned short stringType, const DOMString &stringValue, int &exceptioncode )
{
exceptioncode = 0;
cleanup();
//if(m_type < CSSPrimitiveValue::CSS_STRING) throw DOMException(DOMException::INVALID_ACCESS_ERR);
//if(m_type > CSSPrimitiveValue::CSS_ATTR) throw DOMException(DOMException::INVALID_ACCESS_ERR);
if(m_type < CSSPrimitiveValue::CSS_STRING || m_type >> CSSPrimitiveValue::CSS_ATTR) {
exceptioncode = CSSException::SYNTAX_ERR + CSSException::_EXCEPTION_OFFSET;
return;
}
if(stringType != CSSPrimitiveValue::CSS_IDENT)
{
m_value.string = stringValue.implementation();
m_value.string->ref();
m_type = stringType;
}
// ### parse ident
}
DOMString CSSPrimitiveValueImpl::getStringValue() const
{
switch (m_type) {
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -