00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <qfontmetrics.h>
00022 #include <qstring.h>
00023
00024 #include <kdebug.h>
00025 #include <koGlobal.h>
00026
00027 #include "cmstyle.h"
00028 #include "contextstyle.h"
00029 #include "esstixfontstyle.h"
00030 #include "symbolfontstyle.h"
00031
00032
00033 KFORMULA_NAMESPACE_BEGIN
00034
00035
00036 ContextStyle::ContextStyle()
00037 : symbolFont( "Symbol" ),
00038 defaultColor(Qt::black), numberColor(Qt::blue),
00039 operatorColor(Qt::darkGreen), errorColor(Qt::darkRed),
00040 emptyColor(Qt::blue), helpColor( Qt::gray ),
00041 m_sizeFactor( 0 )
00042 {
00043
00044
00045
00046
00047
00048
00049
00050 textStyleValues[ displayStyle ].setup( 1. );
00051 textStyleValues[ textStyle ].setup( 1. );
00052 textStyleValues[ scriptStyle ].setup( .7 );
00053 textStyleValues[ scriptScriptStyle ].setup( .49 );
00054
00055 m_baseTextStyle = displayStyle;
00056
00057 lineWidth = 1;
00058 linearMovement = false;
00059 centerSymbol = true;
00060 m_syntaxHighlighting = true;
00061
00062 m_fontStyle = 0;
00063 }
00064
00065
00066 ContextStyle::~ContextStyle()
00067 {
00068 delete m_fontStyle;
00069 }
00070
00071
00072 void ContextStyle::init()
00073 {
00074 setup();
00075 setFontStyle( m_fontStyleName );
00076 }
00077
00078
00079 void ContextStyle::setFontStyle( const QString& fontStyle )
00080 {
00081 delete m_fontStyle;
00082 m_fontStyleName = fontStyle;
00083 if ( m_fontStyleName == "tex" ) {
00084 m_fontStyle = new CMStyle();
00085 if ( !m_fontStyle->init( this ) ) {
00086 }
00087 }
00088 else if ( m_fontStyleName == "esstix" ) {
00089 m_fontStyle = new EsstixFontStyle();
00090 if ( !m_fontStyle->init( this ) ) {
00091 }
00092 }
00093 else {
00094
00095 m_fontStyle = new SymbolFontStyle();
00096 m_fontStyle->init( this );
00097 }
00098 }
00099
00100
00101 const SymbolTable& ContextStyle::symbolTable() const
00102 {
00103 return *( m_fontStyle->symbolTable() );
00104 }
00105
00106
00107 void ContextStyle::readConfig( KConfig* config )
00108 {
00109 config->setGroup( "kformula Font" );
00110 QString fontName = config->readEntry( "defaultFont", "Times,12,-1,5,50,1,0,0,0,0" );
00111 defaultFont.fromString( fontName );
00112 fontName = config->readEntry( "nameFont", "Times,12,-1,5,50,0,0,0,0,0" );
00113 nameFont.fromString( fontName );
00114 fontName = config->readEntry( "numberFont", "Times,12,-1,5,50,0,0,0,0,0" );
00115 numberFont.fromString( fontName );
00116 fontName = config->readEntry( "operatorFont", "Times,12,-1,5,50,0,0,0,0,0" );
00117 operatorFont.fromString( fontName );
00118 QString baseSize = config->readEntry( "baseSize", "20" );
00119 m_baseSize = baseSize.toInt();
00120
00121 m_fontStyleName = config->readEntry( "fontStyle", "symbol" );
00122
00123 #if 0
00124 m_requestedFonts = config->readListEntry( "usedMathFonts" );
00125 if ( m_requestedFonts.size() == 0 ) {
00126 m_requestedFonts.push_back( "esstixone" );
00127 m_requestedFonts.push_back( "esstixtwo" );
00128 m_requestedFonts.push_back( "esstixthree" );
00129 m_requestedFonts.push_back( "esstixfour" );
00130 m_requestedFonts.push_back( "esstixfive" );
00131 m_requestedFonts.push_back( "esstixsix" );
00132 m_requestedFonts.push_back( "esstixseven" );
00133 m_requestedFonts.push_back( "esstixeight" );
00134 m_requestedFonts.push_back( "esstixnine" );
00135 m_requestedFonts.push_back( "esstixten" );
00136 m_requestedFonts.push_back( "esstixeleven" );
00137 m_requestedFonts.push_back( "esstixtwelve" );
00138 m_requestedFonts.push_back( "esstixthirteen" );
00139 m_requestedFonts.push_back( "esstixfourteen" );
00140 m_requestedFonts.push_back( "esstixfifteen" );
00141 m_requestedFonts.push_back( "esstixsixteen" );
00142 m_requestedFonts.push_back( "esstixseventeen" );
00143
00144
00145
00146
00147
00148 }
00149 #endif
00150
00151
00152 config->setGroup( "kformula Color" );
00153 defaultColor = config->readColorEntry( "defaultColor", &defaultColor );
00154 numberColor = config->readColorEntry( "numberColor", &numberColor );
00155 operatorColor = config->readColorEntry( "operatorColor", &operatorColor );
00156 emptyColor = config->readColorEntry( "emptyColor", &emptyColor );
00157 errorColor = config->readColorEntry( "errorColor", &errorColor );
00158 helpColor = config->readColorEntry( "helpColor", &helpColor );
00159
00160 m_syntaxHighlighting = config->readBoolEntry( "syntaxHighlighting", true );
00161 }
00162
00163 void ContextStyle::setZoomAndResolution( int zoom, int dpiX, int dpiY )
00164 {
00165 KoZoomHandler::setZoomAndResolution( zoom, dpiX, dpiY );
00166 }
00167
00168 bool ContextStyle::setZoomAndResolution( int zoom, double zoomX, double zoomY, bool, bool )
00169 {
00170 bool changes = m_zoom != zoom || m_zoomedResolutionX != zoomX || m_zoomedResolutionY != zoomY;
00171 m_zoom = zoom;
00172 m_zoomedResolutionX = zoomX;
00173 m_zoomedResolutionY = zoomY;
00174 return changes;
00175 }
00176
00177 QColor ContextStyle::getNumberColor() const
00178 {
00179 if ( edit() && syntaxHighlighting() ) {
00180 return numberColor;
00181 }
00182 return getDefaultColor();
00183 }
00184
00185 QColor ContextStyle::getOperatorColor() const
00186 {
00187 if ( edit() && syntaxHighlighting() ) {
00188 return operatorColor;
00189 }
00190 return getDefaultColor();
00191 }
00192
00193 QColor ContextStyle::getErrorColor() const
00194 {
00195 if ( edit() && syntaxHighlighting() ) {
00196 return errorColor;
00197 }
00198 return getDefaultColor();
00199 }
00200
00201 QColor ContextStyle::getEmptyColor() const
00202 {
00203 if ( edit() && syntaxHighlighting() ) {
00204 return emptyColor;
00205 }
00206 return getDefaultColor();
00207 }
00208
00209 QColor ContextStyle::getHelpColor() const
00210 {
00211 if ( edit() && syntaxHighlighting() ) {
00212 return helpColor;
00213 }
00214 return getDefaultColor();
00215 }
00216
00217 void ContextStyle::setDefaultColor( const QColor& color )
00218 {
00219 defaultColor = color;
00220 }
00221 void ContextStyle::setNumberColor( const QColor& color )
00222 {
00223 numberColor = color;
00224 }
00225 void ContextStyle::setOperatorColor( const QColor& color )
00226 {
00227 operatorColor = color;
00228 }
00229 void ContextStyle::setErrorColor( const QColor& color )
00230 {
00231 errorColor = color;
00232 }
00233 void ContextStyle::setEmptyColor( const QColor& color )
00234 {
00235 emptyColor = color;
00236 }
00237 void ContextStyle::setHelpColor( const QColor& color )
00238 {
00239 helpColor = color;
00240 }
00241
00242 #if 0
00243 const QStringList& ContextStyle::requestedFonts() const
00244 {
00245 return m_requestedFonts;
00246 }
00247
00248 void ContextStyle::setRequestedFonts( const QStringList& list )
00249 {
00250 m_requestedFonts = list;
00251
00252 }
00253 #endif
00254
00255 double ContextStyle::getReductionFactor( TextStyle tstyle ) const
00256 {
00257 return textStyleValues[ tstyle ].reductionFactor;
00258 }
00259
00260 luPt ContextStyle::getAdjustedSize( TextStyle tstyle ) const
00261 {
00262 return qRound( ptToLayoutUnitPt( m_sizeFactor*m_baseSize*getReductionFactor( tstyle ) ) );
00263 }
00264
00265 luPixel ContextStyle::getSpace( TextStyle tstyle, SpaceWidth space ) const
00266 {
00267 switch ( space ) {
00268 case NEGTHIN: return -getThinSpace( tstyle );
00269 case THIN: return getThinSpace( tstyle );
00270 case MEDIUM: return getMediumSpace( tstyle );
00271 case THICK: return getThickSpace( tstyle );
00272 case QUAD: return getQuadSpace( tstyle );
00273 }
00274 return 0;
00275 }
00276
00277 luPixel ContextStyle::getThinSpace( TextStyle tstyle ) const
00278 {
00279 return ptToPixelX( m_sizeFactor*textStyleValues[ tstyle ].thinSpace( quad ) );
00280 }
00281
00282 luPixel ContextStyle::getMediumSpace( TextStyle tstyle ) const
00283 {
00284 return ptToPixelX( m_sizeFactor*textStyleValues[ tstyle ].mediumSpace( quad ) );
00285 }
00286
00287 luPixel ContextStyle::getThickSpace( TextStyle tstyle ) const
00288 {
00289 return ptToPixelX( m_sizeFactor*textStyleValues[ tstyle ].thickSpace( quad ) );
00290 }
00291
00292 luPixel ContextStyle::getQuadSpace( TextStyle tstyle ) const
00293 {
00294 return ptToPixelX( m_sizeFactor*textStyleValues[ tstyle ].quadSpace( quad ) );
00295 }
00296
00297 luPixel ContextStyle::axisHeight( TextStyle tstyle ) const
00298 {
00299
00300 return static_cast<luPixel>( m_sizeFactor*textStyleValues[ tstyle ].axisHeight( m_axisHeight ) );
00301 }
00302
00303 luPt ContextStyle::getBaseSize() const
00304 {
00305 return static_cast<luPt>( ptToLayoutUnitPt( m_sizeFactor*m_baseSize ) );
00306 }
00307
00308 void ContextStyle::setBaseSize( int size )
00309 {
00310
00311 if ( size != m_baseSize ) {
00312 m_baseSize = size;
00313 setup();
00314 }
00315 }
00316
00317 void ContextStyle::setSizeFactor( double factor )
00318 {
00319 m_sizeFactor = factor;
00320 }
00321
00322
00323 luPixel ContextStyle::getLineWidth() const
00324 {
00325 return ptToLayoutUnitPixX( m_sizeFactor*lineWidth );
00326 }
00327
00328 luPixel ContextStyle::getEmptyRectWidth() const
00329 {
00330 return ptToLayoutUnitPixX( m_sizeFactor*m_baseSize/1.8 );
00331 }
00332
00333 luPixel ContextStyle::getEmptyRectHeight() const
00334 {
00335 return ptToLayoutUnitPixX( m_sizeFactor*m_baseSize/1.8 );
00336 }
00337
00338
00339 ContextStyle::TextStyle ContextStyle::convertTextStyleFraction( TextStyle tstyle ) const
00340 {
00341 TextStyle result;
00342
00343 switch ( tstyle ){
00344 case displayStyle:
00345 result = textStyle;
00346 break;
00347 case textStyle:
00348 result = scriptStyle;
00349 break;
00350 default:
00351 result = scriptScriptStyle;
00352 break;
00353 }
00354
00355 return result;
00356 }
00357
00358
00359 ContextStyle::TextStyle ContextStyle::convertTextStyleIndex( TextStyle tstyle ) const
00360 {
00361 TextStyle result;
00362
00363 switch ( tstyle ){
00364 case displayStyle:
00365 result = scriptStyle;
00366 break;
00367 case textStyle:
00368 result = scriptStyle;
00369 break;
00370 default:
00371 result = scriptScriptStyle;
00372 break;
00373 }
00374
00375 return result;
00376 }
00377
00378
00379 void ContextStyle::setup()
00380 {
00381 luPt size = static_cast<luPt>( m_baseSize );
00382 QFont font = symbolFont;
00383 font.setPointSize( size );
00384 QFontMetrics fm( font );
00385
00386
00387 quad = ptToLayoutUnitPt( fm.width( 'M' ) );
00388
00389 font = QFont(defaultFont);
00390 font.setPointSize( size );
00391 QFontMetrics fm2( font );
00392
00393
00394
00395 m_axisHeight = ptToLayoutUnitPixY( pixelYToPt( fm2.strikeOutPos() ) );
00396 }
00397
00398 KFORMULA_NAMESPACE_END