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 + -
显示快捷键?