/*===========================================================================*/
/*          Copyright (c) 1987 - 1988, Future Soft Engineering, Inc.         */
/*                              Houston, Texas                               */
/*===========================================================================*/

#define  NOGDICAPMASKS     TRUE
#define  NOVIRTUALKEYCODES TRUE
#define  NOICONS                 TRUE
#define  NOKEYSTATES       TRUE
#define  NOSYSCOMMANDS     TRUE
#define  NOATOM          TRUE
#define  NODRAWTEXT           TRUE
#define  NOMINMAX                TRUE
#define  NOOPENFILE           TRUE
#define  NOSCROLL                TRUE
#define  NOPROFILER           TRUE
#define  NODEFERWINDOWPOS  TRUE
#define  NOPEN             TRUE
#define  NO_TASK_DEFINES   TRUE
#define  NOLSTRING         TRUE
#define  WIN31

#include <stdarg.h>
#include <windows.h>
#include <shellapi.h>
#include "port1632.h"
#include "dcrc.h"
#include "dynacomm.h"
#include "task.h"
#include "printfil.h"
#include <commdlg.h>
#include <cderr.h>

/*---------------------------------------------------------------------------*/
/* enableMenuList() -                                                  [mbb] */
/*---------------------------------------------------------------------------*/

VOID enableMenuList(HMENU hAppMenu,BOOL bEnable, ...)
{
   va_list ap;
   INT      ndx;
   UINT     miList;
   HMENU    hSubMenu;

   va_start(ap,bEnable);
   for(miList = va_arg(ap,UINT); miList; miList = va_arg(ap,UINT))
   {
      if(miList & 0x8000)
      {
         miList &= 0x000F;
         if(childZoomStatus(0x0001, 0))
            miList += 1;
         hSubMenu = GetSubMenu(hAppMenu, miList);
         for(ndx = GetMenuItemCount(hSubMenu)-1; ndx >= 0; ndx -= 1)
            EnableMenuItem(hSubMenu, ndx, (bEnable ? MF_ENABLED : MF_GRAYED) | MF_BYPOSITION);
      }
      else
         EnableMenuItem(hAppMenu, miList, bEnable ? MF_ENABLED : MF_GRAYED);
   }
   va_end(ap);
}



/*---------------------------------------------------------------------------*/
/* initMenuPopup() -                                                   [mbb] */
/*---------------------------------------------------------------------------*/

VOID initMenuPopup(WORD  menuIndex)
{
   HMENU    hAppMenu;
   WORD     systemIndex;

   if(childZoomStatus(0x0001, 0))
      menuIndex -= 1;

   hAppMenu = hMenu;
   systemIndex = menuIndex;
      switch(menuIndex)
      {
      case FILEMENU:
         enableMenuList(hAppMenu, countChildWindows(FALSE), FMCLOSE, FMSAVE, FMSAVEAS, NULL);
         enableMenuList(hAppMenu, TRUE, FMPRINT, FMPRINTSETUP, NULL);
         enableMenuList(hAppMenu, (hPrintFile==NULL), FMPRINTSETUP, FMPRINTSETUP, NULL); /* jtf 3.20 check to see if chanel open */
         break;

      case EDITMENU:
         if(GetTopWindow(hItWnd) == hTermWnd)
         {
            enableMenuList(hAppMenu, TRUE, EMSELECTALL, EMCLEAR, NULL);
            enableMenuList(hAppMenu, (hTE.selStart != hTE.selEnd), EMCOPY, EMCOPYTHENPASTE, EMCOPYSPECIAL, NULL);

            enableMenuList(hAppMenu, IsClipboardFormatAvailable(CF_TEXT), EMPASTE, NULL);

            if (scrapSeq || ((xferFlag != XFRNONE) && (xferFlag != XFRRCV)) ) /* jtf 3.17 disable send if in transfer */
               {
               enableMenuList(hAppMenu, FALSE, EMCOPYTHENPASTE, NULL);
               enableMenuList(hAppMenu, FALSE, EMPASTE, NULL);
               enableMenuList(hAppMenu, FALSE, EMSELECTALL, NULL);
               enableMenuList(hAppMenu, FALSE, EMCOPY, NULL);
               }

            enableMenuList(hAppMenu, (curTopLine >= savTopLine), EMSAVESCREEN, NULL);
         }
         else
            enableMenuList(hAppMenu, FALSE, 0x8000 | systemIndex, NULL);
         break;

      case SETTINGSMENU:
         enableMenuList(hAppMenu, activTerm, SMPHONE, SMEMULATE, SMTERMINAL, SMFUNCTIONKEYS, SMMODEM, NULL);
         enableMenuList(hAppMenu, activTerm && (xferFlag == XFRNONE), SMTEXTXFERS, SMBINXFERS, SMCOMMUNICATIONS, NULL);
         break;

      case PHONEMENU:                        /* mbbx 2.00: network... */
         if((trmParams.comDevRef > ITMNOCOM) && (xferFlag == XFRNONE))  /* mbbx 1.10: carrier... */
         {
            enableMenuList(hAppMenu, TRUE, 0x8000 | systemIndex, NULL);
            enableMenuList(hAppMenu, !mdmOnLine, PMDIAL, NULL);
         }
         else
            enableMenuList(hAppMenu, FALSE, 0x8000 | systemIndex, NULL);
         break;

      case TRANSFERMENU:
                                             /* mbbx 1.10: answerMode... */
         enableMenuList(hAppMenu, (trmParams.comDevRef > ITMNOCOM) && (xferFlag == XFRNONE),    /* mbbx 2.00: network... */
                        TMSENDTEXTFILE, TMRCVTEXTFILE, NULL);
         enableMenuList(hAppMenu, (trmParams.comDevRef > ITMNOCOM) && (xferFlag == XFRNONE) && !answerMode,
                        TMSENDBINFILE, TMRCVBINFILE, NULL);
         enableMenuList(hAppMenu, activTerm && (xferFlag == XFRNONE), TMVIEWTEXTFILE, NULL);
         enableMenuList(hAppMenu, (xferFlag > XFRNONE) && (xferFlag < XFRBSND) && !xferPaused, TMPAUSE, NULL);
         enableMenuList(hAppMenu, (xferFlag > XFRNONE) && (xferFlag < XFRBSND) && xferPaused, TMRESUME, NULL);
         enableMenuList(hAppMenu, (xferFlag > XFRNONE), TMSTOP, NULL);

         if (scrapSeq) /* jtf gold 045 */
         enableMenuList(hAppMenu, FALSE, TMSENDTEXTFILE, TMVIEWTEXTFILE, NULL); /* jtf 3.27 */


         break;

      case HELPMENU:                         /* mbbx 2.00: CUA... */
         break;
      }
}


