
#include "includes.h"
#include "installergui_data.h"

/********************************************************************
 *
 *  DESCRIPTION
 *
 *  a very complex one :)
 *  this handles both WELCOME panels, stores the user-selected
 *  data (such as LOGFILE, USERMODE, PRETEND...) into the
 *  applications global environment (app->app_GlobalEnv)
 *
 *  IN:  application - pointer to the private application structure
 *       appname - the name of the application (i.e. the content
 *                 of the @APPNAME variable)
 *  OUT: -
 */

/********************************************************************
 *
 *  STATIC
 *
 */

static APTR make_intro1(APTR, char *);
static APTR make_intro2(APTR);

static const struct Hook welcome_MXTwoHook = { { NULL, NULL }, (VOID *) guistuff_MXTwoFun, NULL, NULL };
static const struct Hook welcome_MXThreeHook = { { NULL, NULL }, (VOID *) guistuff_MXThreeFun, NULL, NULL };
static const struct Hook welcome_SetValHook = { { NULL, NULL }, (VOID *) guistuff_SetValFun, NULL, NULL };

/********************************************************************
 *
 *  EXTERN
 *
 */

/********************************************************************
 *
 *  PUBLIC
 *
 */

/********************************************************************
 *
 *  CODE
 *
 */

void __asm igui_Welcome(register __a0 APTR application, register __a1 char *appname)
{
  #ifdef DEBUG
  DEBUG_MAKRO
  #endif

  {
    struct Application *app = (struct Application *) application;

    // set the help text
    igui_SetHelp(app, app->app_Texts[HELP_INTRO1]);

    // make a new panel an display it
    if (!guistuff_NewContent(app, make_intro1(app, appname))) { app->app_Error = GUIERROR_NO_GUI_OBJECT; return; }

    // wait for user input
    igui_WaitApp(app);
    if (!igui_QuitApp(app))
    {
      // only if the selected user is AVERAGE or EXPERT, we have to set up
      // the second panel
      if (app->app_GlobalEnv[GENV_USER] != USER_NOVICE)
      {
        if (!guistuff_NewContent(app, make_intro2(app))) { app->app_Error = GUIERROR_NO_GUI_OBJECT; return; }
        igui_SetHelp(app, app->app_Texts[HELP_INTRO2]);
        igui_WaitApp(app);
      }
    }

    igui_EmptyPanel(app);
    return;
  }
}

/********************************************************************/

