/* prf_docommand.c */
/* V1.1 9-3-92 */

#include "prf.h"

struct EasyStruct AboutReq =
       {
        0L,0L,(UBYTE *)ABOUT_LINE1,
              (UBYTE *)ABOUT_LINE2,
              (UBYTE *)ABOUT_LINE3,
       };

struct EasyStruct QuitReq =
       {
        0L,0L,(UBYTE *)QUIT_LINE1,
              (UBYTE *)QUIT_LINE2,
              (UBYTE *)QUIT_LINE3
       };
struct EasyStruct StopReq =
       {
        0L,0L,(UBYTE *)STOP_LINE1,
              (UBYTE *)STOP_LINE2,
              (UBYTE *)STOP_LINE3,
       };

struct EasyStruct FinalReq =
       {
        0L,0L,(UBYTE *)FINAL_LINE1,
              (UBYTE *)FINAL_LINE2,
              (UBYTE *)FINAL_LINE3,
       };

long DoCommand(struct prf_info *info, long cmd)
{
 struct StringInfo *s;
 struct Node       *n;
 BOOL               rc1;
 long               ins = CMD_INSERTTAIL;
 long               rc  = CMD_NEUTRAL;
 switch(cmd)
 {
  case CMD_RESETALL  : Prf_Reset(info);
                       break;
  case CMD_CLEARLIST : DetachList(info);
                       while(n = (struct Node *)RemHead(&info->FileList))free((struct FileNameNode *)n);
                       AttachList(info);
                       break;
  case CMD_SAVEPREFS : SavePreferences(info,NULL);
                       break;
  case CMD_PRINT     : PrintQueue(info);
                       break;
  case CMD_OPENWD    : if(!(info->Swd)) ChangeApp(info);
                       break;
  case CMD_CLOSEWD   : if(info->Swd)ChangeApp(info);
                       break;
  case CMD_LMARGIN   : s = (struct StringInfo *)info->PGadgets[GD_Lmargin - PGD]->SpecialInfo;
                       if(s->LongInt < info->Rmargin )
                       {
                        info->Lmargin = (ULONG)s->LongInt;
                        info->Columns = info->Rmargin - info->Lmargin;
                       }
                       if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_Lmargin - PGD],info->Pwd,NULL,GTIN_Number,info->Lmargin,TAG_DONE);
                       break;
  case CMD_RMARGIN   : s = (struct StringInfo *)info->PGadgets[GD_Rmargin- PGD]->SpecialInfo;
                       if(s->LongInt > info->Lmargin )
                       {
                        info->Rmargin = (ULONG)s->LongInt;
                        info->Columns = info->Rmargin - info->Lmargin;
                       }
                       if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_Rmargin- PGD],info->Pwd,NULL,GTIN_Number,info->Rmargin,TAG_DONE);
                       break;
  case CMD_LINES     : s = (struct StringInfo *)info->PGadgets[GD_Linesperpage- PGD]->SpecialInfo;
                       info->Lines = (ULONG)s->LongInt;
  case CMD_OPENPWD   : OpenPwd(info);
                       break;
  case CMD_CLOSEPWD  : ClosePwd(info);
                       break;
  case CMD_STR_INSERT: s = (struct StringInfo *)info->SGadgets[GD_Gadget11]->SpecialInfo;
                       info->Special1 = (APTR)s->Buffer;
                       info->Special2 = (APTR)&ins;
                       InsertName(info);
                       info->Special1 = NULL;
                       info->Special2 = NULL;
                       break;
  case CMD_REMOVE    : s = (struct StringInfo *)info->SGadgets[GD_Gadget11]->SpecialInfo;
                       info->Special1 = (APTR)s->Buffer;
                       info->Special2 = (APTR)&ins;
                       RemoveName(info);
                       info->Special1 = NULL;
                       info->Special2 = NULL;
                       break;
                       break;
  case CMD_CHANGEAPP : ChangeApp(info);
                       break;
  case CMD_FILEREQ   : Prf_FileReq(info);
                       break;
  case CMD_RXQUIT    : rc = CMD_QUIT;
                       break;
  case CMD_QUIT      : if(info->flags & FLAG_PRINT)
                       {
                        rc1 = EasyRequestArgs(info->Swd,&StopReq,NULL,NULL);
                        if(rc1 == 1) rc = CMD_QUIT;
                       }
                       else
                       {
                        rc1 = EasyRequestArgs(info->Swd,&QuitReq,NULL,NULL);
                        switch(rc1)
                        {
                         case 1    : rc1 = EasyRequestArgs(info->Swd,&FinalReq,NULL,NULL);
                                     if(rc1 == 0)rc = CMD_QUIT;
                                     break;
                         case 2    : ChangeApp(info);
                                     break;
                         default   : break;
                        }
                       }
                       break;
  case CMD_ABOUT     : (void)EasyRequestArgs(info->Swd,&AboutReq,NULL,NULL);
                       break;
  case CMD_HEAD      : if(info->Swd)ActivateGadget(info->SGadgets[GD_Headline],info->Swd,NULL);
                       break;
  case CMD_FOOT      : if(info->Swd)ActivateGadget(info->SGadgets[GD_Footline],info->Swd,NULL);
                       break;
  case CMD_HEADL     : s = (struct StringInfo *)info->SGadgets[GD_Headline]->SpecialInfo;
                       strcpy(info->Headline,s->Buffer);
                       break;
  case CMD_FOOTL     : s = (struct StringInfo *)info->SGadgets[GD_Footline]->SpecialInfo;
                       strcpy(info->Footline,s->Buffer);
                       break;
  case CMD_DATE_ON   : info->flags |= FLAG_DATE;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Date],info->Swd,NULL,GTCB_Checked,TRUE,TAG_DONE);
                       break;
  case CMD_DATE_OFF  : info->flags ^= FLAG_DATE;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Date],info->Swd,NULL,GTCB_Checked,FALSE,TAG_DONE);
                       break;
  case CMD_TIME_ON   : info->flags |= FLAG_TIME;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Time],info->Swd,NULL,GTCB_Checked,TRUE,TAG_DONE);
                       break;
  case CMD_TIME_OFF  : info->flags ^= FLAG_TIME;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Time],info->Swd,NULL,GTCB_Checked,FALSE,TAG_DONE);
                       break;
  case CMD_NAME_ON   : info->flags |= FLAG_FILE;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Filename],info->Swd,NULL,GTCB_Checked,TRUE,TAG_DONE);
                       break;
  case CMD_NAME_OFF  : info->flags ^= FLAG_FILE;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Filename],info->Swd,NULL,GTCB_Checked,FALSE,TAG_DONE);
                       break;
  case CMD_FF_ON     : info->flags |= FLAG_FF;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_FF],info->Swd,NULL,GTCB_Checked,TRUE,TAG_DONE);
                       break;
  case CMD_FF_OFF    : info->flags ^= FLAG_FF;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_FF],info->Swd,NULL,GTCB_Checked,FALSE,TAG_DONE);
                       break;
  case CMD_CRLF_ON   : info->flags |= FLAG_CRLF;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_CRLF],info->Swd,NULL,GTCB_Checked,TRUE,TAG_DONE);
                       break;
  case CMD_CRLF_OFF  : info->flags ^= FLAG_CRLF;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_CRLF],info->Swd,NULL,GTCB_Checked,FALSE,TAG_DONE);
                       break;
  case CMD_PAGE_ON   : info->flags |= FLAG_PAGE;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Pagenumber],info->Swd,NULL,GTCB_Checked,TRUE,TAG_DONE);
                       break;
  case CMD_PAGE_OFF  : info->flags ^= FLAG_PAGE;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Pagenumber],info->Swd,NULL,GTCB_Checked,FALSE,TAG_DONE);
                       break;
  case CMD_LINE_ON   : info->flags |= FLAG_LINE;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Linenumber],info->Swd,NULL,GTCB_Checked,TRUE,TAG_DONE);
                       break;
  case CMD_LINE_OFF  : info->flags ^= FLAG_LINE;
                       if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Linenumber],info->Swd,NULL,GTCB_Checked,FALSE,TAG_DONE);
                       break;
  case CMD_PITCH6    : info->flags |= FLAG_PITCH6;
                       if(info->flags & FLAG_PITCH8)info->flags ^= FLAG_PITCH8;
                       if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_Pitch - PGD],info->Pwd,NULL,GTMX_Active,0,TAG_DONE);
                       break;
  case CMD_PITCH8    : info->flags |= FLAG_PITCH8;
                       if(info->flags & FLAG_PITCH6)info->flags ^= FLAG_PITCH6;
                       if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_Pitch - PGD],info->Pwd,NULL,GTMX_Active,1,TAG_DONE);
                       break;
  case CMD_DRAFT     : info->flags |= FLAG_DRAFT;
                       if(info->flags & FLAG_LQ)info->flags ^= FLAG_LQ;
                       if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_Quality - PGD],info->Pwd,NULL,GTMX_Active,0,TAG_DONE);
                       break;
  case CMD_LQ        : info->flags |= FLAG_LQ;
                       if(info->flags & FLAG_DRAFT)info->flags ^= FLAG_DRAFT;
                       if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_Quality - PGD],info->Pwd,NULL,GTMX_Active,1,TAG_DONE);
                       break;
  case CMD_10CPI     : info->flags |= FLAG_10CPI;
                       if(info->flags & FLAG_12CPI)info->flags ^= FLAG_12CPI;
                       if(info->flags & FLAG_15CPI)info->flags ^= FLAG_15CPI;
                       if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_cpi - PGD],info->Pwd,NULL,GTMX_Active,0,TAG_DONE);
                       break;
  case CMD_12CPI     : if(info->flags & FLAG_10CPI)info->flags ^= FLAG_10CPI;
                       info->flags |= FLAG_12CPI;
                       if(info->flags & FLAG_15CPI)info->flags ^= FLAG_15CPI;
                       if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_cpi - PGD],info->Pwd,NULL,GTMX_Active,1,TAG_DONE);
                       break;
  case CMD_15CPI     : if(info->flags & FLAG_10CPI)info->flags ^= FLAG_10CPI;
                       if(info->flags & FLAG_12CPI)info->flags ^= FLAG_12CPI;
                       info->flags |= FLAG_15CPI;
                       if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_cpi - PGD],info->Pwd,NULL,GTMX_Active,2,TAG_DONE);
                       break;
  default            :
                       break;
 }
 return (rc);
}

