aboutsummaryrefslogtreecommitdiff
path: root/lib/service/listboxservice.h
blob: a742b061ffde88bfb625fca0e158879a913d3686 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#ifndef __lib_service_listboxservice_h
#define __lib_service_listboxservice_h

#include <lib/gui/elistbox.h>
#include <lib/service/iservice.h>
#include <set>

class eListboxServiceContent: public virtual iListboxContent
{
	DECLARE_REF(eListboxServiceContent);
public:
	eListboxServiceContent();

	void setIgnoreService( const eServiceReference &service );
	void setRoot(const eServiceReference &ref);
	void getCurrent(eServiceReference &ref);
	
	int getNextBeginningWithChar(char c);

		/* support for marked services */
	void initMarked();
	void addMarked(const eServiceReference &ref);
	void removeMarked(const eServiceReference &ref);
	int isMarked(const eServiceReference &ref);

		/* this is NOT thread safe! */
	void markedQueryStart();
	int markedQueryNext(eServiceReference &ref);

	int lookupService(const eServiceReference &ref);
	void setCurrent(const eServiceReference &ref);

	enum {
		visModeSimple,
		visModeComplex
	};
	
	void setVisualMode(int mode);
	
		/* only in complex mode: */
	enum {
		celIcon,
		celServiceNumber,
		celServiceName,
		celServiceInfo, // "now" event
		celElements
	};
	
	void setElementPosition(int element, eRect where);
	void setElementFont(int element, gFont *font);
	
	void sort();

	int setCurrentMarked(bool);

	void setNumberOffset(int offset) { m_numberoffset = offset; }
protected:
	void cursorHome();
	void cursorEnd();
	int cursorMove(int count=1);
	int cursorValid();
	int cursorSet(int n);
	int cursorGet();

	void cursorSave();
	void cursorRestore();
	int size();
	
	// void setOutputDevice ? (for allocating colors, ...) .. requires some work, though
	void setSize(const eSize &size);
	
		/* the following functions always refer to the selected item */
	void paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected);
	
	int m_visual_mode;
		/* for complex mode */
	eRect m_element_position[celElements];
	ePtr<gFont> m_element_font[celElements];
private:
	typedef std::list<eServiceReference> list;
	
	list m_list;
	list::iterator m_cursor, m_saved_cursor;
	
	int m_cursor_number, m_saved_cursor_number;
	int m_size;
	
	eSize m_itemsize;
	ePtr<iServiceHandler> m_service_center;
	
	eServiceReference m_root;

		/* support for marked services */
	std::set<eServiceReference> m_marked;
	std::set<eServiceReference>::const_iterator m_marked_iterator;

		/* support for movemode */
	bool m_current_marked;

	int m_numberoffset;

	eServiceReference m_is_playable_ignore;
};

#endif