kspread_style_manager.cc
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kspread_style.h"
00022 #include "kspread_style_manager.h"
00023 #include <koOasisStyles.h>
00024 #include <koxmlns.h>
00025 #include <kdebug.h>
00026 #include <klocale.h>
00027 #include <qdom.h>
00028 #include <qstringlist.h>
00029
00030 KSpreadStyleManager::KSpreadStyleManager()
00031 : m_defaultStyle( new KSpreadCustomStyle() )
00032 {
00033 m_defaultStyle->setName( "Default" );
00034 m_defaultStyle->setType( KSpreadStyle::BUILTIN );
00035 }
00036
00037 KSpreadStyleManager::~KSpreadStyleManager()
00038 {
00039 delete m_defaultStyle;
00040
00041 Styles::iterator iter = m_styles.begin();
00042 Styles::iterator end = m_styles.end();
00043
00044 while ( iter != end )
00045 {
00046 delete iter.data();
00047
00048 ++iter;
00049 }
00050 }
00051
00052 void KSpreadStyleManager::saveOasis( KoGenStyles &mainStyles )
00053 {
00054 kdDebug() << "Saving default oasis style" << endl;
00055 m_defaultStyle->saveOasis( mainStyles );
00056
00057 Styles::iterator iter = m_styles.begin();
00058 Styles::iterator end = m_styles.end();
00059
00060 while ( iter != end )
00061 {
00062 kdDebug() << "Saving style" << endl;
00063 KSpreadCustomStyle * styleData = iter.data();
00064
00065 styleData->saveOasis( mainStyles );
00066
00067 ++iter;
00068 }
00069
00070 }
00071
00072 void KSpreadStyleManager::loadOasisStyleTemplate( KoOasisStyles& oasisStyles )
00073 {
00074 uint nStyles = oasisStyles.userStyles().count();
00075 kdDebug()<<" number of template style to load : "<<nStyles<<endl;
00076 for (unsigned int item = 0; item < nStyles; item++) {
00077 QDomElement styleElem = oasisStyles.userStyles()[item];
00078 QString name;
00079 if ( styleElem.hasAttributeNS( KoXmlNS::style, "display-name" ) )
00080 {
00081 name = styleElem.attributeNS( KoXmlNS::style, "display-name", QString::null );
00082 }
00083
00084 if ( name == "Default" )
00085 {
00086 m_defaultStyle->loadOasis( oasisStyles, styleElem,name );
00087 m_defaultStyle->setType( KSpreadStyle::BUILTIN );
00088 }
00089 else if ( !name.isEmpty() )
00090 {
00091 KSpreadCustomStyle * style = 0;
00092 if ( styleElem.hasAttributeNS( KoXmlNS::style, "parent-style-name" ) && styleElem.attributeNS( KoXmlNS::style, "parent-style-name", QString::null ) == "Default" )
00093 style = new KSpreadCustomStyle( name, m_defaultStyle );
00094 else
00095 style = new KSpreadCustomStyle( name, 0 );
00096
00097
00098 style->loadOasis( oasisStyles, styleElem,name );
00099 style->setType( KSpreadStyle::CUSTOM );
00100 m_styles[name] = style;
00101 kdDebug() << "Style " << name << ": " << style << endl;
00102
00103 }
00104 }
00105 Styles::iterator iter = m_styles.begin();
00106 Styles::iterator end = m_styles.end();
00107
00108 while ( iter != end )
00109 {
00110 KSpreadCustomStyle * styleData = iter.data();
00111
00112 if ( !styleData->parent() && !styleData->parentName().isNull() )
00113 styleData->setParent( m_styles[ styleData->parentName() ] );
00114
00115 ++iter;
00116 }
00117
00118 m_defaultStyle->setName( "Default" );
00119 m_defaultStyle->setType( KSpreadStyle::BUILTIN );
00120
00121 }
00122
00123 QDomElement KSpreadStyleManager::save( QDomDocument & doc )
00124 {
00125 kdDebug() << "Saving styles" << endl;
00126 QDomElement styles = doc.createElement( "styles" );
00127
00128 kdDebug() << "Saving default style" << endl;
00129 m_defaultStyle->save( doc, styles );
00130
00131 Styles::iterator iter = m_styles.begin();
00132 Styles::iterator end = m_styles.end();
00133
00134 while ( iter != end )
00135 {
00136 kdDebug() << "Saving style" << endl;
00137 KSpreadCustomStyle * styleData = iter.data();
00138
00139 styleData->save( doc, styles );
00140
00141 ++iter;
00142 }
00143
00144 kdDebug() << "End saving styles" << endl;
00145 return styles;
00146 }
00147
00148 bool KSpreadStyleManager::loadXML( QDomElement const & styles )
00149 {
00150 QDomElement e = styles.firstChild().toElement();
00151 while ( !e.isNull() )
00152 {
00153 QString name;
00154 if ( e.hasAttribute( "name" ) )
00155 name = e.attribute( "name" );
00156
00157 if ( name == "Default" )
00158 {
00159 if ( !m_defaultStyle->loadXML( e, name ) )
00160 return false;
00161 m_defaultStyle->setType( KSpreadStyle::BUILTIN );
00162 }
00163 else if ( !name.isNull() )
00164 {
00165 KSpreadCustomStyle * style = 0;
00166 if ( e.hasAttribute( "parent" ) && e.attribute( "parent" ) == "Default" )
00167 style = new KSpreadCustomStyle( name, m_defaultStyle );
00168 else
00169 style = new KSpreadCustomStyle( name, 0 );
00170
00171 if ( !style->loadXML( e, name ) )
00172 {
00173 delete style;
00174 return false;
00175 }
00176
00177 if ( style->type() == KSpreadStyle::AUTO )
00178 style->setType( KSpreadStyle::CUSTOM );
00179 m_styles[name] = style;
00180 kdDebug() << "Style " << name << ": " << style << endl;
00181 }
00182
00183 e = e.nextSibling().toElement();
00184 }
00185
00186 Styles::iterator iter = m_styles.begin();
00187 Styles::iterator end = m_styles.end();
00188
00189 while ( iter != end )
00190 {
00191 KSpreadCustomStyle * styleData = iter.data();
00192
00193 if ( !styleData->parent() && !styleData->parentName().isNull() )
00194 styleData->setParent( m_styles[ styleData->parentName() ] );
00195
00196 ++iter;
00197 }
00198
00199 m_defaultStyle->setName( "Default" );
00200 m_defaultStyle->setType( KSpreadStyle::BUILTIN );
00201
00202 return true;
00203 }
00204
00205 void KSpreadStyleManager::createBuiltinStyles()
00206 {
00207 KSpreadCustomStyle * header1 = new KSpreadCustomStyle( i18n( "Header" ), m_defaultStyle );
00208 QFont f( header1->font() );
00209 f.setItalic( true );
00210 f.setPointSize( f.pointSize() + 2 );
00211 f.setBold( true );
00212 header1->changeFont( f );
00213 header1->setType( KSpreadStyle::BUILTIN );
00214 m_styles[ header1->name() ] = header1;
00215
00216 KSpreadCustomStyle * header2 = new KSpreadCustomStyle( i18n( "Header1" ), header1 );
00217 QColor color( "#F0F0FF" );
00218 header2->changeBgColor( color );
00219 QPen pen( Qt::black, 1, Qt::SolidLine );
00220 header2->changeBottomBorderPen( pen );
00221 header2->setType( KSpreadStyle::BUILTIN );
00222
00223 m_styles[ header2->name() ] = header2;
00224 }
00225
00226 KSpreadCustomStyle * KSpreadStyleManager::style( QString const & name ) const
00227 {
00228 Styles::const_iterator iter( m_styles.find( name ) );
00229
00230 if ( iter != m_styles.end() )
00231 return iter.data();
00232
00233 if ( name == i18n( "Default" ) || name == "Default" )
00234 return m_defaultStyle;
00235
00236 return 0;
00237 }
00238
00239 void KSpreadStyleManager::takeStyle( KSpreadCustomStyle * style )
00240 {
00241 KSpreadCustomStyle * parent = style->parent();
00242
00243 Styles::iterator iter = m_styles.begin();
00244 Styles::iterator end = m_styles.end();
00245
00246 while ( iter != end )
00247 {
00248 if ( iter.data()->parent() == style )
00249 iter.data()->setParent( parent );
00250
00251 ++iter;
00252 }
00253
00254 Styles::iterator i( m_styles.find( style->name() ) );
00255
00256 if ( i != m_styles.end() )
00257 {
00258 kdDebug() << "Erasing style entry for " << style->name() << endl;
00259 m_styles.erase( i );
00260 }
00261 }
00262
00263 bool KSpreadStyleManager::checkCircle( QString const & name, QString const & parent )
00264 {
00265 KSpreadCustomStyle * s = style( parent );
00266 if ( !s || s->parent() == 0 )
00267 return true;
00268 if ( s->parentName() == name )
00269 return false;
00270 else
00271 return checkCircle( name, s->parentName() );
00272 }
00273
00274 bool KSpreadStyleManager::validateStyleName( QString const & name, KSpreadCustomStyle * style )
00275 {
00276 if ( m_defaultStyle->name() == name || name == i18n( "Default" ) )
00277 return false;
00278
00279 Styles::const_iterator iter = m_styles.begin();
00280 Styles::const_iterator end = m_styles.end();
00281
00282 while ( iter != end )
00283 {
00284 if ( iter.key() == name && iter.data() != style )
00285 return false;
00286
00287 ++iter;
00288 }
00289
00290 return true;
00291 }
00292
00293 void KSpreadStyleManager::changeName( QString const & oldName, QString const & newName )
00294 {
00295 Styles::iterator iter = m_styles.begin();
00296 Styles::iterator end = m_styles.end();
00297
00298 while ( iter != end )
00299 {
00300 if ( iter.data()->parentName() == oldName )
00301 iter.data()->refreshParentName();
00302
00303 ++iter;
00304 }
00305
00306 iter = m_styles.find( oldName );
00307 if ( iter != end )
00308 {
00309 KSpreadCustomStyle * s = iter.data();
00310 m_styles.erase( iter );
00311 m_styles[newName] = s;
00312 }
00313 }
00314
00315 QStringList KSpreadStyleManager::styleNames() const
00316 {
00317 QStringList list;
00318
00319 list.push_back( i18n( "Default" ) );
00320
00321 Styles::const_iterator iter = m_styles.begin();
00322 Styles::const_iterator end = m_styles.end();
00323
00324 while ( iter != end )
00325 {
00326 list.push_back( iter.key() );
00327
00328 ++iter;
00329 }
00330
00331 return list;
00332 }
00333
This file is part of the documentation for kspread Library Version 1.4.2.