#include <lib/gui/ewidget.h>
#include <connection.h>
+class eListbox;
+class eSlider;
+
class iListboxContent: public iObject
{
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
anyway. */
#ifndef SWIG
protected:
+ iListboxContent();
friend class eListbox;
+ virtual void updateClip(gRegion &){ };
virtual void cursorHome()=0;
virtual void cursorEnd()=0;
virtual int cursorMove(int count=1)=0;
virtual int size()=0;
- virtual RESULT connectItemChanged(const Slot0<void> &itemChanged, ePtr<eConnection> &connection)=0;
+ virtual int currentCursorSelectable();
+
+ void setListbox(eListbox *lb);
// void setOutputDevice ? (for allocating colors, ...) .. requires some work, though
virtual void setSize(const eSize &size)=0;
/* 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);
- void setContent(iListboxContent *content);
-
- void moveSelection(int how);
+ ~eListbox();
+
+ PSignal0<void> selectionChanged;
+
enum {
+ showOnDemand,
+ showAlways,
+ showNever
+ };
+ void setScrollbarMode(int mode);
+ void setWrapAround(bool);
+
+ void setContent(iListboxContent *content);
+
+/* enum Movement {
+ moveUp,
+ moveDown,
+ moveTop,
+ moveEnd,
+ justCheck
+ }; */
+
+ int getCurrentIndex();
+ void moveSelection(long how);
+ void moveSelectionTo(int index);
+ void moveToEnd();
+ bool atBegin();
+ bool atEnd();
+
+ enum ListboxActions {
moveUp,
moveDown,
moveTop,
- moveEnd
+ moveEnd,
+ pageUp,
+ 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. */
+ void entryRemoved(int index);
+ /* 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(bool cursorHome=true);
+
+ int getEntryTop();
+ void invalidate(const gRegion ®ion = 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