1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 
8 #ifndef PAGEITEMITERATOR_H
9 #define PAGEITEMITERATOR_H
10 
11 #include <QList>
12 #include <QStack>
13 
14 #include "scribusapi.h"
15 
16 class PageItem;
17 class ScribusDoc;
18 
19 class SCRIBUS_API PageItemIterator
20 {
21 public:
22 	enum Options
23 	{
24 		IterateInGroups = 1,
25 		IterateInTables = 2,
26 		IterateInDocItems = 4,
27 		IterateInMasterItems = 8,
28 		IterateInFrameItems = 16,
29 		IterateInDocPatterns = 32,
30 		IterateInDocNoPatterns = IterateInGroups + IterateInDocItems + IterateInMasterItems + IterateInFrameItems,
31 		IterateInDocDefaults = IterateInGroups + IterateInDocItems + IterateInMasterItems + IterateInFrameItems + IterateInDocPatterns,
32 		IterateAll = IterateInGroups + IterateInTables + IterateInDocItems + IterateInMasterItems + IterateInFrameItems + IterateInDocPatterns
33 	};
34 	PageItemIterator(int options = IterateInGroups);
35 	PageItemIterator(const QList<PageItem*>& itemList, int options = IterateInGroups);
36 	PageItemIterator(const ScribusDoc* doc, int options = IterateInDocDefaults);
37 
isNull()38 	bool isNull() const { return (m_current == nullptr); }
current()39 	PageItem* current() const { return m_current; }
40 
41 	PageItem* begin(ScribusDoc* doc, int options = IterateInDocDefaults);
42 	PageItem* begin(const QList<PageItem*>& itemList);
43 	PageItem* next();
44 
45 	PageItem* moveTo(PageItem* item);
46 	PageItem* movePast(PageItem* item);
47 
48 	inline PageItem*  operator*() const { return m_current; }
49 	inline PageItem*  operator->() const { return m_current; }
50 	PageItemIterator& operator++() { next(); return *this; }
51 
52 protected:
53 	struct State
54 	{
55 		QList<PageItem*> itemList;
56 		int   currentIndex;
57 	};
58 
59 	int m_options { 0 };
60 	PageItem* m_current { nullptr };
61 	QStack<State> m_stateStack;
62 };
63 
64 #endif // PAGEITEMITERATOR_H