#ifndef CPP_BOOPSI_GADGETS_H
#define CPP_BOOPSI_GADGETS_H

// Gadgets, insbesondere für den Layouter nützlich
//
// Autor: Jochen Becher
//
// Historie:
// Version 1.0 am 28. Februar 94

#ifndef CPP_BOOPSI_BOOPSICLASS_H
#include <classes/boopsi/boopsiclass.h>
#endif

#ifndef CPP_BOOPSI_GADGETCLASS_H
#include <classes/boopsi/gadgetclass.h>
#endif

#ifndef CPP_WORKBENCH_WORKBENCH_H
#include <classes/workbench/workbench.h>
#endif

#ifndef CPP_DATASTRUCTURES_STRINGARRAY_H
#include <classes/datastructures/stringarray.h>
#endif

#define IBT_AdjustLeft   0
#define IBT_AdjustRight  1

#define IBTA_ImageAdjust   (TAG_USER +  1) // I·G, ULONG
#define IBTA_Font          (TAG_USER +  2) // ISG, struct TextAttr *
#define IBTA_LabelMark     (TAG_USER +  3) // I·G, UBYTE
#define IBTA_AutoWidth     (TAG_USER +  4) // ··G, LONG
#define IBTA_AutoHeight    (TAG_USER +  5) // ··G, LONG
#define IBTA_LeftBorder    (TAG_USER +  6) // ··G, LONG
#define IBTA_RightBorder   (TAG_USER +  7) // ··G, LONG
#define IBTA_TopBorder     (TAG_USER +  8) // ··G, LONG
#define IBTA_BottomBorder  (TAG_USER +  9) // ··G, LONG

class IButtonClass : public BoopsiClass {
public:
	IButtonClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
	static WORD labelWidth(Class *cl, struct Gadget *g,
		struct InstanceData *);
	static WORD labelHeight(Class *cl, struct Gadget *g,
		struct InstanceData *);
};