/*---------------------------------------------------------------------------*/
/* doEditMenu() - Edit memu commands happen here !                     [scf] */
/*---------------------------------------------------------------------------*/

VOID doEditMenu(INT  theItem)
{
   DWORD    scrapSize;
   HANDLE   hText;
   HANDLE   tmpScrapHandle;

   // -sdj unreferenced local var HDC	theDC,newDC;
   // -sdj unreferenced local varRECT	  theClient;
   // -sdj unreferenced local varHANDLE   newHdl;

   if(GetTopWindow(hItWnd) == hTermWnd)
   {
      hText = hTE.hText;

      switch(theItem)
      {
      case EMSELECTALL:
         termSetSelect(0l, (LONG) (savTopLine + maxScreenLine + 1) * (maxChars + 2));
         activSelect = TRUE; /* jtf 3.30 */
         noSelect = FALSE;    /* rjs bugs 020 */
         break;

      case EMCOPY:
      case EMPASTE:
      case EMCOPYTABLE:
      case EMCOPYTHENPASTE:
         if((theItem == EMCOPY) || (theItem == EMCOPYTABLE) || (theItem == EMCOPYTHENPASTE))
         {
            copiedTable = FALSE;
            scrapSize = hTE.selEnd - hTE.selStart;
            if (scrapSize == 0)
                  break; /* jtf 3.20 do not copy blank selection */
                                             /* the + 3 for possible <cr>,<lf>, NULL */
            if((tEScrapHandle = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, scrapSize + 3)) != NULL)
            {
               blockMove((LPBYTE) GlobalLock(hText) + hTE.selStart,
                         (LPBYTE) GlobalLock(tEScrapHandle), scrapSize);
               GlobalUnlock(hText);
               GlobalUnlock(tEScrapHandle);

                  stripBlanks(GlobalLock(tEScrapHandle), &scrapSize);
                  GlobalUnlock(tEScrapHandle);

               if((tEScrapHandle = GlobalReAlloc(tEScrapHandle, scrapSize+1, GMEM_MOVEABLE | GMEM_ZEROINIT)) != NULL)
                  if(OpenClipboard(hTermWnd))
                  {
                     EmptyClipboard();
                     SetClipboardData(CF_TEXT, tEScrapHandle);
                     CloseClipboard();
                  }
            }
         }

         if((theItem == EMPASTE) || (theItem == EMCOPYTHENPASTE))
           if (IsClipboardFormatAvailable(CF_TEXT)) /* jtf 3.20 prevent protect violation */
            if(OpenClipboard(hTermWnd))
            {
               if((tmpScrapHandle = GetClipboardData(CF_TEXT)) != NULL)
               {
                  scrapSize = (DWORD) lstrlen(GlobalLock(tmpScrapHandle));
                  GlobalUnlock(tmpScrapHandle);
                  if((tEScrapHandle = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, scrapSize+1)) != NULL)
                  {
                     blockMove(GlobalLock(tmpScrapHandle), GlobalLock(tEScrapHandle), scrapSize);
                     GlobalUnlock(tmpScrapHandle);
                     GlobalUnlock(tEScrapHandle);
                  }
               }
               CloseClipboard();
               useScrap = TRUE;
            }
         break;

      case EMCLEAR:
         cursorAdjust();
         clearBuffer();
         break;

      }
   }

}


