
// HelloWorld.c
//
// Dieses Programm öffnet ein Fenster, in dem der Text "Hello World"
// ausgegeben wird. Allerdings kommt der Layouter zum Einsatz - das
// ganze zeigt ganz gut den Aufbau einer typischen Applikation mit
// der Klassenbibliothek
//
// Autor: Jochen Becher

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

class HelloWorldWindowC : public StandardWindowC {
public:
	HelloWorldWindowC(GTIDCMPortC &, ScreenC &);
	~HelloWorldWindowC();
private:
	LBTextC hello;
	GeometryC helloGeo;
	WindowCloseHandlerC wch;
};

HelloWorldWindowC::HelloWorldWindowC(GTIDCMPortC &p, ScreenC &s)
	: StandardWindowC(p,s,NULL,
		TAG_END),
	  hello(NULL,*this,LAYOUT_AUTOSIZE,LAYOUT_AUTOSIZE,
	   LBA_Text,"Hello World!",
	   LBA_Adjust,LB_AdjustCenter,
	   TAG_END),
	  helloGeo(hello,
	   LAYOUT_GROUP,NULL,2,LAYOUT_GROUP,NULL,-2,
	   LAYOUT_GROUP,NULL,2,LAYOUT_GROUP,NULL,-2),
	  wch(*this)
{
	gadgets.add(hello);
	innerGeo.add(helloGeo);
}

HelloWorldWindowC::~HelloWorldWindowC()
{
	// Dieses close() im Destruktor ist wichtig (obwohl die Fensterklasse
	// WindowC dieses auch enthält), damit das Fenster geschlossen ist,
	// bevor die Gadgets freigegeben werden - ein Refresh innerhalb dieser
	// Zeitspanne könnte sonst katastrophale Folgen haben.
	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
	HelloWorldWindowC 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;
}
