// This may look like C code, but it is really -*- C++ -*-

// $Revision: 1.3 $
// $Author: roman $
// $Date: 90/07/20 03:24:45 $

#include "eureka.h"
#include "Widget.h"

#ifndef _Factory_h
#define _Factory_h 1

extern const unsigned DefaultWidgetClassTableSize;

class AWidgetClass;
class AWidget;

class WidgetFactory {
   HashTable* classTable;

 public:

   SymbolID  RegisterClass(char* name, AWidgetClass* cl);
   void      UnRegisterClass(SymbolID id);

   AWidgetClass& RetrieveClass(char* name);

   AWidget*  CreateWidget(char* name, char* classname, AWidget& parent);
   AWidget*  CreateWidget(char* name, SymbolID cl, AWidget& parent);

   void      Display(AWidget& parent);

//  should we keep track of widgets ?
//   void      DestroyWidget(char* name);
//   void      DestroyWidget(SymbolID) {}
//   void      DestroyWidget(AWidget* w);

   WidgetFactory(int size = DefaultWidgetClassTableSize);
   ~WidgetFactory();

};

#endif
