Subversion Repositories Scribus

Rev

Rev 12314 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 For general Scribus (>=1.3.2) copyright and licensing information please refer
 to the COPYING file provided with the program. Following this notice may exist
 a copyright and/or license notice that predates the release of Scribus 1.3.2
 for which a new license (GPL+exception) is in place.
 */

/***************************************************************************
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
***************************************************************************/


#ifndef PARAGRAPHSTYLE_H
#define PARAGRAPHSTYLE_H

#include "style.h"
#include "charstyle.h"
#include "styles/stylecontextproxy.h"


class ResourceCollection;


class SCRIBUS_API ParagraphStyle : public Style
{
public:
        enum LineSpacingMode {
                FixedLineSpacing        = 0,
                AutomaticLineSpacing    = 1,
                BaselineGridLineSpacing = 2
        };
        enum AlignmentType {
                Leftaligned  = 0,
                Centered     = 1,
                Rightaligned = 2,
                Justified    = 3,
                Extended     = 4
        };
        enum OpticalMarginType {
                OM_None  = 0,
                OM_LeftProtruding    = 1,
                OM_RightProtruding   = 2,
                OM_LeftHangingPunct  = 4,
                OM_RightHangingPunct = 8,
                OM_Default           = OM_RightProtruding + OM_LeftHangingPunct + OM_RightHangingPunct
        };
        enum HyphenationMode {
                NoHyphenation        = 0,
                ManualHyphenation    = 1,
                AutomaticHyphenation = 2
        };
        struct TabRecord
        {
                double tabPosition;
                int tabType;
                QChar tabFillChar;
                bool operator==(const TabRecord& other) const {
                        return tabPosition==other.tabPosition && tabType==other.tabType && tabFillChar == other.tabFillChar;
                }
                bool operator<(const TabRecord& other)  const { return tabPosition < other.tabPosition; }
                bool operator<=(const TabRecord& other) const { return tabPosition <= other.tabPosition; }
                bool operator>(const TabRecord& other)  const { return tabPosition > other.tabPosition; }
                bool operator>=(const TabRecord& other) const { return tabPosition >= other.tabPosition; }
        };

        ParagraphStyle();
        ParagraphStyle(const ParagraphStyle& other);
        ParagraphStyle& operator=(const ParagraphStyle& other);
        ~ParagraphStyle();

        static const Xml_string saxxDefaultElem;
        static void  desaxeRules(const Xml_string& prefixPattern, desaxe::Digester& ruleset, Xml_string elemtag = saxxDefaultElem);
       
        virtual void saxx(SaxHandler& handler, const Xml_string& elemtag) const;
        virtual void saxx(SaxHandler& handler)                     const { saxx(handler, saxxDefaultElem); }
       

        void getNamedResources(ResourceCollection& lists) const;
        void replaceNamedResources(ResourceCollection& newNames);

//      QString displayName() const;

        void setContext(const StyleContext* context);
        void update(const StyleContext*);
       
        bool equiv(const Style& other) const;
       
        void applyStyle(const ParagraphStyle* other);
        void eraseStyle(const ParagraphStyle* other);
        void setStyle(const ParagraphStyle* other);
        void erase() { eraseStyle(this); }

        StyleContext* charStyleContext() { return & cstyleContext; }
        const StyleContext* charStyleContext() const { return & cstyleContext; }
        CharStyle * charStyle() ;
        const CharStyle* charStyle() const ;
        /** Normally the context for charStyle() is parentStyle()->charStyleContext()
                Use this method to break that relation and set charStyle()'s context manually
        */

        void breakImplicitCharStyleInheritance(bool val = true);
        /** used internally to establish the implicit relation
                charStyle().context() == parentStyle()->charStyleContext()
                Done implicitly in setContext(), update(), operator= and breakImplicitCharStyleInheritance()
        */

        void repairImplicitCharStyleInheritance();
       
        /** getter: validates and returns the attribute's value */
       
#define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
        attr_TYPE attr_GETTER() const { validate(); return m_##attr_NAME; }

#include "paragraphstyle.attrdefs.cxx"
#undef ATTRDEF
       
        /** setter: sets the attribute's value and clears inherited flag */
       
#define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
        void set##attr_NAME(attr_TYPE v) { m_##attr_NAME = v; inh_##attr_NAME = false; }

#include "paragraphstyle.attrdefs.cxx"
#undef ATTRDEF
        void appendTabValue(const TabRecord& tab) { validate(); m_TabValues.append(tab); inh_TabValues = false; }
       
       
        /** setter: resets the attribute's value and sets inherited flag */
       
#define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
        void reset##attr_NAME() { m_##attr_NAME = attr_DEFAULT; inh_##attr_NAME = true; }

#include "paragraphstyle.attrdefs.cxx"
#undef ATTRDEF
       
        /** isInherited: returns true if the attriute is inherited */
#define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
        bool isInh##attr_NAME() const { return inh_##attr_NAME; }

#include "paragraphstyle.attrdefs.cxx"
#undef ATTRDEF
       
       
        /** isDefined: returns true if the attribute is defined in this style or any parent */
#define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
        bool isDef##attr_NAME() const { \
                if ( !inh_##attr_NAME ) return true; \
                const ParagraphStyle * par = dynamic_cast<const ParagraphStyle*>(parentStyle()); \
                return par && par->isDef##attr_NAME(); \
        }

#include "paragraphstyle.attrdefs.cxx"
#undef ATTRDEF
       
       
private:
               
        // member declarations:
        StyleContextProxy cstyleContext;
        bool cstyleContextIsInh;
        QString cstyle;
       
#define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
                attr_TYPE m_##attr_NAME; \
                        bool inh_##attr_NAME;

#include "paragraphstyle.attrdefs.cxx"
#undef ATTRDEF
               
};

#endif