/************************************************/
/* ML-Support                                   */
/* Freeware                                     */
/* © 1998-99 Christian Hattemer                 */
/* email: chris@mail.riednet.wh.tu-darmstadt.de */
/* 11.06.99 12:17                               */
/************************************************/

#ifndef MAKE_ID
   #define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
#endif

/* Ansi */
#include <string.h>

/* ML-Support */
#include "Editwin.h"
#include "GUI.h"
#include "ML_Support_Cat.h"
#include "MLList.h"

/* Protos */
#include <proto/utility.h>

/* Functions */
METHOD Editwin_New (Class *cl, Object *obj, struct opSet *msg);
METHOD Editwin_Edit(Class *cl, Object *obj, struct MUIP_Editwin_Edit *msg);
ULONG SAVEDS Editwin_Dispatcher(REG(a0) Class *cl, REG(a2) Object *obj, REG(a1) Msg msg);
static BOOL  CheckValues  (struct Editwin_Data *Data, Object *obj);
static void  CopyGadToList(struct Editwin_Data *Data, struct MUIP_Editwin_Edit *msg);

/* Structures */
static struct MUIP_Editwin_Edit
{
   ULONG  MethodID;
   struct MLListNode *MLN;
};

static struct Editwin_Data
{
   Object *STR_MLName;
   Object *STR_SubsCmd;
   Object *STR_UnsubsCmd;
   Object *STR_ServerAdd;
   Object *CY_AddData;
   Object *STR_Comment;
   Object *CM_IsSubs;
   Object *CM_ToCmd;
};


