/* This file is part of the KDE project Copyright (C) 2001 Andrea Rizzi Ulrich Kuettler 2006 Alfredo Beaumont Sainz This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "contextstyle.h" #include "fontstyle.h" KFORMULA_NAMESPACE_BEGIN ContextStyle::ContextStyle() : symbolFont( "Symbol" ), defaultColor(TQt::black), numberColor(TQt::blue), operatorColor(TQt::darkGreen), errorColor(TQt::darkRed), emptyColor(TQt::blue), helpColor( TQt::gray ), m_sizeFactor( 0 ) { // kdDebug() << "ContextStyle::ContextStyle" << endl // << "defaultFont: " << defaultFont.rawName() << endl // << "nameFont: " << nameFont.rawName() << endl // << "numberFont: " << numberFont.rawName() << endl // << "operatorFont: " << operatorFont.rawName() << endl // << "symbolFont: " << symbolFont.rawName() << endl; textStyleValues[ displayStyle ].setup( 1. ); textStyleValues[ textStyle ].setup( 1. ); textStyleValues[ scriptStyle ].setup( .7 ); textStyleValues[ scriptScriptStyle ].setup( .49 ); m_baseTextStyle = displayStyle; lineWidth = 1; linearMovement = false; centerSymbol = true; m_syntaxHighlighting = true; m_fontStyle = 0; } ContextStyle::~ContextStyle() { delete m_fontStyle; } void ContextStyle::init( bool init ) { setup(); setFontStyle( m_fontStyleName, init ); } void ContextStyle::setFontStyle( const TQString& fontStyle, bool init ) { delete m_fontStyle; m_fontStyleName = fontStyle; m_fontStyle = new FontStyle(); m_fontStyle->init( this, init ); } const SymbolTable& ContextStyle::symbolTable() const { return *( m_fontStyle->symbolTable() ); } void ContextStyle::readConfig( KConfig* config, bool init ) { config->setGroup( "kformula Font" ); TQString fontName = config->readEntry( "defaultFont", "Times,12,-1,5,50,1,0,0,0,0" ); defaultFont.fromString( fontName ); fontName = config->readEntry( "nameFont", "Times,12,-1,5,50,0,0,0,0,0" ); nameFont.fromString( fontName ); fontName = config->readEntry( "numberFont", "Times,12,-1,5,50,0,0,0,0,0" ); numberFont.fromString( fontName ); fontName = config->readEntry( "operatorFont", "Times,12,-1,5,50,0,0,0,0,0" ); operatorFont.fromString( fontName ); TQString baseSize = config->readEntry( "baseSize", "20" ); m_baseSize = baseSize.toInt(); if ( ! FontStyle::missingFonts( init ).isEmpty() ) { kdWarning( DEBUGID) << "Not all basic fonts found\n"; } mathFont.fromString("Arev Sans"); bracketFont.fromString("cmex10"); // There's no gui right anymore but I'll leave it here... config->setGroup( "kformula Color" ); defaultColor = config->readColorEntry( "defaultColor", &defaultColor ); numberColor = config->readColorEntry( "numberColor", &numberColor ); operatorColor = config->readColorEntry( "operatorColor", &operatorColor ); emptyColor = config->readColorEntry( "emptyColor", &emptyColor ); errorColor = config->readColorEntry( "errorColor", &errorColor ); helpColor = config->readColorEntry( "helpColor", &helpColor ); m_syntaxHighlighting = config->readBoolEntry( "syntaxHighlighting", true ); } void ContextStyle::setZoomAndResolution( int zoom, int dpiX, int dpiY ) { KoZoomHandler::setZoomAndResolution( zoom, dpiX, dpiY ); } bool ContextStyle::setZoomAndResolution( int zoom, double zoomX, double zoomY, bool, bool ) { bool changes = m_zoom != zoom || m_zoomedResolutionX != zoomX || m_zoomedResolutionY != zoomY; m_zoom = zoom; m_zoomedResolutionX = zoomX; m_zoomedResolutionY = zoomY; return changes; } TQColor ContextStyle::getNumberColor() const { if ( edit() && syntaxHighlighting() ) { return numberColor; } return getDefaultColor(); } TQColor ContextStyle::getOperatorColor() const { if ( edit() && syntaxHighlighting() ) { return operatorColor; } return getDefaultColor(); } TQColor ContextStyle::getErrorColor() const { if ( edit() && syntaxHighlighting() ) { return errorColor; } return getDefaultColor(); } TQColor ContextStyle::getEmptyColor() const { if ( edit() && syntaxHighlighting() ) { return emptyColor; } return getDefaultColor(); } TQColor ContextStyle::getHelpColor() const { if ( edit() && syntaxHighlighting() ) { return helpColor; } return getDefaultColor(); } void ContextStyle::setDefaultColor( const TQColor& color ) { defaultColor = color; } void ContextStyle::setNumberColor( const TQColor& color ) { numberColor = color; } void ContextStyle::setOperatorColor( const TQColor& color ) { operatorColor = color; } void ContextStyle::setErrorColor( const TQColor& color ) { errorColor = color; } void ContextStyle::setEmptyColor( const TQColor& color ) { emptyColor = color; } void ContextStyle::setHelpColor( const TQColor& color ) { helpColor = color; } #if 0 const TQStringList& ContextStyle::requestedFonts() const { return m_requestedFonts; } void ContextStyle::setRequestedFonts( const TQStringList& list ) { m_requestedFonts = list; //table.init( this ); } #endif double ContextStyle::getReductionFactor( TextStyle tstyle ) const { return textStyleValues[ tstyle ].reductionFactor; } luPt ContextStyle::getAdjustedSize( TextStyle tstyle, double factor ) const { return tqRound( ptToLayoutUnitPt( m_sizeFactor * m_baseSize * getReductionFactor( tstyle ) * factor * zoom() / 100.0 ) ); } luPixel ContextStyle::getSpace( TextStyle tstyle, SpaceWidth space, double factor ) const { switch ( space ) { case NEGTHIN: return -getThinSpace( tstyle, factor ); case THIN: return getThinSpace( tstyle, factor ); case MEDIUM: return getMediumSpace( tstyle, factor ); case THICK: return getThickSpace( tstyle, factor ); case QUAD: return getQuadSpace( tstyle, factor ); } return 0; } luPixel ContextStyle::getThinSpace( TextStyle tstyle, double factor ) const { return ptToPixelX( m_sizeFactor * textStyleValues[ tstyle ].thinSpace( quad ) * factor * zoom() / 100.0 ); } luPixel ContextStyle::getMediumSpace( TextStyle tstyle, double factor ) const { return ptToPixelX( m_sizeFactor * textStyleValues[ tstyle ].mediumSpace( quad ) * factor * zoom() / 100.0 ); } luPixel ContextStyle::getThickSpace( TextStyle tstyle, double factor ) const { return ptToPixelX( m_sizeFactor * textStyleValues[ tstyle ].thickSpace( quad ) * factor * zoom() / 100.0 ); } luPixel ContextStyle::getQuadSpace( TextStyle tstyle, double factor ) const { return ptToPixelX( m_sizeFactor * textStyleValues[ tstyle ].quadSpace( quad ) * factor * zoom() / 100.0 ); } luPixel ContextStyle::axisHeight( TextStyle tstyle, double factor ) const { //return ptToPixelY( textStyleValues[ tstyle ].axisHeight( m_axisHeight ) ); return static_cast( m_sizeFactor * textStyleValues[ tstyle ].axisHeight( m_axisHeight ) * factor * zoom() / 100.0 ); } luPt ContextStyle::getBaseSize() const { return static_cast( ptToLayoutUnitPt( m_sizeFactor*m_baseSize ) ); } void ContextStyle::setBaseSize( int size ) { //kdDebug( 40000 ) << "ContextStyle::setBaseSize" << endl; if ( size != m_baseSize ) { m_baseSize = size; setup(); } } void ContextStyle::setSizeFactor( double factor ) { m_sizeFactor = factor; } luPixel ContextStyle::getLineWidth( double factor ) const { return ptToLayoutUnitPixX( m_sizeFactor*lineWidth*factor*zoom() / 100.0 ); } luPixel ContextStyle::getEmptyRectWidth( double factor ) const { return ptToLayoutUnitPixX( m_sizeFactor*m_baseSize*factor*(zoom() / 100.0)/1.8 ); } luPixel ContextStyle::getEmptyRectHeight( double factor ) const { return ptToLayoutUnitPixX( m_sizeFactor*m_baseSize*factor*(zoom() / 100.0)/1.8 ); } ContextStyle::TextStyle ContextStyle::convertTextStyleFraction( TextStyle tstyle ) const { TextStyle result; switch ( tstyle ){ case displayStyle: result = textStyle; break; case textStyle: result = scriptStyle; break; default: result = scriptScriptStyle; break; } return result; } ContextStyle::TextStyle ContextStyle::convertTextStyleIndex( TextStyle tstyle ) const { TextStyle result; switch ( tstyle ){ case displayStyle: result = scriptStyle; break; case textStyle: result = scriptStyle; break; default: result = scriptScriptStyle; break; } return result; } void ContextStyle::setup() { luPt size = static_cast( m_baseSize ); TQFont font = symbolFont; font.setPointSize( size ); TQFontMetrics fm( font ); // Or better the real space required? ( boundingRect ) quad = ptToLayoutUnitPt( fm.width( 'M' ) ); font = TQFont(defaultFont); font.setPointSize( size ); TQFontMetrics fm2( font ); //m_axisHeight = ptToLayoutUnitPt( fm2.strikeOutPos() ); //ptToLayoutUnitPixY //m_axisHeight = ptToLayoutUnitPt( pixelYToPt( fm2.strikeOutPos() ) ); m_axisHeight = ptToLayoutUnitPixY( pixelYToPt( fm2.strikeOutPos() ) ); } double StyleAttributes::sizeFactor() const { if ( m_size.empty() ) { // kdWarning( DEBUGID ) << "SizeFactor stack is empty.\n"; return 1.0; } return m_size.top(); } bool StyleAttributes::customMathVariant() const { if ( m_customMathVariant.empty() ) { return false; } return m_customMathVariant.top(); } CharStyle StyleAttributes::charStyle() const { if ( m_charStyle.empty() ) { // kdWarning( DEBUGID ) << "CharStyle stack is empty.\n"; return anyChar; } return m_charStyle.top(); } CharFamily StyleAttributes::charFamily() const { if ( m_charFamily.empty() ) { // kdWarning( DEBUGID ) << "CharFamily stack is empty.\n"; return anyFamily; } return m_charFamily.top(); } TQColor StyleAttributes::color() const { if ( m_color.empty() ) { // kdWarning( DEBUGID ) << "Color stack is empty.\n"; return TQColor( TQt::black ); //return getDefaultColor(); } return m_color.top(); } TQColor StyleAttributes::background() const { if ( m_background.empty() ) { // kdWarning( DEBUGID ) << "Background stack is empty.\n"; return TQColor( TQt::color0 ); } return m_background.top(); } TQFont StyleAttributes::font() const { if ( m_font.empty() ) { return TQFont(); } return m_font.top(); } bool StyleAttributes::fontWeight() const { if ( m_fontWeight.empty() ) { return false; } return m_fontWeight.top(); } bool StyleAttributes::customFontWeight() const { if ( m_customFontWeight.empty() ) { return false; } return m_customFontWeight.top(); } bool StyleAttributes::fontStyle() const { if ( m_fontStyle.empty() ) { return false; } return m_fontStyle.top(); } bool StyleAttributes::customFontStyle() const { if ( m_customFontStyle.empty() ) { return false; } return m_customFontStyle.top(); } bool StyleAttributes::customFont() const { if ( m_customFontFamily.empty() ) { return false; } return m_customFontFamily.top(); } int StyleAttributes::scriptLevel() const { if ( m_scriptLevel.empty() ) { return 0; } return m_scriptLevel.top(); } double StyleAttributes::scriptSizeMultiplier() const { if ( m_scriptSizeMultiplier.empty() ) { return scriptsizemultiplier; } return m_scriptSizeMultiplier.top(); } double StyleAttributes::scriptMinSize() const { if ( m_scriptMinSize.empty() ) { return scriptminsize; } return m_scriptMinSize.top(); } double StyleAttributes::veryVeryThinMathSpace() const { if ( m_veryVeryThinMathSpace.empty() ) { return veryverythinmathspace; } return m_veryVeryThinMathSpace.top(); } double StyleAttributes::veryThinMathSpace() const { if ( m_veryThinMathSpace.empty() ) { return verythinmathspace; } return m_veryThinMathSpace.top(); } double StyleAttributes::thinMathSpace() const { if ( m_thinMathSpace.empty() ) { return thinmathspace; } return m_thinMathSpace.top(); } double StyleAttributes::mediumMathSpace() const { if ( m_mediumMathSpace.empty() ) { return mediummathspace; } return m_mediumMathSpace.top(); } double StyleAttributes::thickMathSpace() const { if ( m_thickMathSpace.empty() ) { return thickmathspace; } return m_thickMathSpace.top(); } double StyleAttributes::veryThickMathSpace() const { if ( m_veryThickMathSpace.empty() ) { return verythickmathspace; } return m_veryThickMathSpace.top(); } double StyleAttributes::veryVeryThickMathSpace() const { if ( m_veryVeryThickMathSpace.empty() ) { return veryverythickmathspace; } return m_veryVeryThickMathSpace.top(); } bool StyleAttributes::displayStyle() const { if ( m_displayStyle.empty() ) { return true; } return m_displayStyle.top(); } bool StyleAttributes::customDisplayStyle() const { if ( m_customDisplayStyle.empty() ) { return false; } return m_customDisplayStyle.top(); } double StyleAttributes::getSpace( SizeType type, double length ) const { switch ( type ) { case NegativeVeryVeryThinMathSpace: return - veryVeryThinMathSpace(); case NegativeVeryThinMathSpace: return - veryThinMathSpace(); case NegativeThinMathSpace: return - thinMathSpace(); case NegativeMediumMathSpace: return - mediumMathSpace(); case NegativeThickMathSpace: return - thickMathSpace(); case NegativeVeryThickMathSpace: return - veryThickMathSpace(); case NegativeVeryVeryThickMathSpace: return - veryVeryThickMathSpace(); case VeryVeryThinMathSpace: return veryVeryThinMathSpace(); case VeryThinMathSpace: return veryThinMathSpace(); case ThinMathSpace: return thinMathSpace(); case MediumMathSpace: return mediumMathSpace(); case ThickMathSpace: return thickMathSpace(); case VeryThickMathSpace: return veryThickMathSpace(); case VeryVeryThickMathSpace: return veryVeryThickMathSpace(); default: break; } return length; } void StyleAttributes::resetSize() { if ( ! m_size.empty() ) { m_size.pop(); } } void StyleAttributes::resetCharStyle() { if ( ! m_charStyle.empty() ) { m_charStyle.pop(); } } void StyleAttributes::resetCharFamily() { if ( ! m_charFamily.empty() ) { m_charFamily.pop(); } } void StyleAttributes::resetColor() { if ( ! m_color.empty() ) { m_color.pop(); } } void StyleAttributes::resetBackground() { if ( ! m_background.empty() ) { m_background.pop(); } } void StyleAttributes::resetFontFamily() { if ( ! m_customFontFamily.empty() ) { if ( m_customFontFamily.pop() ) { if ( ! m_font.empty() ) { m_font.pop(); } } } } void StyleAttributes::resetFontWeight() { if ( ! m_customFontWeight.empty() ) { if ( m_customFontWeight.pop() ) { if ( ! m_fontWeight.empty() ) { m_fontWeight.pop(); } } } } void StyleAttributes::resetFontStyle() { if ( ! m_customFontStyle.empty() ) { if ( m_customFontStyle.pop() ) { if ( ! m_fontStyle.empty() ) { m_fontStyle.pop(); } } } } void StyleAttributes::resetScriptLevel() { if ( ! m_scriptLevel.empty() ) { m_scriptLevel.pop(); } } void StyleAttributes::resetScriptSizeMultiplier() { if ( ! m_scriptSizeMultiplier.empty() ) { m_scriptSizeMultiplier.pop(); } } void StyleAttributes::resetScriptMinSize() { if ( ! m_scriptMinSize.empty() ) { m_scriptMinSize.pop(); } } void StyleAttributes::resetVeryVeryThinMathSpace() { if ( ! m_veryVeryThinMathSpace.empty() ) { m_veryVeryThinMathSpace.pop(); } } void StyleAttributes::resetVeryThinMathSpace() { if ( ! m_veryThinMathSpace.empty() ) { m_veryThinMathSpace.pop(); } } void StyleAttributes::resetThinMathSpace() { if ( ! m_thinMathSpace.empty() ) { m_thinMathSpace.pop(); } } void StyleAttributes::resetMediumMathSpace() { if ( ! m_mediumMathSpace.empty() ) { m_mediumMathSpace.pop(); } } void StyleAttributes::resetThickMathSpace() { if ( ! m_thickMathSpace.empty() ) { m_thickMathSpace.pop(); } } void StyleAttributes::resetVeryThickMathSpace() { if ( ! m_veryThickMathSpace.empty() ) { m_veryThickMathSpace.pop(); } } void StyleAttributes::resetVeryVeryThickMathSpace() { if ( ! m_veryVeryThickMathSpace.empty() ) { m_veryVeryThickMathSpace.pop(); } } void StyleAttributes::resetDisplayStyle() { if ( ! m_customDisplayStyle.empty() ) { if ( m_customDisplayStyle.pop() ) { if ( ! m_displayStyle.empty() ) { m_displayStyle.pop(); } } } } KFORMULA_NAMESPACE_END