?? css_computedstyle.cpp
字號:
/**
* css_computedstyle.cpp
*
* Copyright (C) 2004 Zack Rusin <zack@kde.org>
* Copyright (C) 2004 Apple Computer, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*/
#include "css_computedstyle.h"
#include "cssproperties.h"
#include "cssvalues.h"
#include "dom_atomicstring.h"
#include "dom_exception.h"
#include "dom_string.h"
#include "font.h"
#include "khtmllayout.h"
#include "loader.h"
#include "rendering/render_style.h"
#include "rendering/render_object.h"
#if APPLE_CHANGES
#include "KWQAssertions.h"
#include "KWQFontFamily.h"
#include "KWQLogging.h"
#endif
using khtml::EBorderStyle;
using khtml::ETextAlign;
using khtml::Font;
using khtml::FontDef;
using khtml::Length;
using khtml::LengthBox;
using khtml::RenderObject;
using khtml::RenderStyle;
using khtml::ShadowData;
using khtml::StyleDashboardRegion;
namespace DOM {
// List of all properties we know how to compute, omitting shorthands.
static const int computedProperties[] = {
CSS_PROP_BACKGROUND_COLOR,
CSS_PROP_BACKGROUND_IMAGE,
CSS_PROP_BACKGROUND_REPEAT,
CSS_PROP_BACKGROUND_ATTACHMENT,
CSS_PROP_BACKGROUND_POSITION,
CSS_PROP_BACKGROUND_POSITION_X,
CSS_PROP_BACKGROUND_POSITION_Y,
CSS_PROP_BORDER_COLLAPSE,
CSS_PROP_BORDER_SPACING,
CSS_PROP__KHTML_BORDER_HORIZONTAL_SPACING,
CSS_PROP__KHTML_BORDER_VERTICAL_SPACING,
CSS_PROP_BORDER_TOP_COLOR,
CSS_PROP_BORDER_RIGHT_COLOR,
CSS_PROP_BORDER_BOTTOM_COLOR,
CSS_PROP_BORDER_LEFT_COLOR,
CSS_PROP_BORDER_TOP_STYLE,
CSS_PROP_BORDER_RIGHT_STYLE,
CSS_PROP_BORDER_BOTTOM_STYLE,
CSS_PROP_BORDER_LEFT_STYLE,
CSS_PROP_BORDER_TOP_WIDTH,
CSS_PROP_BORDER_RIGHT_WIDTH,
CSS_PROP_BORDER_BOTTOM_WIDTH,
CSS_PROP_BORDER_LEFT_WIDTH,
CSS_PROP_BOTTOM,
CSS_PROP__KHTML_BOX_ALIGN,
CSS_PROP__KHTML_BOX_DIRECTION,
CSS_PROP__KHTML_BOX_FLEX,
CSS_PROP__KHTML_BOX_FLEX_GROUP,
CSS_PROP__KHTML_BOX_LINES,
CSS_PROP__KHTML_BOX_ORDINAL_GROUP,
CSS_PROP__KHTML_BOX_ORIENT,
CSS_PROP__KHTML_BOX_PACK,
CSS_PROP_CAPTION_SIDE,
CSS_PROP_CLEAR,
CSS_PROP_COLOR,
CSS_PROP_CURSOR,
CSS_PROP__APPLE_DASHBOARD_REGION,
CSS_PROP_DIRECTION,
CSS_PROP_DISPLAY,
CSS_PROP_EMPTY_CELLS,
CSS_PROP_FLOAT,
CSS_PROP_FONT_FAMILY,
CSS_PROP_FONT_SIZE,
CSS_PROP_FONT_STYLE,
CSS_PROP_FONT_VARIANT,
CSS_PROP_FONT_WEIGHT,
CSS_PROP_HEIGHT,
CSS_PROP_LEFT,
CSS_PROP_LETTER_SPACING,
CSS_PROP__KHTML_LINE_BREAK,
CSS_PROP__APPLE_LINE_CLAMP,
CSS_PROP_LINE_HEIGHT,
CSS_PROP_LIST_STYLE_IMAGE,
CSS_PROP_LIST_STYLE_POSITION,
CSS_PROP_LIST_STYLE_TYPE,
CSS_PROP_MARGIN_TOP,
CSS_PROP_MARGIN_RIGHT,
CSS_PROP_MARGIN_BOTTOM,
CSS_PROP_MARGIN_LEFT,
CSS_PROP__KHTML_MARQUEE_DIRECTION,
CSS_PROP__KHTML_MARQUEE_INCREMENT,
CSS_PROP__KHTML_MARQUEE_REPETITION,
CSS_PROP__KHTML_MARQUEE_STYLE,
CSS_PROP_MAX_HEIGHT,
CSS_PROP_MAX_WIDTH,
CSS_PROP_MIN_HEIGHT,
CSS_PROP_MIN_WIDTH,
CSS_PROP__KHTML_NBSP_MODE,
CSS_PROP_OPACITY,
CSS_PROP_ORPHANS,
CSS_PROP_OUTLINE_STYLE,
CSS_PROP_OVERFLOW,
CSS_PROP_PADDING_TOP,
CSS_PROP_PADDING_RIGHT,
CSS_PROP_PADDING_BOTTOM,
CSS_PROP_PADDING_LEFT,
CSS_PROP_PAGE_BREAK_AFTER,
CSS_PROP_PAGE_BREAK_BEFORE,
CSS_PROP_PAGE_BREAK_INSIDE,
CSS_PROP_POSITION,
CSS_PROP_RIGHT,
CSS_PROP_TABLE_LAYOUT,
CSS_PROP_TEXT_ALIGN,
CSS_PROP_TEXT_DECORATION,
CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT,
CSS_PROP_TEXT_INDENT,
CSS_PROP_TEXT_SHADOW,
CSS_PROP_TEXT_TRANSFORM,
CSS_PROP_TOP,
CSS_PROP_UNICODE_BIDI,
CSS_PROP__KHTML_USER_MODIFY,
CSS_PROP_VERTICAL_ALIGN,
CSS_PROP_VISIBILITY,
CSS_PROP_WHITE_SPACE,
CSS_PROP_WIDOWS,
CSS_PROP_WIDTH,
CSS_PROP_WORD_SPACING,
CSS_PROP_WORD_WRAP,
CSS_PROP_Z_INDEX,
};
const unsigned numComputedProperties = sizeof(computedProperties) / sizeof(computedProperties[0]);
static CSSValueImpl* valueForLength(const Length &length)
{
switch (length.type) {
case khtml::Percent:
return new CSSPrimitiveValueImpl(length.length(), CSSPrimitiveValue::CSS_PERCENTAGE);
case khtml::Fixed:
return new CSSPrimitiveValueImpl(length.length(), CSSPrimitiveValue::CSS_PX);
default: // FIXME: Intrinsic and MinIntrinsic should probably return keywords.
return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
}
}
static CSSValueImpl *valueForBorderStyle(EBorderStyle style)
{
switch (style) {
case khtml::BNONE:
return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
case khtml::BHIDDEN:
return new CSSPrimitiveValueImpl(CSS_VAL_HIDDEN);
case khtml::INSET:
return new CSSPrimitiveValueImpl(CSS_VAL_INSET);
case khtml::GROOVE:
return new CSSPrimitiveValueImpl(CSS_VAL_GROOVE);
case khtml::RIDGE:
return new CSSPrimitiveValueImpl(CSS_VAL_RIDGE);
case khtml::OUTSET:
return new CSSPrimitiveValueImpl(CSS_VAL_OUTSET);
case khtml::DOTTED:
return new CSSPrimitiveValueImpl(CSS_VAL_DOTTED);
case khtml::DASHED:
return new CSSPrimitiveValueImpl(CSS_VAL_DASHED);
case khtml::SOLID:
return new CSSPrimitiveValueImpl(CSS_VAL_SOLID);
case khtml::DOUBLE:
return new CSSPrimitiveValueImpl(CSS_VAL_DOUBLE);
}
ASSERT_NOT_REACHED();
return 0;
}
static CSSValueImpl *valueForTextAlign(ETextAlign align)
{
switch (align) {
case khtml::TAAUTO:
return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
case khtml::LEFT:
return new CSSPrimitiveValueImpl(CSS_VAL_LEFT);
case khtml::RIGHT:
return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT);
case khtml::CENTER:
return new CSSPrimitiveValueImpl(CSS_VAL_CENTER);
case khtml::JUSTIFY:
return new CSSPrimitiveValueImpl(CSS_VAL_JUSTIFY);
case khtml::KHTML_LEFT:
return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_LEFT);
case khtml::KHTML_RIGHT:
return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_RIGHT);
case khtml::KHTML_CENTER:
return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_CENTER);
}
ASSERT_NOT_REACHED();
return 0;
}
static CSSValueImpl* valueForShadow(const ShadowData *shadow)
{
if (!shadow)
return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
CSSValueListImpl *list = new CSSValueListImpl;
for (const ShadowData *s = shadow; s; s = s->next) {
CSSPrimitiveValueImpl *x = new CSSPrimitiveValueImpl(s->x, CSSPrimitiveValue::CSS_PX);
CSSPrimitiveValueImpl *y = new CSSPrimitiveValueImpl(s->y, CSSPrimitiveValue::CSS_PX);
CSSPrimitiveValueImpl *blur = new CSSPrimitiveValueImpl(s->blur, CSSPrimitiveValue::CSS_PX);
CSSPrimitiveValueImpl *color = new CSSPrimitiveValueImpl(s->color.rgb());
list->append(new ShadowValueImpl(x, y, blur, color));
}
return list;
}
static CSSValueImpl *getPositionOffsetValue(RenderObject *renderer, int propertyID)
{
if (!renderer)
return 0;
RenderStyle *style = renderer->style();
if (!style)
return 0;
Length l;
switch (propertyID) {
case CSS_PROP_LEFT:
l = style->left();
break;
case CSS_PROP_RIGHT:
l = style->right();
break;
case CSS_PROP_TOP:
l = style->top();
break;
case CSS_PROP_BOTTOM:
l = style->bottom();
break;
default:
return 0;
}
if (renderer->isPositioned())
return valueForLength(l);
if (renderer->isRelPositioned())
// FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined.
// In other words if left is auto and right is not auto, then left's computed value is negative right.
// So we should get the opposite length unit and see if it is auto.
return valueForLength(l);
return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
}
CSSComputedStyleDeclarationImpl::CSSComputedStyleDeclarationImpl(NodeImpl *n)
: m_node(n)
{
}
CSSComputedStyleDeclarationImpl::~CSSComputedStyleDeclarationImpl()
{
}
DOMString CSSComputedStyleDeclarationImpl::cssText() const
{
ERROR("unimplemented");
return DOMString();
}
void CSSComputedStyleDeclarationImpl::setCssText(const DOMString &, int &exceptionCode)
{
exceptionCode = DOMException::NO_MODIFICATION_ALLOWED_ERR;
}
// Display integers in integer format instead of "1.0".
static QString numberAsString(double n)
{
long i = static_cast<long>(n);
return i == n ? QString::number(i) : QString::number(n);
}
CSSValueImpl *CSSComputedStyleDeclarationImpl::getPropertyCSSValue(int propertyID) const
{
return getPropertyCSSValue(propertyID, UpdateLayout);
}
CSSValueImpl *CSSComputedStyleDeclarationImpl::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const
{
NodeImpl *node = m_node.handle();
if (!node)
return 0;
// Make sure our layout is up to date before we allow a query on these attributes.
DocumentImpl* docimpl = node->getDocument();
if (docimpl && updateLayout)
docimpl->updateLayout();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -