jens-maus/yam

View on GitHub
src/mui/ScriptsConfigPage.c

Summary

Maintainability
Test Coverage
/***************************************************************************

 YAM - Yet Another Mailer
 Copyright (C) 1995-2000 Marcel Beck
 Copyright (C) 2000-2022 YAM Open Source Team

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 YAM Official Support Site : http://www.yam.ch
 YAM OpenSource project     : http://sourceforge.net/projects/yamos/

 $Id$

 Superclass:  MUIC_ConfigPage
 Description: "Scripts" configuration page

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

#include "ScriptsConfigPage_cl.h"

#include <proto/asl.h>
#include <proto/muimaster.h>
#include <mui/NList_mcc.h>
#include <mui/NListview_mcc.h>

#include "SDI_hook.h"

#include "mui/ConfigPage.h"
#include "mui/ConfigPageList.h"
#include "mui/PlaceholderPopup.h"
#include "mui/PlaceholderPopupList.h"
#include "mui/ScriptList.h"

#include "Config.h"
#include "MUIObjects.h"

#include "Debug.h"

/* CLASSDATA
struct Data
{
  Object *LV_REXX;
  Object *ST_RXNAME;
  Object *CY_ISADOS;
  Object *PO_SCRIPT;
  Object *CH_CONSOLE;
  Object *CH_WAITTERM;

  LONG script;

  struct Hook FilereqStartHook;
  struct Hook FilereqStopHook;
};
*/

/* Overloaded Methods */
/// OVERLOAD(OM_NEW)
OVERLOAD(OM_NEW)
{
  static const char *const stype[3] =
  {
    "ARexx", "AmigaDOS", NULL
  };
  Object *LV_REXX;
  Object *ST_RXNAME;
  Object *CY_ISADOS;
  Object *PO_SCRIPT;
  Object *CH_CONSOLE;
  Object *CH_WAITTERM;
  Object *popAsl;

  ENTER();

  if((obj = DoSuperNew(cl, obj,
    MUIA_HelpNode, "Configuration#Scripts",
    MUIA_ConfigPage_Page, cp_Scripts,
    MUIA_ConfigPage_AddSpacer, FALSE,
    MUIA_ConfigPage_Contents, VGroup,
      Child, VGroup,
        Child, NListviewObject,
          MUIA_CycleChain, TRUE,
          MUIA_NListview_NList, LV_REXX = ScriptListObject,
          End,
        End,
        Child, ColGroup(2),

          Child, Label2(tr(MSG_CO_Name)),
          Child, HGroup,
            Child, ST_RXNAME = MakeString(SIZE_NAME,tr(MSG_CO_Name)),
            Child, CY_ISADOS = CycleObject,
              MUIA_CycleChain,    TRUE,
              MUIA_Weight,        25,
              MUIA_Font,          MUIV_Font_Button,
              MUIA_Cycle_Entries, stype,
            End,
          End,

          Child, Label2(tr(MSG_CO_Script)),
          Child, HGroup,
            MUIA_Group_HorizSpacing, 0,
            Child, PO_SCRIPT = PlaceholderPopupObject,
              MUIA_String_MaxLen, SIZE_PATHFILE,
              MUIA_PlaceholderPopup_Mode, PHM_SCRIPTS,
              MUIA_PlaceholderPopup_ControlChar, ShortCut(tr(MSG_CO_Script)),
            End,
            Child, popAsl = PopaslObject,
               MUIA_Popasl_Type,      ASL_FileRequest,
               MUIA_Popstring_Button, PopButton(MUII_PopFile),
            End,
          End,

          Child, HSpace(1),
          Child, MakeCheckGroup(&CH_CONSOLE, tr(MSG_CO_OpenConsole)),

          Child, HSpace(1),
          Child, MakeCheckGroup(&CH_WAITTERM, tr(MSG_CO_WaitTerm)),

        End,
      End,

    End,
  TAG_MORE, inittags(msg))) != NULL)
  {
    GETDATA;
    int i;

    data->LV_REXX =     LV_REXX;
    data->ST_RXNAME =   ST_RXNAME;
    data->CY_ISADOS =   CY_ISADOS;
    data->PO_SCRIPT =   PO_SCRIPT;
    data->CH_CONSOLE =  CH_CONSOLE;
    data->CH_WAITTERM = CH_WAITTERM;

    data->script = MUIV_NList_Active_Off;

    // we must use macro+1 here as list entry, because the entry is treated as a pointer
    // and otherwise the first entry (=0) will be ignored
    for(i = MACRO_MEN0; i < MACRO_COUNT; i++)
      DoMethod(LV_REXX, MUIM_NList_InsertSingle, i+1, MUIV_NList_Insert_Bottom);

    InitHook(&data->FilereqStartHook, FilereqStartHook, data->PO_SCRIPT);
    InitHook(&data->FilereqStopHook, FilereqStopHook, data->PO_SCRIPT);

    xset(popAsl,
      MUIA_Popasl_StartHook, &data->FilereqStartHook,
      MUIA_Popasl_StopHook,  &data->FilereqStopHook);

    SetHelp(ST_RXNAME,    MSG_HELP_CO_ST_RXNAME);
    SetHelp(PO_SCRIPT,    MSG_HELP_CO_ST_SCRIPT);
    SetHelp(CY_ISADOS,    MSG_HELP_CO_CY_ISADOS);
    SetHelp(CH_CONSOLE,   MSG_HELP_CO_CH_CONSOLE);
    SetHelp(CH_WAITTERM,  MSG_HELP_CO_CH_WAITTERM);
    SetHelp(LV_REXX,      MSG_HELP_CO_LV_REXX);

    DoMethod(LV_REXX,     MUIM_Notify, MUIA_NList_Active,    MUIV_EveryTime, obj, 2, METHOD(ChangeActiveScript), MUIV_TriggerValue);
    DoMethod(ST_RXNAME,   MUIM_Notify, MUIA_String_Contents, MUIV_EveryTime, obj, 1, METHOD(GUIToScript));
    DoMethod(PO_SCRIPT,   MUIM_Notify, MUIA_String_Contents, MUIV_EveryTime, obj, 1, METHOD(GUIToScript));
    DoMethod(CY_ISADOS,   MUIM_Notify, MUIA_Cycle_Active,    MUIV_EveryTime, obj, 1, METHOD(GUIToScript));
    DoMethod(CH_CONSOLE,  MUIM_Notify, MUIA_Selected,        MUIV_EveryTime, obj, 1, METHOD(GUIToScript));
    DoMethod(CH_WAITTERM, MUIM_Notify, MUIA_Selected,        MUIV_EveryTime, obj, 1, METHOD(GUIToScript));
  }

  RETURN((IPTR)obj);
  return (IPTR)obj;
}

///
/// OVERLOAD(MUIM_ConfigPage_ConfigToGUI)
OVERLOAD(MUIM_ConfigPage_ConfigToGUI)
{
  GETDATA;

  ENTER();

  // just set the active entry, this will cause all necessary notifications
  set(data->LV_REXX, MUIA_NList_Active, MUIV_NList_Active_Top);

  RETURN(0);
  return 0;
}

///
/// OVERLOAD(MUIM_ConfigPage_GUIToConfig)
OVERLOAD(MUIM_ConfigPage_GUIToConfig)
{
  ENTER();

  // nothing to be done, but we must overload this method to avoid an
  // error message in the debug build.

  RETURN(0);
  return 0;
}

///
/// DECLARE(ChangeActiveScript)
DECLARE(ChangeActiveScript) // LONG active
{
  GETDATA;

  ENTER();

  // transfer any pending changes from the GUI to the previous script entry
  DoMethod(obj, METHOD(GUIToScript));
  // get the now active script entry
  data->script = msg->active;
  // update the GUI
  DoMethod(obj, METHOD(ScriptToGUI));

  RETURN(0);
  return 0;
}

///
/// DECLARE(ScriptToGUI)
// fills form with data from selected list entry
DECLARE(ScriptToGUI)
{
  GETDATA;

  ENTER();

  if(data->script != MUIV_NList_Active_Off)
  {
    struct RxHook *rh = &CE->RX[data->script];
    enum Macro macro = data->script;

    nnset(data->ST_RXNAME, MUIA_String_Contents, macro <= MACRO_MEN9 ? rh->Name : "");
    nnset(data->PO_SCRIPT, MUIA_String_Contents, rh->Script);
    nnset(data->CY_ISADOS, MUIA_Cycle_Active, rh->IsAmigaDOS ? 1 : 0);
    nnset(data->CH_CONSOLE, MUIA_Selected, rh->UseConsole);
    nnset(data->CH_WAITTERM, MUIA_Selected, rh->WaitTerm);
    set(data->ST_RXNAME, MUIA_Disabled, macro > MACRO_MEN9);

    switch(macro)
    {
      case MACRO_MEN0:
      case MACRO_MEN1:
      case MACRO_MEN2:
      case MACRO_MEN3:
      case MACRO_MEN4:
      case MACRO_MEN5:
      case MACRO_MEN6:
      case MACRO_MEN7:
      case MACRO_MEN8:
      case MACRO_MEN9:
      case MACRO_STARTUP:
      case MACRO_QUIT:
      case MACRO_PRESEND:
      case MACRO_POSTSEND:
      case MACRO_PREFILTER:
      case MACRO_POSTFILTER:
      default:
        // disable the popup button since these script don't take any parameter
        nnset(data->PO_SCRIPT, MUIA_PlaceholderPopup_PopbuttonDisabled, TRUE);
      break;

      case MACRO_PREGET:
      case MACRO_POSTGET:
      case MACRO_NEWMSG:
      case MACRO_READ:
      case MACRO_PREWRITE:
      case MACRO_POSTWRITE:
      case MACRO_URL:
        // enable the popup button
        nnset(data->PO_SCRIPT, MUIA_PlaceholderPopup_PopbuttonDisabled, FALSE);
      break;
    }

    set(data->PO_SCRIPT, MUIA_PlaceholderPopup_ScriptEntry, macro);
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(GUIToScript)
// fills form data into selected list entry
DECLARE(GUIToScript)
{
  GETDATA;

  ENTER();

  if(data->script != MUIV_NList_Active_Off)
  {
    struct RxHook *rh = &CE->RX[data->script];

    GetMUIString(rh->Name, data->ST_RXNAME, sizeof(rh->Name));
    GetMUIString(rh->Script, data->PO_SCRIPT, sizeof(rh->Script));
    rh->IsAmigaDOS = GetMUICycle(data->CY_ISADOS) == 1;
    rh->UseConsole = GetMUICheck(data->CH_CONSOLE);
    rh->WaitTerm = GetMUICheck(data->CH_WAITTERM);

    DoMethod(data->LV_REXX, MUIM_NList_Redraw, data->script);
  }

  RETURN(0);
  return 0;
}

///