cssstyleselector.cpp
来自「将konqueror浏览器移植到ARM9 2410中」· C++ 代码 · 共 1,995 行 · 第 1/5 页
CPP
1,995 行
style->setBorderTopWidth(e->parentNode()->style()->borderTopWidth()); break; case CSS_PROP_BORDER_RIGHT_WIDTH: style->setBorderRightWidth(e->parentNode()->style()->borderRightWidth()); break; case CSS_PROP_BORDER_BOTTOM_WIDTH: style->setBorderBottomWidth(e->parentNode()->style()->borderBottomWidth()); break; case CSS_PROP_BORDER_LEFT_WIDTH: style->setBorderLeftWidth(e->parentNode()->style()->borderLeftWidth()); break; case CSS_PROP_OUTLINE_WIDTH: style->setOutlineWidth(e->parentNode()->style()->outlineWidth()); break; default: // ### break; } return; } if(!primitiveValue) break; short width = 3; // medium is default value switch(primitiveValue->getIdent()) { case CSS_VAL_THIN: width = 1; break; case CSS_VAL_MEDIUM: width = 3; break; case CSS_VAL_THICK: width = 5; break; case CSS_VAL_INVALID: width = primitiveValue->computeLength(style, doc); break; default: return; } if(width < 0) return; switch(prop->m_id) { case CSS_PROP_BORDER_TOP_WIDTH: style->setBorderTopWidth(width); break; case CSS_PROP_BORDER_RIGHT_WIDTH: style->setBorderRightWidth(width); break; case CSS_PROP_BORDER_BOTTOM_WIDTH: style->setBorderBottomWidth(width); break; case CSS_PROP_BORDER_LEFT_WIDTH: style->setBorderLeftWidth(width); break; case CSS_PROP_OUTLINE_WIDTH: style->setOutlineWidth(width); break; default: return; } return; } case CSS_PROP_MARKER_OFFSET: case CSS_PROP_LETTER_SPACING: case CSS_PROP_WORD_SPACING: { if(value->valueType() == CSSValue::CSS_INHERIT) { if(!e->parentNode()) return; switch(prop->m_id) { case CSS_PROP_MARKER_OFFSET: // ### break; case CSS_PROP_LETTER_SPACING: style->setLetterSpacing(e->parentNode()->style()->letterSpacing()); break; case CSS_PROP_WORD_SPACING: style->setWordSpacing(e->parentNode()->style()->wordSpacing()); break; default: // ### break; } return; } if(!primitiveValue) return; int width = primitiveValue->computeLength(style, doc);// reason : letter or word spacing may be negative.// if( width < 0 ) return; switch(prop->m_id) { case CSS_PROP_LETTER_SPACING: style->setLetterSpacing(width); break; case CSS_PROP_WORD_SPACING: style->setWordSpacing(width); break; // ### needs the definitions in renderstyle case CSS_PROP_MARKER_OFFSET: default: return; } }// length, percent case CSS_PROP_MAX_WIDTH: // +none +inherit if(primitiveValue && primitiveValue->getIdent() == CSS_VAL_NONE) apply = true; case CSS_PROP_TOP: case CSS_PROP_LEFT: case CSS_PROP_RIGHT: // http://www.w3.org/Style/css2-updates/REC-CSS2-19980512-errata // introduces static-position value for top, left & right if(prop->m_id != CSS_PROP_MAX_WIDTH && primitiveValue && primitiveValue->getIdent() == CSS_VAL_STATIC_POSITION) { //kdDebug( 6080 ) << "found value=static-position" << endl; l = Length ( 0, Static); apply = true; } case CSS_PROP_BOTTOM: case CSS_PROP_WIDTH: case CSS_PROP_MIN_WIDTH: case CSS_PROP_MARGIN_TOP: case CSS_PROP_MARGIN_RIGHT: case CSS_PROP_MARGIN_BOTTOM: case CSS_PROP_MARGIN_LEFT: // +inherit +auto if(prop->m_id != CSS_PROP_MAX_WIDTH && primitiveValue && primitiveValue->getIdent() == CSS_VAL_AUTO) { //kdDebug( 6080 ) << "found value=auto" << endl; apply = true; } case CSS_PROP_PADDING_TOP: case CSS_PROP_PADDING_RIGHT: case CSS_PROP_PADDING_BOTTOM: case CSS_PROP_PADDING_LEFT: case CSS_PROP_TEXT_INDENT: // +inherit { if(value->valueType() == CSSValue::CSS_INHERIT) { if(!e->parentNode()) return; switch(prop->m_id) { case CSS_PROP_MAX_WIDTH: style->setMaxWidth(e->parentNode()->style()->maxWidth()); break; case CSS_PROP_BOTTOM: style->setBottom(e->parentNode()->style()->bottom()); break; case CSS_PROP_TOP: style->setTop(e->parentNode()->style()->top()); break; case CSS_PROP_LEFT: style->setLeft(e->parentNode()->style()->left()); break; case CSS_PROP_RIGHT: style->setRight(e->parentNode()->style()->right()); break; case CSS_PROP_WIDTH: style->setWidth(e->parentNode()->style()->width()); break; case CSS_PROP_MIN_WIDTH: style->setMinWidth(e->parentNode()->style()->minWidth()); break; case CSS_PROP_PADDING_TOP: style->setPaddingTop(e->parentNode()->style()->paddingTop()); break; case CSS_PROP_PADDING_RIGHT: style->setPaddingRight(e->parentNode()->style()->paddingRight()); break; case CSS_PROP_PADDING_BOTTOM: style->setPaddingBottom(e->parentNode()->style()->paddingBottom()); break; case CSS_PROP_PADDING_LEFT: style->setPaddingLeft(e->parentNode()->style()->paddingLeft()); break; case CSS_PROP_MARGIN_TOP: style->setMarginTop(e->parentNode()->style()->marginTop()); break; case CSS_PROP_MARGIN_RIGHT: style->setMarginRight(e->parentNode()->style()->marginRight()); break; case CSS_PROP_MARGIN_BOTTOM: style->setMarginBottom(e->parentNode()->style()->marginBottom()); break; case CSS_PROP_MARGIN_LEFT: style->setMarginLeft(e->parentNode()->style()->marginLeft()); break; case CSS_PROP_TEXT_INDENT: style->setTextIndent(e->parentNode()->style()->textIndent()); break; default: return; } } else if(primitiveValue && !apply) { int type = primitiveValue->primitiveType(); if(type > CSSPrimitiveValue::CSS_PERCENTAGE && type < CSSPrimitiveValue::CSS_DEG) l = Length(primitiveValue->computeLength(style, doc), Fixed); else if(type == CSSPrimitiveValue::CSS_PERCENTAGE) l = Length((int)primitiveValue->getFloatValue(CSSPrimitiveValue::CSS_PERCENTAGE), Percent); else return; apply = true; } if(!apply) return; switch(prop->m_id) { case CSS_PROP_MAX_WIDTH: style->setMaxWidth(l); break; case CSS_PROP_BOTTOM: style->setBottom(l); break; case CSS_PROP_TOP: style->setTop(l); break; case CSS_PROP_LEFT: style->setLeft(l); break; case CSS_PROP_RIGHT: style->setRight(l); break; case CSS_PROP_WIDTH: style->setWidth(l); break; case CSS_PROP_MIN_WIDTH: style->setMinWidth(l); break; case CSS_PROP_PADDING_TOP: style->setPaddingTop(l); break; case CSS_PROP_PADDING_RIGHT: style->setPaddingRight(l); break; case CSS_PROP_PADDING_BOTTOM: style->setPaddingBottom(l); break; case CSS_PROP_PADDING_LEFT: style->setPaddingLeft(l); break; case CSS_PROP_MARGIN_TOP: style->setMarginTop(l); break; case CSS_PROP_MARGIN_RIGHT: style->setMarginRight(l); break; case CSS_PROP_MARGIN_BOTTOM: style->setMarginBottom(l); break; case CSS_PROP_MARGIN_LEFT: style->setMarginLeft(l); break; case CSS_PROP_TEXT_INDENT: style->setTextIndent(l); break; default: return; } } case CSS_PROP_MAX_HEIGHT: // +inherit +none !can be calculted directly! if(primitiveValue && primitiveValue->getIdent() == CSS_VAL_NONE) apply = true; case CSS_PROP_HEIGHT: case CSS_PROP_MIN_HEIGHT: // +inherit +auto !can be calculted directly! if(!prop->m_id == CSS_PROP_MAX_HEIGHT && primitiveValue && primitiveValue->getIdent() == CSS_VAL_AUTO) apply = true; if(value->valueType() == CSSValue::CSS_INHERIT) { if(!e->parentNode()) return; switch(prop->m_id) { case CSS_PROP_MAX_HEIGHT: style->setMaxHeight(e->parentNode()->style()->maxHeight()); break; case CSS_PROP_HEIGHT: style->setHeight(e->parentNode()->style()->height()); break; case CSS_PROP_MIN_HEIGHT: style->setMinHeight(e->parentNode()->style()->minHeight()); break; default: return; } return; } if(primitiveValue && !apply) { int type = primitiveValue->primitiveType(); if(type > CSSPrimitiveValue::CSS_PERCENTAGE && type < CSSPrimitiveValue::CSS_DEG) l = Length(primitiveValue->computeLength(style, doc), Fixed); else if(type == CSSPrimitiveValue::CSS_PERCENTAGE) { // ### compute from parents height!!! l = Length((int)primitiveValue->getFloatValue(CSSPrimitiveValue::CSS_PERCENTAGE), Percent); } else return; apply = true; } if(!apply) return; switch(prop->m_id) { case CSS_PROP_MAX_HEIGHT: style->setMaxHeight(l); break; case CSS_PROP_HEIGHT: style->setHeight(l); break; case CSS_PROP_MIN_HEIGHT: style->setMinHeight(l); break; default: return; } return; break; case CSS_PROP_VERTICAL_ALIGN: if(value->valueType() == CSSValue::CSS_INHERIT) { if(!e->parentNode()) return; style->setVerticalAlign(e->parentNode()->style()->verticalAlign()); return; } if(!primitiveValue) return; if(primitiveValue->getIdent()) { khtml::EVerticalAlign align; switch(primitiveValue->getIdent()) { case CSS_VAL_TOP: align = TOP; break; case CSS_VAL_BOTTOM: align = BOTTOM; break; case CSS_VAL_MIDDLE: align = MIDDLE; break; case CSS_VAL_BASELINE: align = BASELINE; break; case CSS_VAL_TEXT_BOTTOM: align = TEXT_BOTTOM; break; case CSS_VAL_TEXT_TOP: align = TEXT_TOP; break; case CSS_VAL_SUB: align = SUB; break; case CSS_VAL_SUPER: align = SUPER; break; case CSS_VAL__KONQ_BASELINE_MIDDLE: align = BASELINE_MIDDLE; break; default: return; } style->setVerticalAlign(align); return; } else { int type = primitiveValue->primitiveType(); Length l; if(type > CSSPrimitiveValue::CSS_PERCENTAGE && type < CSSPrimitiveValue::CSS_DEG) l = Length( primitiveValue->computeLength(style, doc), Fixed ); else if(type == CSSPrimitiveValue::CSS_PERCENTAGE) l = Length( int( primitiveValue->getFloatValue(CSSPrimitiveValue::CSS_PERCENTAGE) ), Percent ); style->setVerticalAlign( LENGTH ); style->setVerticalAlignLength( l ); } break; case CSS_PROP_FONT_SIZE: { QFont f = style->font(); int oldSize; float size = 0; int minFontSize = doc->view()->part()->settings()->minFontSize(); float toPix = 1.; // fallback if ( !khtml::printpainter ) toPix = paintDeviceMetrics->logicalDpiY()/72.; if ( !khtml::printpainter && toPix < 96./72. ) toPix = 96./72.; QValueList<int> standardSizes = doc->view()->part()->fontSizes(); if(e->parentNode()) { oldSize = e->parentNode()->style()->font().pixelSize(); } else { oldSize = (int)(standardSizes[3]*toPix); } if(value->valueType() == CSSValue::CSS_INHERIT) { size = oldSize; } else if(primitiveValue->getIdent()) { switch(primitiveValue->getIdent()) { case CSS_VAL_XX_SMALL: size = standardSizes[0]*toPix; break; case CSS_VAL_X_SMALL: size = standardSizes[1]*toPix; break; case CSS_VAL_SMALL: size = standardSizes[2]*toPix; break; case CSS_VAL_MEDIUM: size = standardSizes[3]*toPix; break; case CSS_VAL_LARGE: size = standardSizes[4]*toPix; break; case CSS_VAL_X_LARGE: size = standardSizes[5]*toPix; break; case CSS_VAL_XX_LARGE: size = standardSizes[6]*toPix; break; case CSS_VAL__KONQ_XXX_LARGE: size = ( standardSizes[6]*toPix*5 )/3; break; case CSS_VAL_LARGER: // ### use the next bigger standardSize!!! size = oldSize * 1.2; break; case CSS_VAL_SMALLER: size = oldSize / 1.2; break; default: return; } } else { int type = primitiveValue->primitiveType(); RenderStyle *parentStyle = style; // use the current style as fallback in case we have no parent if(e->parentNode()) parentStyle = e->parentNode()->style(); if(type > CSSPrimitiveValue::CSS_PERCENTAGE && type < CSSPrimitiveValue::CSS_DEG) size = primitiveValue->computeLengthFloat(parentStyle, doc); else if(type == CSSPrimitiveValue::CSS_PERCENTAGE) size = (primitiveValue->getFloatValue(CSSPrimitiveValue::CSS_PERCENTAGE) * parentStyle
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?