?? cssstyleselector.cpp
字號:
case CSSSelector::PseudoSelection:
dynamicPseudo = RenderStyle::SELECTION;
return true;
case CSSSelector::PseudoBefore:
dynamicPseudo = RenderStyle::BEFORE;
return true;
case CSSSelector::PseudoAfter:
dynamicPseudo = RenderStyle::AFTER;
return true;
case CSSSelector::PseudoNotParsed:
assert(false);
break;
case CSSSelector::PseudoLang:
/* not supported for now */
case CSSSelector::PseudoOther:
break;
}
return false;
}
// ### add the rest of the checks...
return true;
}
// -----------------------------------------------------------------
CSSRuleSet::CSSRuleSet()
{
m_idRules.setAutoDelete(true);
m_classRules.setAutoDelete(true);
m_tagRules.setAutoDelete(true);
m_universalRules = 0;
m_ruleCount = 0;
}
void CSSRuleSet::addToRuleSet(void* hash, QPtrDict<CSSRuleDataList>& dict,
CSSStyleRuleImpl* rule, CSSSelector* sel)
{
if (!hash) return;
CSSRuleDataList* rules = dict.find(hash);
if (!rules) {
rules = new CSSRuleDataList(m_ruleCount++, rule, sel);
dict.insert(hash, rules);
}
else
rules->append(m_ruleCount++, rule, sel);
}
void CSSRuleSet::addRule(CSSStyleRuleImpl* rule, CSSSelector* sel)
{
if (sel->match == CSSSelector::Id) {
addToRuleSet(sel->value.implementation(), m_idRules, rule, sel);
return;
}
if (sel->match == CSSSelector::Class) {
addToRuleSet(sel->value.implementation(), m_classRules, rule, sel);
return;
}
Q_UINT16 localName = localNamePart(sel->tag);
if (localName != anyLocalName) {
addToRuleSet((void*)(int)localName, m_tagRules, rule, sel);
return;
}
// Just put it in the universal rule set.
if (!m_universalRules)
m_universalRules = new CSSRuleDataList(m_ruleCount++, rule, sel);
else
m_universalRules->append(m_ruleCount++, rule, sel);
}
void CSSRuleSet::addRulesFromSheet(CSSStyleSheetImpl *sheet, const DOMString &medium)
{
if (!sheet || !sheet->isCSSStyleSheet()) return;
// No media implies "all", but if a media list exists it must
// contain our current medium
if (sheet->media() && !sheet->media()->contains(medium))
return; // the style sheet doesn't apply
int len = sheet->length();
for (int i = 0; i < len; i++) {
StyleBaseImpl *item = sheet->item(i);
if (item->isStyleRule()) {
CSSStyleRuleImpl* rule = static_cast<CSSStyleRuleImpl*>(item);
for (CSSSelector* s = rule->selector(); s; s = s->next())
addRule(rule, s);
}
else if(item->isImportRule()) {
CSSImportRuleImpl *import = static_cast<CSSImportRuleImpl *>(item);
//kdDebug( 6080 ) << "@import: Media: "
// << import->media()->mediaText().string() << endl;
if (!import->media() || import->media()->contains(medium))
addRulesFromSheet(import->styleSheet(), medium);
}
else if(item->isMediaRule()) {
CSSMediaRuleImpl *r = static_cast<CSSMediaRuleImpl*>(item);
CSSRuleListImpl *rules = r->cssRules();
//DOMString mediaText = media->mediaText();
//kdDebug( 6080 ) << "@media: Media: "
// << r->media()->mediaText().string() << endl;
if ((!r->media() || r->media()->contains(medium)) && rules) {
// Traverse child elements of the @media rule.
for (unsigned j = 0; j < rules->length(); j++) {
//kdDebug( 6080 ) << "*** Rule #" << j << endl;
CSSRuleImpl *childItem = rules->item(j);
if (childItem->isStyleRule()) {
// It is a StyleRule, so append it to our list
CSSStyleRuleImpl* rule = static_cast<CSSStyleRuleImpl*>(childItem);
for (CSSSelector* s = rule->selector(); s; s = s->next())
addRule(rule, s);
}
else
{
//kdDebug( 6080 ) << "Ignoring child rule of "
// "ImportRule: rule is not a StyleRule!" << endl;
}
} // for rules
} // if rules
else
{
//kdDebug( 6080 ) << "CSSMediaRule not rendered: "
// << "rule empty or wrong medium!" << endl;
}
}
// ### include other rules
}
}
// -------------------------------------------------------------------------------------
// this is mostly boring stuff on how to apply a certain rule to the renderstyle...
static Length convertToLength( CSSPrimitiveValueImpl *primitiveValue, RenderStyle *style, QPaintDeviceMetrics *paintDeviceMetrics, bool *ok = 0 )
{
Length l;
if ( !primitiveValue ) {
if ( ok )
*ok = false;
} else {
int type = primitiveValue->primitiveType();
if(type > CSSPrimitiveValue::CSS_PERCENTAGE && type < CSSPrimitiveValue::CSS_DEG)
l = Length(primitiveValue->computeLength(style, paintDeviceMetrics), Fixed);
else if(type == CSSPrimitiveValue::CSS_PERCENTAGE)
l = Length(int(primitiveValue->getFloatValue(CSSPrimitiveValue::CSS_PERCENTAGE)), Percent);
else if(type == CSSPrimitiveValue::CSS_NUMBER)
l = Length(int(primitiveValue->getFloatValue(CSSPrimitiveValue::CSS_NUMBER)*100), Percent);
else if (type == CSSPrimitiveValue::CSS_HTML_RELATIVE)
l = Length(int(primitiveValue->getFloatValue(CSSPrimitiveValue::CSS_HTML_RELATIVE)), Relative);
else if ( ok )
*ok = false;
}
return l;
}
// color mapping code
struct colorMap {
int css_value;
QRgb color;
};
static const colorMap cmap[] = {
{ CSS_VAL_AQUA, 0xFF00FFFF },
{ CSS_VAL_BLACK, 0xFF000000 },
{ CSS_VAL_BLUE, 0xFF0000FF },
{ CSS_VAL_FUCHSIA, 0xFFFF00FF },
{ CSS_VAL_GRAY, 0xFF808080 },
{ CSS_VAL_GREEN, 0xFF008000 },
{ CSS_VAL_LIME, 0xFF00FF00 },
{ CSS_VAL_MAROON, 0xFF800000 },
{ CSS_VAL_NAVY, 0xFF000080 },
{ CSS_VAL_OLIVE, 0xFF808000 },
{ CSS_VAL_ORANGE, 0xFFFFA500 },
{ CSS_VAL_PURPLE, 0xFF800080 },
{ CSS_VAL_RED, 0xFFFF0000 },
{ CSS_VAL_SILVER, 0xFFC0C0C0 },
{ CSS_VAL_TEAL, 0xFF008080 },
{ CSS_VAL_WHITE, 0xFFFFFFFF },
{ CSS_VAL_YELLOW, 0xFFFFFF00 },
#if !APPLE_CHANGES
{ CSS_VAL_INVERT, invertedColor },
#endif
{ CSS_VAL_TRANSPARENT, transparentColor },
{ CSS_VAL_GREY, 0xFF808080 },
#if APPLE_CHANGES
{ CSS_VAL_ACTIVEBORDER, 0xFFE0E0E0 },
{ CSS_VAL_ACTIVECAPTION, 0xFF000000 },
{ CSS_VAL_APPWORKSPACE, 0xFF000000 },
{ CSS_VAL_BUTTONFACE, 0xFFC0C0C0 },
{ CSS_VAL_BUTTONHIGHLIGHT, 0xFFE0E0E0 },
{ CSS_VAL_BUTTONSHADOW, 0xFFFFFFFF },
{ CSS_VAL_BUTTONTEXT, 0xFF000000 },
{ CSS_VAL_CAPTIONTEXT, 0xFF000000 },
{ CSS_VAL_GRAYTEXT, 0xFF000000 },
{ CSS_VAL_HIGHLIGHT, 0xFFFFFFFF },
{ CSS_VAL_HIGHLIGHTTEXT, 0xFFFFFFFF },
{ CSS_VAL_INACTIVEBORDER, 0xFFFFFFFF },
{ CSS_VAL_INACTIVECAPTION, 0xFFFFFFFF },
{ CSS_VAL_INACTIVECAPTIONTEXT, 0xFF000000 },
{ CSS_VAL_INFOBACKGROUND, 0xFF000000 },
{ CSS_VAL_INFOTEXT, 0xFF000000 },
{ CSS_VAL_MENU, 0xFFFFFFFF },
{ CSS_VAL_MENUTEXT, 0xFFFFFFFF },
{ CSS_VAL_SCROLLBAR, 0xFFFFFFFF },
{ CSS_VAL_TEXT, 0xFF000000 },
{ CSS_VAL_THREEDDARKSHADOW, 0xFF404040 },
{ CSS_VAL_THREEDFACE, 0xFFC0C0C0 },
{ CSS_VAL_THREEDHIGHLIGHT, 0xFFE0E0E0 },
{ CSS_VAL_THREEDLIGHTSHADOW, 0xFFC0C0C0 },
{ CSS_VAL_THREEDSHADOW, 0xFFFFFFFF },
{ CSS_VAL_WINDOW, 0xFFFFFFFF },
{ CSS_VAL_WINDOWFRAME, 0xFFFFFFFF },
{ CSS_VAL_WINDOWTEXT, 0xFF000000 },
#endif
{ 0, 0 }
};
#if !APPLE_CHANGES
struct uiColors {
int css_value;
const char * configGroup;
const char * configEntry;
QPalette::ColorGroup group;
QColorGroup::ColorRole role;
};
const char * const wmgroup = "WM";
const char * const generalgroup = "General";
/* Mapping system settings to CSS 2
* Tried hard to get an appropriate mapping - schlpbch
*/
static const uiColors uimap[] = {
// Active window border.
{ CSS_VAL_ACTIVEBORDER, wmgroup, "background", QPalette::Active, QColorGroup::Light },
// Active window caption.
{ CSS_VAL_ACTIVECAPTION, wmgroup, "background", QPalette::Active, QColorGroup::Text },
// Text in caption, size box, and scrollbar arrow box.
{ CSS_VAL_CAPTIONTEXT, wmgroup, "activeForeground", QPalette::Active, QColorGroup::Text },
// Face color for three-dimensional display elements.
{ CSS_VAL_BUTTONFACE, wmgroup, 0, QPalette::Inactive, QColorGroup::Button },
// Dark shadow for three-dimensional display elements (for edges facing away from the light source).
{ CSS_VAL_BUTTONHIGHLIGHT, wmgroup, 0, QPalette::Inactive, QColorGroup::Light },
// Shadow color for three-dimensional display elements.
{ CSS_VAL_BUTTONSHADOW, wmgroup, 0, QPalette::Inactive, QColorGroup::Shadow },
// Text on push buttons.
{ CSS_VAL_BUTTONTEXT, wmgroup, "buttonForeground", QPalette::Inactive, QColorGroup::ButtonText },
// Dark shadow for three-dimensional display elements.
{ CSS_VAL_THREEDDARKSHADOW, wmgroup, 0, QPalette::Inactive, QColorGroup::Dark },
// Face color for three-dimensional display elements.
{ CSS_VAL_THREEDFACE, wmgroup, 0, QPalette::Inactive, QColorGroup::Button },
// Highlight color for three-dimensional display elements.
{ CSS_VAL_THREEDHIGHLIGHT, wmgroup, 0, QPalette::Inactive, QColorGroup::Light },
// Light color for three-dimensional display elements (for edges facing the light source).
{ CSS_VAL_THREEDLIGHTSHADOW, wmgroup, 0, QPalette::Inactive, QColorGroup::Midlight },
// Dark shadow for three-dimensional display elements.
{ CSS_VAL_THREEDSHADOW, wmgroup, 0, QPalette::Inactive, QColorGroup::Shadow },
// Inactive window border.
{ CSS_VAL_INACTIVEBORDER, wmgroup, "background", QPalette::Disabled, QColorGroup::Background },
// Inactive window caption.
{ CSS_VAL_INACTIVECAPTION, wmgroup, "inactiveBackground", QPalette::Disabled, QColorGroup::Background },
// Color of text in an inactive caption.
{ CSS_VAL_INACTIVECAPTIONTEXT, wmgroup, "inactiveForeground", QPalette::Disabled, QColorGroup::Text },
{ CSS_VAL_GRAYTEXT, wmgroup, 0, QPalette::Disabled, QColorGroup::Text },
// Menu background
{ CSS_VAL_MENU, generalgroup, "background", QPalette::Inactive, QColorGroup::Background },
// Text in menus
{ CSS_VAL_MENUTEXT, generalgroup, "foreground", QPalette::Inactive, QColorGroup::Background },
// Text of item(s) selected in a control.
{ CSS_VAL_HIGHLIGHT, generalgroup, "selectBackground", QPalette::Inactive, QColorGroup::Background },
// Text of item(s) selected in a control.
{ CSS_VAL_HIGHLIGHTTEXT, generalgroup, "selectForeground", QPalette::Inactive, QColorGroup::Background },
// Background color of multiple document interface.
{ CSS_VAL_APPWORKSPACE, generalgroup, "background", QPalette::Inactive, QColorGroup::Text },
// Scroll bar gray area.
{ CSS_VAL_SCROLLBAR, generalgroup, "background", QPalette::Inactive, QColorGroup::Background },
// Window background.
{ CSS_VAL_WINDOW, generalgroup, "windowBackground", QPalette::Inactive, QColorGroup::Background },
// Window frame.
{ CSS_VAL_WINDOWFRAME, generalgroup, "windowBackground", QPalette::Inactive, QColorGroup::Background },
// WindowText
{ CSS_VAL_WINDOWTEXT, generalgroup, "windowForeground", QPalette::Inactive, QColorGroup::Text },
{ CSS_VAL_TEXT, generalgroup, 0, QPalette::Inactive, QColorGroup::Text },
{ 0, 0, 0, QPalette::NColorGroups, QColorGroup::NColorRoles }
};
#endif // !APPLE_CHANGES
static QColor colorForCSSValue( int css_value )
{
// try the regular ones first
const colorMap *col = cmap;
while ( col->css_value && col->css_value != css_value )
++col;
if ( col->css_value )
return col->color;
#if APPLE_CHANGES
return QColor();
#else
const uiColors *uicol = uimap;
while ( uicol->css_value && uicol->css_value != css_value )
++uicol;
if ( !uicol->css_value ) {
if ( css_value == CSS_VAL_INFOBACKGROUND )
return QToolTip::palette().inactive().background();
else if ( css_value == CSS_VAL_INFOTEXT )
return QToolTip::palette().inactive().foreground();
else if ( css_value == CSS_VAL_BACKGROUND ) {
KConfig bckgrConfig("kdesktoprc", true, false); // No multi-screen support
bckgrConfig.setGroup("Desktop0");
// Desktop background.
return bckgrConfig.readColorEntry("Color1", &qApp->palette().disabled().background());
}
return khtml::invalidColor;
}
const QPalette &pal = qApp->palette();
QColor c = pal.color( uicol->group, uicol->role );
if ( uicol->configEntry ) {
KConfig *globalConfig = KGlobal::config();
globalConfig->setGroup( uicol->configGroup );
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -