Subversion Repositories Scribus

Rev

Rev 17163 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5981 avox 1
 
2
 
3
#ifndef STYLESET_H
4
#define STYLESET_H
5
 
5990 jghali 6
#include <assert.h>
6733 avox 7
#include "style.h"
8501 cbradney 8
//Added by qt3to4:
9803 fschmid 9
#include <QList>
5981 avox 10
 
7059 avox 11
 
5981 avox 12
template<class STYLE>
8134 avox 13
class StyleSet : public StyleContext {
5981 avox 14
public:
8546 cbradney 15
        STYLE& operator[] (int index) {
7059 avox 16
                assert(index < styles.count());
17
                return * styles[index];
18
        }
19
 
12550 pierre 20
        STYLE* getDefault(){ return m_default; }               
12549 pierre 21
 
8520 cbradney 22
        const STYLE& get(const QString& name) const {
7059 avox 23
                return * dynamic_cast<const STYLE*>(resolve(name));
24
        }
25
 
8546 cbradney 26
        const STYLE& operator[] (int index) const {
7059 avox 27
                assert(index < styles.count());
28
                return * styles[index];
29
        }
21366 jghali 30
 
31
        inline bool contains(const QString& name) const;
7059 avox 32
 
7001 avox 33
        inline int find(const QString& name) const;
7059 avox 34
 
7001 avox 35
        inline const Style* resolve(const QString& name) const;
7059 avox 36
 
10400 subik 37
        int count() const {
38
                return styles.count();
7059 avox 39
        }
40
 
41
        STYLE* append(STYLE* style) {
42
                styles.append(style);
8134 avox 43
                style->setContext(this);
7059 avox 44
                return style;
45
        }
46
 
8638 cbradney 47
        inline void remove(int index);
7059 avox 48
 
6953 avox 49
        inline void redefine(const StyleSet<STYLE>& defs, bool removeUnused=false);
7059 avox 50
 
8455 avox 51
        inline void rename(const QMap<QString,QString>& newNames);
52
 
7059 avox 53
        STYLE* create(const STYLE& proto) {
54
                return append(new STYLE(proto));
55
        }
56
 
57
        void makeDefault(STYLE* def) {
58
                m_default = def;
59
                if(def)
8134 avox 60
                        def->setContext(this);
7942 avox 61
                invalidate();
7059 avox 62
        }
63
 
7194 avox 64
        bool isDefault(const STYLE& style) const {
7193 avox 65
                return &style == m_default;
66
        }
67
 
12549 pierre 68
 
8134 avox 69
        StyleSet() : styles(), m_context(NULL), m_default(NULL) {}
7059 avox 70
 
7942 avox 71
        ~StyleSet() {
72
                clear();
73
        }
7059 avox 74
 
75
        void clear() {
76
                while(styles.count()>0)
77
                {
78
                        delete styles.front();
79
                        styles.pop_front();
7942 avox 80
                }
81
                invalidate();
7059 avox 82
        }
6733 avox 83
 
8134 avox 84
        void setContext(const StyleContext* context) {
85
                bool reallyNew = m_context != context;
86
                m_context = context;
7945 avox 87
                if (reallyNew)
88
                        invalidate();
7059 avox 89
        }
6733 avox 90
 
8134 avox 91
        const StyleContext* context() const {
92
                return m_context;
7059 avox 93
        }
94
 
12549 pierre 95
 
5981 avox 96
private:
7059 avox 97
        StyleSet(const StyleSet&)             { assert(false); }
98
        StyleSet& operator= (const StyleSet&) { assert(false); return *this; }
99
 
9803 fschmid 100
        QList<STYLE*> styles;
8134 avox 101
        const StyleContext* m_context;
7018 avox 102
        STYLE* m_default;
5981 avox 103
};
104
 
105
template<class STYLE>
8638 cbradney 106
inline void StyleSet<STYLE>::remove(int index)
5981 avox 107
{
8638 cbradney 108
        assert(index>=0 && index < styles.count());
9803 fschmid 109
//      QList<STYLE*> it = styles.at(index);
110
        if (styles.at(index) == m_default)
7183 avox 111
                return;
9803 fschmid 112
//      delete (*it);
113
//      styles.erase(it);
114
        styles.removeAt(index);
5981 avox 115
}
116
 
117
template<class STYLE>
21366 jghali 118
inline bool StyleSet<STYLE>::contains(const QString& name) const
119
{
120
        for (int i=0; i < styles.count(); ++i)
121
                if (styles[i]->name() == name)
122
                        return true;
123
        return false;
124
}
125
 
126
template<class STYLE>
7001 avox 127
inline int StyleSet<STYLE>::find(const QString& name) const
5981 avox 128
{
8546 cbradney 129
        for (int i=0; i < styles.count(); ++i)
5981 avox 130
                if (styles[i]->name() == name)
131
                        return i;
132
        return -1;
133
}
134
 
135
template<class STYLE>
7001 avox 136
inline const Style* StyleSet<STYLE>::resolve(const QString& name) const
6733 avox 137
{
7018 avox 138
        if (name.isEmpty())
139
                return m_default;
8523 cbradney 140
        for (int i=0; i < styles.count(); ++i)
7059 avox 141
        {
6733 avox 142
                if (styles[i]->name() == name)
143
                        return styles[i];
7059 avox 144
        }
8134 avox 145
        return m_context ? m_context->resolve(name) : NULL;
6733 avox 146
}
147
 
148
template<class STYLE>
6953 avox 149
inline void StyleSet<STYLE>::redefine(const StyleSet<STYLE>& defs, bool removeUnused)
5981 avox 150
{
7059 avox 151
        for (int i=signed(styles.count())-1; i >= 0; --i)
152
        {
5981 avox 153
                bool found = false;
10400 subik 154
                for (int j=0; j < defs.count(); ++j)
7059 avox 155
                {
156
                        if (styles[i]->name() == defs[j].name())
157
                        {
5981 avox 158
                                found = true;
159
                                (*styles[i]) = defs[j];
8134 avox 160
                                (*styles[i]).setContext(this);
7018 avox 161
                                if (defs.m_default == defs.styles[j])
162
                                        makeDefault(styles[i]);
5981 avox 163
                                break;
164
                        }
165
                }
7059 avox 166
                if (!found && removeUnused)
167
                {
168
                        if (styles[i] == m_default)
169
                                makeDefault(NULL);
5981 avox 170
                        remove(i);
171
                }
172
        }
10400 subik 173
        for (int j=0; j < defs.count(); ++j)
7059 avox 174
        {
175
                if (find(defs[j].name()) < 0)
176
                {
7018 avox 177
                        STYLE* newStyle = create(defs[j]);
178
                        if (defs.m_default == defs.styles[j])
179
                                makeDefault(newStyle);
5981 avox 180
                }
181
        }
6865 avox 182
        invalidate();
5981 avox 183
}
184
 
8455 avox 185
template<class STYLE>
186
inline void StyleSet<STYLE>::rename(const QMap<QString,QString>& newNames)
187
{
8643 cbradney 188
        for (int i=0; i < styles.count(); ++i)
8455 avox 189
        {
190
                QMap<QString,QString>::ConstIterator it;
191
 
192
                it = newNames.find(styles[i]->name());
193
                if (it != newNames.end())
10394 cbradney 194
                        styles[i]->setName(it.value());
8455 avox 195
 
196
                it = newNames.find(styles[i]->parent());
197
                if (it != newNames.end())
10394 cbradney 198
                        styles[i]->setParent(it.value());
8455 avox 199
        }
200
        invalidate();
201
}
202
 
5984 avox 203
#endif
204
 
205