summaryrefslogtreecommitdiffstats
path: root/lib/kformula/contextstyle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kformula/contextstyle.cpp')
-rw-r--r--lib/kformula/contextstyle.cpp765
1 files changed, 765 insertions, 0 deletions
diff --git a/lib/kformula/contextstyle.cpp b/lib/kformula/contextstyle.cpp
new file mode 100644
index 00000000..a744e02d
--- /dev/null
+++ b/lib/kformula/contextstyle.cpp
@@ -0,0 +1,765 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Andrea Rizzi <rizzi@kde.org>
+ Ulrich Kuettler <ulrich.kuettler@mailbox.tu-dresden.de>
+ 2006 Alfredo Beaumont Sainz <alfredo.beaumont@gmail.com>
+
+ 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 <tqfontmetrics.h>
+#include <tqstring.h>
+
+#include <kdebug.h>
+#include <KoGlobal.h>
+
+#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( TDEConfig* 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<luPixel>( m_sizeFactor
+ * textStyleValues[ tstyle ].axisHeight( m_axisHeight )
+ * factor
+ * zoom() / 100.0 );
+}
+
+luPt ContextStyle::getBaseSize() const
+{
+ return static_cast<luPt>( 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<luPt>( 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