// create the panel for the first intro
static APTR make_intro1(APTR application, char *appname)
{
  struct Application *app = (struct Application *) application;

  char *welcometext;
  APTR IM_novice, IM_average, IM_expert,
       obj = NULL;

  // create the welcome text
  welcometext = sav_StringF2(app->app_Texts[INTRO1_WELCOME], &appname);
  if (!welcometext) { }
  else
  {
    obj = GroupObject,
                  Child, TextObject,
                    MUIA_Frame, MUIV_Frame_None,
                    MUIA_Text_Contents, welcometext,
                    MUIA_Text_SetMin, TRUE,
                    MUIA_Text_PreParse, "\33c",
                  End,
                  Child, HVSpace,
                  Child, GroupObject,
                    MUIA_Frame, MUIV_Frame_Group,
                    MUIA_FrameTitle, app->app_Texts[INTRO1_MODE],
                    MUIA_Group_Horiz, TRUE,
                    Child, HVSpace,
                    Child, GroupObject,
                      MUIA_Group_Columns, 2,
                      Child, IM_novice = guistuff_InitRadio((app->app_GlobalEnv[GENV_GUI_DEFUSER]==USER_NOVICE)?TRUE:FALSE,
                                                       (app->app_GlobalEnv[GENV_GUI_MINUSER]>USER_NOVICE)?TRUE:FALSE),
                      Child, LLabel(app->app_Texts[INTRO1_NOVICE]),
                      Child, IM_average = guistuff_InitRadio((app->app_GlobalEnv[GENV_GUI_DEFUSER]==USER_AVERAGE)?TRUE:FALSE,
                                                        (app->app_GlobalEnv[GENV_GUI_MINUSER]>USER_AVERAGE)?TRUE:FALSE),
                      Child, LLabel(app->app_Texts[INTRO1_AVERAGE]),
                      Child, IM_expert = guistuff_InitRadio((app->app_GlobalEnv[GENV_GUI_DEFUSER]==USER_EXPERT)?TRUE:FALSE,
                                                       FALSE),
                      Child, LLabel(app->app_Texts[INTRO1_EXPERT]),
                    End,
                    Child, HVSpace,
                  End,
                  Child, HVSpace,
                End;

    if (obj)
    {
      DoMethod(IM_novice, MUIM_Notify, MUIA_Pressed, TRUE,
               MUIV_Notify_Self, 5, MUIM_CallHook, &welcome_MXThreeHook, IM_novice, IM_average, IM_expert);
      DoMethod(IM_average, MUIM_Notify, MUIA_Pressed, TRUE,
               MUIV_Notify_Self, 5, MUIM_CallHook, &welcome_MXThreeHook, IM_average, IM_novice, IM_expert);
      DoMethod(IM_expert, MUIM_Notify, MUIA_Pressed, TRUE,
               MUIV_Notify_Self, 5, MUIM_CallHook, &welcome_MXThreeHook, IM_expert, IM_novice, IM_average);

      DoMethod(IM_novice, MUIM_Notify, MUIA_Pressed, TRUE,
               MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_USER]), USER_NOVICE);
      DoMethod(IM_average, MUIM_Notify, MUIA_Pressed, TRUE,
               MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_USER]), USER_AVERAGE);
      DoMethod(IM_expert, MUIM_Notify, MUIA_Pressed, TRUE,
               MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_USER]), USER_EXPERT);
    }
  }

  return(obj);
}

/********************************************************************/

