00001
00023
00024
00025
#include "dom/dom_string.h"
00026
#include "dom/dom_exception.h"
00027
#include "dom/css_stylesheet.h"
00028
#include "dom/css_rule.h"
00029
00030
#include "css/css_ruleimpl.h"
00031
#include "css/css_valueimpl.h"
00032
#include "css/cssparser.h"
00033
#include "css/css_stylesheetimpl.h"
00034
00035
#include "xml/dom_nodeimpl.h"
00036
#include "html/html_documentimpl.h"
00037
#include "misc/loader.h"
00038
00039
#include <kdebug.h>
00040
00041
using namespace DOM;
00042
using namespace khtml;
00043
00044
00045 StyleSheetImpl::StyleSheetImpl(StyleSheetImpl *parentSheet,
DOMString href)
00046 : StyleListImpl(parentSheet)
00047 {
00048 m_disabled =
false;
00049 m_media = 0;
00050 m_parentNode = 0;
00051 m_strHref = href;
00052 }
00053
00054
00055 StyleSheetImpl::StyleSheetImpl(DOM::NodeImpl *parentNode,
DOMString href)
00056 : StyleListImpl()
00057 {
00058 m_parentNode = parentNode;
00059 m_disabled =
false;
00060 m_media = 0;
00061 m_strHref = href;
00062 }
00063
00064 StyleSheetImpl::StyleSheetImpl(StyleBaseImpl *owner,
DOMString href)
00065 : StyleListImpl(owner)
00066 {
00067 m_disabled =
false;
00068 m_media = 0;
00069 m_parentNode = 0;
00070 m_strHref = href;
00071 }
00072
00073 StyleSheetImpl::~StyleSheetImpl()
00074 {
00075
if(m_media) {
00076 m_media->setParent( 0 );
00077 m_media->deref();
00078 }
00079 }
00080
00081 StyleSheetImpl *StyleSheetImpl::parentStyleSheet()
const
00082
{
00083
if( !m_parent )
return 0;
00084
if( m_parent->isStyleSheet() )
return static_cast<StyleSheetImpl *>(m_parent);
00085
return 0;
00086 }
00087
00088
void StyleSheetImpl::setMedia( MediaListImpl *media )
00089 {
00090
if( media )
00091 media->ref();
00092
if( m_media )
00093 m_media->deref();
00094 m_media = media;
00095 }
00096
00097
00098
00099
00100 CSSStyleSheetImpl::CSSStyleSheetImpl(CSSStyleSheetImpl *parentSheet,
DOMString href)
00101 : StyleSheetImpl(parentSheet, href)
00102 {
00103 m_lstChildren =
new QPtrList<StyleBaseImpl>;
00104 m_doc = 0;
00105 m_implicit =
false;
00106 }
00107
00108 CSSStyleSheetImpl::CSSStyleSheetImpl(DOM::NodeImpl *parentNode,
DOMString href,
bool _implicit)
00109 : StyleSheetImpl(parentNode, href)
00110 {
00111 m_lstChildren =
new QPtrList<StyleBaseImpl>;
00112 m_doc = parentNode->getDocument();
00113 m_implicit = _implicit;
00114 }
00115
00116 CSSStyleSheetImpl::CSSStyleSheetImpl(CSSRuleImpl *ownerRule,
DOMString href)
00117 : StyleSheetImpl(ownerRule, href)
00118 {
00119 m_lstChildren =
new QPtrList<StyleBaseImpl>;
00120 m_doc = 0;
00121 m_implicit =
false;
00122 }
00123
00124 CSSStyleSheetImpl::CSSStyleSheetImpl(DOM::NodeImpl *parentNode, CSSStyleSheetImpl *orig)
00125 : StyleSheetImpl(parentNode, orig->m_strHref)
00126 {
00127 m_lstChildren =
new QPtrList<StyleBaseImpl>;
00128 StyleBaseImpl *rule;
00129
for ( rule = orig->m_lstChildren->first(); rule != 0; rule = orig->m_lstChildren->next() )
00130 {
00131 m_lstChildren->append(rule);
00132 rule->setParent(
this);
00133 }
00134 m_doc = parentNode->getDocument();
00135 m_implicit =
false;
00136 }
00137
00138 CSSStyleSheetImpl::CSSStyleSheetImpl(CSSRuleImpl *ownerRule, CSSStyleSheetImpl *orig)
00139 : StyleSheetImpl(ownerRule, orig->m_strHref)
00140 {
00141
00142 m_lstChildren =
new QPtrList<StyleBaseImpl>;
00143 StyleBaseImpl *rule;
00144
for ( rule = orig->m_lstChildren->first(); rule != 0; rule = orig->m_lstChildren->next() )
00145 {
00146 m_lstChildren->append(rule);
00147 rule->setParent(
this);
00148 }
00149 m_doc = 0;
00150 m_implicit =
false;
00151 }
00152
00153 CSSRuleImpl *CSSStyleSheetImpl::ownerRule()
const
00154
{
00155
if( !m_parent )
return 0;
00156
if( m_parent->isRule() )
return static_cast<CSSRuleImpl *>(m_parent);
00157
return 0;
00158 }
00159
00160
unsigned long CSSStyleSheetImpl::insertRule(
const DOMString &rule,
unsigned long index,
int &exceptioncode )
00161 {
00162 exceptioncode = 0;
00163
if(index > m_lstChildren->count()) {
00164 exceptioncode = DOMException::INDEX_SIZE_ERR;
00165
return 0;
00166 }
00167 CSSParser p( strictParsing );
00168 CSSRuleImpl *r = p.parseRule(
this, rule );
00169
00170
if(!r) {
00171 exceptioncode = CSSException::SYNTAX_ERR + CSSException::_EXCEPTION_OFFSET;
00172
return 0;
00173 }
00174
00175
00176
00177 m_lstChildren->insert(index, r);
00178
return index;
00179 }
00180
00181
CSSRuleList CSSStyleSheetImpl::cssRules()
00182 {
00183
return this;
00184 }
00185
00186
void CSSStyleSheetImpl::deleteRule(
unsigned long index,
int &exceptioncode )
00187 {
00188 exceptioncode = 0;
00189 StyleBaseImpl *b = m_lstChildren->take(index);
00190
if(!b) {
00191 exceptioncode = DOMException::INDEX_SIZE_ERR;
00192
return;
00193 }
00194 b->deref();
00195 }
00196
00197
bool CSSStyleSheetImpl::parseString(
const DOMString &string,
bool strict)
00198 {
00199
#ifdef CSS_STYLESHEET_DEBUG
00200
kdDebug( 6080 ) <<
"parsing sheet, len=" << string.
length() <<
", sheet is " << string.
string() <<
endl;
00201
#endif
00202
00203 strictParsing = strict;
00204 CSSParser p( strict );
00205 p.parseSheet(
this, string );
00206
return true;
00207 }
00208
00209
bool CSSStyleSheetImpl::isLoading()
const
00210
{
00211 StyleBaseImpl *rule;
00212
for ( rule = m_lstChildren->first(); rule != 0; rule = m_lstChildren->next() )
00213 {
00214
if(rule->isImportRule())
00215 {
00216 CSSImportRuleImpl *
import = static_cast<CSSImportRuleImpl *>(rule);
00217
#ifdef CSS_STYLESHEET_DEBUG
00218
kdDebug( 6080 ) <<
"found import" <<
endl;
00219
#endif
00220
if(
import->isLoading())
00221 {
00222
#ifdef CSS_STYLESHEET_DEBUG
00223
kdDebug( 6080 ) <<
"--> not loaded" <<
endl;
00224
#endif
00225
return true;
00226 }
00227 }
00228 }
00229
return false;
00230 }
00231
00232
void CSSStyleSheetImpl::checkLoaded()
const
00233
{
00234
if(isLoading())
return;
00235
if(m_parent) m_parent->checkLoaded();
00236
if(m_parentNode) m_parentNode->sheetLoaded();
00237 }
00238
00239
void CSSStyleSheetImpl::setNonCSSHints()
00240 {
00241 StyleBaseImpl *rule = m_lstChildren->first();
00242
while(rule) {
00243
if(rule->isStyleRule()) {
00244 static_cast<CSSStyleRuleImpl *>(rule)->setNonCSSHints();
00245 }
00246 rule = m_lstChildren->next();
00247 }
00248 }
00249
00250
00251
00252
00253
00254 StyleSheetListImpl::~StyleSheetListImpl()
00255 {
00256
for (
QPtrListIterator<StyleSheetImpl> it ( styleSheets ); it.current(); ++it )
00257 it.current()->deref();
00258 }
00259
00260
void StyleSheetListImpl::add( StyleSheetImpl* s )
00261 {
00262
if ( !styleSheets.containsRef( s ) ) {
00263 s->ref();
00264 styleSheets.append( s );
00265 }
00266 }
00267
00268
void StyleSheetListImpl::remove( StyleSheetImpl* s )
00269 {
00270
if ( styleSheets.removeRef( s ) )
00271 s->deref();
00272 }
00273
00274
unsigned long StyleSheetListImpl::length()
const
00275
{
00276
00277
unsigned long l = 0;
00278
QPtrListIterator<StyleSheetImpl> it(styleSheets);
00279
for (; it.current(); ++it) {
00280
if (!it.current()->isCSSStyleSheet() || !static_cast<CSSStyleSheetImpl*>(it.current())->implicit())
00281 ++l;
00282 }
00283
return l;
00284 }
00285
00286 StyleSheetImpl *StyleSheetListImpl::item (
unsigned long index )
00287 {
00288
unsigned long l = 0;
00289
QPtrListIterator<StyleSheetImpl> it(styleSheets);
00290
for (; it.current(); ++it) {
00291
if (!it.current()->isCSSStyleSheet() || !static_cast<CSSStyleSheetImpl*>(it.current())->implicit()) {
00292
if (l == index)
00293
return it.current();
00294 ++l;
00295 }
00296 }
00297
return 0;
00298 }
00299
00300
00301
00302 MediaListImpl::MediaListImpl( CSSStyleSheetImpl *parentSheet,
00303
const DOMString &media )
00304 : StyleBaseImpl( parentSheet )
00305 {
00306
setMediaText( media );
00307 }
00308
00309 MediaListImpl::MediaListImpl( CSSRuleImpl *parentRule,
const DOMString &media )
00310 : StyleBaseImpl(parentRule)
00311 {
00312
setMediaText( media );
00313 }
00314
00315
bool MediaListImpl::contains(
const DOMString &medium )
const
00316
{
00317
return m_lstMedia.empty() || m_lstMedia.contains( medium ) ||
00318 m_lstMedia.contains(
"all" );
00319 }
00320
00321 CSSStyleSheetImpl *MediaListImpl::parentStyleSheet()
const
00322
{
00323
if( m_parent->isCSSStyleSheet() )
return static_cast<CSSStyleSheetImpl *>(m_parent);
00324
return 0;
00325 }
00326
00327 CSSRuleImpl *MediaListImpl::parentRule()
const
00328
{
00329
if( m_parent->isRule() )
return static_cast<CSSRuleImpl *>(m_parent);
00330
return 0;
00331 }
00332
00333
void MediaListImpl::deleteMedium(
const DOMString &oldMedium )
00334 {
00335
const QValueList<DOMString>::Iterator itEnd = m_lstMedia.end();
00336
00337
for (
QValueList<DOMString>::Iterator it = m_lstMedia.begin(); it != itEnd; ++it ) {
00338
if( (*it) == oldMedium ) {
00339 m_lstMedia.remove( it );
00340
return;
00341 }
00342 }
00343 }
00344
00345
DOM::DOMString MediaListImpl::mediaText()
const
00346
{
00347
DOMString text;
00348
const QValueList<DOMString>::ConstIterator itEnd = m_lstMedia.end();
00349
00350
for (
QValueList<DOMString>::ConstIterator it = m_lstMedia.begin(); it != itEnd; ++it ) {
00351 text += *it;
00352 text +=
", ";
00353 }
00354
return text;
00355 }
00356
00357
void MediaListImpl::setMediaText(
const DOM::DOMString &value)
00358 {
00359 m_lstMedia.clear();
00360
const QString val = value.
string();
00361
const QStringList list = QStringList::split(
',', val );
00362
00363
const QStringList::ConstIterator itEnd = list.end();
00364
00365
for ( QStringList::ConstIterator it = list.begin(); it != itEnd; ++it )
00366 {
00367
const DOMString medium = (*it).stripWhiteSpace();
00368
if( !medium.
isEmpty() )
00369 m_lstMedia.append( medium );
00370 }
00371 }