00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <config.h>
00033
00034 #include "csshelper.h"
00035
00036 #include "kmkernel.h"
00037
00038 #include <kconfig.h>
00039 #include <kglobalsettings.h>
00040 #include <kdebug.h>
00041 #include <kglobal.h>
00042
00043 #include <qcolor.h>
00044 #include <qfont.h>
00045 #include <qstring.h>
00046 #include <qapplication.h>
00047
00048 #include <cassert>
00049
00050 namespace KMail {
00051
00052 class CSSHelper::Private {
00053 friend class CSSHelper;
00054 public:
00055 Private() {}
00056 ~Private() {}
00057
00058 bool operator==( const Private & other ) const;
00059 bool operator!=( const Private & other ) const {
00060 return !operator==( other );
00061 }
00062
00063 void readColorConfig();
00064
00065
00066 QString printCssDefinitions() const;
00067
00068
00069 QString screenCssDefinitions( const CSSHelper * helper, bool fixed ) const;
00070
00071
00072 QString commonCssDefinitions() const;
00073
00074 QFont bodyFont( bool fixed, bool print=false ) const {
00075 return fixed ? mFixedFont : print ? mPrintFont : mBodyFont ;
00076 }
00077 int fontSize( bool fixed, bool print=false ) const {
00078 return bodyFont( fixed, print ).pointSize();
00079 }
00080
00081 QString quoteFontTag( int level ) const;
00082
00083 private:
00084 QFont mBodyFont, mPrintFont, mFixedFont;
00085 QFont mQuoteFont[3];
00086 QColor mQuoteColor[3];
00087 bool mRecycleQuoteColors;
00088 bool mBackingPixmapOn;
00089 QString mBackingPixmapStr;
00090 QColor c1, c2, c3, c4;
00091
00092 QColor cPgpOk1F, cPgpOk1H, cPgpOk1B,
00093 cPgpOk0F, cPgpOk0H, cPgpOk0B,
00094 cPgpWarnF, cPgpWarnH, cPgpWarnB,
00095 cPgpErrF, cPgpErrH, cPgpErrB,
00096 cPgpEncrF, cPgpEncrH, cPgpEncrB;
00097
00098 QColor cHtmlWarning;
00099 };
00100
00101 bool CSSHelper::Private::operator==( const Private & other ) const {
00102 for ( int i = 0 ; i < 3 ; ++i )
00103 if ( mQuoteFont[i] != other.mQuoteFont[i] ||
00104 mQuoteColor[i] != other.mQuoteColor[i] )
00105 return false;
00106 return
00107 mBodyFont == other.mBodyFont &&
00108 mPrintFont == other.mPrintFont &&
00109 mFixedFont == other.mFixedFont &&
00110 mRecycleQuoteColors == other.mRecycleQuoteColors &&
00111 mBackingPixmapOn == other.mBackingPixmapOn &&
00112 mBackingPixmapStr == other.mBackingPixmapStr &&
00113 c1 == other.c1 && c2 == other.c2 && c3 == other.c3 && c4 == other.c4 &&
00114 cHtmlWarning == other.cHtmlWarning &&
00115 cPgpOk1F == other.cPgpOk1F && cPgpOk1H == other.cPgpOk1H && cPgpOk1B == other.cPgpOk1B &&
00116 cPgpOk0F == other.cPgpOk0F && cPgpOk0H == other.cPgpOk0H && cPgpOk0B == other.cPgpOk0B &&
00117 cPgpWarnF == other.cPgpWarnF && cPgpWarnH == other.cPgpWarnH && cPgpWarnB == other.cPgpWarnB &&
00118 cPgpErrF == other.cPgpErrF && cPgpErrH == other.cPgpErrH && cPgpErrB == other.cPgpErrB &&
00119 cPgpEncrF == other.cPgpEncrF && cPgpEncrH == other.cPgpEncrH && cPgpEncrB == other.cPgpEncrB ;
00120 }
00121
00122 namespace {
00123
00124 inline QColor darker( const QColor & c ) {
00125 int h, s, v;
00126 c.hsv( &h, &s, &v );
00127 return QColor( h, s, v*4/5, QColor::Hsv );
00128 }
00129
00130 inline QColor desaturate( const QColor & c ) {
00131 int h, s, v;
00132 c.hsv( &h, &s, &v );
00133 return QColor( h, s/8, v, QColor::Hsv );
00134 }
00135
00136 inline QColor fixValue( const QColor & c, int newV ) {
00137 int h, s, v;
00138 c.hsv( &h, &s, &v );
00139 return QColor( h, s, newV, QColor::Hsv );
00140 }
00141
00142 inline int getValueOf( const QColor & c ) {
00143 int h, s, v;
00144 c.hsv( &h, &s, &v );
00145 return v;
00146 }
00147 }
00148
00149 void CSSHelper::Private::readColorConfig() {
00150 KConfig * config = KMKernel::config();
00151
00152 KConfigGroup reader( config, "Reader" );
00153 KConfigGroup fonts( config, "Fonts" );
00154 KConfigGroup pixmaps( config, "Pixmaps" );
00155
00156 c1 = QApplication::palette().active().text();
00157 c2 = KGlobalSettings::linkColor();
00158 c3 = KGlobalSettings::visitedLinkColor();
00159 c4 = QApplication::palette().active().base();
00160 cHtmlWarning = QColor( 0xFF, 0x40, 0x40 );
00161
00162
00163 cPgpEncrH = QColor( 0x00, 0x80, 0xFF );
00164 cPgpOk1H = QColor( 0x40, 0xFF, 0x40 );
00165 cPgpOk0H = QColor( 0xFF, 0xFF, 0x40 );
00166 cPgpWarnH = QColor( 0xFF, 0xFF, 0x40 );
00167 cPgpErrH = Qt::red;
00168 mQuoteColor[0] = QColor( 0,0,221 );
00169 mQuoteColor[1] = QColor( 0,99, 18 );
00170 mQuoteColor[2] = QColor( 84,0,0 );
00171
00172 mRecycleQuoteColors = reader.readBoolEntry( "RecycleQuoteColors", false );
00173
00174 if ( !reader.readBoolEntry( "defaultColors", true ) ) {
00175 c1 = reader.readColorEntry("ForegroundColor",&c1);
00176 c2 = reader.readColorEntry("LinkColor",&c2);
00177 c3 = reader.readColorEntry("FollowedColor",&c3);
00178 c4 = reader.readColorEntry("BackgroundColor",&c4);
00179 cPgpEncrH = reader.readColorEntry( "PGPMessageEncr", &cPgpEncrH );
00180 cPgpOk1H = reader.readColorEntry( "PGPMessageOkKeyOk", &cPgpOk1H );
00181 cPgpOk0H = reader.readColorEntry( "PGPMessageOkKeyBad", &cPgpOk0H );
00182 cPgpWarnH = reader.readColorEntry( "PGPMessageWarn", &cPgpWarnH );
00183 cPgpErrH = reader.readColorEntry( "PGPMessageErr", &cPgpErrH );
00184 cHtmlWarning = reader.readColorEntry( "HTMLWarningColor", &cHtmlWarning );
00185 for ( int i = 0 ; i < 3 ; ++i ) {
00186 const QString key = "QuotedText" + QString::number( i+1 );
00187 mQuoteColor[i] = reader.readColorEntry( key, &mQuoteColor[i] );
00188 }
00189 }
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 const int vBG = getValueOf( c4 );
00203 const bool lightBG = vBG >= 128;
00204 if ( cPgpOk1H == c4 ) {
00205 cPgpOk1F = c4;
00206 cPgpOk1B = c4;
00207 } else {
00208 cPgpOk1F= darker( cPgpOk1H );
00209 cPgpOk1B = lightBG ? desaturate( cPgpOk1H ) : fixValue( cPgpOk1H, vBG );
00210 }
00211 if ( cPgpOk0H == c4 ) {
00212 cPgpOk0F = c4;
00213 cPgpOk0B = c4;
00214 } else {
00215 cPgpOk0F = darker( cPgpOk0H );
00216 cPgpOk0B = lightBG ? desaturate( cPgpOk0H ) : fixValue( cPgpOk0H, vBG );
00217 }
00218 if ( cPgpWarnH == c4 ) {
00219 cPgpWarnF = c4;
00220 cPgpWarnB = c4;
00221 } else {
00222 cPgpWarnF = darker( cPgpWarnH );
00223 cPgpWarnB = lightBG ? desaturate( cPgpWarnH ) : fixValue( cPgpWarnH, vBG );
00224 }
00225 if ( cPgpErrH == c4 ) {
00226 cPgpErrF = c4;
00227 cPgpErrB = c4;
00228 } else {
00229 cPgpErrF = darker( cPgpErrH );
00230 cPgpErrB = lightBG ? desaturate( cPgpErrH ) : fixValue( cPgpErrH, vBG );
00231 }
00232 if ( cPgpEncrH == c4 ) {
00233 cPgpEncrF = c4;
00234 cPgpEncrB = c4;
00235 } else {
00236 cPgpEncrF = darker( cPgpEncrH );
00237 cPgpEncrB = lightBG ? desaturate( cPgpEncrH ) : fixValue( cPgpEncrH, vBG );
00238 }
00239
00240 QFont defaultFont = KGlobalSettings::generalFont();
00241 if ( fonts.readBoolEntry( "defaultFonts", true ) ) {
00242 mBodyFont = mPrintFont = defaultFont;
00243 mFixedFont = KGlobalSettings::fixedFont();
00244 defaultFont.setItalic( true );
00245 for ( int i = 0 ; i < 3 ; ++i )
00246 mQuoteFont[i] = defaultFont;
00247 } else {
00248 mBodyFont = fonts.readFontEntry( "body-font", &defaultFont);
00249 mPrintFont = fonts.readFontEntry( "print-font", &defaultFont);
00250 mFixedFont = fonts.readFontEntry( "fixed-font", &defaultFont);
00251 defaultFont.setItalic( true );
00252 for ( int i = 0 ; i < 3 ; ++i ) {
00253 const QString key = QString( "quote%1-font" ).arg( i+1 );
00254 mQuoteFont[i] = fonts.readFontEntry( key, &defaultFont );
00255 }
00256 }
00257
00258 mBackingPixmapStr = pixmaps.readPathEntry("Readerwin");
00259 mBackingPixmapOn = !mBackingPixmapStr.isEmpty();
00260 }
00261
00262 CSSHelper::CSSHelper( const QPaintDeviceMetrics & pdm, QObject * parent, const char * name )
00263 : ConfigManager( parent, name ),
00264 d( 0 ), s( 0 ), mMetrics( pdm )
00265 {
00266 d = new Private();
00267 d->readColorConfig();
00268 }
00269
00270 CSSHelper::~CSSHelper() {
00271 kdWarning( hasPendingChanges(), 5006 )
00272 << "CSSHelper: There were uncommitted changes!" << endl;
00273 delete d; d = 0;
00274 delete s; s = 0;
00275 }
00276
00277 void CSSHelper::commit() {
00278
00279 }
00280
00281 void CSSHelper::rollback() {
00282 delete s; s = 0;
00283 }
00284
00285 bool CSSHelper::hasPendingChanges() const {
00286 assert( d );
00287 return s && *s != *d ;
00288 }
00289
00290 QString CSSHelper::cssDefinitions( bool fixed ) const {
00291 assert( d );
00292 return
00293 d->commonCssDefinitions()
00294 +
00295 "@media screen {\n\n"
00296 +
00297 d->screenCssDefinitions( this, fixed )
00298 +
00299 "}\n"
00300 "@media print {\n\n"
00301 +
00302 d->printCssDefinitions()
00303 +
00304 "}\n";
00305 }
00306
00307 QString CSSHelper::htmlHead( bool fixed ) const {
00308 return
00309 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"
00310 "<html><head><title></title></head>\n"
00311 +
00312 QString( fixed ? "<body class\"fixedfont\">\n" : "<body>\n" );
00313 }
00314
00315 QString CSSHelper::Private::quoteFontTag( int level ) const {
00316 if ( level < 0 )
00317 level = 0;
00318 static const int numQuoteLevels = sizeof mQuoteFont / sizeof *mQuoteFont ;
00319 const int effectiveLevel = mRecycleQuoteColors
00320 ? level % numQuoteLevels + 1
00321 : kMin( level + 1, numQuoteLevels ) ;
00322 return QString( "<div class=\"quotelevel%1\">" ).arg( effectiveLevel );
00323 }
00324
00325 QString CSSHelper::quoteFontTag( int level ) const {
00326 assert( d );
00327 return d->quoteFontTag( level );
00328 }
00329
00330 QString CSSHelper::nonQuotedFontTag() const {
00331 return "<div class=\"noquote\">";
00332 }
00333
00334 QFont CSSHelper::bodyFont( bool fixed, bool print ) const {
00335 assert( d );
00336 return d->bodyFont( fixed, print );
00337 }
00338
00339 namespace {
00340 int pointsToPixel( const QPaintDeviceMetrics & metrics, int pointSize ) {
00341 return ( pointSize * metrics.logicalDpiY() + 36 ) / 72 ;
00342 }
00343 }
00344
00345 QString CSSHelper::Private::printCssDefinitions() const {
00346 const QString headerFont = QString( " font-family: \"%1\" ! important;\n"
00347 " font-size: %2pt ! important;\n" )
00348 .arg( mPrintFont.family() )
00349 .arg( mPrintFont.pointSize() );
00350 const QColorGroup & cg = QApplication::palette().active();
00351
00352 QString quoteCSS;
00353 if ( mPrintFont.italic() )
00354 quoteCSS += " font-style: italic ! important;\n";
00355 if ( mPrintFont.bold() )
00356 quoteCSS += " font-weight: bold ! important;\n";
00357 if ( !quoteCSS.isEmpty() )
00358 quoteCSS = "div.noquote {\n" + quoteCSS + "}\n\n";
00359
00360 return
00361 QString( "body {\n"
00362 " font-family: \"%1\" ! important;\n"
00363 " font-size: %2pt ! important;\n"
00364 " color: #000000 ! important;\n"
00365 " background-color: #ffffff ! important\n"
00366 "}\n\n" )
00367 .arg( mPrintFont.family(),
00368 QString::number( mPrintFont.pointSize() ) )
00369 +
00370 QString( "tr.textAtmH,\n"
00371 "tr.rfc822H,\n"
00372 "tr.encrH,\n"
00373 "tr.signOkKeyOkH,\n"
00374 "tr.signOkKeyBadH,\n"
00375 "tr.signWarnH,\n"
00376 "tr.signErrH,\n"
00377 "div.header {\n"
00378 "%1"
00379 "}\n\n"
00380
00381 "div.fancy.header > div {\n"
00382 " background-color: %2 ! important;\n"
00383 " color: %3 ! important;\n"
00384 " padding: 4px ! important;\n"
00385 " border: solid %3 1px ! important;\n"
00386 "}\n\n"
00387
00388 "div.fancy.header > div a[href] { color: %3 ! important; }\n\n"
00389
00390 "div.fancy.header > table.outer{\n"
00391 " background-color: %2 ! important;\n"
00392 " color: %3 ! important;\n"
00393 " border-bottom: solid %3 1px ! important;\n"
00394 " border-left: solid %3 1px ! important;\n"
00395 " border-right: solid %3 1px ! important;\n"
00396 "}\n\n"
00397
00398 "div.fancy.header > div.sender-pic{\n"
00399 " font-size:0.8em;\n"
00400 " border:1px solid black;\n"
00401 " background-color:InfoBackground;\n"
00402 "}\n\n"
00403
00404 "div.fancy.header > div.sender-status{\n"
00405 " text-align:center;\n"
00406 "}\n\n"
00407
00408 "div.htmlWarn {\n"
00409 " border: 2px solid #ffffff ! important;\n"
00410 "}\n\n"
00411 "div.senderStatus {\n"
00412
00413 )
00414 .arg( headerFont,
00415 cg.background().name(),
00416 cg.foreground().name() )
00417 + quoteCSS;
00418 }
00419
00420 QString CSSHelper::Private::screenCssDefinitions( const CSSHelper * helper, bool fixed ) const {
00421 const QString fgColor = c1.name();
00422 const QString bgColor = c4.name();
00423 const QString linkColor = c2.name();
00424 const QString headerFont = QString(" font-family: \"%1\" ! important;\n"
00425 " font-size: %2px ! important;\n")
00426 .arg( mBodyFont.family() )
00427 .arg( pointsToPixel( helper->mMetrics, mBodyFont.pointSize() ) );
00428 const QString background = ( mBackingPixmapOn
00429 ? QString( " background-image:url(file://%1) ! important;\n" )
00430 .arg( mBackingPixmapStr )
00431 : QString( " background-color: %1 ! important;\n" )
00432 .arg( bgColor ) );
00433 const QString bodyFontSize = QString::number( pointsToPixel( helper->mMetrics, fontSize( fixed ) ) ) + "px" ;
00434 const QColorGroup & cg = QApplication::palette().active();
00435
00436 QString quoteCSS;
00437 if ( bodyFont( fixed ).italic() )
00438 quoteCSS += " font-style: italic ! important;\n";
00439 if ( bodyFont( fixed ).bold() )
00440 quoteCSS += " font-weight: bold ! important;\n";
00441 if ( !quoteCSS.isEmpty() )
00442 quoteCSS = "div.noquote {\n" + quoteCSS + "}\n\n";
00443
00444 for ( int i = 0 ; i < 3 ; ++i ) {
00445 quoteCSS += QString( "div.quotelevel%1 {\n"
00446 " color: %2 ! important;\n" )
00447 .arg( QString::number(i+1), mQuoteColor[i].name() );
00448 if ( mQuoteFont[i].italic() )
00449 quoteCSS += " font-style: italic ! important;\n";
00450 if ( mQuoteFont[i].bold() )
00451 quoteCSS += " font-weight: bold ! important;\n";
00452 quoteCSS += "}\n\n";
00453 }
00454
00455 return
00456 QString( "body {\n"
00457 " font-family: \"%1\" ! important;\n"
00458 " font-size: %2 ! important;\n"
00459 " color: %3 ! important;\n"
00460 "%4"
00461 "}\n\n" )
00462 .arg( bodyFont( fixed ).family(),
00463 bodyFontSize,
00464 fgColor,
00465 background )
00466 +
00467 QString( "a {\n"
00468 " color: %1 ! important;\n"
00469 " text-decoration: none ! important;\n"
00470 "}\n\n"
00471
00472 "table.textAtm { background-color: %2 ! important; }\n\n"
00473
00474 "tr.textAtmH {\n"
00475 " background-color: %3 ! important;\n"
00476 "%4"
00477 "}\n\n"
00478
00479 "tr.textAtmB {\n"
00480 " background-color: %3 ! important;\n"
00481 "}\n\n"
00482
00483 "table.rfc822 {\n"
00484 " background-color: %3 ! important;\n"
00485 "}\n\n"
00486
00487 "tr.rfc822H {\n"
00488 "%4"
00489 "}\n\n" )
00490 .arg( linkColor, fgColor, bgColor, headerFont )
00491 +
00492 QString( "table.encr {\n"
00493 " background-color: %1 ! important;\n"
00494 "}\n\n"
00495
00496 "tr.encrH {\n"
00497 " background-color: %2 ! important;\n"
00498 "%3"
00499 "}\n\n"
00500
00501 "tr.encrB { background-color: %4 ! important; }\n\n" )
00502 .arg( cPgpEncrF.name(),
00503 cPgpEncrH.name(),
00504 headerFont,
00505 cPgpEncrB.name() )
00506 +
00507 QString( "table.signOkKeyOk {\n"
00508 " background-color: %1 ! important;\n"
00509 "}\n\n"
00510
00511 "tr.signOkKeyOkH {\n"
00512 " background-color: %2 ! important;\n"
00513 "%3"
00514 "}\n\n"
00515
00516 "tr.signOkKeyOkB { background-color: %4 ! important; }\n\n" )
00517 .arg( cPgpOk1F.name(),
00518 cPgpOk1H.name(),
00519 headerFont,
00520 cPgpOk1B.name() )
00521 +
00522 QString( "table.signOkKeyBad {\n"
00523 " background-color: %1 ! important;\n"
00524 "}\n\n"
00525
00526 "tr.signOkKeyBadH {\n"
00527 " background-color: %2 ! important;\n"
00528 "%3"
00529 "}\n\n"
00530
00531 "tr.signOkKeyBadB { background-color: %4 ! important; }\n\n" )
00532 .arg( cPgpOk0F.name(),
00533 cPgpOk0H.name(),
00534 headerFont,
00535 cPgpOk0B.name() )
00536 +
00537 QString( "table.signWarn {\n"
00538 " background-color: %1 ! important;\n"
00539 "}\n\n"
00540
00541 "tr.signWarnH {\n"
00542 " background-color: %2 ! important;\n"
00543 "%3"
00544 "}\n\n"
00545
00546 "tr.signWarnB { background-color: %4 ! important; }\n\n" )
00547 .arg( cPgpWarnF.name(),
00548 cPgpWarnH.name(),
00549 headerFont,
00550 cPgpWarnB.name() )
00551 +
00552 QString( "table.signErr {\n"
00553 " background-color: %1 ! important;\n"
00554 "}\n\n"
00555
00556 "tr.signErrH {\n"
00557 " background-color: %2 ! important;\n"
00558 "%3"
00559 "}\n\n"
00560
00561 "tr.signErrB { background-color: %4 ! important; }\n\n" )
00562 .arg( cPgpErrF.name(),
00563 cPgpErrH.name(),
00564 headerFont,
00565 cPgpErrB.name() )
00566 +
00567 QString( "div.htmlWarn {\n"
00568 " border: 2px solid %1 ! important;\n"
00569 "}\n\n" )
00570 .arg( cHtmlWarning.name() )
00571 +
00572 QString( "div.header {\n"
00573 "%1"
00574 "}\n\n"
00575
00576 "div.fancy.header > div {\n"
00577 " background-color: %2 ! important;\n"
00578 " color: %3 ! important;\n"
00579 " border: solid %4 1px ! important;\n"
00580 "}\n\n"
00581
00582 "div.fancy.header > div a[href] { color: %3 ! important; }\n\n"
00583
00584 "div.fancy.header > div a[href]:hover { text-decoration: underline ! important; }\n\n"
00585
00586 "div.fancy.header > table.outer {\n"
00587 " background-color: %5 ! important;\n"
00588 " color: %4 ! important;\n"
00589 " border-bottom: solid %4 1px ! important;\n"
00590 " border-left: solid %4 1px ! important;\n"
00591 " border-right: solid %4 1px ! important;\n"
00592 "}\n\n"
00593
00594 "div.senderpic{\n"
00595 " font-size:0.8em;\n"
00596 " border:1px solid black;\n"
00597
00598
00599 " background-color:yellow;\n"
00600 "}\n\n"
00601
00602 "div.senderstatus{\n"
00603 " text-align:center;\n"
00604 "}\n\n" )
00605
00606 .arg( headerFont )
00607 .arg( cg.highlight().name(),
00608 cg.highlightedText().name(),
00609 cg.foreground().name(),
00610 cg.background().name() )
00611 + quoteCSS;
00612 }
00613
00614 QString CSSHelper::Private::commonCssDefinitions() const {
00615 return
00616 "div.header {\n"
00617 " margin-bottom: 10pt ! important;\n"
00618 "}\n\n"
00619
00620 "table.textAtm {\n"
00621 " margin-top: 10pt ! important;\n"
00622 " margin-bottom: 10pt ! important;\n"
00623 "}\n\n"
00624
00625 "tr.textAtmH,\n"
00626 "tr.textAtmB,\n"
00627 "tr.rfc822B {\n"
00628 " font-weight: normal ! important;\n"
00629 "}\n\n"
00630
00631 "tr.rfc822H,\n"
00632 "tr.encrH,\n"
00633 "tr.signOkKeyOkH,\n"
00634 "tr.signOkKeyBadH,\n"
00635 "tr.signWarnH,\n"
00636 "tr.signErrH {\n"
00637 " font-weight: bold ! important;\n"
00638 "}\n\n"
00639
00640 "tr.textAtmH td,\n"
00641 "tr.textAtmB td {\n"
00642 " padding: 3px ! important;\n"
00643 "}\n\n"
00644
00645 "table.rfc822 {\n"
00646 " width: 100% ! important;\n"
00647 " border: solid 1px black ! important;\n"
00648 " margin-top: 10pt ! important;\n"
00649 " margin-bottom: 10pt ! important;\n"
00650 "}\n\n"
00651
00652 "table.textAtm,\n"
00653 "table.encr,\n"
00654 "table.signWarn,\n"
00655 "table.signErr,\n"
00656 "table.signOkKeyBad,\n"
00657 "table.signOkKeyOk,\n"
00658 "div.fancy.header table {\n"
00659 " width: 100% ! important;\n"
00660 " border-width: 0px ! important;\n"
00661 "}\n\n"
00662
00663 "div.htmlWarn {\n"
00664 " margin: 0px 5% ! important;\n"
00665 " padding: 10px ! important;\n"
00666 " text-align: left ! important;\n"
00667 "}\n\n"
00668
00669 "div.fancy.header > div {\n"
00670 " font-weight: bold ! important;\n"
00671 " padding: 4px ! important;\n"
00672 "}\n\n"
00673
00674 "div.fancy.header table {\n"
00675 " padding: 2px ! important;\n"
00676 " text-align: left ! important\n"
00677 "}\n\n"
00678
00679 "div.fancy.header table th {\n"
00680 " padding: 0px ! important;\n"
00681 " white-space: nowrap ! important;\n"
00682 " border-spacing: 0px ! important;\n"
00683 " text-align: left ! important;\n"
00684 " vertical-align: top ! important;\n"
00685 "}\n\n"
00686
00687 "div.fancy.header table td {\n"
00688 " padding: 0px ! important;\n"
00689 " border-spacing: 0px ! important;\n"
00690 " text-align: left ! important;\n"
00691 " vertical-align: top ! important;\n"
00692 " width: 100% ! important;\n"
00693 "}\n\n"
00694 ;
00695 }
00696
00697 }
00698