#ifndef CPP_BOOPSI_DECORGADGETS_H
#define CPP_BOOPSI_DECORGADGETS_H

// Einige Schmuckelemente für die Oberfläche als BOOPSI Gadget Klassen
//
// BevelboxClass : ein Rahmen mit einem (optionalen) Titel
// BevellineClass : eine senkrechte oder waagrechte Line mit Titel
//
// Autor: Jochen Becher
//
// Historie:
// Version 1.0 am 26. 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_BOOPSI_IMAGECLASS_H
#include <classes/boopsi/imageclass.h>
#endif

#ifndef CPP_BOOPSI_IMAGES_H
#include <classes/boopsi/images.h>
#endif

#define BB_LabelAbove  0
#define BB_LabelLine   1

#define BBA_Font               (TAG_USER+ 1)  // (ISG), struct TextAttr *
#define BBA_Highlighted        (TAG_USER+ 2)  // (I.G), BOOL
#define BBA_TopBorder          (TAG_USER+ 3)  // (..G), LONG
#define BBA_LeftBorder         (TAG_USER+ 4)  // (..G), LONG
#define BBA_RightBorder        (TAG_USER+ 5)  // (..G), LONG
#define BBA_BottomBorder       (TAG_USER+ 6)  // (..G), LONG
#define BBA_InnerTopBorder     (TAG_USER+ 7)  // (..G), LONG
#define BBA_InnerLeftBorder    (TAG_USER+ 8)  // (..G), LONG
#define BBA_InnerRightBorder   (TAG_USER+ 9)  // (..G), LONG
#define BBA_InnerBottomBorder  (TAG_USER+10)  // (..G), LONG
#define BBA_LabelPlace         (TAG_USER+11)  // (I.G), ULONG
#define BBA_Pattern            (TAG_USER+12)  // (I.G), Object *
#define BBA_Frame              (TAG_USER+13)  // (I.G), BOOL

class BevelboxClass : public BoopsiClass {
public:
	BevelboxClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG renderBevelbox(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct BevelboxData *);
	static VOID calcBorders(Class *cl, struct Gadget *g,
		struct BevelboxData *);
};

class BBevelboxC : public BGadgetC {
public:
	BBevelboxC(WindowC &w, Tag tag1type, ...)
		: BGadgetC(NULL,bbgc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type) { };
	BBevelboxC(WindowC &w, struct TagItem *tags)
		: BGadgetC(NULL,bbgc.boopsiclass(),NULL,w,tags) { };
	VOID erase(WindowC *);
	WORD leftBorder() const { return getAttr(BBA_LeftBorder); };
	WORD topBorder() const { return getAttr(BBA_TopBorder); };
	WORD rightBorder() const { return getAttr(BBA_RightBorder); };
	WORD bottomBorder() const { return getAttr(BBA_BottomBorder); };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(BBA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (TextAttrC *) getAttr(BBA_Font); };
protected:
	BBevelboxC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
		WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,NULL,pubclass,w,tags) { };
private:
	static BevelboxClass bbgc;
};

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

#define BL_LabelAbove  0
#define BL_LabelLine   1

#define BLA_Font          (TAG_USER+ 1)  // (ISG), struct TextAttr *
#define BLA_Highlighted   (TAG_USER+ 2)  // (I.G), BOOL
#define BLA_Vertical      (TAG_USER+ 3)  // (I.G), BOOL
#define BLA_TopBorder     (TAG_USER+ 4)  // (..G)
#define BLA_LeftBorder    (TAG_USER+ 5)  // (..G)
#define BLA_RightBorder   (TAG_USER+ 6)  // (..G)
#define BLA_BottomBorder  (TAG_USER+ 7)  // (..G)
#define BLA_LabelPlace    (TAG_USER+ 8)  // (I.G), ULONG

class BevellineClass : public BoopsiClass {
public:
	BevellineClass();
private:
	static ULONG dispatcher(Class *cl, Object *o, Msg msg);
	static ULONG renderBevelline(Class *cl, struct Gadget *g,
		struct gpRender *msg, struct BevellineData *);
	static VOID calcBorders(Class *cl, struct Gadget *g,
		struct BevellineData *);
};

class BBevellineC : public BGadgetC {
public:
	BBevellineC(WindowC &w, Tag tag1type, ...)
		: BGadgetC(NULL,blgc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type) { };
	BBevellineC(WindowC &w, struct TagItem *tags)
		: BGadgetC(NULL,blgc.boopsiclass(),NULL,w,tags) { };
	VOID erase(WindowC *);
	WORD leftBorder() const { return getAttr(BLA_LeftBorder); };
	WORD topBorder() const { return getAttr(BLA_TopBorder); };
	WORD rightBorder() const { return getAttr(BLA_RightBorder); };
	WORD bottomBorder() const { return getAttr(BLA_BottomBorder); };
	VOID setTextAttr(const TextAttrC *f) { setAttrs(BLA_Font,f,TAG_END); };
	TextAttrC *textAttr() const { return (TextAttrC *) getAttr(BLA_Font); };
protected:
	BBevellineC(GadgetEventC *ev, struct IClass *c, STRPTR pubclass,
		WindowC &w, struct TagItem *tags)
		: BGadgetC(ev,NULL,pubclass,w,tags) { };
private:
	static BevellineClass blgc;
};

#endif