METHOD Editwin_New(Class *cl, Object *obj, struct opSet *msg)
{
   Object *BT_Ok, *BT_Cancel;

   static STRPTR CYA_AddData[] =
   {
      (STRPTR)_LBL_AD_NONE,
      (STRPTR)_LBL_AD_EMAIL,
      (STRPTR)_LBL_AD_REALNAME,
      (STRPTR)_LBL_AD_EMAIL_REALNAME,
      (STRPTR)_LBL_AD_REALNAME_EMAIL,
      NULL
   };

   struct Editwin_Data Temp, *Data;

   LocalizeStringArray(CYA_AddData);

   obj = (Object *)DoSuperNew(cl, obj,
      MUIA_Window_Title, TITLE_EDITWIN,
      MUIA_Window_ID, MAKE_ID('E', 'D', 'I', 'T'),
      MUIA_Window_CloseGadget, FALSE,

      WindowContents, VGroup,
         Child, ColGroup(4),
            Child, Label2(LBL_ML_NAME),
            Child, Temp.STR_MLName = MUI_MakeObject(MUIO_String, LBL_ML_NAME, MAX_TEXT),
            Child, Label2(LBL_SUBS_CMD),
            Child, Temp.STR_SubsCmd = MUI_MakeObject(MUIO_String, LBL_SUBS_CMD, MAX_TEXT),

            Child, Label2(LBL_SERVER_ADD),
            Child, Temp.STR_ServerAdd = MUI_MakeObject(MUIO_String, LBL_SERVER_ADD, MAX_TEXT),
            Child, Label2(LBL_UNSUBS_CMD),
            Child, Temp.STR_UnsubsCmd = MUI_MakeObject(MUIO_String, LBL_UNSUBS_CMD, MAX_TEXT),

            Child, Label1(LBL_ADD_DATA),
            Child, Temp.CY_AddData = MUI_MakeObject(MUIO_Cycle, LBL_ADD_DATA, &CYA_AddData),
            Child, Label2(LBL_COMMENT),
            Child, Temp.STR_Comment = MUI_MakeObject(MUIO_String, LBL_COMMENT, MAX_TEXT),

            Child, Label1(LBL_IS_SUBSCRIBED),
            Child, HGroup,
               Child, Temp.CM_IsSubs = MUI_MakeObject(MUIO_Checkmark, LBL_IS_SUBSCRIBED),
               Child, HVSpace,
            End,
            Child, Label1(LBL_CMD_IN_TO),
            Child, HGroup,
               Child, Temp.CM_ToCmd = MUI_MakeObject(MUIO_Checkmark, LBL_CMD_IN_TO),
               Child, HVSpace,
            End,
         End,

         Child, VSpace(0),

         Child, HGroup,
            MUIA_Group_SameSize, TRUE,
            Child, BT_Ok = SimpleButton(LBL_OK),
            Child, HSpace(0),
            Child, BT_Cancel = SimpleButton(LBL_CANCEL),
         End,
      End,
   End;


   if (!obj)
   {
      return NULL;
   }


   DoMethod(obj, MUIM_MultiSet,
            MUIA_String_AdvanceOnCR, TRUE,
            Temp.STR_MLName   , Temp.STR_SubsCmd,
            Temp.STR_ServerAdd, Temp.STR_UnsubsCmd,
            Temp.STR_Comment  , NULL
           );

   DoMethod(obj, MUIM_MultiSet,
            MUIA_CycleChain, 1,
            Temp.STR_MLName   , Temp.STR_SubsCmd,
            Temp.STR_ServerAdd, Temp.STR_UnsubsCmd,
            Temp.CY_AddData   , Temp.STR_Comment,
            Temp.CM_IsSubs    , Temp.CM_ToCmd,
            BT_Ok, BT_Cancel  , NULL
           );

   set(Temp.STR_MLName   , MUIA_ShortHelp, BBL_MLNAME   );
   set(Temp.STR_SubsCmd  , MUIA_ShortHelp, BBL_SUBSCMD  );
   set(Temp.STR_ServerAdd, MUIA_ShortHelp, BBL_SERVERADD);
   set(Temp.STR_UnsubsCmd, MUIA_ShortHelp, BBL_UNSUBSCMD);
   set(Temp.CY_AddData   , MUIA_ShortHelp, BBL_ADDDATA  );
   set(Temp.STR_Comment  , MUIA_ShortHelp, BBL_COMMENT  );
   set(Temp.CM_IsSubs    , MUIA_ShortHelp, BBL_ISSUBS   );
   set(Temp.CM_ToCmd     , MUIA_ShortHelp, BBL_TOCMD    );

   Data = INST_DATA(cl, obj);
   *Data = Temp;

   DoMethod(BT_Ok,
            MUIM_Notify, MUIA_Pressed, FALSE,
            MUIV_Notify_Application,
            2,
            MUIM_Application_ReturnID, MUIV_Editwin_Ok
           );

   DoMethod(BT_Cancel,
            MUIM_Notify, MUIA_Pressed, FALSE,
            MUIV_Notify_Application,
            2,
            MUIM_Application_ReturnID, MUIV_Editwin_Cancel
           );

   return ((ULONG)obj);
}

METHOD Editwin_Edit(Class *cl, Object *obj, struct MUIP_Editwin_Edit *msg)
{
   BOOL    Running = TRUE;
   ULONG   Sigs    = 0UL;
   Object *App     = _app(obj);

   struct Editwin_Data *Data = INST_DATA(cl, obj);

   set(Data->STR_MLName   , MUIA_String_Contents, msg->MLN->MLName   );
   set(Data->STR_SubsCmd  , MUIA_String_Contents, msg->MLN->SubsCmd  );
   set(Data->STR_UnsubsCmd, MUIA_String_Contents, msg->MLN->UnsubsCmd);
   set(Data->STR_ServerAdd, MUIA_String_Contents, msg->MLN->ServerAdd);
   set(Data->CY_AddData   , MUIA_Cycle_Active   , msg->MLN->AddData  );
   set(Data->STR_Comment  , MUIA_String_Contents, msg->MLN->Comment  );
   set(Data->CM_IsSubs    , MUIA_Selected       , msg->MLN->IsSubs   );
   set(Data->CM_ToCmd     , MUIA_Selected       , msg->MLN->ToCmd    );

   if (EMPTYSTR((STRPTR)xget(Data->STR_MLName, MUIA_String_Contents)))
   {
      set(obj, MUIA_Window_ActiveObject, Data->STR_MLName);
   }

   set(obj, MUIA_Window_Open, TRUE);
   if (!(xget(obj, MUIA_Window_Open)))
   {
      DisplayBeep(NULL);
      return MUIV_Editwin_Cancel;
   }

   while (Running)
   {
      switch (DoMethod(App, MUIM_Application_NewInput, &Sigs))
      {
         case MUIV_Application_ReturnID_Quit:
            // re-send the quit id so the main app loop can exit
            DoMethod(App, MUIM_Application_ReturnID,
                     MUIV_Application_ReturnID_Quit
                    );
            Running = FALSE;
            break;

         case MUIV_Editwin_Ok:
            if (CheckValues(Data, obj))
            {
               CopyGadToList(Data, msg);
               set(obj, MUIA_Window_Open, FALSE);
               return MUIV_Editwin_Ok;
            }
            break;

         case MUIV_Editwin_Cancel:
            set(obj, MUIA_Window_Open, FALSE);
            return MUIV_Editwin_Cancel;

         default:
            if (Sigs)
            {
               Sigs = Wait(Sigs | SIGBREAKF_CTRL_C);
               if (Sigs & SIGBREAKF_CTRL_C)
               {
                  DoMethod(App, MUIM_Application_ReturnID,
                           MUIV_Application_ReturnID_Quit
                          );
                  Running = FALSE;
               }
            }
            break;
      }
   }

   return MUIV_Editwin_Nothing;
}

ULONG SAVEDS Editwin_Dispatcher(REG(a0) Class *cl, REG(a2) Object *obj, REG(a1) Msg msg)
{
   switch (msg->MethodID)
   {
      case OM_NEW: return(Editwin_New(cl, obj, (APTR)msg));
      case MUIM_Editwin_Edit: return(Editwin_Edit (cl, obj, (APTR)msg));
   }

   return (DoSuperMethodA(cl, obj, msg));
}

static BOOL CheckValues(struct Editwin_Data *Data, Object *obj)
{
   STRPTR  ErrorMsg = NULL, Buf;
   Object *ErrorObj;

   if (EMPTYSTR((STRPTR)xget(Data->STR_UnsubsCmd, MUIA_String_Contents)))
   {
      ErrorMsg = MSG_NO_UNSUBS_CMD;
      ErrorObj = Data->STR_UnsubsCmd;
   }

   get(Data->STR_ServerAdd, MUIA_String_Contents, &Buf);
   if (!(strchr(Buf, '@') && strchr(Buf, '.')))
   {
      ErrorMsg = MSG_NO_SERVER_ADD;
      ErrorObj = Data->STR_ServerAdd;
   }

   if (EMPTYSTR((STRPTR)xget(Data->STR_SubsCmd, MUIA_String_Contents)))
   {
      ErrorMsg = MSG_NO_SUBS_CMD;
      ErrorObj = Data->STR_SubsCmd;
   }

   if (EMPTYSTR((STRPTR)xget(Data->STR_MLName, MUIA_String_Contents)))
   {
      ErrorMsg = MSG_NO_ML_NAME;
      ErrorObj = Data->STR_MLName;
   }

   if (ErrorMsg)
   {
      MUI_RequestA(_app(obj), obj, 0,
                   TITLE_EDITWIN,
                   LBL_OK_ACTIVE,
                   ErrorMsg,
                   NULL
                  );

      set(obj, MUIA_Window_ActiveObject, ErrorObj);

      return FALSE;
   }

   return TRUE;
}

static void CopyGadToList(struct Editwin_Data *Data, struct MUIP_Editwin_Edit *msg)
{
   strcpy(msg->MLN->MLName   , (STRPTR)xget(Data->STR_MLName   , MUIA_String_Contents));
   strcpy(msg->MLN->SubsCmd  , (STRPTR)xget(Data->STR_SubsCmd  , MUIA_String_Contents));
   strcpy(msg->MLN->UnsubsCmd, (STRPTR)xget(Data->STR_UnsubsCmd, MUIA_String_Contents));
   strcpy(msg->MLN->ServerAdd, (STRPTR)xget(Data->STR_ServerAdd, MUIA_String_Contents));
   strcpy(msg->MLN->Comment  , (STRPTR)xget(Data->STR_Comment  , MUIA_String_Contents));

   msg->MLN->AddData = xget(Data->CY_AddData, MUIA_Cycle_Active);
   msg->MLN->IsSubs  = xget(Data->CM_IsSubs , MUIA_Selected    );
   msg->MLN->ToCmd   = xget(Data->CM_ToCmd  , MUIA_Selected    );
}

struct MUI_CustomClass *CreateEditwinClass()
{
   return MUI_CreateCustomClass(NULL,
                                MUIC_Window, NULL,
                                sizeof(struct Editwin_Data),
                                Editwin_Dispatcher
                               );
}

void DeleteEditwinClass(struct MUI_CustomClass *CL_Editwin)
{
   MUI_DeleteCustomClass(CL_Editwin);
}