/*---------------------------------------------------------------------------*/
/* doCommand() -                                                       [mbb] */
/*---------------------------------------------------------------------------*/

VOID doCommand(HWND     hWnd, WPARAM   wParam, LONG     lParam)
{

/* this is called from within WM_COMMAND, so that wParam and lParam change as per*/
/* win32.  This is also called from another place with lParm set to zero */
/* I'll fix the wParam references, and debug to see if any other fixes needed*/

   CHAR     work[STR255];
   CHAR     extrainfo[STR255];	// -sdj another buff to hold EXTRAINFO string of aboutbox;
   BOOL     result;
   // -sdj unreferenced local var LPSTR	lpEOS;
   INT      rc;
   PRINTDLG PRN;

   offCursor();

   switch(GET_WM_COMMAND_ID(wParam, lParam))
   {
   case FMNEW:
      doFileNew();
      break;

   case FMOPEN:
      doFileOpen();
      break;

   case FMCLOSE:
      doFileClose();
      break;

   case FMSAVE:
      doFileSave();
      break;

   case FMSAVEAS:
      doFileSaveAs();
      break;

   case FMPRINTSETUP:
      /* initialize PRINTDLG structure */
      PRN.lStructSize = sizeof(PRINTDLG);
      PRN.hDevMode    = hDevMode;
      PRN.hDevNames   = hDevNames;
      PRN.Flags       = PD_PRINTSETUP;
      PRN.hwndOwner   = hWnd;

      PrintDlg(&PRN);
      rc = CommDlgExtendedError();
      /* Probable cause is low memory. */
      if(rc == CDERR_DIALOGFAILURE  || rc == CDERR_INITIALIZATION ||
           rc == CDERR_LOADSTRFAILURE || rc == CDERR_LOADRESFAILURE ||
           rc == PDERR_LOADDRVFAILURE || rc == PDERR_GETDEVMODEFAIL)
      {
        testBox(hWnd,-(MB_ICONHAND|MB_SYSTEMMODAL|MB_OK),STR_ERRCAPTION,NoMemStr);
      }
      else
      {
        hDevMode = PRN.hDevMode;
        hDevNames= PRN.hDevNames;
      }
      break;

   case FMPRINTER:
      PrintFileComm(!prtFlag);         /* mbbx 1.03: prAction(!prtFlag); */
      break;

   case FMTIMER:
      timerToggle(TRUE);                     /* mbbx 1.03 */
      break;

   case FMEXIT:                              /* mbbx 1.10: CUA... */
      CommThreadExit = TRUE;  // we are exiting, so let the thread
                              // exit on its own by ExitThread.

      PostMessage(hItWnd, WM_CLOSE, 0, 0L);
      break;

   case EMUNDO:
   case EMSELECTALL:
   case EMCUT:
   case EMCOPY:
   case EMPASTE:
   case EMCLEAR:
   case EMCOPYTHENPASTE:
      doEditMenu(GET_WM_COMMAND_ID(wParam, lParam));
      break;

   case SMPHONE:                             /* mbbx 1.04 ... */
      doSettings(IDDBPHON, dbPhon);
      break;

   case SMEMULATE:
      doSettings(IDDBEMUL, dbEmul);
      break;

   case SMTERMINAL:
      doSettings(IDDBTERM, dbTerm);
      break;

   case SMFUNCTIONKEYS:
      doSettings(IDDBFKEY, dbFkey);
      break;

   case SMTEXTXFERS:
      doSettings(IDDBTXTX, dbTxtX);
      break;

   case SMBINXFERS:
      doSettings(IDDBBINX, dbBinX);
      break;

   case SMCOMMUNICATIONS:
      doSettings(IDDBCOMM, dbComm);
      break;

   case SMMODEM:                             /* mbbx 1.10: CUA... */
      doSettings(IDDBMODEM, dbModem);
      break;

   case PMDIAL:
      dialPhone();
      break;

   case PMHANGUP:
      hangUpPhone();
      break;

   case TMSENDTEXTFILE:
      DEBOUT("doCommand: Got %s menu click\n","SENDTEXTFILE");
      *taskState.string = 0;                 /* mbbx 1.01... */
      sndTFile();
      break;

   case TMRCVTEXTFILE:
      DEBOUT("doCommand: Got %s menu click\n","RCVTEXTFILE");
      *taskState.string = 0;                 /* mbbx 1.01... */
      rcvTFile();
      break;

   case TMVIEWTEXTFILE:
      DEBOUT("doCommand: Got %s menu click\n","VIEWTEXTFILE");
      *taskState.string = 0;                 /* mbbx 1.01... */
      typTFile();
      break;

   case TMSENDBINFILE:
      DEBOUT("doCommand: Got %s menu click\n","SENDBINFILE");
      *taskState.string = 0;                 /* mbbx 1.01... */
      sndBFile();
      break;

   case TMRCVBINFILE:
      DEBOUT("doCommand: Got %s menu click\n","RCVBINFILE");
      *taskState.string = 0;                 /* mbbx 1.01... */
      rcvBFile();
      break;

   case TMPAUSE:                             /* mbbx 2.00: xfer ctrls... */
      xferPauseResume(TRUE, FALSE);
      break;

   case TMRESUME:
      xferPauseResume(FALSE, TRUE);
      break;

   case TMSTOP:
      xferStopBreak(TRUE);
      break;

   case WMFKEYS:
      showHidedbmyControls(!fKeysShown, TRUE);  /* mbbx 2.00: bArrange... */
      break;

   case HMCOMMANDS:
   case HMPROCEDURES:
   case HMKEYBOARD:
      LoadString(hInst, STR_HELPFILE, work, STR255-1);
      result = WinHelp(hTermWnd, work, HELP_CONTEXT, wParam);
      if(!result)
         testBox(hTermWnd,-(MB_ICONHAND|MB_SYSTEMMODAL|MB_OK),STR_ERRCAPTION,NoMemStr);
      break;

   case HMINDEX:                             /* mbbx 2.00: CUA... */
      LoadString(hInst, STR_HELPFILE, work, STR255-1);
      result = WinHelp(hTermWnd,work,HELP_INDEX,0L);
      if(!result)
         testBox(hTermWnd,-(MB_ICONHAND|MB_SYSTEMMODAL|MB_OK),STR_ERRCAPTION,NoMemStr);
      break;

   case HMHELP:
      result = WinHelp(hTermWnd,NULL,HELP_HELPONHELP,0L);
           if(!result)
                testBox(hTermWnd,-(MB_ICONHAND|MB_SYSTEMMODAL|MB_OK),STR_ERRCAPTION,NoMemStr);
      break;

   case HMSEARCH:
      LoadString(hInst, STR_HELPFILE, work, STR255-1);
      if(!WinHelp(hTermWnd, work, HELP_PARTIALKEY, (DWORD_PTR)""))
	  testBox(hTermWnd,-(MB_ICONHAND|MB_SYSTEMMODAL|MB_OK),STR_ERRCAPTION,NoMemStr);
      break;

//   case HMABOUT:
//		 DialogBox(hInst, MAKEINTRESOURCE(IDDBABOUT), hItWnd, dbAbout);
//	break;
// lets try to close one bugreport, by using shellabout again so that
// the about box is consistent with the other shell applets and win31
// -sdj 12/15/92

   case HMABOUT:
      LoadString(hInst, STR_APPNAME, work,	 STR255-1);
      LoadString(hInst, STR_EXTRAINFO, extrainfo, STR255-1);

		ShellAbout(hTermWnd, work, extrainfo,
		       LoadIcon(hInst, MAKEINTRESOURCE(ICO_DYNACOMM)));
            break;




   default:
      DEBOUT("doCommand: %s\n","Got INTO default option");
      switch(GET_WM_COMMAND_ID(wParam, lParam) & 0xF000)
      {
      case 0xF000:
                 /* NOTE under lParam may be zero and screw up under win32, since lParam*/
                 /* is passed in sometimes == zero by another function*/

         DEBOUT("doCommand: %s\n","Got into default option: doing SendMsg");
         SendMessage(GetTopWindow(hItWnd), WM_SYSCOMMAND, wParam, lParam);
         DEBOUT("doCommand: %s\n","Got into default option: done SendMsg");
         break;
      }
      DEBOUT("doCommand: %s\n","Got OUT of default option");
      break;
   }

   DEBOUT("doCommand: %s\n","Doing UpdateWindow(hItWnd)");
   UpdateWindow(hItWnd);
   DEBOUT("doCommand: %s\n","Done  UpdateWindow(hItWnd)");
   onCursor();
}

INT_PTR CALLBACK dbAbout(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch (message)
   {
   case WM_INITDIALOG:
      return TRUE;

   case WM_COMMAND:
      if (wParam == IDOK)
         EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam));
      break;
   }

   return FALSE;
}

