
#include <classes/layouter/windows.h>
#include <classes/layouter/boopsigadgets.h>
#include <classes/layouter/decorgadgets.h>
#include <classes/exec/libraries.h>

class GadgetColumnC : public GeometryGroupC {
public:
	GadgetColumnC(
		GroupLayoutC &frame,
		ULONG topRelation, GeometryC *topObject, WORD topOffset,
		ULONG bottomRelation, GeometryC *bottomObject, WORD bottomOffset,
		ULONG leftRelation, GeometryC *leftObject, WORD leftOffset,
		ULONG rightRelation, GeometryC *rightObject, WORD rightOffset);
	~GadgetColumnC();
	VOID add(GeometryC &);
private:
	TransparentLayoutC left, right;
	GeometryC leftG, rightG;
	GeometryC *lastG;
};

GadgetColumnC::GadgetColumnC(
		GroupLayoutC &frame,
		ULONG topRelation, GeometryC *topObject, WORD topOffset,
		ULONG bottomRelation, GeometryC *bottomObject, WORD bottomOffset,
		ULONG leftRelation, GeometryC *leftObject, WORD leftOffset,
		ULONG rightRelation, GeometryC *rightObject, WORD rightOffset)
	: GeometryGroupC(frame,
	   topRelation,topObject,topOffset,
	   bottomRelation,bottomObject,bottomOffset,
	   leftRelation,leftObject,leftOffset,
	   rightRelation,rightObject,rightOffset),
	  left(),
	  right(),
	  leftG(left,
	   LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0,
	   LAYOUT_GROUP,NULL,0,LAYOUT_MAXOPPBORDER,NULL,0),
	  rightG(right,
	   LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0,
	   LAYOUT_MAXOPPBORDER,NULL,0,LAYOUT_GROUP,NULL,0),
	  lastG(NULL)
{
	GeometryGroupC::add(leftG);
	GeometryGroupC::add(rightG);
}

GadgetColumnC::~GadgetColumnC()
{
}

VOID GadgetColumnC::add(GeometryC &g)
{
	if (lastG)
		g.setTopRule(LAYOUT_OPPBORDER,lastG,2)
	else
		g.setTopRule(LAYOUT_GROUP,NULL,0);
	g.setBottomRule(LAYOUT_SIZE,NULL,0);
	g.setLeftRule(LAYOUT_OPP,&leftG,0);
	g.setRightRule(LAYOUT_OPP,&rightG,0);
	GeometryGroupC::add(g);
	lastG = &g;
}

class TestWindowC : public StandardWindowC {
public:
	TestWindowC(GTIDCMPortC &, ScreenC &);
	~TestWindowC();
private:
	LBBevelboxC columnFrame;
	LBStringC string1, string2, string3;
	GeometryC string1G, string2G, string3G;
	GadgetColumnC columnG;
	WindowCloseHandlerC wch;
};

TestWindowC::TestWindowC(GTIDCMPortC &p, ScreenC &s)
	: StandardWindowC(p,s,NULL,
		TAG_END),
	  columnFrame(*this),
	  string1(NULL,*this,LAYOUT_AUTOSIZE,LAYOUT_AUTOSIZE,
	   GA_Text,"Name",
	   STRINGA_MaxChars,20,
	   TAG_END),
	  string2(NULL,*this,LAYOUT_AUTOSIZE,LAYOUT_AUTOSIZE,
	   GA_Text,"Vorname",
	   STRINGA_MaxChars,20,
	   TAG_END),
	  string3(NULL,*this,LAYOUT_AUTOSIZE,LAYOUT_AUTOSIZE,
	   GA_Text,"Straße",
	   STRINGA_MaxChars,20,
	   TAG_END),
	  string1G(string1,
	   LAYOUT_GROUP,NULL,0,LAYOUT_GROUP,NULL,0,
	   LAYOUT_SIZE,NULL,0,LAYOUT_SIZE,NULL,0),
	  string2G(string2,
	   LAYOUT_GROUP,NULL,0,LAYOUT_GROUP,NULL,0,
	   LAYOUT_SIZE,NULL,0,LAYOUT_SIZE,NULL,0),
	  string3G(string3,
	   LAYOUT_GROUP,NULL,0,LAYOUT_GROUP,NULL,0,
	   LAYOUT_SIZE,NULL,0,LAYOUT_SIZE,NULL,0),
	  columnG(columnFrame,
	   LAYOUT_GROUP,NULL,2,LAYOUT_GROUP,NULL,-2,
	   LAYOUT_GROUP,NULL,2,LAYOUT_GROUP,NULL,-2),
	  wch(*this)
{
	titlegadgets.add(columnFrame);
	gadgets.add(string1);
	gadgets.add(string2);
	gadgets.add(string3);
	columnG.add(string1G);
	columnG.add(string2G);
	columnG.add(string3G);
	innerGeo.add(columnG);
}

TestWindowC::~TestWindowC()
{
	close();
}

LibraryBaseErrC GadToolsBase("gadtools.library",37);
LibraryBaseErrC UtilityBase("utility.library",37);
LibraryBaseErrC CxBase("commodities.library",37);
LibraryBaseErrC LayersBase("layers.library",37);
LibraryBaseErrC WorkbenchBase("workbench.library",37);

int main()
{
	if (!LibraryBaseC::areAllOpen())
		return 20;

	// diese Klasse empfängt und verarbeitet alle Signale
	SignalsC sc;

	// öffentlichen Standardbildschirm sperren
	PublicScreenC screen();
	if (!screen.lock(NULL))
		return 100;

	// der IDCMPort (in der GadTools Version) für die Fenster
	GTIDCMPortC port;
	sc.add(port);

	// Das Fenster
	TestWindowC window(port,screen);

	// noch einen Ctrl C HandlerC zur Sicherheit einhängen
	CtrlCHandlerC ctrlchandler;
	sc.add(ctrlchandler);

	// Fenster öffnen
	window.open();

	// THE BIG AND EASY ONE!
	sc.loop();

	return 0;
}
