//*************************************************************************//
// Filename:    WindowList.h
// Autor:       Christian Taulien of Strange Intelligence
// Purpose:     definition of used classes
// Creation:    24. März 1998
//*************************************************************************//
#ifndef WINDOWLIST_H
#define WINDOWLIST_H
extern struct Window;

#include "global.h"
#include "golded:developer/api/include/api.h"
#include "golded:developer/golded/include/golded.h"
#include "flxclasses.h"

#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <intuition/intuition.h>

class WNameListC;

//*************************************************************************//
//.klasse
//KLASSENNAME   : WNameNodeC
//VERSION       : 24. März 1998
//AUTOR         : Taulien
//AUFGABE       : Eine Klasse zur Verwaltung eines WindowNames in einer Liste
//DOKUMENTATION : -
//BEMERKUNGEN   : -
//AENDERUNGEN   : -
//*************************************************************************//
struct WNameNodeC : public struct Node
{
  friend class WNameListC;
private:
  // ## methods
  WNameNodeC(struct APIInstance *arg_poInstance, WNameListC *arg_poNameList);

public:
  // ## datamembers
  struct APIInstance *m_poAPIInstance;

  // ## methods
  ~WNameNodeC();

  char *getFileName(void) { return ln_Name; };
  WNameNodeC *getNext(void);
  WNameNodeC *getPrev(void);
};

//*************************************************************************//
//.klasse
//KLASSENNAME   : WNameListC
//VERSION       : 24. März 1998
//AUTOR         : Taulien
//AUFGABE       : Eine Klasse für die Verwaltung der WindowName-Liste
//DOKUMENTATION : -
//BEMERKUNGEN   : -
//AENDERUNGEN   : -
//*************************************************************************//
class WNameListC : public struct List
{
public:
  WNameListC();
  ~WNameListC();

  void removeAll();
  BOOL addWName(struct APIInstance *arg_poInstance);
  int sortIn(struct APIInstance *arg_poInstance);
  WNameNodeC *findWName(struct APIInstance *arg_poInstance);
  WNameNodeC *getFirst() { return (WNameNodeC *) lh_Head; };
  int indexOf(WNameNodeC *arg_pNode);
  int getSize();

  WNameNodeC *operator[](int arg_iIndex);
};

//*************************************************************************//
//.klasse
//KLASSENNAME   : VisualInfoC
//VERSION       : 28. März 1998
//AUTOR         : Taulien
//AUFGABE       : Eine Hilfsklasse-Klasse für die Verwaltung von VisualInfos
//DOKUMENTATION : -
//BEMERKUNGEN   : -
//AENDERUNGEN   : -
//*************************************************************************//
class VisualInfoC
{
private:
  // ## private Datamembers ##
  APTR  m_iVisualInfo;

  // ## private Methods ##
  void initVisualInfo(struct Screen *arg_poScreen);

public:
  // ## public Methods ##
  VisualInfoC(struct Window *arg_poWindow)
    { initVisualInfo(arg_poWindow->WScreen); };
  VisualInfoC(struct Screen *arg_poScreen)
    { initVisualInfo(arg_poScreen); };
  virtual ~VisualInfoC();

  BOOL isOk(void)   { return m_iVisualInfo ? TRUE : FALSE; };

  // # operator overriding
  operator APTR()   { return m_iVisualInfo; };
  BOOL operator !() { return !isOk(); };
};

//*************************************************************************//
//.klasse
//KLASSENNAME   : WindowListC
//VERSION       : 27. März 1998
//AUTOR         : Taulien
//AUFGABE       : Eine Klasse für die Verwaltung in GoldED geöffneter Fenster
//DOKUMENTATION : -
//BEMERKUNGEN   : -
//AENDERUNGEN   : -
//*************************************************************************//
class WindowListC
{
private:
  enum
  {
    IDC_LISTE,
    IDC_OKAY,
    IDC_CLOSE,
    IDC_CANCEL,
    GAD_ANZAHL
  };

  // ## private Datenmember ##
  static char *m_asButtonLabels[GAD_ANZAHL];

  int  m_iMaxVisibleEntries;
  static int  m_iLeft;
  static int  m_iTop;
  int  m_iWinHeight;
  int  m_iWinWidth;
  BOOL m_bGadgetsAttached;

  FLXWatchListC  *m_poWatches;
  struct Gadget *m_poFirstGadget;
  struct Gadget *m_apoGadgets[GAD_ANZAHL];
  struct Window *m_poWindow;
  WNameListC     m_oWindowNameList;

  // ## private Methoden ##
  char *getSelectedName();
  struct Gadget *createGadgets(struct Screen *arg_pScreen);
  void freeGadgets();
  void validateWindowPosition(struct Screen *arg_poScreen);
public:
  // ## public Methoden ##
  WindowListC(FLXWatchListC *arg_poWatches);
  virtual ~WindowListC();

  BOOL isOpen() { return m_poWindow ? TRUE : FALSE; };
  BOOL openWindowList(struct APIMessage *apiMsg);
  void closeWindowList();
  BOOL SAVEDS handleWindowList();
  void updateWindowList(struct APIInstance *arg_poInstance);
  void setMaxVisibleEntries(int arg_iCount)
                { m_iMaxVisibleEntries = arg_iCount; };
  void setWindowPosition(int arg_iX = -1, int arg_iY = -1, BOOL arg_bNow = TRUE);
  void clearWindow();
  void hideGadgets();
  void showGadgets();
  void resizeWindow(int arg_iEntries = 0, int arg_iX = -1, int arg_iY = -1);
  const struct Window *getWindow() { return m_poWindow; };

};

#endif //WINDOWLIST_H