void  SavePreferences(struct prf_info *info,UBYTE *name)
{
 FILE *prefs;
 UBYTE filename[STR_SIZE];
 struct FileNameNode *n;
 if(name) strcpy(filename,name);
  else Prf_SavePrefs(info,filename);
 if(info->Swd)
 {
  SwdTags[0].ti_Data = (ULONG)info->Swd->LeftEdge;
  SwdTags[1].ti_Data = (ULONG)info->Swd->TopEdge;
 }
 if(*filename)
 {
  if(prefs = fopen(filename,"w"))
  {
   fprintf(prefs,T_PREFSHEADER);
   fprintf(prefs,T_PREFSHEADER1);
   fprintf(prefs,T_PREFSHEADER2);
   fprintf(prefs,T_RX_RESET RT_RX_RESET"\n");
   if(info->flags & FLAG_10CPI)fprintf(prefs,T_RX_10CPI RT_RX_10CPI "\n");
   if(info->flags & FLAG_12CPI)fprintf(prefs,T_RX_12CPI RT_RX_12CPI "\n");
   if(info->flags & FLAG_15CPI)fprintf(prefs,T_RX_15CPI RT_RX_15CPI "\n");
   if(info->flags & FLAG_DRAFT)fprintf(prefs,T_RX_DRAFT RT_RX_DRAFT "\n");
   if(info->flags & FLAG_LQ)fprintf(prefs,T_RX_LQ RT_RX_LQ "\n");
   if(info->flags & FLAG_PAGE)fprintf(prefs,T_RX_PAGE RT_RX_PAGE "\n");
   if(info->flags & FLAG_TIME)fprintf(prefs,T_RX_TIME RT_RX_TIME "\n");
   if(info->flags & FLAG_FILE)fprintf(prefs,T_RX_FILE RT_RX_FILE "\n");
   if(info->flags & FLAG_LINE)fprintf(prefs,T_RX_LINE RT_RX_LINE "\n");
   if(info->flags & FLAG_DATE)fprintf(prefs,T_RX_DATE RT_RX_DATE "\n");
   if(info->flags & FLAG_PITCH6)fprintf(prefs,T_RX_PITCH6 RT_RX_PITCH6 "\n");
   if(info->flags & FLAG_PITCH8)fprintf(prefs,T_RX_PITCH8 RT_RX_PITCH8 "\n");
   if(info->flags & FLAG_FF)fprintf(prefs,T_RX_FF RT_RX_FF "\n");
   if(info->flags & FLAG_CRLF)fprintf(prefs,T_RX_CRLF RT_RX_CRLF "\n");
   if(*(info->Headline))fprintf(prefs,"%s '%s'" RT_RX_HEAD "\n", T_RX_HEAD,info->Headline);
   if(*(info->Footline))fprintf(prefs,"%s '%s'" RT_RX_FOOT "\n", T_RX_FOOT,info->Footline);
   fprintf(prefs,"%s %ld" RT_RX_LMARGIN "\n",T_RX_LMARGIN,info->Lmargin);
   fprintf(prefs,"%s %ld" RT_RX_RMARGIN "\n",T_RX_RMARGIN,info->Rmargin);
   fprintf(prefs,"%s %ld" RT_RX_LINES "\n",T_RX_LINES,info->Lines);
   n = (struct FileNameNode *)info->FileList.lh_Head;
   while(n && (n != (struct FileNameNode *)info->FileList.lh_Tail))
   {
    if(*(n->fnn_Name))
    {
     fprintf(prefs, "%s '%s'" RT_RX_INSFILE "\n", T_RX_INSFILE,n->fnn_Name);
    }
    n = (struct FileNameNode *)n->fnn_Node.ln_Succ;
   }
   fprintf(prefs,T_RX_OPENWINDOW " " T_RX_CONTROL " %ld %ld " RT_RX_OPENWINDOW "\n",SwdTags[0].ti_Data,SwdTags[1].ti_Data);
   fclose(prefs);
  }
 }
}

