Merge branch 'master' of git.opendreambox.org:/git/enigma2
[enigma2.git] / lib / gui / elistbox.h
index a7ed637d55ff70836c734b25e5f175afa3847c0f..0073653529d5e27aaffc9161b51b04654d228bae 100644 (file)
@@ -4,6 +4,9 @@
 #include <lib/gui/ewidget.h>
 #include <connection.h>
 
+class eListbox;
+class eSlider;
+
 class iListboxContent: public iObject
 {
 public:
@@ -12,7 +15,7 @@ public:
                /* indices go from 0 to size().
                   the end is reached when the cursor is on size(), 
                   i.e. one after the last entry (this mimics 
-                  stl behaviour)
+                  stl behavior)
                   
                   cursors never invalidate - they can become invalid
                   when stuff is removed. Cursors will always try
@@ -23,6 +26,7 @@ public:
 protected:
        iListboxContent();
        friend class eListbox;
+       virtual void updateClip(gRegion &){ };
        virtual void cursorHome()=0;
        virtual void cursorEnd()=0;
        virtual int cursorMove(int count=1)=0;
@@ -35,6 +39,8 @@ protected:
        
        virtual int size()=0;
        
+       virtual int currentCursorSelectable();
+       
        void setListbox(eListbox *lb);
        
        // void setOutputDevice ? (for allocating colors, ...) .. requires some work, though
@@ -43,17 +49,50 @@ protected:
                /* the following functions always refer to the selected item */
        virtual void paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected)=0;
        
+       virtual int getItemHeight()=0;
+       
        eListbox *m_listbox;
 #endif
 };
 
+#ifndef SWIG
+struct eListboxStyle
+{
+       ePtr<gPixmap> m_background, m_selection;
+       int m_transparent_background;
+       gRGB m_background_color, m_background_color_selected, m_foreground_color, m_foreground_color_selected;
+       int m_background_color_set, m_foreground_color_set, m_background_color_selected_set, m_foreground_color_selected_set;
+
+               /*
+                       {m_transparent_background m_background_color_set m_background}
+                       {0 0 0} use global background color
+                       {0 1 x} use background color
+                       {0 0 p} use background picture
+                       {1 x 0} use transparent background
+                       {1 x p} use transparent background picture
+               */
+};
+#endif
+
 class eListbox: public eWidget
 {
+       void updateScrollBar();
 public:
        eListbox(eWidget *parent);
        ~eListbox();
+
+       PSignal0<void> selectionChanged;
+
+       enum {
+               showOnDemand,
+               showAlways,
+               showNever
+       };
+       void setScrollbarMode(int mode);
+       void setWrapAround(bool);
+
        void setContent(iListboxContent *content);
-       
+
 /*     enum Movement {
                moveUp,
                moveDown,
@@ -61,8 +100,13 @@ public:
                moveEnd,
                justCheck
        }; */
-       
-       void moveSelection(int how);
+
+       int getCurrentIndex();
+       void moveSelection(long how);
+       void moveSelectionTo(int index);
+       void moveToEnd();
+       bool atBegin();
+       bool atEnd();
 
        enum ListboxActions {
                moveUp,
@@ -73,11 +117,20 @@ public:
                pageDown,
                justCheck
        };
-       
+
        void setItemHeight(int h);
        void setSelectionEnable(int en);
 
+       void setBackgroundColor(gRGB &col);
+       void setBackgroundColorSelected(gRGB &col);
+       void setForegroundColor(gRGB &col);
+       void setForegroundColorSelected(gRGB &col);
+       void setBackgroundPicture(ePtr<gPixmap> &pixmap);
+       void setSelectionPicture(ePtr<gPixmap> &pixmap);
+
 #ifndef SWIG
+       struct eListboxStyle *getLocalStyle(void);
+
                /* entryAdded: an entry was added *before* the given index. it's index is the given number. */
        void entryAdded(int index);
                /* entryRemoved: an entry with the given index was removed. */
@@ -85,20 +138,27 @@ public:
                /* entryChanged: the entry with the given index was changed and should be redrawn. */
        void entryChanged(int index);
                /* the complete list changed. you should not attemp to keep the current index. */
-       void entryReset();
+       void entryReset(bool cursorHome=true);
 
+       int getEntryTop();
+       void invalidate(const gRegion &region = gRegion::invalidRegion());
 protected:
        int event(int event, void *data=0, void *data2=0);
        void recalcSize();
 
 private:
+       int m_scrollbar_mode, m_prev_scrollbar_page;
+       bool m_content_changed;
+       bool m_enabled_wrap_around;
+
        int m_top, m_selected;
        int m_itemheight;
        int m_items_per_page;
        int m_selection_enabled;
        ePtr<iListboxContent> m_content;
+       eSlider *m_scrollbar;
+       eListboxStyle m_style;
 #endif
-
 };
 
 #endif