css_renderstyledeclarationimpl.cpp

00001 
00022 #include "css_renderstyledeclarationimpl.h"
00023 
00024 #include "rendering/render_style.h"
00025 #include "rendering/render_object.h"
00026 
00027 #include "cssproperties.h"
00028 
00029 using namespace DOM;
00030 using namespace khtml;
00031 
00032 
00033 static CSSValueImpl *valueForLength(const Length &length, int max)
00034 {
00035     if (length.isPercent()) {
00036         return new CSSPrimitiveValueImpl(length._length, CSSPrimitiveValue::CSS_PERCENTAGE);
00037     }
00038     else {
00039         return new CSSPrimitiveValueImpl(length.minWidth(max), CSSPrimitiveValue::CSS_PX);
00040     }
00041 }
00042 
00043 static DOMString stringForBorderStyle(EBorderStyle style)
00044 {
00045     switch (style) {
00046     case khtml::BNATIVE:
00047         return "-khtml-native";
00048     case khtml::BNONE:
00049         return "none";
00050     case khtml::BHIDDEN:
00051         return "hidden";
00052     case khtml::INSET:
00053         return "inset";
00054     case khtml::GROOVE:
00055         return "groove";
00056     case khtml::RIDGE:
00057         return "ridge";
00058     case khtml::OUTSET:
00059         return "outset";
00060     case khtml::DOTTED:
00061         return "dotted";
00062     case khtml::DASHED:
00063         return "dashed";
00064     case khtml::SOLID:
00065         return "solid";
00066     case khtml::DOUBLE:
00067         return "double";
00068     }
00069     Q_ASSERT( 0 );
00070     return "";
00071 }
00072 
00073 static DOMString stringForTextAlign(ETextAlign align)
00074 {
00075     switch (align) {
00076     case khtml::TAAUTO:
00077         return "auto";
00078     case khtml::LEFT:
00079         return "left";
00080     case khtml::RIGHT:
00081         return "right";
00082     case khtml::CENTER:
00083         return "center";
00084     case khtml::JUSTIFY:
00085         return "justify";
00086     case khtml::KHTML_LEFT:
00087         return "-khtml-left";
00088     case khtml::KHTML_RIGHT:
00089         return "-khtml-right";
00090     case khtml::KHTML_CENTER:
00091         return "-khtml-center";
00092     }
00093     Q_ASSERT( 0 );
00094     return "";
00095 }
00096 
00097 DOMString khtml::stringForListStyleType(EListStyleType type)
00098 {
00099     switch (type) {
00100         case khtml::LDISC:
00101             return "disc";
00102         case khtml::LCIRCLE:
00103             return "circle";
00104         case khtml::LSQUARE:
00105             return "square";
00106         case khtml::LBOX:
00107             return "box";
00108         case khtml::LDIAMOND:
00109             return "-khtml-diamond";
00110         case khtml::LDECIMAL:
00111             return "decimal";
00112         case khtml::DECIMAL_LEADING_ZERO:
00113             return "decimal-leading-zero";
00114         case khtml::ARABIC_INDIC:
00115             return "-khtml-arabic-indic";
00116         case khtml::LAO:
00117             return "-khtml-lao";
00118         case khtml::PERSIAN:
00119             return "-khtml-persian";
00120         case khtml::URDU:
00121             return "-khtml-urdu";
00122         case khtml::THAI:
00123             return "-khtml-thai";
00124         case khtml::TIBETAN:
00125             return "-khtml-tibetan";
00126         case khtml::LOWER_ROMAN:
00127             return "lower-roman";
00128         case khtml::UPPER_ROMAN:
00129             return "upper-roman";
00130         case khtml::HEBREW:
00131             return "hebrew";
00132         case khtml::ARMENIAN:
00133             return "armenian";
00134         case khtml::GEORGIAN:
00135             return "georgian";
00136         case khtml::CJK_IDEOGRAPHIC:
00137             return "cjk-ideographic";
00138         case khtml::JAPANESE_FORMAL:
00139             return "-khtml-japanese-formal";
00140         case khtml::JAPANESE_INFORMAL:
00141             return "-khtml-japanese-informal";
00142         case khtml::SIMP_CHINESE_FORMAL:
00143             return "-khtml-simp-chinese-formal";
00144         case khtml::SIMP_CHINESE_INFORMAL:
00145             return "-khtml-simp-chinese-informal";
00146         case khtml::TRAD_CHINESE_FORMAL:
00147             return "-khtml-trad-chinese-formal";
00148         case khtml::TRAD_CHINESE_INFORMAL:
00149             return "-khtml-trad-chinese-informal";
00150         case khtml::LOWER_GREEK:
00151             return "lower-greek";
00152         case khtml::UPPER_GREEK:
00153             return "-khtml-upper-greek";
00154         case khtml::LOWER_ALPHA:
00155             return "lower-alpha";
00156         case khtml::UPPER_ALPHA:
00157             return "upper-alpha";
00158         case khtml::LOWER_LATIN:
00159             return "lower-latin";
00160         case khtml::UPPER_LATIN:
00161             return "upper-latin";
00162         case khtml::HIRAGANA:
00163             return "hiragana";
00164         case khtml::KATAKANA:
00165             return "katakana";
00166         case khtml::HIRAGANA_IROHA:
00167             return "hiragana-iroha";
00168         case khtml::KATAKANA_IROHA:
00169             return "katakana_iroha";
00170         case khtml::LNONE:
00171             return "none";
00172     }
00173     Q_ASSERT( 0 );
00174     return "";
00175 }
00176 
00177 RenderStyleDeclarationImpl::RenderStyleDeclarationImpl( DOM::NodeImpl *node )
00178     : CSSStyleDeclarationImpl(0), m_node(node)
00179 {
00180     kdDebug() << "Render Style Declaration created" << endl;
00181 }
00182 
00183 RenderStyleDeclarationImpl::~RenderStyleDeclarationImpl()
00184 {
00185     kdDebug() << "Render Style Declaration destroyed" << endl;
00186 }
00187 
00188 DOM::DOMString RenderStyleDeclarationImpl::cssText() const
00189 {
00190     return DOMString();
00191 }
00192 
00193 void RenderStyleDeclarationImpl::setCssText( DOM::DOMString )
00194 {
00195     // ### report that this sucka is read only
00196 }
00197 
00198 CSSValueImpl *RenderStyleDeclarationImpl::getPropertyCSSValue( int propertyID ) const
00199 {
00200     NodeImpl *node = m_node.get();
00201     if (!node)
00202         return 0;
00203 
00204     // Make sure our layout is up to date before we allow a query on these attributes.
00205     DocumentImpl* docimpl = node->getDocument();
00206     if (docimpl) {
00207         docimpl->updateLayout();
00208     }
00209 
00210     RenderObject *renderer = m_node->renderer();
00211     if (!renderer)
00212         return 0;
00213     RenderStyle *style = renderer->style();
00214     if (!style)
00215         return 0;
00216 
00217     switch(propertyID)
00218     {
00219     case CSS_PROP_BACKGROUND_COLOR:
00220         return new CSSPrimitiveValueImpl(style->backgroundColor().rgb());
00221     case CSS_PROP_BACKGROUND_IMAGE:
00222         if (style->backgroundImage())
00223             return new CSSPrimitiveValueImpl(style->backgroundImage()->url(),
00224                                              CSSPrimitiveValue::CSS_URI);
00225         return 0;
00226     case CSS_PROP_BACKGROUND_REPEAT:
00227         switch (style->backgroundRepeat()) {
00228         case khtml::REPEAT:
00229             return new CSSPrimitiveValueImpl("repeat", CSSPrimitiveValue::CSS_STRING);
00230         case khtml::REPEAT_X:
00231             return new CSSPrimitiveValueImpl("repeat-x", CSSPrimitiveValue::CSS_STRING);
00232         case khtml::REPEAT_Y:
00233             return new CSSPrimitiveValueImpl("repeat-y", CSSPrimitiveValue::CSS_STRING);
00234         case khtml::NO_REPEAT:
00235             return new CSSPrimitiveValueImpl("no-repeat", CSSPrimitiveValue::CSS_STRING);
00236         default:
00237             Q_ASSERT( 0 );
00238         }
00239     case CSS_PROP_BACKGROUND_ATTACHMENT:
00240         if (style->backgroundAttachment())
00241             return new CSSPrimitiveValueImpl("scroll", CSSPrimitiveValue::CSS_STRING);
00242         else
00243             return new CSSPrimitiveValueImpl("fixed", CSSPrimitiveValue::CSS_STRING);
00244     case CSS_PROP_BACKGROUND_POSITION:
00245     {
00246         DOMString string;
00247         Length length(style->backgroundXPosition());
00248         if (length.isPercent())
00249             string = QString::number(length._length) + "%";
00250         else
00251             string = QString::number(length.minWidth(renderer->contentWidth()));
00252         string += " ";
00253         length = style->backgroundYPosition();
00254         if (length.isPercent())
00255             string += QString::number(length._length) + "%";
00256         else
00257             string += QString::number(length.minWidth(renderer->contentWidth()));
00258         return new CSSPrimitiveValueImpl(string, CSSPrimitiveValue::CSS_STRING);
00259     }
00260     case CSS_PROP_BACKGROUND_POSITION_X:
00261         return valueForLength(style->backgroundXPosition(), renderer->contentWidth());
00262     case CSS_PROP_BACKGROUND_POSITION_Y:
00263         return valueForLength(style->backgroundYPosition(), renderer->contentHeight());
00264     case CSS_PROP_BORDER_COLLAPSE:
00265         if (style->borderCollapse())
00266             return new CSSPrimitiveValueImpl("collapse", CSSPrimitiveValue::CSS_STRING);
00267         else
00268             return new CSSPrimitiveValueImpl("separate", CSSPrimitiveValue::CSS_STRING);
00269     case CSS_PROP_BORDER_SPACING:
00270     {
00271         QString string(QString::number(style->borderHorizontalSpacing()) +
00272                        "px " +
00273                        QString::number(style->borderVerticalSpacing()) +
00274                        "px");
00275         return new CSSPrimitiveValueImpl(string, CSSPrimitiveValue::CSS_STRING);
00276     }
00277     case CSS_PROP__KHTML_BORDER_HORIZONTAL_SPACING:
00278         return new CSSPrimitiveValueImpl(style->borderHorizontalSpacing(),
00279                                          CSSPrimitiveValue::CSS_PX);
00280     case CSS_PROP__KHTML_BORDER_VERTICAL_SPACING:
00281         return new CSSPrimitiveValueImpl(style->borderVerticalSpacing(),
00282                                          CSSPrimitiveValue::CSS_PX);
00283     case CSS_PROP_BORDER_TOP_COLOR:
00284         return new CSSPrimitiveValueImpl(style->borderLeftColor().rgb());
00285     case CSS_PROP_BORDER_RIGHT_COLOR:
00286         return new CSSPrimitiveValueImpl(style->borderRightColor().rgb());
00287     case CSS_PROP_BORDER_BOTTOM_COLOR:
00288         return new CSSPrimitiveValueImpl(style->borderBottomColor().rgb());
00289     case CSS_PROP_BORDER_LEFT_COLOR:
00290         return new CSSPrimitiveValueImpl(style->borderLeftColor().rgb());
00291     case CSS_PROP_BORDER_TOP_STYLE:
00292         return new CSSPrimitiveValueImpl(stringForBorderStyle(style->borderTopStyle()),
00293                                          CSSPrimitiveValue::CSS_STRING);
00294     case CSS_PROP_BORDER_RIGHT_STYLE:
00295         return new CSSPrimitiveValueImpl(stringForBorderStyle(style->borderRightStyle()),
00296                                          CSSPrimitiveValue::CSS_STRING);
00297     case CSS_PROP_BORDER_BOTTOM_STYLE:
00298         return new CSSPrimitiveValueImpl(stringForBorderStyle(style->borderBottomStyle()),
00299                                          CSSPrimitiveValue::CSS_STRING);
00300     case CSS_PROP_BORDER_LEFT_STYLE:
00301         return new CSSPrimitiveValueImpl(stringForBorderStyle(style->borderLeftStyle()),
00302                                          CSSPrimitiveValue::CSS_STRING);
00303     case CSS_PROP_BORDER_TOP_WIDTH:
00304         return new CSSPrimitiveValueImpl( style->borderTopWidth(), CSSPrimitiveValue::CSS_PX );
00305     case CSS_PROP_BORDER_RIGHT_WIDTH:
00306         return new CSSPrimitiveValueImpl( style->borderRightWidth(), CSSPrimitiveValue::CSS_PX );
00307     case CSS_PROP_BORDER_BOTTOM_WIDTH:
00308         return new CSSPrimitiveValueImpl( style->borderBottomWidth(), CSSPrimitiveValue::CSS_PX );
00309     case CSS_PROP_BORDER_LEFT_WIDTH:
00310         return new CSSPrimitiveValueImpl( style->borderLeftWidth(), CSSPrimitiveValue::CSS_PX );
00311     case CSS_PROP_BOTTOM:
00312         break;
00313     case CSS_PROP_CAPTION_SIDE:
00314         break;
00315     case CSS_PROP_CLEAR:
00316         break;
00317     case CSS_PROP_CLIP:
00318         break;
00319     case CSS_PROP_COLOR:
00320         return new CSSPrimitiveValueImpl(style->color().rgb());
00321     case CSS_PROP_CONTENT:
00322         break;
00323     case CSS_PROP_COUNTER_INCREMENT:
00324         break;
00325     case CSS_PROP_COUNTER_RESET:
00326         break;
00327     case CSS_PROP_CURSOR:
00328         break;
00329     case CSS_PROP_DIRECTION:
00330         break;
00331     case CSS_PROP_DISPLAY:
00332         switch (style->display()) {
00333         case khtml::INLINE:
00334             return new CSSPrimitiveValueImpl("inline", CSSPrimitiveValue::CSS_STRING);
00335         case khtml::BLOCK:
00336             return new CSSPrimitiveValueImpl("block", CSSPrimitiveValue::CSS_STRING);
00337         case khtml::LIST_ITEM:
00338             return new CSSPrimitiveValueImpl("list-item", CSSPrimitiveValue::CSS_STRING);
00339         case khtml::RUN_IN:
00340             return new CSSPrimitiveValueImpl("run-in", CSSPrimitiveValue::CSS_STRING);
00341         case khtml::COMPACT:
00342             return new CSSPrimitiveValueImpl("compact", CSSPrimitiveValue::CSS_STRING);
00343         case khtml::INLINE_BLOCK:
00344             return new CSSPrimitiveValueImpl("inline-block", CSSPrimitiveValue::CSS_STRING);
00345         case khtml::TABLE:
00346             return new CSSPrimitiveValueImpl("table", CSSPrimitiveValue::CSS_STRING);
00347         case khtml::INLINE_TABLE:
00348             return new CSSPrimitiveValueImpl("inline-table", CSSPrimitiveValue::CSS_STRING);
00349         case khtml::TABLE_ROW_GROUP:
00350             return new CSSPrimitiveValueImpl("table-row-group", CSSPrimitiveValue::CSS_STRING);
00351         case khtml::TABLE_HEADER_GROUP:
00352             return new CSSPrimitiveValueImpl("table-header-group", CSSPrimitiveValue::CSS_STRING);
00353         case khtml::TABLE_FOOTER_GROUP:
00354             return new CSSPrimitiveValueImpl("table-footer-group", CSSPrimitiveValue::CSS_STRING);
00355         case khtml::TABLE_ROW:
00356             return new CSSPrimitiveValueImpl("table-row", CSSPrimitiveValue::CSS_STRING);
00357         case khtml::TABLE_COLUMN_GROUP:
00358             return new CSSPrimitiveValueImpl("table-column-group", CSSPrimitiveValue::CSS_STRING);
00359         case khtml::TABLE_COLUMN:
00360             return new CSSPrimitiveValueImpl("table-column", CSSPrimitiveValue::CSS_STRING);
00361         case khtml::TABLE_CELL:
00362             return new CSSPrimitiveValueImpl("table-cell", CSSPrimitiveValue::CSS_STRING);
00363         case khtml::TABLE_CAPTION:
00364             return new CSSPrimitiveValueImpl("table-caption", CSSPrimitiveValue::CSS_STRING);
00365         case khtml::NONE:
00366             return new CSSPrimitiveValueImpl("none", CSSPrimitiveValue::CSS_STRING);
00367         default:
00368             Q_ASSERT( 0 );
00369         }
00370     case CSS_PROP_EMPTY_CELLS:
00371         switch (style->emptyCells()) {
00372             case khtml::SHOW:
00373                 return new CSSPrimitiveValueImpl("show", CSSPrimitiveValue::CSS_STRING);
00374             case khtml::HIDE:
00375                 return new CSSPrimitiveValueImpl("hide", CSSPrimitiveValue::CSS_STRING);
00376         }
00377         break;
00378     case CSS_PROP_FLOAT:
00379     {
00380         switch (style->floating()) {
00381         case khtml::FNONE:
00382             return new CSSPrimitiveValueImpl("none", CSSPrimitiveValue::CSS_STRING);
00383         case khtml::FLEFT:
00384             return new CSSPrimitiveValueImpl("left", CSSPrimitiveValue::CSS_STRING);
00385         case khtml::FRIGHT:
00386             return new CSSPrimitiveValueImpl("right", CSSPrimitiveValue::CSS_STRING);
00387         case khtml::FLEFT_ALIGN:
00388             return new CSSPrimitiveValueImpl("-khtml-left", CSSPrimitiveValue::CSS_STRING);
00389         case khtml::FRIGHT_ALIGN:
00390             return new CSSPrimitiveValueImpl("-khtml-right", CSSPrimitiveValue::CSS_STRING);
00391         }
00392     }
00393     case CSS_PROP_FONT_FAMILY:
00394     {
00395         FontDef def = style->htmlFont().getFontDef();
00396         return new CSSPrimitiveValueImpl(def.family, CSSPrimitiveValue::CSS_STRING);
00397     }
00398     case CSS_PROP_FONT_SIZE:
00399     {
00400         FontDef def = style->htmlFont().getFontDef();
00401         return new CSSPrimitiveValueImpl(def.size, CSSPrimitiveValue::CSS_PX);
00402     }
00403     case CSS_PROP_FONT_STYLE:
00404     {
00405         // FIXME: handle oblique
00406         FontDef def = style->htmlFont().getFontDef();
00407         if (def.italic)
00408             return new CSSPrimitiveValueImpl("italic", CSSPrimitiveValue::CSS_STRING);
00409         else
00410             return new CSSPrimitiveValueImpl("normal", CSSPrimitiveValue::CSS_STRING);
00411     }
00412     case CSS_PROP_FONT_VARIANT:
00413     {
00414         FontDef def = style->htmlFont().getFontDef();
00415         if (def.smallCaps)
00416             return new CSSPrimitiveValueImpl("small-caps", CSSPrimitiveValue::CSS_STRING);
00417         else
00418             return new CSSPrimitiveValueImpl("normal", CSSPrimitiveValue::CSS_STRING);
00419     }
00420     case CSS_PROP_FONT_WEIGHT:
00421     {
00422         // FIXME: this does not reflect the full range of weights
00423         // that can be expressed with CSS
00424         FontDef def = style->htmlFont().getFontDef();
00425         if (def.weight == QFont::Bold)
00426             return new CSSPrimitiveValueImpl("bold", CSSPrimitiveValue::CSS_STRING);
00427         else
00428             return new CSSPrimitiveValueImpl("normal", CSSPrimitiveValue::CSS_STRING);
00429     }
00430     case CSS_PROP_HEIGHT:
00431         return new CSSPrimitiveValueImpl(renderer->contentHeight(), CSSPrimitiveValue::CSS_PX);
00432     case CSS_PROP_LEFT:
00433         break;
00434     case CSS_PROP_LETTER_SPACING:
00435         if (style->letterSpacing() == 0)
00436             return new CSSPrimitiveValueImpl("normal", CSSPrimitiveValue::CSS_STRING);
00437         return new CSSPrimitiveValueImpl(style->letterSpacing(), CSSPrimitiveValue::CSS_PX);
00438     case CSS_PROP_LINE_HEIGHT:
00439     {
00440         Length length(style->lineHeight());
00441         if (length.isPercent()) {
00442             //XXX: merge from webcore the computedStyle/specifiedStyle distinction in rendering/font.h
00443             float computedSize = style->htmlFont().getFontDef().size;
00444             return new CSSPrimitiveValueImpl((int)(length._length * computedSize) / 100, CSSPrimitiveValue::CSS_PX);
00445         }
00446         else {
00447             return new CSSPrimitiveValueImpl(length._length, CSSPrimitiveValue::CSS_PX);
00448         }
00449     }
00450     case CSS_PROP_LIST_STYLE_IMAGE:
00451         break;
00452     case CSS_PROP_LIST_STYLE_POSITION:
00453         switch (style->listStylePosition()) {
00454         case OUTSIDE:
00455             return new CSSPrimitiveValueImpl("outside", CSSPrimitiveValue::CSS_STRING);
00456         case INSIDE:
00457             return new CSSPrimitiveValueImpl("inside", CSSPrimitiveValue::CSS_STRING);
00458         }
00459         Q_ASSERT( 0 );
00460         break;
00461     case CSS_PROP_LIST_STYLE_TYPE:
00462         return new CSSPrimitiveValueImpl(stringForListStyleType(style->listStyleType()), CSSPrimitiveValue::CSS_STRING);
00463     case CSS_PROP_MARGIN_TOP:
00464         return valueForLength(style->marginTop(), renderer->contentHeight());
00465     case CSS_PROP_MARGIN_RIGHT:
00466         return valueForLength(style->marginRight(), renderer->contentWidth());
00467     case CSS_PROP_MARGIN_BOTTOM:
00468         return valueForLength(style->marginBottom(), renderer->contentHeight());
00469     case CSS_PROP_MARGIN_LEFT:
00470         return valueForLength(style->marginLeft(), renderer->contentWidth());
00471     case CSS_PROP_MAX_HEIGHT:
00472         return new CSSPrimitiveValueImpl( renderer->availableHeight(),
00473                                           CSSPrimitiveValue::CSS_PX );
00474         break;
00475     case CSS_PROP_MAX_WIDTH:
00476         return new CSSPrimitiveValueImpl( renderer->maxWidth(),
00477                                           CSSPrimitiveValue::CSS_PX );
00478         break;
00479     case CSS_PROP_MIN_HEIGHT:
00480         return new CSSPrimitiveValueImpl( renderer->contentHeight(),
00481                                           CSSPrimitiveValue::CSS_PX );
00482         break;
00483     case CSS_PROP_MIN_WIDTH:
00484         return new CSSPrimitiveValueImpl( renderer->minWidth(),
00485                                           CSSPrimitiveValue::CSS_PX );
00486         break;
00487     case CSS_PROP_OPACITY:
00488         break;
00489     case CSS_PROP_ORPHANS:
00490         break;
00491     case CSS_PROP_OUTLINE_COLOR:
00492         break;
00493     case CSS_PROP_OUTLINE_OFFSET:
00494         break;
00495     case CSS_PROP_OUTLINE_STYLE:
00496         break;
00497     case CSS_PROP_OUTLINE_WIDTH:
00498         break;
00499     case CSS_PROP_OVERFLOW:
00500     {
00501         switch (style->overflow()) {
00502         case khtml::OVISIBLE:
00503             return new CSSPrimitiveValueImpl("visible", CSSPrimitiveValue::CSS_STRING);
00504         case khtml::OHIDDEN:
00505             return new CSSPrimitiveValueImpl("hidden", CSSPrimitiveValue::CSS_STRING);
00506         case khtml::OSCROLL:
00507             return new CSSPrimitiveValueImpl("scroll", CSSPrimitiveValue::CSS_STRING);
00508         case khtml::OAUTO:
00509             return new CSSPrimitiveValueImpl("auto", CSSPrimitiveValue::CSS_STRING);
00510         case khtml::OMARQUEE:
00511             return new CSSPrimitiveValueImpl("marquee", CSSPrimitiveValue::CSS_STRING);
00512         }
00513     }
00514     case CSS_PROP_PADDING_TOP:
00515         return valueForLength(style->paddingTop(), renderer->contentHeight());
00516     case CSS_PROP_PADDING_RIGHT:
00517         return valueForLength(style->paddingRight(), renderer->contentWidth());
00518     case CSS_PROP_PADDING_BOTTOM:
00519         return valueForLength(style->paddingBottom(), renderer->contentHeight());
00520     case CSS_PROP_PADDING_LEFT:
00521         return valueForLength(style->paddingLeft(), renderer->contentWidth());
00522     case CSS_PROP_PAGE_BREAK_AFTER:
00523         break;
00524     case CSS_PROP_PAGE_BREAK_BEFORE:
00525         break;
00526     case CSS_PROP_PAGE_BREAK_INSIDE:
00527         break;
00528     case CSS_PROP_POSITION:
00529         break;
00530     case CSS_PROP_QUOTES:
00531         break;
00532     case CSS_PROP_RIGHT:
00533         break;
00534     case CSS_PROP_SIZE:
00535         break;
00536     case CSS_PROP_TABLE_LAYOUT:
00537         break;
00538     case CSS_PROP_TEXT_ALIGN:
00539         return new CSSPrimitiveValueImpl(stringForTextAlign(style->textAlign()), CSSPrimitiveValue::CSS_STRING);
00540     case CSS_PROP_TEXT_DECORATION:
00541     {
00542         QString string;
00543         if (style->textDecoration() & khtml::UNDERLINE)
00544             string += "underline";
00545         if (style->textDecoration() & khtml::OVERLINE) {
00546             if (string.length() > 0)
00547                 string += " ";
00548             string += "overline";
00549         }
00550         if (style->textDecoration() & khtml::LINE_THROUGH) {
00551             if (string.length() > 0)
00552                 string += " ";
00553             string += "line-through";
00554         }
00555         if (style->textDecoration() & khtml::BLINK) {
00556             if (string.length() > 0)
00557                 string += " ";
00558             string += "blink";
00559         }
00560         if (string.length() == 0)
00561             string = "none";
00562         return new CSSPrimitiveValueImpl(string, CSSPrimitiveValue::CSS_STRING);
00563     }
00564     case CSS_PROP_TEXT_INDENT:
00565         return valueForLength(style->textIndent(), renderer->contentWidth());
00566     case CSS_PROP_TEXT_TRANSFORM:
00567         break;
00568     case CSS_PROP_TOP:
00569         break;
00570     case CSS_PROP_UNICODE_BIDI:
00571         break;
00572     case CSS_PROP_VERTICAL_ALIGN:
00573     {
00574         switch (style->verticalAlign()) {
00575         case khtml::BASELINE:
00576             return new CSSPrimitiveValueImpl("baseline", CSSPrimitiveValue::CSS_STRING);
00577         case khtml::MIDDLE:
00578             return new CSSPrimitiveValueImpl("middle", CSSPrimitiveValue::CSS_STRING);
00579         case khtml::SUB:
00580             return new CSSPrimitiveValueImpl("sub", CSSPrimitiveValue::CSS_STRING);
00581         case khtml::SUPER:
00582             return new CSSPrimitiveValueImpl("super", CSSPrimitiveValue::CSS_STRING);
00583         case khtml::TEXT_TOP:
00584             return new CSSPrimitiveValueImpl("text-top", CSSPrimitiveValue::CSS_STRING);
00585         case khtml::TEXT_BOTTOM:
00586             return new CSSPrimitiveValueImpl("text-bottom", CSSPrimitiveValue::CSS_STRING);
00587         case khtml::TOP:
00588             return new CSSPrimitiveValueImpl("top", CSSPrimitiveValue::CSS_STRING);
00589         case khtml::BOTTOM:
00590             return new CSSPrimitiveValueImpl("bottom", CSSPrimitiveValue::CSS_STRING);
00591         case khtml::BASELINE_MIDDLE:
00592             return new CSSPrimitiveValueImpl("baseline-middle", CSSPrimitiveValue::CSS_STRING);
00593         case khtml::LENGTH:
00594             return valueForLength(style->verticalAlignLength(), renderer->contentWidth());
00595         }
00596     }
00597     case CSS_PROP_VISIBILITY:
00598         switch (style->visibility()) {
00599             case khtml::VISIBLE:
00600                 return new CSSPrimitiveValueImpl("visible", CSSPrimitiveValue::CSS_STRING);
00601             case khtml::HIDDEN:
00602                 return new CSSPrimitiveValueImpl("hidden", CSSPrimitiveValue::CSS_STRING);
00603             case khtml::COLLAPSE:
00604                 return new CSSPrimitiveValueImpl("collapse", CSSPrimitiveValue::CSS_STRING);
00605         }
00606         break;
00607     case CSS_PROP_WHITE_SPACE:
00608     {
00609         switch (style->whiteSpace()) {
00610             case khtml::NORMAL:
00611                 return new CSSPrimitiveValueImpl("normal", CSSPrimitiveValue::CSS_STRING);
00612             case khtml::NOWRAP:
00613                 return new CSSPrimitiveValueImpl("nowrap", CSSPrimitiveValue::CSS_STRING);
00614             case khtml::PRE:
00615                 return new CSSPrimitiveValueImpl("pre", CSSPrimitiveValue::CSS_STRING);
00616             case khtml::PRE_WRAP:
00617                 return new CSSPrimitiveValueImpl("pre-wrap", CSSPrimitiveValue::CSS_STRING);
00618             case khtml::PRE_LINE:
00619                 return new CSSPrimitiveValueImpl("pre-line", CSSPrimitiveValue::CSS_STRING);
00620             case khtml::KHTML_NOWRAP:
00621                 return new CSSPrimitiveValueImpl("-khtml-nowrap", CSSPrimitiveValue::CSS_STRING);
00622         }
00623         break;
00624     }
00625     case CSS_PROP_WIDOWS:
00626         break;
00627     case CSS_PROP_WIDTH:
00628         return new CSSPrimitiveValueImpl( renderer->contentWidth(),
00629                                          CSSPrimitiveValue::CSS_PX );
00630     case CSS_PROP_WORD_SPACING:
00631         return new CSSPrimitiveValueImpl(style->wordSpacing(), CSSPrimitiveValue::CSS_PX);
00632     case CSS_PROP_Z_INDEX:
00633         break;
00634     case CSS_PROP_BACKGROUND:
00635         break;
00636     case CSS_PROP_BORDER:
00637         break;
00638     case CSS_PROP_BORDER_COLOR:
00639         break;
00640     case CSS_PROP_BORDER_STYLE:
00641         break;
00642     case CSS_PROP_BORDER_TOP:
00643         return new CSSPrimitiveValueImpl( renderer->borderTop(),
00644                                          CSSPrimitiveValue::CSS_PX );
00645         break;
00646     case CSS_PROP_BORDER_RIGHT:
00647         return new CSSPrimitiveValueImpl( renderer->borderRight(),
00648                                          CSSPrimitiveValue::CSS_PX );
00649         break;
00650     case CSS_PROP_BORDER_BOTTOM:
00651         return new CSSPrimitiveValueImpl( renderer->borderBottom(),
00652                                          CSSPrimitiveValue::CSS_PX );
00653         break;
00654     case CSS_PROP_BORDER_LEFT:
00655         return new CSSPrimitiveValueImpl( renderer->borderLeft(),
00656                                          CSSPrimitiveValue::CSS_PX );
00657         break;
00658     case CSS_PROP_BORDER_WIDTH:
00659         break;
00660     case CSS_PROP_FONT:
00661         break;
00662     case CSS_PROP_LIST_STYLE:
00663         break;
00664     case CSS_PROP_MARGIN:
00665         break;
00666     case CSS_PROP_OUTLINE:
00667         break;
00668     case CSS_PROP_PADDING:
00669         break;
00670     case CSS_PROP_SCROLLBAR_BASE_COLOR:
00671         break;
00672     case CSS_PROP_SCROLLBAR_FACE_COLOR:
00673         break;
00674     case CSS_PROP_SCROLLBAR_SHADOW_COLOR:
00675         break;
00676     case CSS_PROP_SCROLLBAR_HIGHLIGHT_COLOR:
00677         break;
00678     case CSS_PROP_SCROLLBAR_3DLIGHT_COLOR:
00679         break;
00680     case CSS_PROP_SCROLLBAR_DARKSHADOW_COLOR:
00681         break;
00682     case CSS_PROP_SCROLLBAR_TRACK_COLOR:
00683         break;
00684     case CSS_PROP_SCROLLBAR_ARROW_COLOR:
00685         break;
00686     case CSS_PROP__KHTML_FLOW_MODE:
00687         break;
00688     case CSS_PROP__KHTML_USER_INPUT:
00689         break;
00690     default:
00691         Q_ASSERT( 0 );
00692         break;
00693     }
00694     return 0;
00695 }
00696 
00697 DOMString RenderStyleDeclarationImpl::getPropertyValue( int propertyID ) const
00698 {
00699     CSSValueImpl* value = getPropertyCSSValue(propertyID);
00700     if (value)
00701         return value->cssText();
00702     return "";
00703 }
00704 
00705 bool RenderStyleDeclarationImpl::getPropertyPriority( int ) const
00706 {
00707     // This class does not support the notion of priority, since the object
00708     // is a computed value.
00709     return false;
00710 }
00711 
00712 DOM::DOMString RenderStyleDeclarationImpl::removeProperty( int, bool )
00713 {
00714     // ### emit error since we're read-only
00715     return DOMString();
00716 }
00717 
00718 bool RenderStyleDeclarationImpl::setProperty ( int, const DOM::DOMString&, bool,
00719                                                bool )
00720 {
00721     // ### emit error since we're read-only
00722     return false;
00723 }
00724 
00725 void RenderStyleDeclarationImpl::setProperty ( int, int, bool,
00726                                                bool )
00727 {
00728     // ### emit error since we're read-only
00729 }
00730 
00731 void RenderStyleDeclarationImpl::setLengthProperty( int, const DOM::DOMString&, bool,
00732                                                     bool, bool )
00733 {
00734     // ### emit error since we're read-only
00735 }
00736 
00737 void RenderStyleDeclarationImpl::setProperty( const DOMString& )
00738 {
00739     // ### emit error since we're read-only
00740 }
00741 
00742 DOM::DOMString RenderStyleDeclarationImpl::item( unsigned long ) const
00743 {
00744     // ###
00745     return DOMString();
00746 }
00747 
00748 
00749 CSSProperty RenderStyleDeclarationImpl::property( int id ) const
00750 {
00751     CSSProperty prop;
00752     prop.m_id = id;
00753     prop.m_bImportant = false;
00754     prop.nonCSSHint = false;
00755 
00756     CSSValueImpl* v = getPropertyCSSValue( id );
00757     if ( !v )
00758         v = new CSSPrimitiveValueImpl;
00759     prop.setValue( v );
00760     return prop;
00761 }
KDE Home | KDE Accessibility Home | Description of Access Keys