add foregroundcolor selected and backgroundcolor selected to local listbox
[vuplus_dvbapp] / lib / gui / elistbox.h
1 #ifndef __lib_listbox_h
2 #define __lib_listbox_h
3
4 #include <lib/gui/ewidget.h>
5 #include <connection.h>
6
7 class eListbox;
8 class eSlider;
9
10 class iListboxContent: public iObject
11 {
12 public:
13         virtual ~iListboxContent()=0;
14         
15                 /* indices go from 0 to size().
16                    the end is reached when the cursor is on size(), 
17                    i.e. one after the last entry (this mimics 
18                    stl behaviour)
19                    
20                    cursors never invalidate - they can become invalid
21                    when stuff is removed. Cursors will always try
22                    to stay on the same data, however when the current
23                    item is removed, this won't work. you'll be notified
24                    anyway. */
25 #ifndef SWIG    
26 protected:
27         iListboxContent();
28         friend class eListbox;
29         virtual void updateClip(gRegion &){ };
30         virtual void cursorHome()=0;
31         virtual void cursorEnd()=0;
32         virtual int cursorMove(int count=1)=0;
33         virtual int cursorValid()=0;
34         virtual int cursorSet(int n)=0;
35         virtual int cursorGet()=0;
36         
37         virtual void cursorSave()=0;
38         virtual void cursorRestore()=0;
39         
40         virtual int size()=0;
41         
42         virtual int currentCursorSelectable();
43         
44         void setListbox(eListbox *lb);
45         
46         // void setOutputDevice ? (for allocating colors, ...) .. requires some work, though
47         virtual void setSize(const eSize &size)=0;
48         
49                 /* the following functions always refer to the selected item */
50         virtual void paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected)=0;
51         
52         virtual int getItemHeight()=0;
53         
54         eListbox *m_listbox;
55 #endif
56 };
57
58 struct eListboxStyle
59 {
60         ePtr<gPixmap> m_background, m_selection;
61         int m_transparent_background;
62         gRGB m_background_color, m_background_color_selected, m_foreground_color, m_foreground_color_selected;
63         int m_background_color_set, m_foreground_color_set, m_background_color_selected_set, m_foreground_color_selected_set;
64
65                 /*
66                         {m_transparent_background m_background_color_set m_background}
67                         {0 0 0} use global background color
68                         {0 1 x} use background color
69                         {0 0 p} use background picture
70                         {1 x 0} use transparent background
71                         {1 x p} use transparent background picture
72                 */
73 };
74
75 class eListbox: public eWidget
76 {
77         void updateScrollBar();
78 public:
79         eListbox(eWidget *parent);
80         ~eListbox();
81
82         PSignal0<void> selectionChanged;
83
84         enum {
85                 showOnDemand,
86                 showAlways,
87                 showNever
88         };
89         void setScrollbarMode(int mode);
90         void setWrapAround(bool);
91
92         void setContent(iListboxContent *content);
93
94 /*      enum Movement {
95                 moveUp,
96                 moveDown,
97                 moveTop,
98                 moveEnd,
99                 justCheck
100         }; */
101
102         int getCurrentIndex();
103         void moveSelection(int how);
104         void moveSelectionTo(int index);
105         void moveToEnd();
106         bool atBegin();
107         bool atEnd();
108
109         enum ListboxActions {
110                 moveUp,
111                 moveDown,
112                 moveTop,
113                 moveEnd,
114                 pageUp,
115                 pageDown,
116                 justCheck
117         };
118
119         void setItemHeight(int h);
120         void setSelectionEnable(int en);
121
122         void setBackgroundColor(gRGB &col);
123         void setBackgroundColorSelected(gRGB &col);
124         void setForegroundColor(gRGB &col);
125         void setForegroundColorSelected(gRGB &col);
126         void setBackgroundPicture(ePtr<gPixmap> &pixmap);
127         void setSelectionPicture(ePtr<gPixmap> &pixmap);
128
129         struct eListboxStyle *getLocalStyle(void);
130 #ifndef SWIG
131                 /* entryAdded: an entry was added *before* the given index. it's index is the given number. */
132         void entryAdded(int index);
133                 /* entryRemoved: an entry with the given index was removed. */
134         void entryRemoved(int index);
135                 /* entryChanged: the entry with the given index was changed and should be redrawn. */
136         void entryChanged(int index);
137                 /* the complete list changed. you should not attemp to keep the current index. */
138         void entryReset(bool cursorHome=true);
139
140         int getEntryTop();
141         void invalidate(const gRegion &region = gRegion::invalidRegion());
142 protected:
143         int event(int event, void *data=0, void *data2=0);
144         void recalcSize();
145
146 private:
147         int m_scrollbar_mode, m_prev_scrollbar_page;
148         bool m_content_changed;
149         bool m_enabled_wrap_around;
150
151         int m_top, m_selected;
152         int m_itemheight;
153         int m_items_per_page;
154         int m_selection_enabled;
155         ePtr<iListboxContent> m_content;
156         eSlider *m_scrollbar;
157         eListboxStyle m_style;
158 #endif
159 };
160
161 #endif