32 #include "csshelper.h" 34 #include <tdeconfig.h> 35 #include <tdeglobalsettings.h> 37 #include <tdeglobal.h> 40 #include <tqapplication.h> 46 inline TQColor darker(
const TQColor & c ) {
49 return TQColor( h, s, v*4/5, TQColor::Hsv );
52 inline TQColor desaturate(
const TQColor & c ) {
55 return TQColor( h, s/8, v, TQColor::Hsv );
58 inline TQColor fixValue(
const TQColor & c,
int newV ) {
61 return TQColor( h, s, newV, TQColor::Hsv );
64 inline int getValueOf(
const TQColor & c ) {
71 CSSHelper::CSSHelper(
const TQPaintDeviceMetrics &pdm ) :
72 mShrinkQuotes( false ),
76 mForegroundColor = TQApplication::palette().active().text();
77 mLinkColor = TDEGlobalSettings::linkColor();
78 mVisitedLinkColor = TDEGlobalSettings::visitedLinkColor();
79 mBackgroundColor = TQApplication::palette().active().base();
80 cHtmlWarning = TQColor( 0xFF, 0x40, 0x40 );
82 cPgpEncrH = TQColor( 0x00, 0x80, 0xFF );
83 cPgpOk1H = TQColor( 0x40, 0xFF, 0x40 );
84 cPgpOk0H = TQColor( 0xFF, 0xFF, 0x40 );
85 cPgpWarnH = TQColor( 0xFF, 0xFF, 0x40 );
88 for (
int i = 0 ; i < 3 ; ++i )
89 mQuoteColor[i] = TQColor( 0x00, 0x80 - i * 0x10, 0x00 );
90 mRecycleQuoteColors =
false;
92 TQFont defaultFont = TDEGlobalSettings::generalFont();
93 TQFont defaultFixedFont = TDEGlobalSettings::fixedFont();
94 mBodyFont = mPrintFont = defaultFont;
95 mFixedFont = mFixedPrintFont = defaultFixedFont;
96 defaultFont.setItalic(
true );
97 for (
int i = 0 ; i < 3 ; ++i )
98 mQuoteFont[i] = defaultFont;
100 mBackingPixmapOn =
false;
102 recalculatePGPColors();
105 void CSSHelper::recalculatePGPColors() {
117 const int vBG = getValueOf( mBackgroundColor );
118 const bool lightBG = vBG >= 128;
119 if ( cPgpOk1H == mBackgroundColor ) {
120 cPgpOk1F = mBackgroundColor;
121 cPgpOk1B = mBackgroundColor;
123 cPgpOk1F= darker( cPgpOk1H );
124 cPgpOk1B = lightBG ? desaturate( cPgpOk1H ) : fixValue( cPgpOk1H, vBG );
126 if ( cPgpOk0H == mBackgroundColor ) {
127 cPgpOk0F = mBackgroundColor;
128 cPgpOk0B = mBackgroundColor;
130 cPgpOk0F = darker( cPgpOk0H );
131 cPgpOk0B = lightBG ? desaturate( cPgpOk0H ) : fixValue( cPgpOk0H, vBG );
133 if ( cPgpWarnH == mBackgroundColor ) {
134 cPgpWarnF = mBackgroundColor;
135 cPgpWarnB = mBackgroundColor;
137 cPgpWarnF = darker( cPgpWarnH );
138 cPgpWarnB = lightBG ? desaturate( cPgpWarnH ) : fixValue( cPgpWarnH, vBG );
140 if ( cPgpErrH == mBackgroundColor ) {
141 cPgpErrF = mBackgroundColor;
142 cPgpErrB = mBackgroundColor;
144 cPgpErrF = darker( cPgpErrH );
145 cPgpErrB = lightBG ? desaturate( cPgpErrH ) : fixValue( cPgpErrH, vBG );
147 if ( cPgpEncrH == mBackgroundColor ) {
148 cPgpEncrF = mBackgroundColor;
149 cPgpEncrB = mBackgroundColor;
151 cPgpEncrF = darker( cPgpEncrH );
152 cPgpEncrB = lightBG ? desaturate( cPgpEncrH ) : fixValue( cPgpEncrH, vBG );
156 TQString CSSHelper::cssDefinitions(
bool fixed )
const {
158 commonCssDefinitions()
160 "@media screen {\n\n" 162 screenCssDefinitions(
this, fixed )
167 printCssDefinitions( fixed )
172 TQString CSSHelper::htmlHead(
bool )
const {
174 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n" 175 "<html><head><title></title></head>\n" 179 TQString CSSHelper::quoteFontTag(
int level )
const {
182 static const int numQuoteLevels =
sizeof mQuoteFont /
sizeof *mQuoteFont;
183 const int effectiveLevel = mRecycleQuoteColors
184 ? level % numQuoteLevels + 1
185 : kMin( level + 1, numQuoteLevels ) ;
186 if ( level >= numQuoteLevels )
187 return TQString(
"<div class=\"deepquotelevel%1\">" ).arg( effectiveLevel );
189 return TQString(
"<div class=\"quotelevel%1\">" ).arg( effectiveLevel );
192 TQString CSSHelper::nonQuotedFontTag()
const {
193 return "<div class=\"noquote\">";
196 TQFont CSSHelper::bodyFont(
bool fixed,
bool print )
const {
197 return fixed ? ( print ? mFixedPrintFont : mFixedFont )
198 : ( print ? mPrintFont : mBodyFont );
201 int CSSHelper::fontSize(
bool fixed,
bool print )
const {
202 return bodyFont( fixed, print ).pointSize();
207 int pointsToPixel(
const TQPaintDeviceMetrics & metrics,
int pointSize ) {
208 return ( pointSize * metrics.logicalDpiY() + 36 ) / 72 ;
212 static const char *
const quoteFontSizes[] = {
"85",
"80",
"75" };
214 TQString CSSHelper::printCssDefinitions(
bool fixed )
const {
215 const TQString headerFont = TQString(
" font-family: \"%1\" ! important;\n" 216 " font-size: %2pt ! important;\n" )
217 .arg( mPrintFont.family() )
218 .arg( mPrintFont.pointSize() );
219 const TQColorGroup & cg = TQApplication::palette().active();
221 const TQFont printFont = bodyFont( fixed,
true );
223 if ( printFont.italic() )
224 quoteCSS +=
" font-style: italic ! important;\n";
225 if ( printFont.bold() )
226 quoteCSS +=
" font-weight: bold ! important;\n";
227 if ( !quoteCSS.isEmpty() )
228 quoteCSS =
"div.noquote {\n" + quoteCSS +
"}\n\n";
232 " font-family: \"%1\" ! important;\n" 233 " font-size: %2pt ! important;\n" 234 " color: #000000 ! important;\n" 235 " background-color: #ffffff ! important\n" 237 .arg( printFont.family(),
238 TQString::number( printFont.pointSize() ) )
240 TQString(
"tr.textAtmH,\n" 241 "tr.signInProgressH,\n" 245 "tr.signOkKeyBadH,\n" 252 "div.fancy.header > div {\n" 253 " background-color: %2 ! important;\n" 254 " color: %3 ! important;\n" 255 " padding: 4px ! important;\n" 256 " border: solid %3 1px ! important;\n" 259 "div.fancy.header > div a[href] { color: %3 ! important; }\n\n" 261 "div.fancy.header > table.outer{\n" 262 " background-color: %2 ! important;\n" 263 " color: %3 ! important;\n" 264 " border-bottom: solid %3 1px ! important;\n" 265 " border-left: solid %3 1px ! important;\n" 266 " border-right: solid %3 1px ! important;\n" 270 " display:none ! important;\n" 274 " border: 2px solid #ffffff ! important;\n" 278 " font-size:0.8em ! important;\n" 279 " border:1px solid black ! important;\n" 280 " background-color:%2 ! important;\n" 283 "div.senderstatus{\n" 284 " text-align:center ! important;\n" 288 " display:none ! important;\n" 292 cg.background().name(),
293 cg.foreground().name() )
297 TQString CSSHelper::screenCssDefinitions(
const CSSHelper * helper,
bool fixed )
const {
298 const TQString fgColor = mForegroundColor.name();
299 const TQString bgColor = mBackgroundColor.name();
300 const TQString linkColor = mLinkColor.name();
301 const TQString headerFont = TQString(
" font-family: \"%1\" ! important;\n" 302 " font-size: %2px ! important;\n")
303 .arg( mBodyFont.family() )
304 .arg( pointsToPixel( helper->mMetrics, mBodyFont.pointSize() ) );
305 const TQString background = ( mBackingPixmapOn
306 ? TQString(
" background-image:url(file://%1) ! important;\n" )
307 .arg( mBackingPixmapStr )
308 : TQString(
" background-color: %1 ! important;\n" )
310 const TQString bodyFontSize = TQString::number( pointsToPixel( helper->mMetrics, fontSize( fixed ) ) ) +
"px" ;
311 const TQColorGroup & cg = TQApplication::palette().active();
314 if ( bodyFont( fixed ).italic() )
315 quoteCSS +=
" font-style: italic ! important;\n";
316 if ( bodyFont( fixed ).bold() )
317 quoteCSS +=
" font-weight: bold ! important;\n";
318 if ( !quoteCSS.isEmpty() )
319 quoteCSS =
"div.noquote {\n" + quoteCSS +
"}\n\n";
322 for (
int i = 0 ; i < 3 ; ++i ) {
323 quoteCSS += TQString(
"div.quotelevel%1 {\n" 324 " color: %2 ! important;\n" )
325 .arg( TQString::number(i+1), mQuoteColor[i].name() );
326 if ( mQuoteFont[i].italic() )
327 quoteCSS +=
" font-style: italic ! important;\n";
328 if ( mQuoteFont[i].bold() )
329 quoteCSS +=
" font-weight: bold ! important;\n";
331 quoteCSS +=
" font-size: " + TQString::fromLatin1( quoteFontSizes[i] )
332 +
"% ! important;\n";
337 for (
int i = 0 ; i < 3 ; ++i ) {
338 quoteCSS += TQString(
"div.deepquotelevel%1 {\n" 339 " color: %2 ! important;\n" )
340 .arg( TQString::number(i+1), mQuoteColor[i].name() );
341 if ( mQuoteFont[i].italic() )
342 quoteCSS +=
" font-style: italic ! important;\n";
343 if ( mQuoteFont[i].bold() )
344 quoteCSS +=
" font-weight: bold ! important;\n";
346 quoteCSS +=
" font-size: 70% ! important;\n";
352 " font-family: \"%1\" ! important;\n" 353 " font-size: %2 ! important;\n" 354 " color: %3 ! important;\n" 357 .arg( bodyFont( fixed ).family(),
363 " color: %1 ! important;\n" 364 " text-decoration: none ! important;\n" 368 " color: white ! important;\n" 372 " color: black ! important;\n" 375 "table.textAtm { background-color: %2 ! important; }\n\n" 378 " background-color: %3 ! important;\n" 383 " background-color: %3 ! important;\n" 386 "table.signInProgress,\n" 388 " background-color: %3 ! important;\n" 391 "tr.signInProgressH,\n" 395 .arg( linkColor, fgColor, bgColor, headerFont )
397 TQString(
"table.encr {\n" 398 " background-color: %1 ! important;\n" 402 " background-color: %2 ! important;\n" 406 "tr.encrB { background-color: %4 ! important; }\n\n" )
407 .arg( cPgpEncrF.name(),
412 TQString(
"table.signOkKeyOk {\n" 413 " background-color: %1 ! important;\n" 416 "tr.signOkKeyOkH {\n" 417 " background-color: %2 ! important;\n" 421 "tr.signOkKeyOkB { background-color: %4 ! important; }\n\n" )
422 .arg( cPgpOk1F.name(),
427 TQString(
"table.signOkKeyBad {\n" 428 " background-color: %1 ! important;\n" 431 "tr.signOkKeyBadH {\n" 432 " background-color: %2 ! important;\n" 436 "tr.signOkKeyBadB { background-color: %4 ! important; }\n\n" )
437 .arg( cPgpOk0F.name(),
442 TQString(
"table.signWarn {\n" 443 " background-color: %1 ! important;\n" 447 " background-color: %2 ! important;\n" 451 "tr.signWarnB { background-color: %4 ! important; }\n\n" )
452 .arg( cPgpWarnF.name(),
457 TQString(
"table.signErr {\n" 458 " background-color: %1 ! important;\n" 462 " background-color: %2 ! important;\n" 466 "tr.signErrB { background-color: %4 ! important; }\n\n" )
467 .arg( cPgpErrF.name(),
472 TQString(
"div.htmlWarn {\n" 473 " border: 2px solid %1 ! important;\n" 475 .arg( cHtmlWarning.name() )
477 TQString(
"div.header {\n" 481 "div.fancy.header > div {\n" 482 " background-color: %2 ! important;\n" 483 " color: %3 ! important;\n" 484 " border: solid %4 1px ! important;\n" 487 "div.fancy.header > div a[href] { color: %3 ! important; }\n\n" 489 "div.fancy.header > div a[href]:hover { text-decoration: underline ! important; }\n\n" 491 "div.fancy.header > div.spamheader {\n" 492 " background-color: #cdcdcd ! important;\n" 493 " border-top: 0px ! important;\n" 494 " padding: 3px ! important;\n" 495 " color: black ! important;\n" 496 " font-weight: bold ! important;\n" 497 " font-size: smaller ! important;\n" 500 "div.fancy.header > table.outer {\n" 501 " background-color: %5 ! important;\n" 502 " color: %4 ! important;\n" 503 " border-bottom: solid %4 1px ! important;\n" 504 " border-left: solid %4 1px ! important;\n" 505 " border-right: solid %4 1px ! important;\n" 509 " padding: 0px ! important;\n" 510 " font-size:0.8em ! important;\n" 511 " border:1px solid %6 ! important;\n" 514 " background-color:%5 ! important;\n" 517 "div.senderstatus{\n" 518 " text-align:center ! important;\n" 523 .arg( cg.highlight().name(),
524 cg.highlightedText().name(),
525 cg.foreground().name(),
526 cg.background().name() )
527 .arg( cg.mid().name() )
531 TQString CSSHelper::commonCssDefinitions()
const {
534 " margin-bottom: 10pt ! important;\n" 538 " margin-top: 10pt ! important;\n" 539 " margin-bottom: 10pt ! important;\n" 545 " font-weight: normal ! important;\n" 548 "tr.signInProgressH,\n" 552 "tr.signOkKeyBadH,\n" 555 " font-weight: bold ! important;\n" 560 " padding: 3px ! important;\n" 564 " width: 100% ! important;\n" 565 " border: solid 1px black ! important;\n" 566 " margin-top: 10pt ! important;\n" 567 " margin-bottom: 10pt ! important;\n" 574 "table.signOkKeyBad,\n" 575 "table.signOkKeyOk,\n" 576 "table.signInProgress,\n" 577 "div.fancy.header table {\n" 578 " width: 100% ! important;\n" 579 " border-width: 0px ! important;\n" 583 " margin: 0px 5% ! important;\n" 584 " padding: 10px ! important;\n" 585 " text-align: left ! important;\n" 588 "div.fancy.header > div {\n" 589 " font-weight: bold ! important;\n" 590 " padding: 4px ! important;\n" 593 "div.fancy.header table {\n" 594 " padding: 2px ! important;\n" 595 " text-align: left ! important\n" 598 "div.fancy.header table th {\n" 599 " padding: 0px ! important;\n" 600 " white-space: nowrap ! important;\n" 601 " border-spacing: 0px ! important;\n" 602 " text-align: left ! important;\n" 603 " vertical-align: top ! important;\n" 606 "div.fancy.header table td {\n" 607 " padding: 0px ! important;\n" 608 " border-spacing: 0px ! important;\n" 609 " text-align: left ! important;\n" 610 " vertical-align: top ! important;\n" 611 " width: 100% ! important;\n" 614 "span.pimsmileytext {\n" 615 " position: absolute;\n" 618 " visibility: hidden;\n" 621 "img.pimsmileyimg {\n" 624 "div.quotelevelmark {\n" 625 " position: absolute;\n" 626 " margin-left:-10px;\n" 632 void CSSHelper::setBodyFont(
const TQFont& font )
637 void CSSHelper::setPrintFont(
const TQFont& font )
642 TQColor CSSHelper::pgpWarnColor()
const TDEPIM classes for drag and drop of mails.