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 Sun Mar 20 14:25:27 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003