static APTR make_intro2(APTR application)
{
  struct Application *app = (struct Application *) application;

  APTR IM_pretend, IM_real, IM_printer, IM_file, IM_nolog;
  APTR CM_debug, CM_startup, CM_uninstall, CM_dontdelsysdir, CM_packagecomment, CM_alwaysconfirm;
  APTR obj;

  obj = GroupObject,
          Child, GroupObject,
            MUIA_Frame, MUIV_Frame_Group,
            MUIA_FrameTitle, app->app_Texts[INTRO2_OPTS],
            MUIA_Group_Horiz, TRUE,
            Child, HVSpace,
            Child, GroupObject,
              MUIA_Group_Columns, 2,
              Child, IM_real = guistuff_InitRadio(TRUE, FALSE),
              Child, LLabel(app->app_Texts[INTRO2_REAL]),
              Child, IM_pretend = guistuff_InitRadio(FALSE, !(app->app_GlobalEnv[GENV_GUI_ALLOW_PRETEND])),
              Child, LLabel(app->app_Texts[INTRO2_PRETEND]),
            End,
            Child, HVSpace,
          End,
          Child, HVSpace,
          Child, GroupObject,
            MUIA_Frame, MUIV_Frame_Group,
            MUIA_FrameTitle, app->app_Texts[INTRO2_LOG],
            MUIA_Group_Horiz, TRUE,
            Child, HVSpace,
            Child, GroupObject,
              MUIA_Group_Columns, 2,
              Child, IM_printer = guistuff_InitRadio(FALSE, !(app->app_GlobalEnv[GENV_GUI_ALLOW_PRINT])),
              Child, LLabel(app->app_Texts[INTRO2_PRINTER]),
              Child, IM_file = guistuff_InitRadio(FALSE, !(app->app_GlobalEnv[GENV_GUI_ALLOW_LOG])),
              Child, LLabel(app->app_Texts[INTRO2_FILE]),
              Child, IM_nolog = guistuff_InitRadio(TRUE, FALSE),
              Child, LLabel(app->app_Texts[INTRO2_NONE]),
            End,
            Child, HVSpace,
          End,
          Child, HVSpace,
          Child, GroupObject,
            MUIA_Frame, MUIV_Frame_Group,
            MUIA_FrameTitle, app->app_Texts[INTRO2_ADVANCED],
            MUIA_Group_Horiz, TRUE,
            Child, HVSpace,
            Child, GroupObject,
              MUIA_Group_Columns, 4,
                Child, Label(app->app_Texts[INTRO2_DEBUG]),
                Child, CM_debug = CheckMark(app->app_GlobalEnv[GENV_DEBUGMODE]),
                Child, Label(app->app_Texts[INTRO2_NOSTARTUPSEQUENCE]),
                Child, CM_startup = CheckMark(app->app_GlobalEnv[GENV_STARTUP]),
                Child, Label(app->app_Texts[INTRO2_UNINSTALL]),
                Child, CM_uninstall = CheckMark(app->app_GlobalEnv[GENV_UNINSTALL]),
                Child, Label(app->app_Texts[INTRO2_DONTDELFROMSYSDIRS]),
                Child, CM_dontdelsysdir = CheckMark(app->app_GlobalEnv[GENV_DONTDELFROMSYSDIRS]),
                Child, Label(app->app_Texts[INTRO2_PACKAGE_COMMENT]),
                Child, CM_packagecomment = CheckMark(app->app_GlobalEnv[GENV_PACKAGE_COMMENT]),
                Child, Label(app->app_Texts[INTRO2_ALWAYSCONFIRM]),
                Child, CM_alwaysconfirm = CheckMark(app->app_GlobalEnv[GENV_ALWAYSCONFIRM]),
            End,
            Child, HVSpace,
          End,
          Child, HVSpace,
        End;

  if (obj)
  {
    // mx
    DoMethod(IM_real, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_MXTwoHook, IM_real, IM_pretend);
    DoMethod(IM_pretend, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_MXTwoHook, IM_pretend, IM_real);

    DoMethod(IM_real, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_INSTALL]), INSTALL_FOR_REAL);
    DoMethod(IM_pretend, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_INSTALL]), INSTALL_PRETEND);

    DoMethod(IM_printer, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 5, MUIM_CallHook, &welcome_MXThreeHook, IM_printer, IM_file, IM_nolog);
    DoMethod(IM_file, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 5, MUIM_CallHook, &welcome_MXThreeHook, IM_file, IM_printer, IM_nolog);
    DoMethod(IM_nolog, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 5, MUIM_CallHook, &welcome_MXThreeHook, IM_nolog, IM_printer, IM_file);

    DoMethod(IM_printer, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_LOG]), LOG_PRINTER);
    DoMethod(IM_file, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_LOG]), LOG_FILE);
    DoMethod(IM_nolog, MUIM_Notify, MUIA_Pressed, TRUE,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_LOG]), LOG_NOLOG);

    // checkmarks
    DoMethod(CM_uninstall, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_UNINSTALL]), !(app->app_GlobalEnv[GENV_UNINSTALL]));
    DoMethod(CM_startup, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_STARTUP]), !(app->app_GlobalEnv[GENV_STARTUP]));
    DoMethod(CM_debug, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_DEBUGMODE]), !(app->app_GlobalEnv[GENV_DEBUGMODE]));
    DoMethod(CM_packagecomment, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_PACKAGE_COMMENT]), !(app->app_GlobalEnv[GENV_PACKAGE_COMMENT]));
    DoMethod(CM_alwaysconfirm, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_ALWAYSCONFIRM]), !(app->app_GlobalEnv[GENV_ALWAYSCONFIRM]));
    DoMethod(CM_dontdelsysdir, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
             MUIV_Notify_Self, 4, MUIM_CallHook, &welcome_SetValHook, &(app->app_GlobalEnv[GENV_DONTDELFROMSYSDIRS]), !(app->app_GlobalEnv[GENV_DONTDELFROMSYSDIRS]));
  }

  return(obj);
}