class BIButtonC : public BGadgetC, public GButtonC {
public:
	BIButtonC(GadgetEventC *ev,WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,ibc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type),
		  GButtonC() { };
	BIButtonC(GadgetEventC *ev,WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,ibc.boopsiclass(),NULL,w,tags), GButtonC() { };
	WORD leftBorder() const { return (WORD) getAttr(IBTA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(IBTA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(IBTA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(IBTA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(IBTA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(IBTA_Font); };
protected:
	BIButtonC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
		WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags), GButtonC() { };
private:
	static IButtonClass ibc;
};

// *************************************************************

#define STRA_Font           (TAG_USER + 1) // ISG, struct TextAttr *
#define STRA_LabelMark      (TAG_USER + 2) // I·G, UBYTE
#define STRA_LeftBorder     (TAG_USER + 3) // ··G, LONG
#define STRA_RightBorder    (TAG_USER + 4) // ··G, LONG
#define STRA_TopBorder      (TAG_USER + 5) // ··G, LONG
#define STRA_BottomBorder   (TAG_USER + 6) // ··G, LONG
#define STRA_AutoWidth      (TAG_USER + 7) // ··G, LONG
#define STRA_AutoHeight     (TAG_USER + 8) // ··G, LONG
#define STRA_Columns        (TAG_USER + 9) // ISG, ULONG

class StringClass : public BoopsiClass {
public:
	StringClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
	static VOID calcBorders(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcWidth(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcHeight(Class *cl, struct Gadget *g,
		struct InstanceData *data);
};

class BStringC : public BGadgetC, GStringC {
public:
	BStringC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,lc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type) { };
	BStringC(GadgetEventC *ev, WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,lc.boopsiclass(),NULL,w,tags) { };
	WORD leftBorder() const { return (WORD) getAttr(STRA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(STRA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(STRA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(STRA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(STRA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(STRA_Font); };
	VOID set(STRPTR s) { setAttrs(STRINGA_TextVal,s,TAG_END); };
	STRPTR get() { return (STRPTR) getAttr(STRINGA_TextVal); };
protected:
	BStringC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
			WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static StringClass lc;
};

class BIntegerC : public BGadgetC, public GIntegerC {
public:
	BIntegerC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...);
	BIntegerC(GadgetEventC *ev, WindowC &w, struct TagItem *tags);
	WORD leftBorder() const { return (WORD) getAttr(STRA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(STRA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(STRA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(STRA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(STRA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(STRA_Font); };
	VOID set(LONG s) { setAttrs(STRINGA_LongVal,s,TAG_END); };
	LONG get() { return (LONG) getAttr(STRINGA_LongVal); };
protected:
	BIntegerC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
			WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static StringClass lc;
};

// *************************************************************

#define CB_LabelLeft      0
#define CB_LabelRight     1

#define CBA_Font           (TAG_USER + 1) // ISG, struct TextAttr *
#define CBA_LabelPlace     (TAG_USER + 2) // I·G, ULONG
#define CBA_LeftBorder     (TAG_USER + 3) // ··G, LONG
#define CBA_RightBorder    (TAG_USER + 4) // ··G, LONG
#define CBA_TopBorder      (TAG_USER + 5) // ··G, LONG
#define CBA_BottomBorder   (TAG_USER + 6) // ··G, LONG
#define CBA_AutoWidth      (TAG_USER + 7) // ··G, LONG
#define CBA_AutoHeight     (TAG_USER + 8) // ··G, LONG
#define CBA_ReadOnly       (TAG_USER + 9) // ISG, BOOL
#define CBA_LabelMark      (TAG_USER +10) // I·G, UBYTE

class CheckboxClass : public BoopsiClass {
public:
	CheckboxClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
	static VOID calcBorders(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcWidth(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcHeight(Class *cl, struct Gadget *g,
		struct InstanceData *data);
};

class BCheckboxC : public BGadgetC, public GCheckboxC {
public:
	BCheckboxC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,cbc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type) { };
	BCheckboxC(GadgetEventC *ev, WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,cbc.boopsiclass(),NULL,w,tags) { };
	WORD leftBorder() const { return (WORD) getAttr(CBA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(CBA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(CBA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(CBA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(CBA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(CBA_Font); };
	VOID check(BOOL v) { setAttrs(GA_Selected, v, TAG_END); };
	BOOL checked()  { return (BOOL) getAttr(GA_Selected); };
protected:
	BCheckboxC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
			WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static CheckboxClass cbc;
};

// *************************************************************

#define CY_LabelLeft     0
#define CY_LabelRight    1

#define CYA_Labels        (TAG_USER + 1) // ISG, STRPTR *
#define CYA_Active        (TAG_USER + 2) // ISG, ULONG
#define CYA_Font          (TAG_USER + 3) // ISG, struct TextAttr *
#define CYA_MinMenu       (TAG_USER + 4) // ISG, ULONG
#define CYA_LeftBorder    (TAG_USER + 5) // ··G, LONG
#define CYA_RightBorder   (TAG_USER + 6) // ··G, LONG
#define CYA_TopBorder     (TAG_USER + 7) // ··G, LONG
#define CYA_BottomBorder  (TAG_USER + 8) // ··G, LONG
#define CYA_AutoWidth     (TAG_USER + 9) // ··G, LONG
#define CYA_AutoHeight    (TAG_USER +10) // ··G, LONG
#define CYA_Columns       (TAG_USER +11) // ISG, ULONG
#define CYA_LabelPlace    (TAG_USER +12) // I·G, ULONG
#define CYA_LabelMark     (TAG_USER +13) // I·G, UBYTE
#define CYA_Next          (TAG_USER +14) // ·S·
#define CYA_Prev          (TAG_USER +15) // ·S·

class CycleClass : public BoopsiClass {
public:
	CycleClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG renderCycle(Class *cl, struct Gadget *,
		struct gpRender *msg, struct InstanceData *);
	static ULONG calcWidth(Class *cl, struct Gadget *,
		struct InstanceData *);
	static ULONG calcHeight(Class *cl, struct Gadget *,
		struct InstanceData *);
	static VOID calcBorders(Class *cl, struct Gadget *,
		struct InstanceData *);
};

class BCycleC : public BGadgetC, public GCycleC {
public:
	BCycleC(GadgetEventC *ev, WindowC &w, stringarray &, Tag tag1type, ...);
	BCycleC(GadgetEventC *ev,WindowC &w, stringarray &, struct TagItem *tags);
	WORD leftBorder() const { return (WORD) getAttr(CYA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(CYA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(CYA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(CYA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(CYA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(CYA_Font); };
	VOID select(ULONG s) { setAttrs(CYA_Active,s,TAG_END); };
	ULONG selected() { return getAttr(CYA_Active); };
	VOID setLabels(STRPTR *);
	VOID setLabels(STRPTR label1, ...);
	STRPTR *getLabels();
	ULONG labelsCount();
	UWORD addLabel(STRPTR label);
	VOID remLabel(UWORD count);
protected:
	BCycleC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
		WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags), GCycleC() { };
private:
	static CycleClass pmc;
	stringarray labels;
};

// *************************************************************

#define RD_LabelsLeft   0
#define RD_LabelsRight  1

#define RDA_Font         (TAG_USER + 1) // ISG, struct TextAttr
#define RDA_LabelsPlace  (TAG_USER + 2) // I·G, ULONG
#define RDA_Labels       (TAG_USER + 3) // I·G, STRPTR *
#define RDA_LeftBorder   (TAG_USER + 4) // ··G, LONG
#define RDA_RightBorder  (TAG_USER + 5) // ··G, LONG
#define RDA_TopBorder    (TAG_USER + 6) // ··G, LONG
#define RDA_BottomBorder (TAG_USER + 7) // ··G, LONG
#define RDA_AutoWidth    (TAG_USER + 8) // ··G, LONG
#define RDA_AutoHeight   (TAG_USER + 9) // ··G, LONG
#define RDA_Active       (TAG_USER +10) // ISG, ULONG
#define RDA_Spacing      (TAG_USER +11) // I·G, ULONG
#define RDA_LabelMark    (TAG_USER +12) // I·G, UBYTE
#define RDA_Next         (TAG_USER +13) // ·S·
#define RDA_Prev         (TAG_USER +14) // ·S·

class RadioClass : public BoopsiClass {
public:
	RadioClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
	static VOID calcBorders(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static ULONG countLabels(STRPTR *labels);
	static WORD calcWidth(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcHeight(Class *cl, struct Gadget *g,
		struct InstanceData *data);
};

class BRadioC : public BGadgetC, public GRadioC {
public:
	BRadioC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,rc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type) { };
	BRadioC(GadgetEventC *ev, WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,rc.boopsiclass(),NULL,w,tags) { };
	WORD leftBorder() const { return (WORD) getAttr(RDA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(RDA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(RDA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(RDA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(RDA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(RDA_Font); };
	VOID select(ULONG v) { setAttrs(RDA_Active, v, TAG_END); };
	ULONG selected() { return getAttr(RDA_Active); };
protected:
	BRadioC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
			WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static RadioClass rc;
};

// *************************************************************

#define SLA_Font          (TAG_USER + 1) // ISG, struct TextAttr *
#define SLA_ValuePlace    (TAG_USER + 2) // I·G, ULONG
#define SLA_LabelPlace    (TAG_USER + 3) // I·G, ULONG
#define SLA_Min           (TAG_USER + 4) // ISG, LONG
#define SLA_Max           (TAG_USER + 5) // ISG, LONG
#define SLA_Level         (TAG_USER + 6) // ISG, LONG
#define SLA_LeftBorder    (TAG_USER + 7) // ··G, LONG
#define SLA_RightBorder   (TAG_USER + 8) // ··G, LONG
#define SLA_TopBorder     (TAG_USER + 9) // ··G, LONG
#define SLA_BottomBorder  (TAG_USER +10) // ··G, LONG
#define SLA_AutoWidth     (TAG_USER +11) // ··G, LONG
#define SLA_AutoHeight    (TAG_USER +12) // ··G, LONG
#define SLA_Freedom       (TAG_USER +13) // I·G, ULONG

class SliderClass : public BoopsiClass {
public:
	SliderClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
	static VOID calcBorders(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcWidth(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcHeight(Class *cl, struct Gadget *g,
		struct InstanceData *data);
};

class BSliderC : public BGadgetC, GSliderC {
public:
	BSliderC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,sc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type) { };
	BSliderC(GadgetEventC *ev, WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,sc.boopsiclass(),NULL,w,tags) { };
	WORD leftBorder() const { return (WORD) getAttr(SLA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(SLA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(SLA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(SLA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(SLA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(SLA_Font); };
	VOID setMin(UWORD m) { setAttrs(SLA_Min,m,TAG_END); };
	VOID setMax(UWORD m) { setAttrs(SLA_Max,m,TAG_END); };
	VOID setLevel(UWORD l) { setAttrs(SLA_Level,l,TAG_END); };
	UWORD min() { return (UWORD) getAttr(SLA_Min); };
	UWORD max() { return (UWORD) getAttr(SLA_Max); };
	UWORD level() { return (UWORD) getAttr(SLA_Level); };
protected:
	BSliderC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
			WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static SliderClass sc;
};

// *************************************************************

#define ASCA_Arrows        (TAG_USER + 1) // I·G, BOOL
#define ASCA_LeftBorder    (TAG_USER + 2) // ··G, LONG
#define ASCA_RightBorder   (TAG_USER + 3) // ··G, LONG
#define ASCA_TopBorder     (TAG_USER + 4) // ··G, LONG
#define ASCA_BottomBorder  (TAG_USER + 5) // ··G, LONG
#define ASCA_AutoWidth     (TAG_USER + 6) // ··G, LONG
#define ASCA_AutoHeight    (TAG_USER + 7) // ··G, LONG
#define ASCA_Freedom       (TAG_USER + 8) // I·G, ULONG
#define ASCA_Top           (TAG_USER + 9) // ISG, UWORD
#define ASCA_Visible       (TAG_USER +10) // ISG, UWORD
#define ASCA_Total         (TAG_USER +11) // ISG, UWORD
#define ASCA_Borderless    (TAG_USER +12) // I·G, BOOL

class ArrowScrollerClass : public BoopsiClass {
public:
	ArrowScrollerClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *, BOOL overGadget = FALSE);
	static VOID calcArrows(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static VOID scrollUpLeft(Class *cl, struct Gadget *g,
		struct InstanceData *data, struct GadgetInfo *);
	static VOID scrollDownRight(Class *cl, struct Gadget *g,
		struct InstanceData *data, struct GadgetInfo *);
	static WORD calcWidth(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcHeight(Class *cl, struct Gadget *g,
		struct InstanceData *data);
};

class BArrowScrollerC : public BGadgetC, GScrollerC {
public:
	BArrowScrollerC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,sc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type) { };
	BArrowScrollerC(GadgetEventC *ev, WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,sc.boopsiclass(),NULL,w,tags) { };
	WORD leftBorder() const { return (WORD) getAttr(ASCA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(ASCA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(ASCA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(ASCA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setPot(UWORD p) { setAttrs(ASCA_Top,p,TAG_END); };
	VOID setTotal(UWORD t) { setAttrs(ASCA_Total,t,TAG_END); };
	VOID setVisible(UWORD v) { setAttrs(ASCA_Visible,v,TAG_END); };
	UWORD pot() { return (UWORD) getAttr(ASCA_Top); };
	UWORD total() { return (UWORD) getAttr(ASCA_Total); };
	UWORD visible() { return (UWORD) getAttr(ASCA_Visible); };
protected:
	BArrowScrollerC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
			WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static ArrowScrollerClass sc;
};

// *************************************************************

#define LS_AdjustLeft       0
#define LS_AdjustRight      1

#define LSA_Font            (TAG_USER +  1) // ISG, struct TextAttr *
#define LSA_Spacing         (TAG_USER +  2) // ISG, UWORD
#define LSA_Attach          (TAG_USER +  3) // ISG, struct List *
#define LSA_Detach          (TAG_USER +  4) // ·S·, BOOL
#define LSA_Top             (TAG_USER +  5) // ISG, LONG
#define LSA_Active          (TAG_USER +  6) // ISG, LONG
#define LSA_ReadOnly        (TAG_USER +  7) // ISG, BOOL
#define LSA_Next            (TAG_USER +  8) // ·S·
#define LSA_Prev            (TAG_USER +  9) // ·S·
#define LSA_Visible         (TAG_USER + 10) // ···
#define LSA_Total           (TAG_USER + 11) // ···
#define LSA_Frame           (TAG_USER + 12) // I·G, Object *
#define LSA_ItemHeight      (TAG_USER + 13) // ISG, UWORD
#define LSA_LeftBorder      (TAG_USER + 14) // ··G, LONG
#define LSA_RightBorder     (TAG_USER + 15) // ··G, LONG
#define LSA_TopBorder       (TAG_USER + 16) // ··G, LONG
#define LSA_BottomBorder    (TAG_USER + 17) // ··G, LONG
#define LSA_AutoWidth       (TAG_USER + 18) // ··G, LONG
#define LSA_AutoHeight      (TAG_USER + 19) // ··G, LONG
#define LSA_Columns         (TAG_USER + 20) // ISG, ULONG
#define LSA_Lines           (TAG_USER + 21) // ISG, ULONG
#define LSA_LabelMark       (TAG_USER + 22) // I·G, UBYTE
#define LSA_HorizLeft       (TAG_USER + 23) // ISG, UWORD
#define LSA_HorizWidth      (TAG_USER + 24) // ···
#define LSA_HorizTotal      (TAG_USER + 25) // ···
#define LSA_HorizTarget     (TAG_USER + 26) // ISG, Object *
#define LSA_HorizMap        (TAG_USER + 27) // ISG, struct TagItem *
#define LSA_HorizAdjust     (TAG_USER + 28) // ISG, ULONG

class ListClass : public BoopsiClass {
public:
	ListClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *, BOOL fullrender = TRUE);
	static ULONG countListLength(struct InstanceData *);
	static VOID NotifyTarget(Class *cl, Object *o,
		struct InstanceData *data, struct GadgetInfo *ginfo, ULONG flags);
	static VOID calcBorders(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcWidth(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcHeight(Class *cl, struct Gadget *g,
		struct InstanceData *data);
};

class BListC : public BGadgetC, public GListviewC {
public:
	BListC(GadgetEventC *ev,WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,lic.boopsiclass(),NULL,w,(struct TagItem *) &tag1type),
		  GListviewC() { };
	BListC(GadgetEventC *ev,WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,lic.boopsiclass(),NULL,w,tags), GListviewC() { };
	WORD leftBorder() const { return (WORD) getAttr(LSA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(LSA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(LSA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(LSA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(LSA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(LSA_Font); };
	VOID select(ULONG l) { setAttrs(LSA_Active,l,TAG_END); };
	ULONG selected() { return getAttr(LSA_Active); };
	VOID clearSelection() { setAttrs(LSA_Active,~0,TAG_END); };
	VOID setList(EListC *header) { setAttrs(LSA_Attach,header,TAG_END); };
	EListC *getList() { return (EListC *) getAttr(LSA_Attach); };
	VOID detachList() { setAttrs(LSA_Detach,TRUE,TAG_END); };
	VOID attachList() { setAttrs(LSA_Attach,~0,TAG_END); };
protected:
	BListC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
		WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags), GListviewC() { };
private:
	static ListClass lic;
};

// *************************************************************

#define LVA_VertScroller    (TAG_USER + 50) // I·G, BOOL
#define LVA_HorizScroller   (TAG_USER + 51) // I·G, BOOL

class ListviewClass : public BoopsiClass {
public:
	ListviewClass();
	static Class *listclass() { return lic.boopsiclass(); };
	static Class *scrollerclass() { return asc.boopsiclass(); };
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
	static ListClass lic;
	static ArrowScrollerClass asc;
};

class BListviewC : public BListC {
public:
	BListviewC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
		: BListC(ev,lc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type) { };
	BListviewC(GadgetEventC *ev, WindowC &w, struct TagItem *tags)
		: BListC(ev,lc.boopsiclass(),NULL,w,tags) { };
protected:
	BListviewC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
			WindowC &w, struct TagItem *tags)
		: BListC(ev,c,pubclass,w,tags) { };
private:
	static ListviewClass lc;
};

// *************************************************************

#define LB_LabelLeft      0
#define LB_LabelRight     1

#define LB_AdjustLeft     0
#define LB_AdjustCenter   1
#define LB_AdjustRight    2

#define LBA_Font           (TAG_USER + 1) // ISG, struct TextAttr *
#define LBA_Text           (TAG_USER + 2) // ISG, STRPTR
#define LBA_Number         (TAG_USER + 3) // ISG, LONG
#define LBA_LabelPlace     (TAG_USER + 4) // I·G, ULONG
#define LBA_Adjust         (TAG_USER + 5) // ISG, ULONG
#define LBA_Border         (TAG_USER + 6) // I·G, BOOL
#define LBA_LeftBorder     (TAG_USER + 7) // ··G, LONG
#define LBA_RightBorder    (TAG_USER + 8) // ··G, LONG
#define LBA_TopBorder      (TAG_USER + 9) // ··G, LONG
#define LBA_BottomBorder   (TAG_USER +10) // ··G, LONG
#define LBA_AutoWidth      (TAG_USER +11) // ··G, LONG
#define LBA_AutoHeight     (TAG_USER +12) // ··G, LONG
#define LBA_Columns        (TAG_USER +13) // ISG, ULONG

class LabelClass : public BoopsiClass {
public:
	LabelClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
	static VOID calcBorders(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcWidth(Class *cl, struct Gadget *g,
		struct InstanceData *data);
	static WORD calcHeight(Class *cl, struct Gadget *g,
		struct InstanceData *data);
};

class BTextC : public BGadgetC, GTextC {
public:
	BTextC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,lc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type) { };
	BTextC(GadgetEventC *ev, WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,lc.boopsiclass(),NULL,w,tags) { };
	WORD leftBorder() const { return (WORD) getAttr(LBA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(LBA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(LBA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(LBA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(LBA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(LBA_Font); };
	VOID set(STRPTR s) { setAttrs(LBA_Text,s,TAG_END); };
	STRPTR get() { return (STRPTR) getAttr(LBA_Text); };
protected:
	BTextC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
			WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static LabelClass lc;
};

class BNumberC : public BGadgetC, GNumberC {
public:
	BNumberC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...);
	BNumberC(GadgetEventC *ev, WindowC &w, struct TagItem *tags);
	WORD leftBorder() const { return (WORD) getAttr(LBA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(LBA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(LBA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(LBA_BottomBorder); };
	BOOL disable(BOOL value) { return BGadgetC::disable(value) };
	BOOL isDisabled() const { return BGadgetC::isDisabled() };
	BOOL activate(BOOL v) { return FALSE; };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(LBA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(LBA_Font); };
	VOID set(LONG s) { setAttrs(LBA_Number,s,TAG_END); };
	LONG get() { return (LONG) getAttr(LBA_Number); };
protected:
	BNumberC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
			WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static LabelClass lc;
};

// *************************************************************

#define SVA_Level       (TAG_USER + 1) // ISG, UWORD
#define SVA_Horiz       (TAG_USER + 2) // I·G, BOOL
#define SVA_LUSize      (TAG_USER + 3) // ··G, UWORD
#define SVA_RBSize      (TAG_USER + 4) // ··G, UWORD
#define SVA_AutoRedraw  (TAG_USER + 5) // I··, BOOL
#define SVA_RBPosition  (TAG_USER + 6) // ··G, ULONG
#define SVA_LUMargin    (TAG_USER + 7) // ISG, ULONG
#define SVA_RBMargin    (TAG_USER + 8) // ISG, ULONG

class SplitviewClass : public BoopsiClass {
public:
	SplitviewClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *, BOOL selected = FALSE);
	static ULONG renderXor(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
	static ULONG clear(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
};

class BSplitviewC : public BGadgetC {
public:
	BSplitviewC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,svc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type)
		{ };
	BSplitviewC(GadgetEventC *ev,WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,svc.boopsiclass(),NULL,w,tags) { };
protected:
	BSplitviewC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
		WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static SplitviewClass svc;
};

// *************************************************************

#define WBIDA_DiskObject    (TAG_USER + 1) // ISG, struct DiskObject *
#define WBIDA_Name          (TAG_USER + 2) // IS·, STRPTR
#define WBIDA_Font          (TAG_USER + 3) // ISG, struct TextAttr *
#define WBIDA_LeftBorder    (TAG_USER + 4) // ··G, LONG
#define WBIDA_RightBorder   (TAG_USER + 5) // ··G, LONG
#define WBIDA_TopBorder     (TAG_USER + 6) // ··G, LONG
#define WBIDA_BottomBorder  (TAG_USER + 7) // ··G, LONG
#define WBIDA_AutoWidth     (TAG_USER + 8) // ··G, LONG
#define WBIDA_AutoHeight    (TAG_USER + 9) // ··G, LONG

class WBIconDropClass : public BoopsiClass {
public:
	WBIconDropClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG render(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct InstanceData *);
	static LONG calcWidth(Class *cl, struct Gadget *g,
		struct InstanceData *);
	static LONG calcHeight(Class *cl, struct Gadget *g,
		struct InstanceData *);
	static WORD calcTopBorder(Class *cl, struct Gadget *g,
		struct InstanceData *);
};

class BWBIconDropC : public BGadgetC {
public:
	BWBIconDropC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
		: BGadgetC(ev,idc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type)
		{ };
	BWBIconDropC(GadgetEventC *ev,WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,idc.boopsiclass(),NULL,w,tags) { };
	WORD leftBorder() const { return (WORD) getAttr(WBIDA_LeftBorder); };
	WORD rightBorder() const { return (WORD) getAttr(WBIDA_RightBorder); };
	WORD topBorder() const { return (WORD) getAttr(WBIDA_TopBorder); };
	WORD bottomBorder() const { return (WORD) getAttr(WBIDA_BottomBorder); };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(WBIDA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (struct TextAttrC *) getAttr(WBIDA_Font); };
protected:
	BWBIconDropC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
		WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,c,pubclass,w,tags) { };
private:
	static WBIconDropClass idc;
};

class IconDropHandlerC : public AppWindowHandlerC {
public:
	IconDropHandlerC(AppWindowC &, BWBIconDropC &);
protected:
	virtual BOOL _forMe(AppMessageC &msg);
private:
	BWBIconDropC *aGadget;
};

// *************************************************************

#endif
