//
//               CITWindow include
//
//							 StormC
//
//               version 2002.02.25
//

#ifndef CIT_CITWINDOW_H
#define CIT_CITWINDOW_H TRUE

#include "CITScreen.h"
#include <classes/window.h>
#include <intuition/classusr.h>

//
// These enums only for internal use
//
enum
{
  CITWD_POSITION = 0,
  CITWD_POSITION_Y,
  CITWD_WIDTH,
  CITWD_HEIGHT,
  CITWD_LOCKWIDTH,
  CITWD_LOCKHEIGHT,
  CITWD_SHAREDPORT,
  CITWD_APPWINDOW,
  CITWD_APPPORT,
  CITWD_ICONIFYGADGET,
  CITWD_BACKFILLNAME,
  CITWD_MENUSTRIP,
  CITWD_ICONTITLE,
  CITWD_ICON,
  CITWD_GADGETHELP,
  CITWD_CUSTOMSCREEN,
  CITWD_REFWINDOW,
  CITWD_ACTIVATE,
  CITWD_CLOSEGADGET,
  CITWD_DEPTHGADGET,
  CITWD_SIZEGADGET,
  CITWD_DRAGBAR,
  CITWD_BORDERLESS,
  CITWD_BACKDROP,
  CITWD_CAPTION,
  CITWD_SCREENTITLE,
  CITWD_LAST
};

class CITWindowClass;
class CITRootClass;
class CITGroup;

class CITWindow:public CITScreenClass
{
  public:
    Window*    window;
    Object*    windowObject;
    TTextAttr* defTextAttr;
    TextFont*  defTextFont;
    int        LeftEdge, TopEdge;
    int        Width, Height;

    CITWindow();
    ~CITWindow();

    void InsObject(CITWindowClass& winClass,BOOL& Err);
    void InsObject(CITWindowClass& winClass,CITRootClass* parent,BOOL& Err);
    void RemObject(CITWindowClass& winClass);

    void Align(CITGroup& group1,CITGroup& group2);
    
    void Size(int w, int h);
    void Position(int x, int y);
    void Position(UWORD pos);
    void LockWidth(ULONG w)
      {setTag(CITWD_LOCKWIDTH,WINDOW_LockWidth,w);}
    void LockHeigh(ULONG h)
      {setTag(CITWD_LOCKHEIGHT,WINDOW_LockHeight,h);}
    void AppPort(BOOL b = TRUE)
      {setTag(CITWD_APPPORT,WINDOW_AppPort,b,0);}
    void AppWindow(BOOL b = TRUE)
      {setTag(CITWD_APPWINDOW,WINDOW_AppWindow,b,0);}
    void IconifyGadget(BOOL b = TRUE);
    void BackFillName(char* name)
      {setTag(CITWD_BACKFILLNAME,WINDOW_BackFillName,ULONG(name));}
    void BusyPointer(BOOL b);
    void Zoom(BOOL b);
    void MenuStrip(struct Menu* menu)
      {setTag(CITWD_MENUSTRIP,WINDOW_MenuStrip,ULONG(menu));}
    void IconTitle(char* title)
      {setTag(CITWD_ICONTITLE,WINDOW_IconTitle,ULONG(title));}
    void Icon (struct DiskObject* diskObject)
      {setTag(CITWD_ICON,WINDOW_Icon,ULONG(diskObject));}
    void GadgetHelp(BOOL b = TRUE)
      {setTag(CITWD_GADGETHELP,WINDOW_GadgetHelp,b);}
    void RefWindow(struct Window* win)
      {setTag(CITWD_REFWINDOW,WINDOW_RefWindow,ULONG(win));}
    void Activate(BOOL b = TRUE)
      {setTag(CITWD_ACTIVATE,WA_Activate,b);}
    void CloseGadget(BOOL b =TRUE)
      {setTag(CITWD_CLOSEGADGET,WA_CloseGadget,b);}
    void DepthGadget(BOOL b = TRUE)
      {setTag(CITWD_DEPTHGADGET,WA_DepthGadget,b);}
    void SizeGadget(BOOL b  = TRUE)
      {setTag(CITWD_SIZEGADGET,WA_SizeGadget,b);}
    void DragBar(BOOL b = TRUE)
      {setTag(CITWD_DRAGBAR,WA_DragBar,b);}
    void Borderless(BOOL b = TRUE)
      {setTag(CITWD_BORDERLESS,WA_Borderless,b);}
    void Backdrop(BOOL b = TRUE)
      {setTag(CITWD_BACKDROP,WA_Backdrop,b);}
    void ToFront();
    void ToBack();
    void ScreenTitle(char* title)
      {setTag(CITWD_SCREENTITLE,WA_ScreenTitle,ULONG(title));}
    void Caption(char* title)
      {setTag(CITWD_CAPTION,WA_Title,ULONG(title));}
    void DefaultFont(char* name, short Height, short Width = 0);

    BOOL ClosePressed();
    int TextLen(char* t);

    // Set user event handlers
    void CloseEventHandler(void (*p)());
    void CloseEventHandler(void* that,void* p);

    // Return inner size of window
    virtual int InnerWidth();
    virtual int InnerHeight();

  protected:
    virtual void CloseEvent();
    virtual void NewSizeEvent();
    virtual BOOL Create(CITScreen* CITScr);
    virtual void Delete(); 
    virtual void HandleEvent(ULONG Sigs);
    virtual void HandleWindowEvent(ULONG result,UWORD code);

  private:
    MsgPort*  wdIDCMP;
    MsgPort*  appPort;
    TTextAttr wdTextAttr;
    TextFont* wdTextFont;
    CITList   eventList;
    CITList   childList;
    CITList*  alignList;
    TagItem*  windowTag;
    ULONG     flags;

    void *closeEventThat;
    union
    {
      void (*Proc0)();
      void (*Proc1)(void* that);
    } closeEvent;
    
    void setTag(int index,ULONG attr,ULONG val,BOOL set = TRUE);
    void SetUp();
};

class CITWindowClass:public CITNode
{
  public:
    CITWindow* CITWd;

    CITWindowClass();
    ~CITWindowClass();

  protected:
    friend class CITWindow;

    UWORD classID;
    ULONG IDCMPFlags;
    ULONG EventType;
    
    virtual BOOL Create(CITWindow* CITWd,class CITRootClass* parent);
    virtual void Delete();
    virtual void HandleEvent(ULONG result,UWORD code);
};

#endif
