lib Library API Documentation

kostyle.cc

00001 /* This file is part of the KDE project 00002 Copyright (C) 2001 David Faure <faure@kde.org> 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 Boston, MA 02111-1307, USA. 00018 */ 00019 00020 #include "kostyle.h" 00021 #include <kdebug.h> 00022 #include <klocale.h> 00023 #include <qdom.h> 00024 #include <koparagcounter.h> 00025 00026 //necessary to create unique shortcut 00027 int KoStyleCollection::styleNumber = 0; 00028 00029 KoStyleCollection::KoStyleCollection() 00030 { 00031 m_styleList.setAutoDelete( false ); 00032 m_deletedStyles.setAutoDelete( true ); 00033 m_lastStyle = 0L; 00034 } 00035 00036 KoStyleCollection::~KoStyleCollection() 00037 { 00038 m_styleList.setAutoDelete( true ); 00039 m_styleList.clear(); 00040 m_deletedStyles.clear(); 00041 } 00042 00043 KoStyle* KoStyleCollection::findStyle( const QString & _name ) 00044 { 00045 // Caching, to speed things up 00046 if ( m_lastStyle && m_lastStyle->name() == _name ) 00047 return m_lastStyle; 00048 00049 QPtrListIterator<KoStyle> styleIt( m_styleList ); 00050 for ( ; styleIt.current(); ++styleIt ) 00051 { 00052 if ( styleIt.current()->name() == _name ) { 00053 m_lastStyle = styleIt.current(); 00054 return m_lastStyle; 00055 } 00056 } 00057 00058 if(_name == "Standard") return m_styleList.at(0); // fallback.. 00059 00060 return 0L; 00061 } 00062 00063 00064 KoStyle* KoStyleCollection::findStyleShortCut( const QString & _shortCut ) 00065 { 00066 // Caching, to speed things up 00067 if ( m_lastStyle && m_lastStyle->shortCutName() == _shortCut ) 00068 return m_lastStyle; 00069 00070 QPtrListIterator<KoStyle> styleIt( m_styleList ); 00071 for ( ; styleIt.current(); ++styleIt ) 00072 { 00073 if ( styleIt.current()->shortCutName() == _shortCut ) { 00074 m_lastStyle = styleIt.current(); 00075 return m_lastStyle; 00076 } 00077 } 00078 return 0L; 00079 } 00080 00081 KoStyle* KoStyleCollection::addStyleTemplate( KoStyle * sty ) 00082 { 00083 // First check for duplicates. 00084 for ( KoStyle* p = m_styleList.first(); p != 0L; p = m_styleList.next() ) 00085 { 00086 if ( p->name() == sty->name() ) { 00087 // Replace existing style 00088 if ( sty != p ) 00089 { 00090 *p = *sty; 00091 delete sty; 00092 } 00093 return p; 00094 } 00095 } 00096 m_styleList.append( sty ); 00097 00098 sty->setShortCutName( QString("shortcut_style_%1").arg(styleNumber).latin1()); 00099 styleNumber++; 00100 return sty; 00101 } 00102 00103 void KoStyleCollection::removeStyleTemplate ( KoStyle *style ) { 00104 if( m_styleList.removeRef(style)) { 00105 if ( m_lastStyle == style ) 00106 m_lastStyle = 0L; 00107 // Remember to delete this style when deleting the document 00108 m_deletedStyles.append(style); 00109 } 00110 } 00111 00112 void KoStyleCollection::updateStyleListOrder( const QStringList &list ) 00113 { 00114 QPtrList<KoStyle> orderStyle; 00115 QStringList lst( list ); 00116 for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) 00117 { 00118 //kdDebug()<<" style :"<<(*it)<<endl; 00119 QPtrListIterator<KoStyle> style( m_styleList ); 00120 for ( ; style.current() ; ++style ) 00121 { 00122 if ( style.current()->name() == *it) 00123 { 00124 orderStyle.append( style.current() ); 00125 //kdDebug()<<" found !!!!!!!!!!!!\n"; 00126 break; 00127 } 00128 } 00129 } 00130 m_styleList.setAutoDelete( false ); 00131 m_styleList.clear(); 00132 m_styleList = orderStyle; 00133 #if 0 00134 QPtrListIterator<KoStyle> style( m_styleList ); 00135 for ( ; style.current() ; ++style ) 00136 { 00137 kdDebug()<<" style.current()->name() :"<<style.current()->name()<<endl; 00138 } 00139 #endif 00140 } 00141 00143 00144 KoCharStyle::KoCharStyle( const QString & name ) 00145 { 00146 m_name = name; 00147 m_shortCut_name = QString::null; 00148 } 00149 00150 void KoCharStyle::operator=( const KoCharStyle &rhs ) 00151 { 00152 m_name = rhs.m_name; 00153 m_shortCut_name = rhs.m_shortCut_name; 00154 m_format = rhs.m_format; 00155 } 00156 00157 QString KoCharStyle::translatedName() const 00158 { 00159 return i18n( "Style name", name().utf8() ); 00160 } 00161 00162 const KoTextFormat & KoCharStyle::format() const 00163 { 00164 return m_format; 00165 } 00166 00167 KoTextFormat & KoCharStyle::format() 00168 { 00169 return m_format; 00170 } 00171 00173 00174 KoStyle::KoStyle( const QString & name ) 00175 : KoCharStyle( name ) 00176 { 00177 m_name = name; 00178 m_shortCut_name = QString::null; 00179 m_followingStyle = this; 00180 00181 // This way, KoTextParag::setParagLayout also sets the style pointer, to this style 00182 m_paragLayout.style = this; 00183 m_parentStyle = 0L; 00184 m_inheritedParagLayoutFlag = 0; 00185 m_inheritedFormatFlag = 0; 00186 m_bOutline = false; 00187 } 00188 00189 KoStyle::KoStyle( const KoStyle & rhs ) 00190 : KoCharStyle( rhs) 00191 { 00192 *this = rhs; 00193 } 00194 00195 void KoStyle::operator=( const KoStyle &rhs ) 00196 { 00197 KoCharStyle::operator=( rhs ); 00198 m_paragLayout = rhs.m_paragLayout; 00199 m_name = rhs.m_name; 00200 m_shortCut_name = rhs.m_shortCut_name; 00201 m_followingStyle = rhs.m_followingStyle; 00202 m_paragLayout.style = this; // must always be "this" 00203 m_parentStyle = rhs.m_parentStyle; 00204 m_inheritedParagLayoutFlag = rhs.m_inheritedParagLayoutFlag; 00205 m_inheritedFormatFlag = rhs.m_inheritedFormatFlag; 00206 m_bOutline = rhs.m_bOutline; 00207 } 00208 00209 void KoStyle::saveStyle( QDomElement & parentElem ) 00210 { 00211 m_paragLayout.saveParagLayout( parentElem, m_paragLayout.alignment ); 00212 00213 if ( followingStyle() ) 00214 { 00215 QDomElement element = parentElem.ownerDocument().createElement( "FOLLOWING" ); 00216 parentElem.appendChild( element ); 00217 element.setAttribute( "name", followingStyle()->name() ); 00218 } 00219 // TODO save parent style, and inherited flags. 00220 00221 parentElem.setAttribute( "outline", m_bOutline ? "true" : "false" ); 00222 } 00223 00224 void KoStyle::loadStyle( QDomElement & parentElem, int docVersion ) 00225 { 00226 KoParagLayout layout; 00227 KoParagLayout::loadParagLayout( layout, parentElem, docVersion ); 00228 00229 // This way, KoTextParag::setParagLayout also sets the style pointer, to this style 00230 layout.style = this; 00231 m_paragLayout = layout; 00232 00233 // Load name 00234 QDomElement nameElem = parentElem.namedItem("NAME").toElement(); 00235 if ( !nameElem.isNull() ) 00236 m_name = nameElem.attribute("value"); 00237 else 00238 kdWarning() << "No NAME tag in LAYOUT -> no name for this style!" << endl; 00239 00240 // The followingStyle stuff has to be done after loading all styles. 00241 00242 m_bOutline = parentElem.attribute( "outline" ) == "true"; 00243 } 00244 00245 00246 00247 const KoParagLayout & KoStyle::paragLayout() const 00248 { 00249 return m_paragLayout; 00250 } 00251 00252 KoParagLayout & KoStyle::paragLayout() 00253 { 00254 return m_paragLayout; 00255 } 00256 00257 void KoStyle::propagateChanges( int paragLayoutFlag, int /*formatFlag*/ ) 00258 { 00259 if ( !m_parentStyle ) 00260 return; 00261 if ( !(paragLayoutFlag & KoParagLayout::Alignment) ) 00262 m_paragLayout.alignment = m_parentStyle->paragLayout().alignment; 00263 if ( !(paragLayoutFlag & KoParagLayout::Margins) ) 00264 for ( int i = 0 ; i < 5 ; ++i ) 00265 m_paragLayout.margins[i] = m_parentStyle->paragLayout().margins[i]; 00266 if ( !(paragLayoutFlag & KoParagLayout::LineSpacing) ) 00267 { 00268 m_paragLayout.setLineSpacingValue(m_parentStyle->paragLayout().lineSpacingValue()); 00269 m_paragLayout.lineSpacingType = m_parentStyle->paragLayout().lineSpacingType; 00270 } 00271 if ( !(paragLayoutFlag & KoParagLayout::Borders) ) 00272 { 00273 m_paragLayout.leftBorder = m_parentStyle->paragLayout().leftBorder; 00274 m_paragLayout.rightBorder = m_parentStyle->paragLayout().rightBorder; 00275 m_paragLayout.topBorder = m_parentStyle->paragLayout().topBorder; 00276 m_paragLayout.bottomBorder = m_parentStyle->paragLayout().bottomBorder; 00277 } 00278 if ( !(paragLayoutFlag & KoParagLayout::BulletNumber) ) 00279 m_paragLayout.counter = m_parentStyle->paragLayout().counter; 00280 if ( !(paragLayoutFlag & KoParagLayout::Tabulator) ) 00281 m_paragLayout.setTabList(m_parentStyle->paragLayout().tabList()); 00282 #if 0 00283 if ( paragLayoutFlag == KoParagLayout::All ) 00284 { 00285 setDirection( static_cast<QChar::Direction>(layout.direction) ); 00286 // Don't call applyStyle from here, it would overwrite any paragraph-specific settings 00287 setStyle( layout.style ); 00288 } 00289 #endif 00290 // TODO a flag for the "is outline" bool? Otherwise we have no way to inherit 00291 // that property (and possibly reset it). 00292 } 00293 00294 void KoStyle::setOutline( bool b ) 00295 { 00296 m_bOutline = b; 00297 }
KDE Logo
This file is part of the documentation for lib Library Version 1.3.5.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Nov 17 06:54:18 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003