//*************************************************************************//
// 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 "flxclasses.h"
//*/ // Für GoldED 5 aktivieren
#include "golded:developer/api/include/apilib.h"
#include "golded:developer/include/editor.h"
/*/ // Für GoldED 4 aktivieren
#include "golded:developer/api/include/api.h"
#include "golded:developer/golded/include/golded.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
    // Zeiger auf die GoldED-API-Struktur für das Textfenster
  struct APIInstance *m_poAPIInstance;

    // Flag das angibt, ob das Fenster zuletzt als modifiziert angezeigt wurde
  BOOL                m_bModified;

  // ## 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   : HookC
//VERSION       : 20. November 1998
//AUTOR         : Christian Taulien of Strange Intelligence
//AUFGABE       : Diese Klasse repräsentiert einen Hook und stellt gleich-
//                zeitig die Hookfunktion bereit.
//DOKUMENTATION : -
//BEMERKUNGEN   : -
//AENDERUNGEN   : -
//*************************************************************************//
class HookC
{
private:
  // ## private datamembers ##
    // Objektgebundener Hook zum anspringen der doHookFunc()-Methode
  struct Hook         m_oHook;

protected:
  // ## protected datamembers ##
    // This Methods will be called by the Hooks
  virtual ULONG onHook(struct Hook *arg_poHook, APTR arg_pObject, APTR arg_pParms);

    // our SIFC_HookEntry-Function needs to call onHook() which is protected.
  friend static ULONG SIFC_HookEntry(register __a0 struct Hook *arg_poHook,
                                     register __a1 APTR arg_pObject,
                                     register __a2 APTR arg_pParms);

public:
  // ## public methods ##
  HookC();
  virtual ~HookC() {}

  // Infos
  struct Hook *getHook() { return &m_oHook; }
  operator struct Hook *() { return &m_oHook; }
};

//*************************************************************************//
//.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];
  static int   m_iLeft;
  static int   m_iTop;
  int          m_iWinHeight;
  int          m_iWinWidth;
  int          m_iMaxVisibleEntries;
  BOOL         m_bGadgetsAttached;

  FLXWatchListC   *m_poWatches;
  struct Gadget   *m_poFirstGadget;
  struct Gadget   *m_apoGadgets[GAD_ANZAHL];
  struct Window   *m_poWindow;
  struct Rectangle m_oLVRect;
  WNameListC       m_oWindowNameList;
  HookC            m_oListViewCallBack;

  // ## 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 isWNameListEmpty() { return IsListEmpty(&m_oWindowNameList); }
  BOOL openWindowList(struct APIMessage *apiMsg);
  void closeWindowList();
  BOOL SAVEDS handleWindowList();
  void updateWindowList(struct APIInstance *arg_poInstance);
  void updateModifiedFlag(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);
  struct Window *getWindow() { return m_poWindow; }
  WNameListC *getWNameList() { return &m_oWindowNameList; }
  void drawSeperator(int arg_iOffset);
  void refreshDesign();

};

#endif //WINDOWLIST_H
