home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / fsrc1241.zip / mainwindow.c < prev    next >
C/C++ Source or Header  |  1999-02-14  |  105KB  |  2,774 lines

  1. /*---------------------------------------------------------------------------+
  2.  | Titel: MAINWINDOW.C                                                       |
  3.  +-----------------------------------------+---------------------------------+
  4.  | Erstellt von: Michael Hohner            | Am: 22.07.93                    |
  5.  +-----------------------------------------+---------------------------------+
  6.  | System: OS/2 2.x PM                                                       |
  7.  +---------------------------------------------------------------------------+
  8.  | Beschreibung:                                                             |
  9.  |                                                                           |
  10.  |   Bildaufbau des Hauptfensters u. dgl.                                    |
  11.  |                                                                           |
  12.  |                                                                           |
  13.  +---------------------------------------------------------------------------+
  14.  | Bemerkungen:                                                              |
  15.  +---------------------------------------------------------------------------*/
  16.  
  17. /*----------------------------- Header-Dateien ------------------------------*/
  18. #pragma strings(readonly)
  19.  
  20. #define INCL_GPI
  21. #define INCL_WIN
  22. #define INCL_BASE
  23. #define INCL_DOSDEVIOCTL
  24. #include <os2.h>
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <stdarg.h>
  28. #include <string.h>
  29.  
  30. #include "main.h"
  31. #include "structs.h"
  32. #include "msgheader.h"
  33. #include "areaman\areaman.h"
  34. #include "dialogids.h"
  35. #include "resids.h"
  36. #include "messages.h"
  37. #include "handlemsg\handlemsg.h"
  38. #include "handlemsg\kludgeapi.h"
  39. #include "utility.h"
  40. #include "mainwindow.h"
  41. #include "controls\editwin.h"
  42. #include "controls\msgviewer.h"
  43. #include "controls\statline.h"
  44. #include "finddlg.h"
  45. #include "markmanage.h"
  46. #include "controls\toolbar.h"
  47. #include "toolbarconfig.h"
  48. #include "util\addrcnv.h"
  49.  
  50. /*--------------------------------- Defines ---------------------------------*/
  51.  
  52. typedef struct
  53. {
  54.    ULONG   CtrlID;      /* ID des Controls */
  55.    LONG    x;           /* x-Koordinate */
  56.    LONG    y;           /* y-Koordinate */
  57.    LONG    cx;          /* x-Groesse */
  58.    LONG    cy;          /* y-Groesse */
  59.    UCHAR   flags;
  60. } RESIZEPARAM;
  61.  
  62. /* Flags */
  63. #define XREL      0x01U
  64. #define YREL      0x02U
  65. #define CXREL     0x04U
  66. #define CYREL     0x08U
  67. #define VIS       0x10U
  68.  
  69. static RESIZEPARAM ResizeParam[]=
  70. {
  71. {IDE_FROMNAME,       70,  -24,  -210,   18, YREL | CXREL | VIS},
  72. {IDE_TONAME,         70,  -44,  -210,   18, YREL | CXREL | VIS},
  73. {IDE_FROMADDRESS,     5,  -24,   -10,   18, YREL | CXREL | VIS},
  74. {IDE_TOADDRESS,       5,  -44,   -10,   18, YREL | CXREL},
  75. {IDML_MAINEDIT,       0,    0,     0,  -89, CXREL | CYREL | VIS},
  76. {IDS_FROM,            5,  -24,    60,   18, YREL | VIS},
  77. {IDS_TO,              5,  -44,    60,   18, YREL | VIS},
  78. {IDS_SUBJ,            5,  -64,    60,   18, YREL | VIS},
  79. {IDS_DATEWRITTEN,  -135,  -24,   130,   16, XREL | YREL | VIS},
  80. {IDS_DATERECEIVED, -135,  -44,   130,   16, XREL | YREL | VIS},
  81. {IDE_SUBJTEXT,       70,  -64,  - 95,   18, YREL | CXREL | VIS},
  82. {IDS_ATTRTEXT,       70, - 84,  -235,   18, YREL | CXREL | VIS},
  83. {IDB_CHANGEATTR,      5, - 86,    60,   22, YREL | VIS},
  84. {0, 0, 0, 0, 0, 0}
  85. };
  86.  
  87. static USHORT FocusTable[]=
  88. {
  89. IDE_FROMNAME,
  90. IDE_FROMADDRESS,
  91. IDE_TONAME,
  92. IDE_TOADDRESS,
  93. IDE_SUBJTEXT,
  94. IDML_MAINEDIT,
  95. IDB_CHANGEATTR
  96. };
  97.  
  98. typedef struct
  99. {
  100.    USHORT usCtrlID;
  101.    ULONG  ulStringID;
  102. } HELPSTRINGTABLE;
  103.  
  104.  
  105. #define MSGTIMEOUT  3000
  106.  
  107. /*---------------------------- Globale Variablen ----------------------------*/
  108.  
  109. extern HAB anchor;
  110. extern HMODULE hmodLang;
  111. extern int tidRexxExec;
  112. extern int MonoDisp, TempMono;
  113.  
  114. static const HELPSTRINGTABLE MenuHelpStrings[] =
  115. {
  116. {IDM_FILE, IDST_HLP_FI_FILE},
  117. {IDM_FILEIMPORT, IDST_HLP_FI_IMPORT},
  118. {IDM_FILEEXPORT, IDST_HLP_FI_EXPORT},
  119. {IDM_FILEECHOTOSS, IDST_HLP_FI_ECHOTOSS},
  120. {IDM_FILEPRINT, IDST_HLP_FI_PRINT},
  121. {IDM_EXIT, IDST_HLP_FI_EXIT},
  122. {IDM_EDIT, IDST_HLP_ED_EDIT},
  123. {IDM_EDITUNDO, IDST_HLP_ED_UNDO},
  124. {IDM_EDITCUT, IDST_HLP_ED_CUT},
  125. {IDM_EDITCOPY, IDST_HLP_ED_COPY},
  126. {IDM_EDITPASTE, IDST_HLP_ED_PASTE},
  127. {IDM_EDITCLEAR, IDST_HLP_ED_CLEAR},
  128. {IDM_EDITDELLINE, IDST_HLP_ED_CLRLINE},
  129. {IDM_MESSAGE, IDST_HLP_MS_MESSAGE},
  130. {IDM_MSGMOVE, IDST_HLP_MS_MOVE},
  131. {IDM_MSGXPOST, IDST_HLP_MS_XPOST},
  132. {IDM_MSGREQUEST, IDST_HLP_MS_REQ},
  133. {IDM_MSGCCOPY, IDST_HLP_MS_CCOPY},
  134. {IDM_MSGMARK, IDST_HLP_MS_MARK},
  135. {IDM_OPTIONS, IDST_HLP_SU_SETUP},
  136. {IDM_OPCONFIG, IDST_HLP_SU_OPTIONS},
  137. {IDM_OPTEMPLATE, IDST_HLP_SU_TEMPL},
  138. {IDM_OPCCLISTS, IDST_HLP_SU_CCLIST},
  139. {IDM_OPNAMEADDR, IDST_HLP_SU_NAMEAD},
  140. {IDM_OPSAVE, IDST_HLP_SU_SAVE},
  141. {IDM_WINDOWS, IDST_HLP_WI_WINDOWS},
  142. {IDM_WINKLUDGES, IDST_HLP_WI_KLUDGE},
  143. {IDM_WINTHREADS, IDST_HLP_WI_THREAD},
  144. {IDM_WINRESULTS, IDST_HLP_WI_RESULTS},
  145. {IDM_HELP, IDST_HLP_HE_HELP},
  146. {IDM_HELPINDEX, IDST_HLP_HE_INDEX},
  147. {IDM_HELPUSING, IDST_HLP_HE_USING},
  148. {IDM_HELPKEYS, IDST_HLP_HE_KEYS},
  149. {IDM_HELPABOUT, IDST_HLP_HE_ABOUT},
  150. {IDM_HELPGENERAL, IDST_HLP_HE_GENERAL},
  151. {IDM_MSGNEW, IDST_HLP_MS_NEW},
  152. {IDM_MSGCHANGE, IDST_HLP_MS_CHANGE},
  153. {IDM_MSGREPLY, IDST_HLP_MS_REPLY},
  154. {IDM_MSGDELETE, IDST_HLP_MS_DELETE},
  155. {IDM_MSGFIND, IDST_HLP_MS_FIND},
  156. {IDM_FILESHELL, IDST_HLP_FI_SHELL},
  157. {IDM_MSGCOPY, IDST_HLP_MS_COPY},
  158. {IDM_MSGFORWARD, IDST_HLP_MS_FORWARD},
  159. {IDM_WINAREAS, IDST_HLP_WI_AREAS},
  160. {IDM_WINMSGLIST, IDST_HLP_WI_MLIST},
  161. {IDM_HELPCONTENTS, IDST_HLP_HE_CONTENTS},
  162. {IDM_MSGBCAST, IDST_HLP_MS_BCAST},
  163. {IDM_MSGBCDELETE, IDST_HLP_MS_BCDELETE},
  164. {IDM_MSGBCMODIFY, IDST_HLP_MS_BCMODIFY},
  165. {IDM_SPECIAL, IDST_HLP_SP_SPECIAL},
  166. {IDM_MSGQUICKCC, IDST_HLP_MS_QUICKCC},
  167. {IDM_REXX, IDST_HLP_REXX},
  168. {IDM_RXSCRIPTS, IDST_HLP_RXSCRIPTS},
  169. {IDM_SPCADDTONICK, IDST_HLP_ADDTONICK},
  170. {IDM_SPCADDTOCC, IDST_HLP_ADDTOCC},
  171. {IDM_MSGMARKMSG, IDST_HLP_MARKMSG},
  172. {IDM_MSGUNMARKMSG, IDST_HLP_UNMARKMSG},
  173. {IDM_SPCBROWSER, IDST_HLP_SPCBROWSER},
  174. {IDM_OPNICKNAMES, IDST_HLP_OPNICKNAMES},
  175. {IDM_OPECHOMAN, IDST_HLP_OPECHOMAN},
  176. {IDM_OPADDAREAS, IDST_HLP_OPADDAREAS},
  177. {IDM_FILEPRINTSETUP, IDST_HLP_FI_PRINTSETUP},
  178. {IDM_EDITSEARCH, IDST_HLP_ED_SEARCH},
  179. {IDM_TB_ADD, IDST_HLP_TB_ADD},
  180. {0, 0}
  181. };
  182.  
  183. static const HELPSTRINGTABLE ButtonHelpStrings[] =
  184. {
  185. {IDB_PREVMSG, IDST_HLP_PREVMSG},
  186. {IDB_NEXTMSG, IDST_HLP_NEXTMSG},
  187. {IDB_PREVREPLY, IDST_HLP_PREVREPLY},
  188. {IDB_NEXTREPLY, IDST_HLP_NEXTREPLY},
  189. {IDB_FIRSTMSG, IDST_HLP_FIRSTMSG},
  190. {IDB_LASTMSG, IDST_HLP_LASTMSG},
  191. {IDB_FIND, IDST_HLP_FIND},
  192. {IDB_MSGTREE, IDST_HLP_MSGTREE},
  193. {IDB_NEWMSG, IDST_HLP_NEWMSG},
  194. {IDB_REPLY, IDST_HLP_REPLY},
  195. {IDB_IMPORT, IDST_HLP_IMPORT},
  196. {IDB_EXPORT, IDST_HLP_EXPORT},
  197. {IDB_DELMSG, IDST_HLP_DELMSG},
  198. {IDB_EDITMSG, IDST_HLP_EDITMSG},
  199. {IDB_AREA, IDST_HLP_AREA},
  200. {IDB_MSGLIST, IDST_HLP_MSGLIST},
  201. {IDB_PRINTMSG, IDST_HLP_PRINTMSG},
  202. {IDB_SHOWKLUDGES, IDST_HLP_SHOWKLUDGES},
  203. {IDB_OK, IDST_HLP_OK},
  204. {IDB_CANCEL, IDST_HLP_CANCEL},
  205. {IDB_CHANGEATTR, IDST_HLP_CHANGEATTR},
  206. {IDB_HOMEMSG, IDST_HLP_HOMEMSG},
  207. {IDB_NEXTAREA, IDST_HLP_NEXTAREA},
  208. {IDB_BOOKMARKS, IDST_HLP_WI_RESULTS},
  209. {IDB_HELP, IDST_HLP_HE_GENERAL},
  210. {IDB_CUT, IDST_HLP_ED_CUT},
  211. {IDB_COPY,    IDST_HLP_ED_COPY},
  212. {IDB_PASTE,   IDST_HLP_ED_PASTE},
  213. {IDB_COPYMSG, IDST_HLP_MS_COPY},
  214. {IDB_SHELL,   IDST_HLP_FI_SHELL},
  215. {IDB_SCRIPTS, IDST_HLP_RXSCRIPTS},
  216. {IDB_MOVEMSG, IDST_HLP_MS_MOVE},
  217. {IDB_BROWSER, IDST_HLP_SPCBROWSER},
  218. {IDB_FORWARD, IDST_HLP_MS_FORWARD},
  219. {IDB_CATCHUP, IDST_HLP_MS_MARK},
  220. {IDB_REQUEST, IDST_HLP_MS_REQ},
  221. {0, 0}
  222. };
  223.  
  224. /*--------------------------- Funktionsprototypen ---------------------------*/
  225. static void EnableToolbarItems(int num, ...);
  226. static void DisableToolbarItems(int num, ...);
  227. static void EnableMenuItems(HWND hwndMenu, BOOL bNewState, int num, ...);
  228. static void SetMainTitle(AREADEFLIST *pAreaDef);
  229. static MRESULT SetReadOnly(HWND hwnd, ULONG Control, BOOL bReadOnly);
  230.  
  231. /*------------------------------ UpdateDisplay  -----------------------------*/
  232. /* Zeichnet den Bildschirm neu, fuellt alle Fehler, aktiviert Controls       */
  233. /*---------------------------------------------------------------------------*/
  234.  
  235. void UpdateDisplay(BOOL isNewArea, BOOL withText)
  236. {
  237.    extern char CurrentArea[LEN_AREATAG+1];
  238.    extern AREALIST arealiste;
  239.    extern HWND client, frame;
  240.    extern BOOL NewMessage;
  241.    extern char NewArea[LEN_AREATAG+1];
  242.    extern int CurrentStatus;
  243.  
  244.    AREADEFLIST *zeiger=NULL;
  245.    PWINDOWDATA pWindowData=(PWINDOWDATA) WinQueryWindowULong(client, QWL_USER);
  246.  
  247.    DisplayMessage(withText);
  248.  
  249.    zeiger=AM_FindArea(&arealiste, NewMessage?NewArea:CurrentArea);
  250.  
  251.    if (!zeiger)
  252.    {
  253.       SetMainTitle(NULL);
  254.  
  255.       WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  256.                         MPFROMLONG(pWindowData->idAddressField), "");
  257.       if (CurrentStatus != PROGSTATUS_EDITING)
  258.          WinSendDlgItemMsg(client, IDML_MAINEDIT, MSGVM_DISABLEDRAG, NULL, NULL);
  259.    }
  260.    if (zeiger && CurrentStatus==PROGSTATUS_EDITING)
  261.    {
  262.       SetTranslateMode(!(zeiger->areadata.ulAreaOpt & AREAOPT_HIGHASCII));
  263.    }
  264.  
  265.    if (zeiger)
  266.    {
  267.       /* Adressen bei Echo<->Netmail */
  268.       if (zeiger->areadata.areatype != AREATYPE_NET)
  269.          WinShowWindow(WinWindowFromID(client, IDE_TOADDRESS), FALSE);
  270.       else
  271.          WinShowWindow(WinWindowFromID(client, IDE_TOADDRESS), TRUE);
  272.  
  273.       if (isNewArea)
  274.       {
  275.          /* Areabeschreibung */
  276.          SetMainTitle(zeiger);
  277.  
  278.          WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  279.                            MPFROMLONG(pWindowData->idAddressField),
  280.                            zeiger->areadata.address);
  281.       }
  282.  
  283.       if (!NewMessage)
  284.       {
  285.          MESSAGEID MessageID;
  286.  
  287.          strcpy(MessageID.pchAreaTag, CurrentArea);
  288.          MessageID.ulMsgID = pWindowData->ulCurrentID;
  289.          SendMsg(client, WORKM_TRACKMSG, &MessageID, NULL);
  290.       }
  291.    }
  292.  
  293.    UpdateButtons(zeiger);
  294.  
  295.    return;
  296. }
  297.  
  298. static void SetMainTitle(AREADEFLIST *pAreaDef)
  299. {
  300.    extern char pchWindowTitle[100];
  301.    extern HWND frame;
  302.    extern AREALISTOPTIONS arealistoptions;
  303.  
  304.    char pchTitle[30+LEN_AREADESC+1];
  305.    char chType='?';
  306.  
  307.    if (!pAreaDef)
  308.    {
  309.       char pchTemp[21];
  310.  
  311.       LoadString(IDST_MW_NOAREA, 20, pchTemp);
  312.       sprintf(pchTitle, "%s - %s", pchWindowTitle, pchTemp);
  313.    }
  314.    else
  315.    {
  316.       switch(pAreaDef->areadata.areatype)
  317.       {
  318.          case AREATYPE_NET:
  319.             chType = 'N';
  320.             break;
  321.  
  322.          case AREATYPE_ECHO:
  323.             chType = 'E';
  324.             break;
  325.  
  326.          case AREATYPE_LOCAL:
  327.             chType = 'L';
  328.             break;
  329.       }
  330.  
  331.       sprintf(pchTitle, "%s - %s (%c)", pchWindowTitle,
  332.               (arealistoptions.ulFlags & AREALISTFLAG_SHOWTAGS)?pAreaDef->areadata.areatag:pAreaDef->areadata.areadesc,
  333.               chType);
  334.    }
  335.    WinSetWindowText(frame, pchTitle);
  336.  
  337.    return;
  338. }
  339.  
  340. /*------------------------------ UpdateMsgNum   -----------------------------*/
  341. /* Message-Nummer anpassen                                                   */
  342. /*---------------------------------------------------------------------------*/
  343.  
  344. void UpdateMsgNum(HWND hwndClient, PWINDOWDATA pWindowData)
  345. {
  346.    AREADEFLIST *zeiger;
  347.    static char rangebuf[15];
  348.    static char pchFormatRange[50]="";
  349.    extern char CurrentArea[LEN_AREATAG+1];
  350.    extern AREALIST arealiste;
  351.    int msgnum;
  352.  
  353.    zeiger=AM_FindArea(&arealiste, CurrentArea);
  354.  
  355.    if (zeiger)
  356.    {
  357.       msgnum=MSG_UidToMsgn(&arealiste, CurrentArea, pWindowData->ulCurrentID, FALSE);
  358.       if (msgnum)
  359.          zeiger->currentmessage=msgnum;
  360.       if (zeiger->maxmessages > 0 && zeiger->currentmessage == 0)
  361.          zeiger->currentmessage = 1;
  362.  
  363.       if (pchFormatRange[0]=='\0')
  364.          LoadString(IDST_FORMAT_RANGE, 50, pchFormatRange);
  365.  
  366.       sprintf(rangebuf, pchFormatRange, zeiger->currentmessage, zeiger->maxmessages);
  367.       WinSendDlgItemMsg(WinQueryWindow(hwndClient, QW_PARENT), FID_STATUSLINE, STLM_SETFIELDTEXT,
  368.                         MPFROMLONG(pWindowData->idNumberField),
  369.                         rangebuf);
  370.    }
  371.    else
  372.    {
  373.       WinSendDlgItemMsg(WinQueryWindow(hwndClient, QW_PARENT), FID_STATUSLINE, STLM_SETFIELDTEXT,
  374.                         MPFROMLONG(pWindowData->idNumberField), "");
  375.    }
  376.    return;
  377. }
  378.  
  379. void UpdateButtons(AREADEFLIST *zeiger)
  380. {
  381.    extern MSGHEADER CurrentHeader;
  382.    extern HWND client, frame;
  383.    extern int CurrentStatus;
  384.    extern char CurrentArea[LEN_AREATAG+1];
  385.    extern AREALIST arealiste;
  386.  
  387.    /* Anfang der Messages */
  388.    if (!zeiger || zeiger->currentmessage <=1)
  389.       DisableToolbarItems(2, IDB_PREVMSG, IDB_FIRSTMSG);
  390.    else
  391.       EnableToolbarItems(2, IDB_PREVMSG, IDB_FIRSTMSG);
  392.  
  393.    /* Ende der Messages */
  394.    if (!zeiger || zeiger->currentmessage == zeiger->maxmessages)
  395.       DisableToolbarItems(2, IDB_NEXTMSG, IDB_LASTMSG);
  396.    else
  397.       EnableToolbarItems(2, IDB_NEXTMSG, IDB_LASTMSG);
  398.  
  399.    /* ist es ein Reply ? */
  400.    if (zeiger && CurrentHeader.ulReplyTo && zeiger->maxmessages &&
  401.        MSG_UidToMsgn(&arealiste, CurrentArea, CurrentHeader.ulReplyTo, TRUE))
  402.       EnableToolbarItems(1, IDB_PREVREPLY);
  403.    else
  404.       DisableToolbarItems(1, IDB_PREVREPLY);
  405.  
  406.    /* sind Replies da ? */
  407.    if (zeiger && CurrentHeader.ulReplies[0] && zeiger->maxmessages &&
  408.        MSG_UidToMsgn(&arealiste, CurrentArea, CurrentHeader.ulReplies[0], TRUE))
  409.       EnableToolbarItems(1, IDB_NEXTREPLY);
  410.    else
  411.       DisableToolbarItems(1, IDB_NEXTREPLY);
  412.  
  413.    /* Messages da? */
  414.    if (!zeiger || zeiger->maxmessages==0)
  415.    {
  416.       DisableToolbarItems(13, IDB_REPLY, IDB_EDITMSG, IDB_MSGTREE, IDB_EXPORT,
  417.                           IDB_DELMSG, IDB_MSGLIST, IDB_PRINTMSG, IDB_HOMEMSG,
  418.                           IDB_MOVEMSG, IDB_COPYMSG, IDB_FORWARD, IDB_REQUEST, IDB_CATCHUP );
  419.       if (!zeiger)
  420.          DisableToolbarItems(1, IDB_NEWMSG);
  421.       else
  422.          EnableToolbarItems(1, IDB_NEWMSG);
  423.  
  424.       if (CurrentStatus != PROGSTATUS_EDITING)
  425.          WinSendDlgItemMsg(client, IDML_MAINEDIT, MSGVM_DISABLEDRAG, NULL, NULL);
  426.    }
  427.    else
  428.    {
  429.       EnableToolbarItems(15, IDB_REPLY, IDB_EDITMSG, IDB_FIND, IDB_MSGTREE,
  430.                              IDB_EXPORT, IDB_DELMSG, IDB_NEWMSG, IDB_MSGLIST,
  431.                              IDB_PRINTMSG, IDB_HOMEMSG, IDB_MOVEMSG, IDB_COPYMSG,
  432.                              IDB_FORWARD, IDB_CATCHUP, IDB_REQUEST);
  433.  
  434.       if (CurrentStatus != PROGSTATUS_EDITING)
  435.          WinSendDlgItemMsg(client, IDML_MAINEDIT, MSGVM_ENABLEDRAG, NULL, NULL);
  436.    }
  437.  
  438.    return;
  439. }
  440.  
  441. /*------------------------------ DisplayMessage -----------------------------*/
  442. /* Zeigt die Message-Daten an                                                */
  443. /*---------------------------------------------------------------------------*/
  444.  
  445. void DisplayMessage(BOOL withText)
  446. {
  447.    extern FTNMESSAGE CurrentMessage;
  448.    extern MSGHEADER  CurrentHeader;
  449.    extern int CurrentStatus;
  450.    extern GENERALOPT generaloptions;
  451.    extern char CurrentArea[LEN_AREATAG+1];
  452.    extern HWND client, frame;
  453.    extern HWND hwndKludge;
  454.    extern AREALIST arealiste;
  455.    extern USERDATAOPT userdaten;
  456.    extern BOOL NewMessage;
  457.    extern WINDOWFONTS windowfonts;
  458.    AREADEFLIST *zeiger;
  459.    PWINDOWDATA pWindowData;
  460.  
  461.    static char addrbuf[LEN_5DADDRESS+1];
  462.    static char datebuf[22];
  463.    static char rangebuf[15];
  464.    static char pchFormatRange[50]="";
  465.  
  466.    int i;
  467.    HWND hwnd;
  468.  
  469.    zeiger=AM_FindArea(&arealiste, CurrentArea);
  470.    pWindowData=(PWINDOWDATA) WinQueryWindowULong(client, QWL_USER);
  471.  
  472.    hwnd=WinWindowFromID(client, IDML_MAINEDIT);
  473.  
  474.    /* NPD-Flag auswerten */
  475.    if (!MonoDisp) /* noch prop. */
  476.       if ((CurrentHeader.ulAttrib & ATTRIB_NPD) &&
  477.           !TempMono)
  478.       {
  479.          /* auf Monospaced umschalten */
  480.          QueryControlFont(client, IDML_MAINEDIT, windowfonts.viewerfont);
  481.          SetFont(WinWindowFromID(client, IDML_MAINEDIT), windowfonts.viewermonofont);
  482.          TempMono = 1;
  483.       }
  484.       else
  485.          if (!(CurrentHeader.ulAttrib & ATTRIB_NPD) &&
  486.              TempMono)
  487.          {
  488.             /* auf proportional umschalten */
  489.             QueryControlFont(client, IDML_MAINEDIT, windowfonts.viewermonofont);
  490.             SetFont(WinWindowFromID(client, IDML_MAINEDIT), windowfonts.viewerfont);
  491.             TempMono = 0;
  492.          }
  493.  
  494.    if (withText)
  495.    {
  496.       if (zeiger && (zeiger->maxmessages!=0 || NewMessage) && CurrentMessage.pchMessageText)
  497.          DisplayMsgText(client, &CurrentMessage);
  498.       else
  499.          WinSetWindowText(hwnd, "");
  500.    }
  501.    else
  502.       WinSetWindowText(hwnd, "");
  503.  
  504.    if (zeiger && hwndKludge)
  505.       SendMsg(hwndKludge, KM_SHOWKLUDGES,
  506.                  MPFROMP(&CurrentMessage), NULL);
  507.  
  508.    if (!zeiger || (zeiger->maxmessages==0 && CurrentStatus!=PROGSTATUS_EDITING))
  509.    {
  510.       WinSetDlgItemText(client, IDE_FROMNAME, "");
  511.       WinSetDlgItemText(client, IDE_TONAME, "");
  512.       WinSetDlgItemText(client, IDE_SUBJTEXT, "");
  513.    }
  514.    else
  515.    {
  516.       WinSetDlgItemText(client, IDE_FROMNAME, CurrentHeader.pchFromName);
  517.       WinSetDlgItemText(client, IDE_TONAME, CurrentHeader.pchToName);
  518.       WinSetDlgItemText(client, IDE_SUBJTEXT, CurrentHeader.pchSubject);
  519.    }
  520.  
  521.    /* Pieps bei pers. Mail */
  522.    if (zeiger && zeiger->maxmessages &&
  523.        generaloptions.beeponpersonal &&
  524.        CurrentStatus == PROGSTATUS_READING &&
  525.        !(CurrentHeader.ulAttrib & ATTRIB_READ) &&
  526.        CurrentHeader.pchToName[0])
  527.       for (i=0; i<MAX_USERNAMES; i++)
  528.          if (!stricmp(CurrentHeader.pchToName, userdaten.username[i]))
  529.             WinAlarm(HWND_DESKTOP, WA_NOTE);
  530.  
  531.    if (!zeiger)
  532.    {
  533.       WinSetDlgItemText(client, IDE_FROMADDRESS, "");
  534.       WinSetDlgItemText(client, IDE_TOADDRESS, "");
  535.    }
  536.    else
  537.    {
  538.       if (CurrentStatus==PROGSTATUS_EDITING || (zeiger->maxmessages>0))
  539.       {
  540.          NetAddrToString(addrbuf, &CurrentHeader.FromAddress);
  541.          WinSetDlgItemText(client, IDE_FROMADDRESS, addrbuf);
  542.       }
  543.       else
  544.          WinSetDlgItemText(client, IDE_FROMADDRESS, "");
  545.  
  546.       if (zeiger->maxmessages>0 || CurrentStatus==PROGSTATUS_EDITING )
  547.       {
  548.          NetAddrToString(addrbuf, &CurrentHeader.ToAddress);
  549.          WinSetDlgItemText(client, IDE_TOADDRESS, addrbuf);
  550.       }
  551.       else
  552.          WinSetDlgItemText(client, IDE_TOADDRESS, "");
  553.    }
  554.  
  555.  
  556.    if (zeiger && (zeiger->maxmessages || CurrentStatus == PROGSTATUS_EDITING))
  557.    {
  558.       StampToString(datebuf, &CurrentHeader.StampWritten);
  559.       WinSetDlgItemText(client, IDS_DATEWRITTEN, datebuf);
  560.    }
  561.    else
  562.       WinSetDlgItemText(client, IDS_DATEWRITTEN, "");
  563.  
  564.    if (zeiger && zeiger->maxmessages && !(CurrentHeader.ulAttrib & ATTRIB_LOCAL))
  565.    {
  566.       StampToString(datebuf, &CurrentHeader.StampArrived);
  567.       WinSetDlgItemText(client, IDS_DATERECEIVED, datebuf);
  568.    }
  569.    else
  570.       WinSetDlgItemText(client, IDS_DATERECEIVED, "");
  571.  
  572.    if (zeiger && (zeiger->maxmessages>0 || CurrentStatus==PROGSTATUS_EDITING))
  573.       DisplayAttrib(CurrentHeader.ulAttrib);
  574.    else
  575.       WinSetDlgItemText(client, IDS_ATTRTEXT, "");
  576.  
  577.    if (zeiger && CurrentStatus == PROGSTATUS_READING)
  578.    {
  579.       if (pchFormatRange[0]=='\0')
  580.          LoadString(IDST_FORMAT_RANGE, 50, pchFormatRange);
  581.       sprintf(rangebuf, pchFormatRange, zeiger->currentmessage, zeiger->maxmessages);
  582.       WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  583.                         MPFROMLONG(pWindowData->idNumberField),
  584.                         rangebuf);
  585.    }
  586.    else
  587.    {
  588.       WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  589.                         MPFROMLONG(pWindowData->idNumberField), "");
  590.    }
  591.    UpdateCheckField(zeiger, pWindowData);
  592.  
  593.    return;
  594. }
  595.  
  596. void UpdateCheckField(AREADEFLIST *zeiger, PWINDOWDATA pWindowData)
  597. {
  598.    extern HWND frame;
  599.    extern int CurrentStatus;
  600.  
  601.    if (zeiger && CurrentStatus == PROGSTATUS_READING)
  602.    {
  603.       extern MARKERLIST MarkerList;
  604.  
  605.       if (IsMessageMarked(&MarkerList, zeiger->areadata.areatag, pWindowData->ulCurrentID, MARKFLAG_MANUAL))
  606.          WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  607.                            MPFROMLONG(pWindowData->idCheckField), MPFROMLONG(TRUE));
  608.       else
  609.          WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  610.                            MPFROMLONG(pWindowData->idCheckField), NULL);
  611.    }
  612.    else
  613.       WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  614.                         MPFROMLONG(pWindowData->idCheckField), NULL);
  615.  
  616.    return;
  617. }
  618.  
  619. /*------------------------------ DisplayAttrib  -----------------------------*/
  620. /* Zeigt die Message-Attribute an                                            */
  621. /*---------------------------------------------------------------------------*/
  622.  
  623. void DisplayAttrib(ULONG attr)
  624. {
  625.    extern HWND client;
  626.    static char flagsbuf[200];
  627.  
  628.    MSG_AttribToText(attr, flagsbuf);
  629.    WinSetDlgItemText(client, IDS_ATTRTEXT, flagsbuf);
  630.  
  631.    return;
  632. }
  633.  
  634. /*------------------------------ DisplayMsgText -----------------------------*/
  635. /* Zeigt den Message-Text an                                                 */
  636. /*---------------------------------------------------------------------------*/
  637.  
  638. void DisplayMsgText(HWND hwndClient, FTNMESSAGE *msginfo)
  639. {
  640.    int inspoint=0;
  641.    HWND hwnd;
  642.    extern int CurrentStatus;
  643.    ULONG ulRemainLen, ulInsertLen;
  644.    PCHAR pchHelp, pchBuf;
  645.  
  646.    hwnd=WinWindowFromID(hwndClient, IDML_MAINEDIT);
  647.  
  648.    if (CurrentStatus == PROGSTATUS_EDITING)
  649.    {
  650.       ulRemainLen = strlen(msginfo->pchMessageText);
  651.       pchHelp = msginfo->pchMessageText;
  652.  
  653.       DosAllocMem((PPVOID)&pchBuf, 65000, OBJ_TILE | PAG_COMMIT | PAG_READ | PAG_WRITE);
  654.       SendMsg(hwnd, MLM_FORMAT, (MPARAM) MLFIE_NOTRANS, NULL);
  655.       SendMsg(hwnd, MLM_DISABLEREFRESH, NULL, NULL);
  656.  
  657.       while(ulRemainLen >0)
  658.       {
  659.          if (ulRemainLen>=65000)
  660.             ulInsertLen=65000;
  661.          else
  662.             ulInsertLen= ulRemainLen;
  663.  
  664.          memcpy(pchBuf, pchHelp, ulInsertLen);
  665.  
  666.          inspoint=(int)SendMsg(hwnd, MLM_QUERYTEXTLENGTH, NULL, NULL);
  667.  
  668.          SendMsg(hwnd, MLM_SETIMPORTEXPORT, pchBuf, MPFROMLONG(ulInsertLen));
  669.          SendMsg(hwnd, MLM_IMPORT, &inspoint, MPFROMLONG(ulInsertLen));
  670.          pchHelp += ulInsertLen;
  671.          ulRemainLen -= ulInsertLen;
  672.       }
  673.  
  674.       SendMsg(hwnd, MLM_ENABLEREFRESH, NULL, NULL);
  675.       DosFreeMem(pchBuf);
  676.    }
  677.    else
  678.       if (msginfo->pchMessageText)
  679.       {
  680.          WNDPARAMS WndParams;
  681.  
  682.          WndParams.fsStatus = WPM_TEXT;
  683.          WndParams.cchText = strlen(msginfo->pchMessageText)+1; /* incl. \0 */
  684.          WndParams.pszText = msginfo->pchMessageText;
  685.  
  686.          SendMsg(hwnd, WM_SETWINDOWPARAMS, &WndParams, NULL);
  687.       }
  688.       else
  689.          WinSetWindowText(hwnd, "");
  690.    return;
  691. }
  692.  
  693.  
  694. /*------------------------------ QueryLayout    -----------------------------*/
  695. /* Fragt Farben und Fonts und Position vom Hauptfenster ab.                  */
  696. /*---------------------------------------------------------------------------*/
  697.  
  698. void QueryLayout(HWND fenster)
  699. {
  700.    extern WINDOWPOSITIONS windowpositions;
  701.    extern WINDOWCOLORS windowcolors;
  702.    extern WINDOWFONTS windowfonts;
  703.    extern HWND hwndmenu;
  704.    extern HWND frame;
  705.    extern int CurrentStatus;
  706.  
  707.    QueryWinPos(frame, &(windowpositions.mainwindowpos));
  708.  
  709.    QueryControlForeground(frame, FID_STATUSLINE, &windowcolors.statusfore);
  710.    if (CurrentStatus == PROGSTATUS_EDITING)
  711.    {
  712.       QueryControlForeground(fenster, IDML_MAINEDIT, &windowcolors.editfore);
  713.       QueryControlBackground(fenster, IDML_MAINEDIT, &windowcolors.editback);
  714.    }
  715.    else
  716.    {
  717.       HWND hwndView = WinWindowFromID(fenster, IDML_MAINEDIT);
  718.  
  719.       if (MonoDisp || TempMono)
  720.          QueryFont(hwndView, windowfonts.viewermonofont);
  721.       else
  722.          QueryFont(hwndView, windowfonts.viewerfont);
  723.       SendMsg(hwndView, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_TEXT), &windowcolors.viewerfore);
  724.       SendMsg(hwndView, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_BACKGROUND), &windowcolors.viewerback);
  725.       SendMsg(hwndView, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_QUOTE), &windowcolors.viewerquote);
  726.       SendMsg(hwndView, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_TEARLINE), &windowcolors.viewertearline);
  727.       SendMsg(hwndView, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_ORIGIN), &windowcolors.viewerorigin);
  728.    }
  729.    QueryControlForeground(fenster, IDS_DATEWRITTEN, &windowcolors.msgtimefore);
  730.    QueryControlForeground(fenster, IDE_FROMNAME, &windowcolors.fromfore);
  731.    QueryControlForeground(fenster, IDE_TONAME, &windowcolors.tofore);
  732.    QueryControlForeground(fenster, IDE_FROMADDRESS, &windowcolors.fromadfore);
  733.    QueryControlForeground(fenster, IDE_TOADDRESS, &windowcolors.toadfore);
  734.    QueryControlForeground(fenster, IDE_SUBJTEXT, &windowcolors.subjfore);
  735.    QueryControlForeground(fenster, IDS_ATTRTEXT, &windowcolors.attribfore);
  736.    QueryControlForeground(fenster, IDS_FROM, &windowcolors.fromtostaticfore);
  737.  
  738.    QueryBackground(fenster, &windowcolors.windowback);
  739.    QueryControlBackground(fenster, IDE_FROMNAME, &windowcolors.fromback);
  740.    QueryControlBackground(fenster, IDE_TONAME, &windowcolors.toback);
  741.    QueryControlBackground(fenster, IDE_FROMADDRESS, &windowcolors.fromadback);
  742.    QueryControlBackground(fenster, IDE_TOADDRESS, &windowcolors.toadback);
  743.    QueryControlBackground(fenster, IDE_SUBJTEXT, &windowcolors.subjback);
  744.    QueryControlBackground(frame, FID_STATUSLINE, &windowcolors.statusback);
  745.    QueryControlBackground(fenster, IDS_FROM, &windowcolors.fromtostaticback);
  746.    QueryControlBackground(fenster, IDS_DATEWRITTEN, &windowcolors.msgtimeback);
  747.    QueryControlBackground(fenster, IDS_ATTRTEXT, &windowcolors.attribback);
  748.  
  749.    QueryFont(hwndmenu, windowfonts.menufont);
  750.    QueryControlFont(fenster, IDE_FROMNAME, windowfonts.fromfont);
  751.    QueryControlFont(fenster, IDE_TONAME, windowfonts.tofont);
  752.    QueryControlFont(fenster, IDE_FROMADDRESS, windowfonts.fromadfont);
  753.    QueryControlFont(fenster, IDE_TOADDRESS, windowfonts.toadfont);
  754.    QueryControlFont(fenster, IDE_SUBJTEXT, windowfonts.subjfont);
  755.    QueryControlFont(fenster, IDS_ATTRTEXT, windowfonts.attribfont);
  756.    QueryControlFont(frame, FID_STATUSLINE, windowfonts.statusfont);
  757.    QueryControlFont(fenster, IDS_DATEWRITTEN, windowfonts.datefont);
  758.    QueryControlFont(fenster, IDB_CHANGEATTR, windowfonts.buttonfont);
  759.    QueryControlFont(fenster, IDS_FROM, windowfonts.fromtofont);
  760.    return;
  761. }
  762.  
  763. /*------------------------------ InitMenus      -----------------------------*/
  764. /* Initialisierungsfunktion fuer Menues                                      */
  765. /*---------------------------------------------------------------------------*/
  766.  
  767. void InitMenus(USHORT usMenuID, HWND hwndMenuWnd)
  768. {
  769.    extern int CurrentStatus;
  770.    extern HWND hwndhelp, client, hwndRequester, frame;
  771.    extern BOOL issecondinstance;
  772.    extern BOOL NewMessage, bDoingWork, bDoingBrowse, DoingFind;
  773.    extern char CurrentArea[LEN_AREATAG+1];
  774.    extern char NewArea[LEN_AREATAG+1];
  775.    extern AREALIST arealiste;
  776.    extern char *pchXPostList;
  777.    extern CCANCHOR ccanchor;
  778.    extern ULONG ulCCSelected;
  779.    extern ECHOTOSSOPT echotossoptions;
  780.    extern MSGHEADER CurrentHeader;
  781.    extern FTNMESSAGE CurrentMessage;
  782.    extern PCCLIST pQuickCCList;
  783.    extern PDOMAINS domains;
  784.    AREADEFLIST *zeiger;
  785.    PWINDOWDATA pWindowData=(PWINDOWDATA) WinQueryWindowULong(client, QWL_USER);
  786.  
  787.    switch(usMenuID)
  788.    {
  789.       case IDM_FILE:
  790.          switch(CurrentStatus)
  791.          {
  792.             case PROGSTATUS_READING:
  793.                EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_FILEIMPORT);
  794.                zeiger=AM_FindArea(&arealiste, CurrentArea);
  795.                if (!zeiger || zeiger->maxmessages==0)
  796.                   EnableMenuItems(hwndMenuWnd, FALSE, 2, IDM_FILEEXPORT, IDM_FILEPRINT);
  797.                else
  798.                   EnableMenuItems(hwndMenuWnd, TRUE, 2, IDM_FILEEXPORT, IDM_FILEPRINT);
  799.                if (echotossoptions.useechotoss &&
  800.                    echotossoptions.pchEchoToss[0])
  801.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_FILEECHOTOSS);
  802.                else
  803.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_FILEECHOTOSS);
  804.                break;
  805.  
  806.             case PROGSTATUS_NOSETUP:
  807.             case PROGSTATUS_CLEANUP:
  808.                EnableMenuItems(hwndMenuWnd, FALSE, 4,IDM_FILEIMPORT, IDM_FILEEXPORT,
  809.                                                      IDM_FILEECHOTOSS, IDM_FILEPRINT);
  810.                break;
  811.  
  812.             case PROGSTATUS_EDITING:
  813.                EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_FILEIMPORT);
  814.                EnableMenuItems(hwndMenuWnd, FALSE, 3, IDM_FILEEXPORT, IDM_FILEECHOTOSS,
  815.                                IDM_FILEPRINT);
  816.                break;
  817.          }
  818.          break;
  819.  
  820.       case IDM_EDIT:
  821.          switch(CurrentStatus)
  822.          {
  823.             case PROGSTATUS_READING:
  824.                EnableMenuItems(hwndMenuWnd, FALSE, 5, IDM_EDITCUT, IDM_EDITPASTE,
  825.                                                       IDM_EDITCLEAR, IDM_EDITUNDO,
  826.                                                       IDM_EDITDELLINE);
  827.                zeiger=AM_FindArea(&arealiste, CurrentArea);
  828.                if (!zeiger || zeiger->maxmessages==0)
  829.                   EnableMenuItems(hwndMenuWnd, FALSE, 2, IDM_EDITCOPY, IDM_EDITSEARCH);
  830.                if (zeiger && zeiger->maxmessages!=0)
  831.                   EnableMenuItems(hwndMenuWnd, TRUE, 2, IDM_EDITCOPY, IDM_EDITSEARCH);
  832.                break;
  833.  
  834.             case PROGSTATUS_NOSETUP:
  835.             case PROGSTATUS_CLEANUP:
  836.                EnableMenuItems(hwndMenuWnd, FALSE, 7, IDM_EDITCUT, IDM_EDITPASTE,
  837.                                                      IDM_EDITCLEAR, IDM_EDITUNDO,
  838.                                                      IDM_EDITCOPY, IDM_EDITDELLINE, IDM_EDITSEARCH);
  839.                break;
  840.  
  841.             case PROGSTATUS_EDITING:
  842.                EnableMenuItems(hwndMenuWnd, TRUE, 4, IDM_EDITCUT, IDM_EDITCLEAR, IDM_EDITDELLINE, IDM_EDITSEARCH);
  843.                WinOpenClipbrd(anchor);
  844.                if (WinQueryClipbrdFmtInfo(anchor, CF_TEXT, NULL))
  845.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_EDITPASTE);
  846.                else
  847.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_EDITPASTE);
  848.                WinCloseClipbrd(anchor);
  849.                if (SHORT1FROMMR(WinSendDlgItemMsg(client, IDML_MAINEDIT, MLM_QUERYUNDO, NULL, NULL)))
  850.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_EDITUNDO);
  851.                else
  852.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_EDITUNDO);
  853.                break;
  854.          }
  855.          break;
  856.  
  857.       case IDM_OPTIONS:
  858.          if (issecondinstance)
  859.             EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_OPSAVE);
  860.          else
  861.             EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_OPSAVE);
  862.          switch(CurrentStatus)
  863.          {
  864.             case PROGSTATUS_READING:
  865.                if (!tidRexxExec && !bDoingWork && !bDoingBrowse && !DoingFind)
  866.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_OPCONFIG);
  867.                else
  868.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_OPCONFIG);
  869.                zeiger=AM_FindArea(&arealiste, CurrentArea);
  870.                if (!zeiger)
  871.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_OPNAMEADDR);
  872.                else
  873.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_OPNAMEADDR);
  874.                if (zeiger && zeiger->areadata.areatype == AREATYPE_NET)
  875.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_OPECHOMAN);
  876.                else
  877.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_OPECHOMAN);
  878.                EnableMenuItems(hwndMenuWnd, TRUE, 3, IDM_OPCCLISTS, IDM_OPTEMPLATE, IDM_TB_ADD);
  879.                if (zeiger && zeiger->areadata.areatype != AREATYPE_ECHO)
  880.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_OPADDAREAS);
  881.                else
  882.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_OPADDAREAS);
  883.                break;
  884.  
  885.             case PROGSTATUS_NOSETUP:
  886.                EnableMenuItems(hwndMenuWnd, TRUE, 4, IDM_OPCONFIG, IDM_OPCCLISTS, IDM_OPTEMPLATE, IDM_TB_ADD);
  887.                EnableMenuItems(hwndMenuWnd, FALSE, 3, IDM_OPNAMEADDR, IDM_OPECHOMAN, IDM_OPADDAREAS);
  888.                break;
  889.  
  890.             case PROGSTATUS_EDITING:
  891.                EnableMenuItems(hwndMenuWnd, FALSE, 3, IDM_OPCONFIG, IDM_OPECHOMAN, IDM_OPADDAREAS);
  892.                EnableMenuItems(hwndMenuWnd, TRUE, 3, IDM_OPCCLISTS, IDM_OPTEMPLATE, IDM_TB_ADD);
  893.                if (!AM_FindArea(&arealiste, NewArea))
  894.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_OPNAMEADDR);
  895.                else
  896.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_OPNAMEADDR);
  897.                break;
  898.  
  899.             case PROGSTATUS_CLEANUP:
  900.                EnableMenuItems(hwndMenuWnd, FALSE, 7, IDM_OPCONFIG, IDM_OPCCLISTS, IDM_OPTEMPLATE,
  901.                                                       IDM_OPNAMEADDR, IDM_OPECHOMAN, IDM_OPADDAREAS, IDM_TB_ADD);
  902.                break;
  903.          }
  904.          break;
  905.  
  906.       case IDM_MESSAGE:
  907.          switch(CurrentStatus)
  908.          {
  909.             case PROGSTATUS_READING:
  910.                EnableMenuItems(hwndMenuWnd, TRUE, 2, IDM_MSGFIND, IDM_MSGNEW);
  911.                zeiger=AM_FindArea(&arealiste, CurrentArea);
  912.                if (!zeiger || zeiger->maxmessages==0)
  913.                {
  914.                   EnableMenuItems(hwndMenuWnd, FALSE, 9, IDM_MSGMOVE, IDM_MSGCOPY, IDM_MSGFORWARD,
  915.                                                         IDM_MSGDELETE, IDM_MSGREPLY, IDM_MSGCHANGE,
  916.                                                         IDM_MSGBCAST, IDM_MSGMARKMSG, IDM_MSGUNMARKMSG);
  917.                   if (!zeiger)
  918.                      EnableMenuItems(hwndMenuWnd, FALSE, 2, IDM_MSGFIND, IDM_MSGNEW);
  919.                }
  920.                else
  921.                {
  922.                   extern MARKERLIST MarkerList;
  923.  
  924.                   EnableMenuItems(hwndMenuWnd, TRUE, 6, IDM_MSGMOVE, IDM_MSGCOPY, IDM_MSGFORWARD,
  925.                                                         IDM_MSGDELETE, IDM_MSGREPLY, IDM_MSGCHANGE);
  926.                   if (!IsMessageMarked(&MarkerList, CurrentArea, pWindowData->ulCurrentID, MARKFLAG_MANUAL))
  927.                      EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_MSGMARKMSG);
  928.                   else
  929.                      EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_MSGMARKMSG);
  930.                   if (IsMessageMarked(&MarkerList, CurrentArea, pWindowData->ulCurrentID, MARKFLAG_MANUAL))
  931.                      EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_MSGUNMARKMSG);
  932.                   else
  933.                      EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_MSGUNMARKMSG);
  934.                   if (zeiger->areadata.areatype == AREATYPE_ECHO &&
  935.                       (CurrentHeader.ulAttrib & ATTRIB_LOCAL) &&
  936.                       (CurrentHeader.ulAttrib & (ATTRIB_SENT | ATTRIB_SCANNED)) &&
  937.                       MSG_FindKludge(&CurrentMessage, KLUDGE_MSGID, NULL))
  938.                      EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_MSGBCAST);
  939.                   else
  940.                      EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_MSGBCAST);
  941.                }
  942.                break;
  943.  
  944.             case PROGSTATUS_NOSETUP:
  945.             case PROGSTATUS_CLEANUP:
  946.                EnableMenuItems(hwndMenuWnd, FALSE, 11, IDM_MSGMOVE, IDM_MSGCOPY, IDM_MSGFORWARD,
  947.                                                        IDM_MSGDELETE, IDM_MSGREPLY, IDM_MSGCHANGE,
  948.                                                        IDM_MSGFIND, IDM_MSGNEW, IDM_MSGBCAST,
  949.                                                        IDM_MSGMARKMSG, IDM_MSGUNMARKMSG);
  950.                break;
  951.  
  952.             case PROGSTATUS_EDITING:
  953.                EnableMenuItems(hwndMenuWnd, FALSE, 11, IDM_MSGMOVE, IDM_MSGCOPY, IDM_MSGFORWARD,
  954.                                                        IDM_MSGDELETE, IDM_MSGREPLY, IDM_MSGCHANGE,
  955.                                                        IDM_MSGFIND, IDM_MSGNEW, IDM_MSGBCAST,
  956.                                                        IDM_MSGMARKMSG, IDM_MSGUNMARKMSG);
  957.                break;
  958.          }
  959.          break;
  960.  
  961.       case IDM_SPECIAL:
  962.          switch(CurrentStatus)
  963.          {
  964.             case PROGSTATUS_READING:
  965.                EnableMenuItems(hwndMenuWnd, FALSE, 3, IDM_MSGXPOST, IDM_MSGCCOPY, IDM_MSGQUICKCC);
  966.                WinCheckMenuItem(hwndMenuWnd, IDM_MSGXPOST, FALSE);
  967.                WinCheckMenuItem(hwndMenuWnd, IDM_MSGCCOPY, FALSE);
  968.                WinCheckMenuItem(hwndMenuWnd, IDM_MSGQUICKCC, FALSE);
  969.                zeiger=AM_FindArea(&arealiste, CurrentArea);
  970.                if (!zeiger || zeiger->maxmessages==0)
  971.                {
  972.                   EnableMenuItems(hwndMenuWnd, FALSE, 4, IDM_MSGREQUEST, IDM_MSGMARK,
  973.                                                          IDM_SPCADDTONICK, IDM_SPCADDTOCC);
  974.                }
  975.                else
  976.                {
  977.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_SPCADDTONICK);
  978.                   EnableMenuItems(hwndMenuWnd, ccanchor.ulNumLists, 1, IDM_SPCADDTOCC);
  979.                   EnableMenuItems(hwndMenuWnd, !bDoingWork, 1, IDM_MSGMARK);
  980.                   EnableMenuItems(hwndMenuWnd, !hwndRequester, 1, IDM_MSGREQUEST);
  981.                }
  982.                if (domains)
  983.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_SPCBROWSER);
  984.                else
  985.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_SPCBROWSER);
  986.                break;
  987.  
  988.             case PROGSTATUS_NOSETUP:
  989.             case PROGSTATUS_CLEANUP:
  990.                EnableMenuItems(hwndMenuWnd, FALSE, 8, IDM_MSGREQUEST, IDM_MSGXPOST, IDM_MSGCCOPY,
  991.                                                       IDM_MSGMARK, IDM_MSGQUICKCC, IDM_SPCADDTONICK,
  992.                                                       IDM_SPCADDTOCC, IDM_SPCBROWSER);
  993.                WinCheckMenuItem(hwndMenuWnd, IDM_MSGXPOST, FALSE);
  994.                WinCheckMenuItem(hwndMenuWnd, IDM_MSGCCOPY, FALSE);
  995.                WinCheckMenuItem(hwndMenuWnd, IDM_MSGQUICKCC, FALSE);
  996.                break;
  997.  
  998.             case PROGSTATUS_EDITING:
  999.                EnableMenuItems(hwndMenuWnd, FALSE, 4, IDM_SPCADDTONICK, IDM_SPCADDTOCC,
  1000.                                                       IDM_MSGREQUEST, IDM_MSGMARK);
  1001.                if (domains)
  1002.                   EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_SPCBROWSER);
  1003.                else
  1004.                   EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_SPCBROWSER);
  1005.                if (NewMessage)
  1006.                {
  1007.                   zeiger=AM_FindArea(&arealiste, NewMessage ? NewArea : CurrentArea);
  1008.                   if (!zeiger || zeiger->areadata.areatype == AREATYPE_NET || ulCCSelected || pQuickCCList)
  1009.                      EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_MSGXPOST);
  1010.                   else
  1011.                      EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_MSGXPOST);
  1012.  
  1013.                   if (pchXPostList)
  1014.                      WinCheckMenuItem(hwndMenuWnd, IDM_MSGXPOST, TRUE);
  1015.                   else
  1016.                      WinCheckMenuItem(hwndMenuWnd, IDM_MSGXPOST, FALSE);
  1017.  
  1018.                   if (!zeiger || zeiger->areadata.areatype == AREATYPE_ECHO ||pchXPostList ||
  1019.                       !ccanchor.ulNumLists || pQuickCCList)
  1020.                      EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_MSGCCOPY);
  1021.                   else
  1022.                      EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_MSGCCOPY);
  1023.  
  1024.                   if (ulCCSelected)
  1025.                      WinCheckMenuItem(hwndMenuWnd, IDM_MSGCCOPY, TRUE);
  1026.                   else
  1027.                      WinCheckMenuItem(hwndMenuWnd, IDM_MSGCCOPY, FALSE);
  1028.  
  1029.                   if (!ulCCSelected && !pchXPostList && zeiger &&
  1030.                       zeiger->areadata.areatype != AREATYPE_ECHO )
  1031.                   {
  1032.                      EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_MSGQUICKCC);
  1033.                      if (pQuickCCList)
  1034.                         WinCheckMenuItem(hwndMenuWnd, IDM_MSGQUICKCC, TRUE);
  1035.                      else
  1036.                         WinCheckMenuItem(hwndMenuWnd, IDM_MSGQUICKCC, FALSE);
  1037.                   }
  1038.                   else
  1039.                   {
  1040.                      EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_MSGQUICKCC);
  1041.                      WinCheckMenuItem(hwndMenuWnd, IDM_MSGQUICKCC, FALSE);
  1042.                   }
  1043.                }
  1044.                else
  1045.                   EnableMenuItems(hwndMenuWnd, FALSE, 3, IDM_MSGXPOST, IDM_MSGCCOPY, IDM_MSGQUICKCC);
  1046.                break;
  1047.          }
  1048.          break;
  1049.  
  1050.       case IDM_REXX:
  1051.          if (CurrentStatus == PROGSTATUS_NOSETUP)
  1052.             EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_RXSCRIPTS);
  1053.          else
  1054.             EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_RXSCRIPTS);
  1055.  
  1056.          if (tidRexxExec || CurrentStatus == PROGSTATUS_NOSETUP)
  1057.          {
  1058.             EnableMenuItems(hwndMenuWnd, FALSE, 10, IDM_RXQUICK1, IDM_RXQUICK2, IDM_RXQUICK3,
  1059.                                                     IDM_RXQUICK4, IDM_RXQUICK5, IDM_RXQUICK6,
  1060.                                                     IDM_RXQUICK7, IDM_RXQUICK8, IDM_RXQUICK9,
  1061.                                                     IDM_RXQUICK10);
  1062.          }
  1063.          else
  1064.          {
  1065.             EnableMenuItems(hwndMenuWnd, TRUE, 10, IDM_RXQUICK1, IDM_RXQUICK2, IDM_RXQUICK3,
  1066.                                                    IDM_RXQUICK4, IDM_RXQUICK5, IDM_RXQUICK6,
  1067.                                                    IDM_RXQUICK7, IDM_RXQUICK8, IDM_RXQUICK9,
  1068.                                                    IDM_RXQUICK10);
  1069.          }
  1070.          break;
  1071.  
  1072.       case IDM_WINDOWS:
  1073.          if (CurrentStatus == PROGSTATUS_READING ||
  1074.              CurrentStatus == PROGSTATUS_EDITING)
  1075.             EnableMenuItems(hwndMenuWnd, TRUE, 2, IDM_WINKLUDGES, IDM_WINRESULTS);
  1076.          else
  1077.             EnableMenuItems(hwndMenuWnd, FALSE, 2, IDM_WINKLUDGES, IDM_WINRESULTS);
  1078.  
  1079.          if (WinSendDlgItemMsg(frame, FID_TOOLBAR, TBM_ISCMDENABLED, MPFROMLONG(IDB_MSGTREE), NULL))
  1080.             EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_WINTHREADS);
  1081.          else
  1082.             EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_WINTHREADS);
  1083.  
  1084.          if (WinSendDlgItemMsg(frame, FID_TOOLBAR, TBM_ISCMDENABLED, MPFROMLONG(IDB_AREA), NULL))
  1085.             EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_WINAREAS);
  1086.          else
  1087.             EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_WINAREAS);
  1088.  
  1089.          if (WinSendDlgItemMsg(frame, FID_TOOLBAR, TBM_ISCMDENABLED, MPFROMLONG(IDB_MSGLIST), NULL))
  1090.             EnableMenuItems(hwndMenuWnd, TRUE, 1, IDM_WINMSGLIST);
  1091.          else
  1092.             EnableMenuItems(hwndMenuWnd, FALSE, 1, IDM_WINMSGLIST);
  1093.          break;
  1094.  
  1095.       case IDM_HELP:
  1096.          if (!hwndhelp)
  1097.          {
  1098.             EnableMenuItems(hwndMenuWnd, FALSE, 5, IDM_HELPKEYS, IDM_HELPGENERAL, IDM_HELPINDEX,
  1099.                                                    IDM_HELPCONTENTS, IDM_HELPUSING);
  1100.          }
  1101.          break;
  1102.  
  1103.       default:
  1104.          break;
  1105.    }
  1106.    return;
  1107. }
  1108.  
  1109. /*------------------------------ StatusChanged  -----------------------------*/
  1110. /* Aktiviert/Deaktiviert Fensterelemente je nach Programmstatus              */
  1111. /*---------------------------------------------------------------------------*/
  1112.  
  1113. void StatusChanged(HWND hwndClient, int newstatus)
  1114. {
  1115.    extern BOOL bTemplateProcessed;
  1116.  
  1117.    switch(newstatus)
  1118.    {
  1119.       case PROGSTATUS_READING:
  1120.          WinEnableControl(hwndClient, IDB_CHANGEATTR, FALSE);
  1121.  
  1122.          EnableToolbarItems(23, IDB_FIND, IDB_MSGTREE, IDB_NEWMSG, IDB_REPLY, IDB_EXPORT,
  1123.                                 IDB_DELMSG, IDB_EDITMSG, IDB_AREA, IDB_MSGLIST, IDB_PRINTMSG,
  1124.                                 IDB_HOMEMSG, IDB_NEXTAREA, IDB_SHOWKLUDGES, IDB_BOOKMARKS,
  1125.                                 IDB_HELP, IDB_COPY, IDB_SHELL, IDB_SCRIPTS,
  1126.                                 IDB_BROWSER, IDB_FORWARD, IDB_REQUEST, IDB_CATCHUP);
  1127.          DisableToolbarItems(5, IDB_IMPORT, IDB_OK, IDB_CANCEL, IDB_CUT, IDB_PASTE);
  1128.  
  1129.          SetReadOnly(hwndClient, IDE_FROMNAME, TRUE);
  1130.          SetReadOnly(hwndClient, IDE_TONAME, TRUE);
  1131.          SetReadOnly(hwndClient, IDE_FROMADDRESS, TRUE);
  1132.          SetReadOnly(hwndClient, IDE_TOADDRESS, TRUE);
  1133.          SetReadOnly(hwndClient, IDE_SUBJTEXT, TRUE);
  1134.  
  1135.          SendMsg(hwndClient, WORKM_SWITCHACCELS, MPFROMLONG(ACCEL_READ), NULL);
  1136.          bTemplateProcessed=TRUE;
  1137.          SetFocusControl(hwndClient, IDML_MAINEDIT);
  1138.          break;
  1139.  
  1140.       case PROGSTATUS_EDITING:
  1141.          WinEnableControl(hwndClient, IDB_CHANGEATTR, TRUE);
  1142.  
  1143.          DisableToolbarItems(23, IDB_PREVMSG, IDB_NEXTMSG, IDB_PREVREPLY, IDB_NEXTREPLY,
  1144.                                  IDB_FIRSTMSG, IDB_LASTMSG, IDB_FIND, IDB_MSGTREE, IDB_NEWMSG,
  1145.                                  IDB_REPLY, IDB_EXPORT, IDB_DELMSG, IDB_EDITMSG, IDB_AREA,
  1146.                                  IDB_MSGLIST, IDB_PRINTMSG, IDB_HOMEMSG, IDB_NEXTAREA,
  1147.                                  IDB_COPYMSG, IDB_MOVEMSG, IDB_FORWARD, IDB_CATCHUP, IDB_REQUEST);
  1148.  
  1149.          EnableToolbarItems(9, IDB_SHOWKLUDGES, IDB_IMPORT, IDB_OK, IDB_CANCEL,
  1150.                                IDB_CUT, IDB_COPY, IDB_PASTE, IDB_SHELL, IDB_SCRIPTS,
  1151.                                IDB_BROWSER);
  1152.  
  1153.          SetReadOnly(hwndClient, IDE_FROMNAME, FALSE);
  1154.          SetReadOnly(hwndClient, IDE_TONAME, FALSE);
  1155.          SetReadOnly(hwndClient, IDE_FROMADDRESS, FALSE);
  1156.          SetReadOnly(hwndClient, IDE_TOADDRESS, FALSE);
  1157.          SetReadOnly(hwndClient, IDE_SUBJTEXT, FALSE);
  1158.  
  1159.          SendMsg(hwndClient, WORKM_SWITCHACCELS, MPFROMLONG(ACCEL_WRITE), NULL);
  1160.  
  1161.          WinSetSysValue(HWND_DESKTOP, SV_INSERTMODE, TRUE);
  1162.          break;
  1163.  
  1164.       case PROGSTATUS_NOSETUP:
  1165.          WinEnableControl(hwndClient, IDB_CHANGEATTR, FALSE);
  1166.  
  1167.          DisableToolbarItems(33, IDB_PREVMSG, IDB_NEXTMSG, IDB_PREVREPLY, IDB_NEXTREPLY,
  1168.                                  IDB_FIRSTMSG, IDB_LASTMSG, IDB_FIND, IDB_MSGTREE, IDB_NEWMSG,
  1169.                                  IDB_REPLY, IDB_EXPORT, IDB_DELMSG, IDB_EDITMSG, IDB_AREA,
  1170.                                  IDB_MSGLIST, IDB_PRINTMSG, IDB_IMPORT, IDB_OK, IDB_CANCEL,
  1171.                                  IDB_SHOWKLUDGES, IDB_HOMEMSG, IDB_NEXTAREA, IDB_BOOKMARKS,
  1172.                                  IDB_COPYMSG, IDB_MOVEMSG, IDB_CUT, IDB_PASTE, IDB_COPY,
  1173.                                  IDB_BROWSER, IDB_SCRIPTS, IDB_FORWARD, IDB_CATCHUP, IDB_REQUEST);
  1174.  
  1175.          SetReadOnly(hwndClient, IDE_FROMNAME, TRUE);
  1176.          SetReadOnly(hwndClient, IDE_TONAME, TRUE);
  1177.          SetReadOnly(hwndClient, IDE_FROMADDRESS, TRUE);
  1178.          SetReadOnly(hwndClient, IDE_TOADDRESS, TRUE);
  1179.          SetReadOnly(hwndClient, IDE_SUBJTEXT, TRUE);
  1180.  
  1181.          bTemplateProcessed=TRUE;
  1182.          SendMsg(hwndClient, WORKM_SWITCHACCELS, MPFROMLONG(ACCEL_NONE), NULL);
  1183.          break;
  1184.  
  1185.       case PROGSTATUS_CLEANUP:
  1186.          WinEnableControl(hwndClient, IDB_CHANGEATTR, FALSE);
  1187.  
  1188.          DisableToolbarItems(35, IDB_PREVMSG, IDB_NEXTMSG, IDB_PREVREPLY, IDB_NEXTREPLY,
  1189.                                  IDB_FIRSTMSG, IDB_LASTMSG, IDB_FIND, IDB_MSGTREE,
  1190.                                  IDB_NEWMSG, IDB_REPLY, IDB_EXPORT, IDB_DELMSG,
  1191.                                  IDB_EDITMSG, IDB_AREA, IDB_MSGLIST, IDB_PRINTMSG,
  1192.                                  IDB_IMPORT, IDB_OK, IDB_CANCEL, IDB_SHOWKLUDGES,
  1193.                                  IDB_HOMEMSG, IDB_NEXTAREA, IDB_BOOKMARKS, IDB_HELP,
  1194.                                  IDB_COPYMSG, IDB_MOVEMSG, IDB_COPY, IDB_CUT, IDB_PASTE, IDB_SHELL,
  1195.                                  IDB_SCRIPTS, IDB_BROWSER, IDB_FORWARD, IDB_CATCHUP, IDB_REQUEST);
  1196.  
  1197.          WinSetDlgItemText(hwndClient, IDE_FROMNAME, "");
  1198.          WinSetDlgItemText(hwndClient, IDE_TONAME, "");
  1199.          WinSetDlgItemText(hwndClient, IDE_FROMADDRESS, "");
  1200.          WinSetDlgItemText(hwndClient, IDE_TOADDRESS, "");
  1201.          WinSetDlgItemText(hwndClient, IDE_SUBJTEXT, "");
  1202.          WinSetDlgItemText(hwndClient, IDS_ATTRTEXT, "");
  1203.          WinSetDlgItemText(hwndClient, IDS_DATEWRITTEN, "");
  1204.          WinSetDlgItemText(hwndClient, IDS_DATERECEIVED, "");
  1205.  
  1206.          SetReadOnly(hwndClient, IDE_FROMNAME, TRUE);
  1207.          SetReadOnly(hwndClient, IDE_TONAME, TRUE);
  1208.          SetReadOnly(hwndClient, IDE_FROMADDRESS, TRUE);
  1209.          SetReadOnly(hwndClient, IDE_TOADDRESS, TRUE);
  1210.          SetReadOnly(hwndClient, IDE_SUBJTEXT, TRUE);
  1211.  
  1212.          bTemplateProcessed=TRUE;
  1213.          SendMsg(hwndClient, WORKM_SWITCHACCELS, MPFROMLONG(ACCEL_READ), NULL);
  1214.          break;
  1215.  
  1216.       default:
  1217.          break;
  1218.    }
  1219.    return;
  1220. }
  1221.  
  1222. static void EnableToolbarItems(int num, ...)
  1223. {
  1224.    extern HWND frame;
  1225.    va_list arg_ptr;
  1226.  
  1227.    va_start(arg_ptr, num);
  1228.  
  1229.    while(num>0)
  1230.    {
  1231.       WinSendDlgItemMsg(frame, FID_TOOLBAR, TBM_ENABLECMD, MPFROMLONG(va_arg(arg_ptr, ULONG)), NULL);
  1232.       num--;
  1233.    }
  1234.    va_end(arg_ptr);
  1235.    return;
  1236. }
  1237.  
  1238. static void DisableToolbarItems(int num, ...)
  1239. {
  1240.    extern HWND frame;
  1241.    va_list arg_ptr;
  1242.  
  1243.    va_start(arg_ptr, num);
  1244.  
  1245.    while(num>0)
  1246.    {
  1247.       WinSendDlgItemMsg(frame, FID_TOOLBAR, TBM_DISABLECMD, MPFROMLONG(va_arg(arg_ptr, ULONG)), NULL);
  1248.       num--;
  1249.    }
  1250.    va_end(arg_ptr);
  1251.    return;
  1252. }
  1253.  
  1254. static void EnableMenuItems(HWND hwndMenu, BOOL bNewState, int num, ...)
  1255. {
  1256.    va_list arg_ptr;
  1257.  
  1258.    va_start(arg_ptr, num);
  1259.  
  1260.    while(num>0)
  1261.    {
  1262.       WinEnableMenuItem(hwndMenu, va_arg(arg_ptr, ULONG), bNewState);
  1263.       num--;
  1264.    }
  1265.    va_end(arg_ptr);
  1266.    return;
  1267. }
  1268.  
  1269. /*------------------------------ InitMainWindow -----------------------------*/
  1270. /* Initialisierungsfunktion des Main Window                                  */
  1271. /*---------------------------------------------------------------------------*/
  1272.  
  1273. void InitMainWindow(HWND fenster)
  1274. {
  1275.    extern WINDOWCOLORS windowcolors;
  1276.    extern WINDOWFONTS windowfonts;
  1277.    extern WINDOWPOSITIONS windowpositions;
  1278.  
  1279.    HWND hwnd;
  1280.    char pchTemp[100];
  1281.    PWINDOWDATA pWindowData;
  1282.  
  1283.    /* Instanzdaten */
  1284.    pWindowData=malloc(sizeof(WINDOWDATA));
  1285.    memset(pWindowData, 0, sizeof(WINDOWDATA));
  1286.    WinSetWindowULong(fenster, QWL_USER, (ULONG) pWindowData);
  1287.  
  1288.    SetBackground(fenster, &windowcolors.windowback);
  1289.  
  1290.    /* Main Edit Window */
  1291.    hwnd=WinCreateWindow(fenster,
  1292.                         WC_MSGVIEWER,
  1293.                         NULL,
  1294.                         WS_VISIBLE |
  1295.                         MSGVS_VSCROLL |
  1296.                         MSGVS_BORDER,
  1297.                         5,30,
  1298.                         70,100,
  1299.                         fenster,
  1300.                         HWND_TOP,
  1301.                         IDML_MAINEDIT,
  1302.                         NULL,
  1303.                         NULL);
  1304.  
  1305.    SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_TEXT), MPFROMLONG(windowcolors.viewerfore));
  1306.    SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_BACKGROUND), MPFROMLONG(windowcolors.viewerback));
  1307.    SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_QUOTE), MPFROMLONG(windowcolors.viewerquote));
  1308.    SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_TEARLINE), MPFROMLONG(windowcolors.viewertearline));
  1309.    SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_ORIGIN), MPFROMLONG(windowcolors.viewerorigin));
  1310.    SetFont(hwnd, windowfonts.viewerfont);
  1311.  
  1312.    /* Message-Header-Elemente */
  1313.  
  1314.    LoadString(IDST_MW_FROM, 100, pchTemp);
  1315.    hwnd=WinCreateWindow(fenster,
  1316.                    WC_STATIC,
  1317.                    pchTemp,
  1318.                    WS_VISIBLE |
  1319.                    SS_TEXT |
  1320.                    DT_RIGHT |
  1321.                    DT_VCENTER,
  1322.                    5,160,
  1323.                    60,18,
  1324.                    fenster,
  1325.                    HWND_TOP,
  1326.                    IDS_FROM,
  1327.                    NULL,
  1328.                    NULL);
  1329.  
  1330.    SetForeground(hwnd, &windowcolors.fromtostaticfore);
  1331.    SetBackground(hwnd, &windowcolors.fromtostaticback);
  1332.    SetFont(hwnd, windowfonts.fromtofont);
  1333.  
  1334.    LoadString(IDST_MW_TO, 100, pchTemp);
  1335.    hwnd=WinCreateWindow(fenster,
  1336.                    WC_STATIC,
  1337.                    pchTemp,
  1338.                    WS_VISIBLE |
  1339.                    SS_TEXT |
  1340.                    DT_RIGHT |
  1341.                    DT_VCENTER,
  1342.                    5,140,
  1343.                    60,18,
  1344.                    fenster,
  1345.                    HWND_TOP,
  1346.                    IDS_TO,
  1347.                    NULL,
  1348.                    NULL);
  1349.  
  1350.    SetForeground(hwnd, &windowcolors.fromtostaticfore);
  1351.    SetBackground(hwnd, &windowcolors.fromtostaticback);
  1352.    SetFont(hwnd, windowfonts.fromtofont);
  1353.  
  1354.    LoadString(IDST_MW_SUBJ, 100, pchTemp);
  1355.    hwnd=WinCreateWindow(fenster,
  1356.                    WC_STATIC,
  1357.                    pchTemp,
  1358.                    WS_VISIBLE |
  1359.                    SS_TEXT |
  1360.                    DT_RIGHT |
  1361.                    DT_VCENTER,
  1362.                    5,120,
  1363.                    60,18,
  1364.                    fenster,
  1365.                    HWND_TOP,
  1366.                    IDS_SUBJ,
  1367.                    NULL,
  1368.                    NULL);
  1369.  
  1370.    SetForeground(hwnd, &windowcolors.fromtostaticfore);
  1371.    SetBackground(hwnd, &windowcolors.fromtostaticback);
  1372.    SetFont(hwnd, windowfonts.fromtofont);
  1373.  
  1374.    hwnd=WinCreateWindow(fenster,
  1375.                    WC_STATIC,
  1376.                    NULL,
  1377.                    WS_VISIBLE |
  1378.                    SS_TEXT |
  1379.                    DT_CENTER |
  1380.                    DT_VCENTER,
  1381.                    100,80,
  1382.                    130,16,
  1383.                    fenster,
  1384.                    HWND_TOP,
  1385.                    IDS_DATEWRITTEN,
  1386.                    NULL,
  1387.                    NULL);
  1388.  
  1389.    SetForeground(hwnd, &windowcolors.msgtimefore);
  1390.    SetBackground(hwnd, &windowcolors.msgtimeback);
  1391.    SetFont(hwnd, windowfonts.datefont);
  1392.  
  1393.    hwnd=WinCreateWindow(fenster,
  1394.                    WC_STATIC,
  1395.                    NULL,
  1396.                    WS_VISIBLE | WS_SYNCPAINT |
  1397.                    SS_TEXT |
  1398.                    DT_CENTER |
  1399.                    DT_VCENTER,
  1400.                    100,100,
  1401.                    130,16,
  1402.                    fenster,
  1403.                    HWND_TOP,
  1404.                    IDS_DATERECEIVED,
  1405.                    NULL,
  1406.                    NULL);
  1407.  
  1408.    SetForeground(hwnd, &windowcolors.msgtimefore);
  1409.    SetBackground(hwnd, &windowcolors.msgtimeback);
  1410.    SetFont(hwnd, windowfonts.datefont);
  1411.  
  1412.  
  1413.    hwnd=WinCreateWindow(fenster,
  1414.                    "FromToEntry",
  1415.                    NULL,
  1416.                    WS_VISIBLE |
  1417.                    ES_AUTOSCROLL |
  1418.                    ES_LEFT,
  1419.                    100,100,
  1420.                    100,18,
  1421.                    fenster,
  1422.                    HWND_TOP,
  1423.                    IDE_FROMNAME,
  1424.                    NULL,
  1425.                    NULL);
  1426.  
  1427.    SetForeground(hwnd, &windowcolors.fromfore);
  1428.    SetBackground(hwnd, &windowcolors.fromback);
  1429.    SetFont(hwnd, windowfonts.fromfont);
  1430.  
  1431.    SendMsg(hwnd, EM_SETTEXTLIMIT, MPFROMSHORT(LEN_USERNAME), (MPARAM) NULL);
  1432.    SendMsg(hwnd, EM_SETREADONLY, MPFROMLONG(TRUE), NULL);
  1433.  
  1434.    hwnd=WinCreateWindow(fenster,
  1435.                    "FromToEntry",
  1436.                    NULL,
  1437.                    WS_VISIBLE |
  1438.                    ES_AUTOSCROLL |
  1439.                    ES_LEFT,
  1440.                    80,100,
  1441.                    100,18,
  1442.                    fenster,
  1443.                    HWND_TOP,
  1444.                    IDE_TONAME,
  1445.                    NULL,
  1446.                    NULL);
  1447.  
  1448.    SetForeground(hwnd, &windowcolors.tofore);
  1449.    SetBackground(hwnd, &windowcolors.toback);
  1450.    SetFont(hwnd, windowfonts.tofont);
  1451.  
  1452.    SendMsg(hwnd, EM_SETTEXTLIMIT, MPFROMSHORT(LEN_USERNAME), (MPARAM) NULL);
  1453.    SendMsg(hwnd, EM_SETREADONLY, MPFROMLONG(TRUE), NULL);
  1454.  
  1455.    hwnd=WinCreateWindow(fenster,
  1456.                    "SubjectEntry",
  1457.                    NULL,
  1458.                    WS_VISIBLE |
  1459.                    ES_AUTOSCROLL |
  1460.                    ES_LEFT,
  1461.                    100,100,
  1462.                    100,18,
  1463.                    fenster,
  1464.                    HWND_TOP,
  1465.                    IDE_SUBJTEXT,
  1466.                    NULL,
  1467.                    NULL);
  1468.  
  1469.    SetForeground(hwnd, &windowcolors.subjfore);
  1470.    SetBackground(hwnd, &windowcolors.subjback);
  1471.    SetFont(hwnd, windowfonts.subjfont);
  1472.  
  1473.    SendMsg(hwnd, EM_SETTEXTLIMIT, MPFROMSHORT(LEN_SUBJECT), (MPARAM) NULL);
  1474.    SendMsg(hwnd, EM_SETREADONLY, MPFROMLONG(TRUE), NULL);
  1475.  
  1476.    hwnd=WinCreateWindow(fenster,
  1477.                    "FidoEntry",
  1478.                    NULL,
  1479.                    WS_VISIBLE | WS_SYNCPAINT |
  1480.                    ES_AUTOSCROLL |
  1481.                    ES_LEFT,
  1482.                    100,100,
  1483.                    95,18,
  1484.                    fenster,
  1485.                    HWND_TOP,
  1486.                    IDE_FROMADDRESS,
  1487.                    NULL,
  1488.                    NULL);
  1489.  
  1490.    SetForeground(hwnd, &windowcolors.fromadfore);
  1491.    SetBackground(hwnd, &windowcolors.fromadback);
  1492.    SetFont(hwnd, windowfonts.fromadfont);
  1493.  
  1494.    SendMsg(hwnd, EM_SETTEXTLIMIT, MPFROMSHORT(LEN_5DADDRESS), (MPARAM) NULL);
  1495.    SendMsg(hwnd, EM_SETREADONLY, MPFROMLONG(TRUE), NULL);
  1496.  
  1497.    hwnd=WinCreateWindow(fenster,
  1498.                    "FidoEntry",
  1499.                    NULL,
  1500.                    WS_SYNCPAINT |
  1501.                    ES_AUTOSCROLL |
  1502.                    ES_LEFT,
  1503.                    100,100,
  1504.                    95,18,
  1505.                    fenster,
  1506.                    HWND_TOP,
  1507.                    IDE_TOADDRESS,
  1508.                    NULL,
  1509.                    NULL);
  1510.  
  1511.    SetForeground(hwnd, &windowcolors.toadfore);
  1512.    SetBackground(hwnd, &windowcolors.toadback);
  1513.    SetFont(hwnd, windowfonts.toadfont);
  1514.  
  1515.    SendMsg(hwnd, EM_SETTEXTLIMIT, MPFROMSHORT(LEN_5DADDRESS), (MPARAM) NULL);
  1516.    SendMsg(hwnd, EM_SETREADONLY, MPFROMLONG(TRUE), NULL);
  1517.  
  1518.    hwnd=WinCreateWindow(fenster,
  1519.                    WC_STATIC,
  1520.                    NULL,
  1521.                    WS_VISIBLE |
  1522.                    SS_TEXT |
  1523.                    DT_VCENTER,
  1524.                    100,100,
  1525.                    100,18,
  1526.                    fenster,
  1527.                    HWND_TOP,
  1528.                    IDS_ATTRTEXT,
  1529.                    NULL,
  1530.                    NULL);
  1531.  
  1532.    SetForeground(hwnd, &windowcolors.attribfore);
  1533.    SetBackground(hwnd, &windowcolors.attribback);
  1534.    SetFont(hwnd, windowfonts.attribfont);
  1535.  
  1536.    LoadString(IDST_MW_ATTRIB, 100, pchTemp);
  1537.    hwnd=WinCreateWindow(fenster,
  1538.                    WC_BUTTON,
  1539.                    pchTemp,
  1540.                    WS_VISIBLE |
  1541.                    BS_NOPOINTERFOCUS |
  1542.                    BS_PUSHBUTTON,
  1543.                    100,100,
  1544.                    65,22,
  1545.                    fenster,
  1546.                    HWND_TOP,
  1547.                    IDB_CHANGEATTR,
  1548.                    NULL,
  1549.                    NULL);
  1550.  
  1551.    SetFont(hwnd, windowfonts.buttonfont);
  1552.  
  1553.    /* Popup-Menues laden */
  1554.    pWindowData->hwndPopup = WinLoadMenu(HWND_OBJECT, hmodLang, IDM_EDITPOPUP);
  1555.    pWindowData->hwndToolbarPopup = WinLoadMenu(HWND_OBJECT, hmodLang, IDM_TB_POPUP);
  1556.  
  1557.    return;
  1558. }
  1559.  
  1560. /*----------------------------- DisplayStatusText ---------------------------*/
  1561. /* Zeigt fuer eine Control-ID einen Hilfetext an                             */
  1562. /*---------------------------------------------------------------------------*/
  1563.  
  1564. void DisplayStatusText(SHORT ctrlID)
  1565. {
  1566.    static ULONG currentID=0;
  1567.    UCHAR text[100];
  1568.    ULONG stringID;
  1569.    extern HWND frame;
  1570.    int i=0;
  1571.  
  1572.    while (ButtonHelpStrings[i].usCtrlID && ButtonHelpStrings[i].usCtrlID != ctrlID)
  1573.       i++;
  1574.  
  1575.    if (ButtonHelpStrings[i].usCtrlID)
  1576.       stringID = ButtonHelpStrings[i].ulStringID;
  1577.    else
  1578.       stringID = 0;
  1579.  
  1580.    if (currentID!=stringID)
  1581.    {
  1582.       currentID=stringID;
  1583.  
  1584.       if (!stringID)
  1585.          text[0]='\0';
  1586.       else
  1587.          LoadString( stringID, sizeof(text), text);
  1588.  
  1589.       WinSetWindowText(WinWindowFromID(frame, FID_STATUSLINE),
  1590.                        text);
  1591.    }
  1592.    return;
  1593. }
  1594.  
  1595. /*----------------------------- DisplayMenuHelp   ---------------------------*/
  1596. /* Zeigt fuer einen Menuepunkt einen Hilfetext an                            */
  1597. /*---------------------------------------------------------------------------*/
  1598.  
  1599. void DisplayMenuHelp(HWND hwndClient, SHORT ctrlID)
  1600. {
  1601.    UCHAR text[100];
  1602.    int i=0;
  1603.  
  1604.    while (MenuHelpStrings[i].usCtrlID && MenuHelpStrings[i].usCtrlID != ctrlID)
  1605.       i++;
  1606.  
  1607.    if (MenuHelpStrings[i].usCtrlID)
  1608.       LoadString(MenuHelpStrings[i].ulStringID, sizeof(text), text);
  1609.    else
  1610.       text[0]='\0';
  1611.  
  1612.    WinSetDlgItemText(WinQueryWindow(hwndClient, QW_PARENT), FID_STATUSLINE, text);
  1613.  
  1614.    return;
  1615. }
  1616.  
  1617. /*----------------------------- InsertMacro ---------------------------------*/
  1618. /* Fuegt einen Macro-Text in das MLE ein                                     */
  1619. /*---------------------------------------------------------------------------*/
  1620.  
  1621. void InsertMacro(HWND hwndEdit, USHORT MacroID)
  1622. {
  1623.    extern MACROTABLEOPT macrotable;
  1624.  
  1625.    SendMsg(hwndEdit, MLM_INSERT, macrotable.macrotext[MacroID], NULL);
  1626.  
  1627.    return;
  1628. }
  1629.  
  1630. /*----------------------------- ShowFleetWindow -----------------------------*/
  1631. /* Zeigt eines der FleetStreet-Fenster an                                    */
  1632. /*---------------------------------------------------------------------------*/
  1633.  
  1634. void ShowFleetWindow(USHORT usMenuID)
  1635. {
  1636.    extern HWND hwndThreadList, hwndKludge, hwndFindResults,
  1637.                hwndMsgList, hwndAreaDlg, client;
  1638.    HWND hwndTarget=NULLHANDLE;
  1639.    HWND hwndFocus=NULLHANDLE;
  1640.  
  1641.    switch(usMenuID)
  1642.    {
  1643.       case IDM_WINTHREADS:
  1644.          if (!hwndThreadList)
  1645.          {
  1646.             SendMsg(client, WM_COMMAND, MPFROMSHORT(IDB_MSGTREE),
  1647.                        MPFROMSHORT(CMDSRC_PUSHBUTTON));
  1648.          }
  1649.          if (hwndThreadList)
  1650.          {
  1651.             hwndTarget=hwndThreadList;
  1652.             hwndFocus=WinWindowFromID(hwndThreadList, IDD_THREADLIST+1);
  1653.          }
  1654.          break;
  1655.  
  1656.       case IDM_WINKLUDGES:
  1657.          if (!hwndKludge)
  1658.          {
  1659.             SendMsg(client, WM_COMMAND, MPFROMSHORT(IDB_SHOWKLUDGES),
  1660.                        MPFROMSHORT(CMDSRC_PUSHBUTTON));
  1661.          }
  1662.          if (hwndKludge)
  1663.          {
  1664.             hwndTarget=hwndKludge;
  1665.             hwndFocus=hwndKludge;
  1666.          }
  1667.          break;
  1668.  
  1669.       case IDM_WINRESULTS:
  1670.          if (!hwndFindResults)
  1671.          {
  1672.             BOOKMARKSOPEN BMOpen={sizeof(BOOKMARKSOPEN), MARKFLAG_MANUAL};
  1673.  
  1674.             hwndFindResults=WinLoadDlg(HWND_DESKTOP, HWND_DESKTOP,
  1675.                                        FindResultsProc,
  1676.                                        hmodLang, IDD_FINDRESULTS,
  1677.                                        &BMOpen);
  1678.             WinShowWindow(hwndFindResults, TRUE);
  1679.          }
  1680.          if (hwndFindResults)
  1681.          {
  1682.             hwndTarget=hwndFindResults;
  1683.             hwndFocus=WinWindowFromID(hwndFindResults, IDD_FINDRESULTS+1);
  1684.          }
  1685.          break;
  1686.  
  1687.       case IDM_WINAREAS:
  1688.          if (!hwndAreaDlg)
  1689.          {
  1690.             SendMsg(client, WM_COMMAND, MPFROMSHORT(IDB_AREA),
  1691.                        MPFROMSHORT(CMDSRC_PUSHBUTTON));
  1692.          }
  1693.          if (hwndAreaDlg)
  1694.          {
  1695.             hwndTarget=hwndAreaDlg;
  1696.             hwndFocus=WinWindowFromID(hwndAreaDlg, IDD_AREALIST+1);
  1697.          }
  1698.          break;
  1699.  
  1700.       case IDM_WINMSGLIST:
  1701.          if (!hwndMsgList)
  1702.          {
  1703.             SendMsg(client, WM_COMMAND, MPFROMSHORT(IDB_MSGLIST),
  1704.                        MPFROMSHORT(CMDSRC_PUSHBUTTON));
  1705.          }
  1706.          if (hwndMsgList)
  1707.          {
  1708.             hwndTarget=hwndMsgList;
  1709.             hwndFocus=WinWindowFromID(hwndMsgList, IDD_MSGLIST+1);
  1710.          }
  1711.          break;
  1712.  
  1713.       default:
  1714.          break;
  1715.    }
  1716.    if (hwndTarget)
  1717.    {
  1718.       SWP swp;
  1719.  
  1720.       SetFocus(hwndFocus);
  1721.  
  1722.       WinQueryWindowPos(hwndTarget, &swp);
  1723.       if (swp.fl & SWP_MINIMIZE)
  1724.          WinSetWindowPos(hwndTarget,
  1725.                          NULLHANDLE,
  1726.                          0, 0,
  1727.                          0, 0,
  1728.                          SWP_RESTORE);
  1729.    }
  1730.    return;
  1731. }
  1732.  
  1733. /*----------------------------- SwitchEditor    -----------------------------*/
  1734. /* Schaltet zwischen Viewer und Editor hin und her                           */
  1735. /*---------------------------------------------------------------------------*/
  1736.  
  1737. void SwitchEditor(HWND hwndClient, char *pchDestArea, BOOL bEdit)
  1738. {
  1739.    SWP swp;
  1740.    HWND hwnd;
  1741.    PWINDOWDATA pWindowData;
  1742.    extern WINDOWCOLORS windowcolors;
  1743.    extern WINDOWFONTS windowfonts;
  1744.    extern AREALIST arealiste;
  1745.    extern GENERALOPT generaloptions;
  1746.    extern TEMPLATELIST templatelist;
  1747.    extern HWND frame;
  1748.    AREADEFLIST *zeiger=AM_FindArea(&arealiste, pchDestArea);
  1749.    char *pchFont;
  1750.  
  1751.    hwnd=WinWindowFromID(hwndClient, IDML_MAINEDIT);
  1752.  
  1753.    /* Position und Groesse sichern */
  1754.    WinQueryWindowPos(hwnd, &swp);
  1755.  
  1756.    if (bEdit)
  1757.    {
  1758.       /* Editor erzeugen */
  1759.       BOOL bInsert;
  1760.  
  1761.       /* alte Farben und Font sichern */
  1762.       SendMsg(hwnd, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_TEXT), &windowcolors.viewerfore);
  1763.       SendMsg(hwnd, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_BACKGROUND), &windowcolors.viewerback);
  1764.       SendMsg(hwnd, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_QUOTE), &windowcolors.viewerquote);
  1765.       SendMsg(hwnd, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_TEARLINE), &windowcolors.viewertearline);
  1766.       SendMsg(hwnd, MSGVM_QUERYCOLOR, MPFROMLONG(MSGVCLR_ORIGIN), &windowcolors.viewerorigin);
  1767.       if (MonoDisp || TempMono)
  1768.          QueryFont(hwnd, pchFont=windowfonts.viewermonofont);
  1769.       else
  1770.          QueryFont(hwnd, pchFont=windowfonts.viewerfont);
  1771.  
  1772.       /* altes Fenster killen */
  1773.       WinDestroyWindow(hwnd);
  1774.  
  1775.       hwnd=WinCreateWindow(hwndClient,
  1776.                            "EditWin",
  1777.                            NULL,
  1778.                            WS_VISIBLE | MLS_VSCROLL | MLS_WORDWRAP | MLS_BORDER,
  1779.                            swp.x, swp.y,
  1780.                            swp.cx, swp.cy,
  1781.                            hwndClient,
  1782.                            HWND_TOP,
  1783.                            IDML_MAINEDIT,
  1784.                            NULL, NULL);
  1785.  
  1786.       SetBackground(hwnd, &windowcolors.editback);
  1787.       SetForeground(hwnd, &windowcolors.editfore);
  1788.       SetFont(hwnd, pchFont);
  1789.       if (zeiger)
  1790.       {
  1791.          SendMsg(hwnd, MLM_SETTRANSLATE,
  1792.                     (MPARAM) !(zeiger->areadata.ulAreaOpt & AREAOPT_HIGHASCII),
  1793.                     NULL);
  1794.       }
  1795.       SendMsg(hwnd, MLM_SETTABSIZE,
  1796.                  MPFROMLONG(generaloptions.lTabSize), NULL);
  1797.  
  1798.       pWindowData=(PWINDOWDATA)WinQueryWindowULong(hwndClient, QWL_USER);
  1799.       bInsert=(BOOL)WinQuerySysValue(HWND_DESKTOP, SV_INSERTMODE);
  1800.       if (bInsert != pWindowData->bInsert)
  1801.       {
  1802.          if (bInsert)
  1803.             WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  1804.                               MPFROMLONG(pWindowData->idKeybField),
  1805.                               "INS");
  1806.          else
  1807.             WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  1808.                               MPFROMLONG(pWindowData->idKeybField),
  1809.                               "OVR");
  1810.       }
  1811.       pWindowData->bInsert=bInsert;
  1812.    }
  1813.    else   /* Viewer */
  1814.    {
  1815.       PMSGTEMPLATE pTemplate;
  1816.  
  1817.       /* alte Farben und Font sichern */
  1818.       QueryForeground(hwnd, &windowcolors.editfore);
  1819.       QueryBackground(hwnd, &windowcolors.editback);
  1820.       if (MonoDisp || TempMono)
  1821.          QueryFont(hwnd, pchFont=windowfonts.viewermonofont);
  1822.       else
  1823.          QueryFont(hwnd, pchFont=windowfonts.viewerfont);
  1824.  
  1825.       /* altes Fenster killen */
  1826.       WinDestroyWindow(hwnd);
  1827.  
  1828.       /* Viewer erzeugen */
  1829.       hwnd=WinCreateWindow(hwndClient,
  1830.                            WC_MSGVIEWER,
  1831.                            NULL,
  1832.                            WS_VISIBLE | MSGVS_VSCROLL | MSGVS_BORDER,
  1833.                            swp.x, swp.y,
  1834.                            swp.cx, swp.cy,
  1835.                            hwndClient,
  1836.                            HWND_TOP,
  1837.                            IDML_MAINEDIT,
  1838.                            NULL, NULL);
  1839.  
  1840.       SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_TEXT), MPFROMLONG(windowcolors.viewerfore));
  1841.       SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_BACKGROUND), MPFROMLONG(windowcolors.viewerback));
  1842.       SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_QUOTE), MPFROMLONG(windowcolors.viewerquote));
  1843.       SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_TEARLINE), MPFROMLONG(windowcolors.viewertearline));
  1844.       SendMsg(hwnd, MSGVM_SETCOLOR, MPFROMLONG(MSGVCLR_ORIGIN), MPFROMLONG(windowcolors.viewerorigin));
  1845.       SendMsg(hwnd, MSGVM_ENABLEHIGHLIGHT,
  1846.               MPFROMLONG(!generaloptions.nohighlight && !(zeiger->areadata.ulAreaOpt & AREAOPT_NOHIGHLIGHT)),
  1847.               NULL);
  1848.       pTemplate = M_FindTemplate(&templatelist, &arealiste, pchDestArea);
  1849.       if (pTemplate)
  1850.          SendMsg(hwnd, MSGVM_SETQUOTECHAR,
  1851.                  MPFROMCHAR(pTemplate->chQuoteChar), NULL);
  1852.       SetFont(hwnd, pchFont);
  1853.  
  1854.       pWindowData=(PWINDOWDATA)WinQueryWindowULong(hwndClient, QWL_USER);
  1855.       WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  1856.                         MPFROMLONG(pWindowData->idCursorField), NULL);
  1857.       WinSendDlgItemMsg(frame, FID_STATUSLINE, STLM_SETFIELDTEXT,
  1858.                         MPFROMLONG(pWindowData->idKeybField), NULL);
  1859.    }
  1860.  
  1861.    return;
  1862. }
  1863.  
  1864. /*---------------------------------------------------------------------------*/
  1865. /* Funktionsname: OpenEditPopup                                              */
  1866. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1867. /* Beschreibung: Oeffnet das Popup-Menue fuer Clipboard-Operationen          */
  1868. /*                                                                           */
  1869. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1870. /* Parameter: hwndClient: Client-Window-Handle                               */
  1871. /*            pWindowData: Zeiger auf die Client-Window-Daten                */
  1872. /*            bKeyboard: TRUE: Tastatur-Operation                            */
  1873. /*                       FALSE: Maus-Operation                               */
  1874. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1875. /* Rückgabewerte: -                                                          */
  1876. /*                                                                           */
  1877. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1878. /* Sonstiges: usPopupControl in den Window-Daten muss gesetzt sein.          */
  1879. /*                                                                           */
  1880. /*---------------------------------------------------------------------------*/
  1881.  
  1882. void OpenEditPopup(HWND hwndClient, PWINDOWDATA pWindowData, BOOL bKeyBoard)
  1883. {
  1884.    POINTL pointl;
  1885.    extern int CurrentStatus;
  1886.    MRESULT mr;
  1887.  
  1888.    switch(pWindowData->usPopupControl)
  1889.    {
  1890.       case IDML_MAINEDIT:
  1891.          if (CurrentStatus == PROGSTATUS_EDITING)
  1892.          {
  1893.             EnableMenuItems(pWindowData->hwndPopup, TRUE, 7,
  1894.                             IDM_EP_COPY, IDM_EP_UNDO, IDM_EP_CUT, IDM_EP_CLEAR,
  1895.                             IDM_EP_DELLINE, IDM_EP_PASTE, IDM_EP_MONO);
  1896.             EnableMenuItems(pWindowData->hwndPopup, FALSE, 1, IDM_EP_HIGHLIGHT);
  1897.             WinCheckMenuItem(pWindowData->hwndPopup, IDM_EP_HIGHLIGHT, FALSE);
  1898.          }
  1899.          else
  1900.          {
  1901.             BOOL bTemp;
  1902.  
  1903.             EnableMenuItems(pWindowData->hwndPopup, TRUE, 3,
  1904.                             IDM_EP_COPY, IDM_EP_HIGHLIGHT, IDM_EP_MONO);
  1905.             EnableMenuItems(pWindowData->hwndPopup, FALSE, 5,
  1906.                             IDM_EP_UNDO, IDM_EP_CUT, IDM_EP_CLEAR, IDM_EP_DELLINE,
  1907.                             IDM_EP_PASTE);
  1908.             bTemp = (BOOL) WinSendDlgItemMsg(hwndClient, IDML_MAINEDIT, MSGVM_QUERYHIGHLIGHT, NULL, NULL);
  1909.             WinCheckMenuItem(pWindowData->hwndPopup, IDM_EP_HIGHLIGHT, bTemp);
  1910.          }
  1911.          WinCheckMenuItem(pWindowData->hwndPopup, IDM_EP_MONO, MonoDisp || TempMono);
  1912.          break;
  1913.  
  1914.       case IDE_FROMNAME:
  1915.       case IDE_TONAME:
  1916.       case IDE_FROMADDRESS:
  1917.       case IDE_TOADDRESS:
  1918.       case IDE_SUBJTEXT:
  1919.          if (CurrentStatus == PROGSTATUS_EDITING)
  1920.             EnableMenuItems(pWindowData->hwndPopup, TRUE, 1, IDM_EP_PASTE);
  1921.          else
  1922.             EnableMenuItems(pWindowData->hwndPopup, FALSE, 3,
  1923.                             IDM_EP_CUT, IDM_EP_CLEAR, IDM_EP_PASTE);
  1924.  
  1925.          EnableMenuItems(pWindowData->hwndPopup, FALSE, 4,
  1926.                          IDM_EP_UNDO, IDM_EP_DELLINE, IDM_EP_HIGHLIGHT, IDM_EP_MONO);
  1927.          WinCheckMenuItem(pWindowData->hwndPopup, IDM_EP_HIGHLIGHT, FALSE);
  1928.          WinCheckMenuItem(pWindowData->hwndPopup, IDM_EP_MONO, FALSE);
  1929.          mr = WinSendDlgItemMsg(hwndClient, pWindowData->usPopupControl, EM_QUERYSEL,
  1930.                                 NULL, NULL);
  1931.  
  1932.          if ((SHORT2FROMMR(mr) - SHORT1FROMMR(mr)) == 0)
  1933.             EnableMenuItems(pWindowData->hwndPopup, FALSE, 3,
  1934.                             IDM_EP_COPY, IDM_EP_CUT, IDM_EP_CLEAR);
  1935.          else
  1936.             if (CurrentStatus == PROGSTATUS_EDITING)
  1937.                EnableMenuItems(pWindowData->hwndPopup, TRUE, 3,
  1938.                                IDM_EP_COPY, IDM_EP_CUT, IDM_EP_CLEAR);
  1939.             else
  1940.                EnableMenuItems(pWindowData->hwndPopup, TRUE, 1, IDM_EP_COPY);
  1941.          break;
  1942.  
  1943.       default:
  1944.          return;
  1945.    }
  1946.  
  1947.    if (bKeyBoard)
  1948.    {
  1949.       RECTL rectl;
  1950.  
  1951.       WinQueryWindowRect(WinWindowFromID(hwndClient, pWindowData->usPopupControl), &rectl);
  1952.       WinMapWindowPoints(WinWindowFromID(hwndClient, pWindowData->usPopupControl),
  1953.                          HWND_DESKTOP, (PPOINTL) &rectl, 2);
  1954.  
  1955.       WinPopupMenu(HWND_DESKTOP, hwndClient, pWindowData->hwndPopup,
  1956.                    rectl.xLeft+(rectl.xRight-rectl.xLeft)/2,
  1957.                    rectl.yBottom+(rectl.yTop-rectl.yBottom)/2,
  1958.                    IDM_EP_COPY,
  1959.                    PU_HCONSTRAIN | PU_VCONSTRAIN | PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_POSITIONONITEM);
  1960.    }
  1961.    else
  1962.    {
  1963.       WinQueryPointerPos(HWND_DESKTOP, &pointl);
  1964.  
  1965.       WinPopupMenu(HWND_DESKTOP, hwndClient, pWindowData->hwndPopup,
  1966.                    pointl.x, pointl.y,
  1967.                    IDM_EP_COPY,
  1968.                    PU_HCONSTRAIN | PU_VCONSTRAIN | PU_KEYBOARD |
  1969.                    PU_POSITIONONITEM | PU_MOUSEBUTTON1);
  1970.    }
  1971.    return;
  1972. }
  1973.  
  1974. void QueryOpenWindows(POPENWIN pOpenWindows)
  1975. {
  1976.    ULONG ulTemp=0;
  1977.    extern HWND hwndAreaDlg, hwndKludge, hwndTemplates, hwndCCLists, hwndRxFolder,
  1978.                hwndNLBrowser, hwndFindResults, hwndThreadList, hwndMsgList;
  1979.  
  1980.    if (hwndAreaDlg)
  1981.       ulTemp |= OPENWIN_AREA;
  1982.  
  1983.    if (hwndKludge)
  1984.       ulTemp |= OPENWIN_KLUDGES;
  1985.  
  1986.    if (hwndTemplates)
  1987.       ulTemp |= OPENWIN_TPL;
  1988.  
  1989.    if (hwndCCLists)
  1990.       ulTemp |= OPENWIN_CCLISTS;
  1991.  
  1992.    if (hwndRxFolder)
  1993.       ulTemp |= OPENWIN_REXX;
  1994.  
  1995.    if (hwndNLBrowser)
  1996.       ulTemp |= OPENWIN_BROWSER;
  1997.  
  1998.    if (hwndFindResults)
  1999.       ulTemp |= OPENWIN_BOOKMARKS;
  2000.  
  2001.    if (hwndThreadList)
  2002.       ulTemp |= OPENWIN_THRL;
  2003.  
  2004.    if (hwndMsgList)
  2005.       ulTemp |= OPENWIN_MSGL;
  2006.  
  2007.    pOpenWindows->ulOpenWindows = ulTemp;
  2008.  
  2009.    return;
  2010. }
  2011.  
  2012. void RestoreOpenWindows(POPENWIN pOpenWindows)
  2013. {
  2014.    extern HWND client;
  2015.    ULONG ulOpenMask;
  2016.  
  2017.    ulOpenMask = (pOpenWindows->ulOpenWindows & ~pOpenWindows->ulForceClose) | pOpenWindows->ulForceOpen;
  2018.  
  2019.    if (ulOpenMask & OPENWIN_AREA)
  2020.    {
  2021.       SendMsg(client, WM_COMMAND, MPFROMSHORT(IDA_AREA),
  2022.                  MPFROM2SHORT(CMDSRC_ACCELERATOR, FALSE));
  2023.    }
  2024.  
  2025.    if (ulOpenMask & OPENWIN_KLUDGES)
  2026.    {
  2027.       SendMsg(client, WM_COMMAND, MPFROMSHORT(IDA_KLUDGES),
  2028.                  MPFROM2SHORT(CMDSRC_ACCELERATOR, FALSE));
  2029.    }
  2030.  
  2031. #if 0
  2032.    if (ulOpenMask & OPENWIN_TPL)
  2033.    {
  2034.    }
  2035.  
  2036.    if (ulOpenMask & OPENWIN_CCLISTS)
  2037.    {
  2038.    }
  2039.  
  2040.    if (ulOpenMask & OPENWIN_REXX)
  2041.    {
  2042.    }
  2043.  
  2044.    if (ulOpenMask & OPENWIN_BROWSER)
  2045.    {
  2046.    }
  2047. #endif
  2048.  
  2049.    if (ulOpenMask & OPENWIN_BOOKMARKS)
  2050.    {
  2051.       SendMsg(client, WM_COMMAND, MPFROMSHORT(IDA_BOOKMARKS),
  2052.                  MPFROM2SHORT(CMDSRC_ACCELERATOR, FALSE));
  2053.    }
  2054.  
  2055.    if (ulOpenMask & OPENWIN_THRL)
  2056.    {
  2057.       SendMsg(client, WM_COMMAND, MPFROMSHORT(IDA_THREADLIST),
  2058.                  MPFROM2SHORT(CMDSRC_ACCELERATOR, FALSE));
  2059.    }
  2060.  
  2061.    if (ulOpenMask & OPENWIN_MSGL)
  2062.    {
  2063.       SendMsg(client, WM_COMMAND, MPFROMSHORT(IDA_MSGLIST),
  2064.                  MPFROM2SHORT(CMDSRC_ACCELERATOR, FALSE));
  2065.    }
  2066.    return;
  2067. }
  2068.  
  2069. /*---------------------------------------------------------------------------*/
  2070. /* Funktionsname: FLTLAY_ResizeMainWindow                                    */
  2071. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2072. /* Beschreibung: Passt die Groesse und Position der geaenderten Fenster-     */
  2073. /*               groesse an                                                  */
  2074. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2075. /* Parameter: hwndClient:  Window-Handle des Client-Windows                  */
  2076. /*            cx:          Neue X-Groesse des Client-Windows                 */
  2077. /*            cy:          Neue Y-Groesse des Client-Windows                 */
  2078. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2079. /* Rückgabewerte: keine                                                      */
  2080. /*                                                                           */
  2081. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2082. /* Sonstiges: -                                                              */
  2083. /*                                                                           */
  2084. /*---------------------------------------------------------------------------*/
  2085.  
  2086. void FLTLAY_ResizeMainWindow(HWND hwndClient, SHORT cx, SHORT cy)
  2087. {
  2088.    int i=0;
  2089.  
  2090.    while (ResizeParam[i].CtrlID)
  2091.    {
  2092.       switch(ResizeParam[i].CtrlID)
  2093.       {
  2094.          case IDE_TOADDRESS:
  2095.             WinSetWindowPos(WinWindowFromID(hwndClient, ResizeParam[i].CtrlID),
  2096.                             NULLHANDLE,
  2097.                             (ResizeParam[i].flags & XREL)?  (cx+ResizeParam[i].x)  : ResizeParam[i].x,
  2098.                             (ResizeParam[i].flags & YREL)?  (cy+ResizeParam[i].y)  : ResizeParam[i].y,
  2099.                             (ResizeParam[i].flags & CXREL)? (cx+ResizeParam[i].cx) : ResizeParam[i].cx,
  2100.                             (ResizeParam[i].flags & CYREL)? (cy+ResizeParam[i].cy) : ResizeParam[i].cy,
  2101.                             SWP_SIZE | SWP_MOVE);
  2102.             break;
  2103.  
  2104.          default:
  2105.             WinSetWindowPos(WinWindowFromID(hwndClient, ResizeParam[i].CtrlID),
  2106.                             NULLHANDLE,
  2107.                             (ResizeParam[i].flags & XREL)?  (cx+ResizeParam[i].x)  : ResizeParam[i].x,
  2108.                             (ResizeParam[i].flags & YREL)?  (cy+ResizeParam[i].y)  : ResizeParam[i].y,
  2109.                             (ResizeParam[i].flags & CXREL)? (cx+ResizeParam[i].cx) : ResizeParam[i].cx,
  2110.                             (ResizeParam[i].flags & CYREL)? (cy+ResizeParam[i].cy) : ResizeParam[i].cy,
  2111.                             SWP_SIZE | SWP_MOVE |
  2112.                             ((ResizeParam[i].flags & VIS) ? SWP_SHOW : SWP_HIDE));
  2113.             break;
  2114.       }
  2115.       i++;
  2116.    }
  2117.  
  2118.    /* Spezial-Behandlungen */
  2119.    WinSetWindowPos(WinWindowFromID(hwndClient, IDE_FROMNAME),
  2120.                    NULLHANDLE,
  2121.                    ResizeParam[0].x, cy+ResizeParam[0].y,
  2122.                    (cx-70-140)*2/3, ResizeParam[0].cy,
  2123.                    SWP_MOVE | SWP_SIZE);
  2124.  
  2125.    WinSetWindowPos(WinWindowFromID(hwndClient, IDE_TONAME),
  2126.                    NULLHANDLE,
  2127.                    ResizeParam[1].x, cy+ResizeParam[1].y,
  2128.                    (cx-70-140)*2/3, ResizeParam[1].cy,
  2129.                    SWP_MOVE | SWP_SIZE);
  2130.  
  2131.    WinSetWindowPos(WinWindowFromID(hwndClient, IDE_FROMADDRESS),
  2132.                    NULLHANDLE,
  2133.                    cx-(cx-70-140)/3-135, cy+ResizeParam[2].y,
  2134.                    (cx-70-140)/3, ResizeParam[2].cy,
  2135.                    SWP_SIZE | SWP_MOVE);
  2136.  
  2137.    WinSetWindowPos(WinWindowFromID(hwndClient, IDE_TOADDRESS),
  2138.                    NULLHANDLE,
  2139.                    cx-(cx-70-140)/3-135, cy+ResizeParam[3].y,
  2140.                    (cx-70-140)/3, ResizeParam[3].cy,
  2141.                    SWP_SIZE | SWP_MOVE);
  2142.  
  2143.    return;
  2144. }
  2145.  
  2146. /*---------------------------------------------------------------------------*/
  2147. /* Funktionsname: FLTLAY_QueryNextFocus                                      */
  2148. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2149. /* Beschreibung: Liefert für eine Control-ID die ID des naechsten Controls   */
  2150. /*               in der Kette zurueck                                        */
  2151. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2152. /* Parameter: ulLayoutNum: Nummer des Layouts                                */
  2153. /*            usCurrent:   ID des momentanen Controls                        */
  2154. /*            bSkipAddresses: TRUE  Adressfelder ueberspringen               */
  2155. /*                            FALSE Adressfelder einbeziehen                 */
  2156. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2157. /* Rückgabewerte: ID des naechsten Controls                                  */
  2158. /*                0 bei einem Fehler                                         */
  2159. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2160. /* Sonstiges: -                                                              */
  2161. /*                                                                           */
  2162. /*---------------------------------------------------------------------------*/
  2163.  
  2164. USHORT FLTLAY_QueryNextFocus(USHORT usCurrent, BOOL bSkipAddresses)
  2165. {
  2166.    int i=0;
  2167.  
  2168.    while(FocusTable[i] &&
  2169.          FocusTable[i] != usCurrent)
  2170.      i++;
  2171.  
  2172.    if (FocusTable[i] == 0)
  2173.       return 0;
  2174.    else
  2175.    {
  2176.       i++;
  2177.       if (FocusTable[i] == 0)
  2178.          i=0;
  2179.       if (FocusTable[i] == IDE_TOADDRESS && bSkipAddresses)
  2180.          i++;
  2181.       if (FocusTable[i] == 0)
  2182.          i=0;
  2183.       return FocusTable[i];
  2184.    }
  2185. }
  2186.  
  2187. /*---------------------------------------------------------------------------*/
  2188. /* Funktionsname: FLTLAY_QueryPrevFocus                                      */
  2189. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2190. /* Beschreibung: Liefert für eine Control-ID die ID des vorherigen Controls  */
  2191. /*               in der Kette zurueck                                        */
  2192. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2193. /* Parameter: ulLayoutNum: Nummer des Layouts                                */
  2194. /*            usCurrent:   ID des momentanen Controls                        */
  2195. /*            bSkipAddresses: TRUE  Adressfelder ueberspringen               */
  2196. /*                            FALSE Adressfelder einbeziehen                 */
  2197. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2198. /* Rückgabewerte: ID des vorherigen Controls                                 */
  2199. /*                0 bei einem Fehler                                         */
  2200. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2201. /* Sonstiges: -                                                              */
  2202. /*                                                                           */
  2203. /*---------------------------------------------------------------------------*/
  2204.  
  2205. USHORT FLTLAY_QueryPrevFocus(USHORT usCurrent, BOOL bSkipAddresses)
  2206. {
  2207.    int i=0;
  2208.  
  2209.    while(FocusTable[i] &&
  2210.          FocusTable[i] != usCurrent)
  2211.      i++;
  2212.  
  2213.    if (FocusTable[i] == 0)
  2214.       return 0;
  2215.    else
  2216.    {
  2217.       i--;
  2218.       if (i<0)
  2219.          i=0;
  2220.       if (FocusTable[i] == IDE_TOADDRESS && bSkipAddresses)
  2221.          i--;
  2222.       if (i<0)
  2223.          i=0;
  2224.       return FocusTable[i];
  2225.    }
  2226. }
  2227.  
  2228. /*---------------------------------------------------------------------------*/
  2229. /* Funktionsname: ToolbarFrameProc                                           */
  2230. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2231. /* Beschreibung: Neue Frame-Prozedur zum einpassen der Toolbar unter dem     */
  2232. /*               normalen Menue                                              */
  2233. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2234. /* Parameter: WINPROC                                                        */
  2235. /*                                                                           */
  2236. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2237. /* Rückgabewerte: MRESULT                                                    */
  2238. /*                                                                           */
  2239. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  2240. /* Sonstiges: Der Zeiger auf die Original-Prozedur muß in den Window-Words   */
  2241. /*            stehen, sonst wird nur WinDefWindowProc aufgerufen.            */
  2242. /*---------------------------------------------------------------------------*/
  2243.  
  2244. MRESULT EXPENTRY ToolbarFrameProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2245. {
  2246.    extern TOOLBAROPTIONS ToolbarOptions;
  2247.    USHORT usCount;
  2248.    MRESULT (* EXPENTRY OldFrameProc)(HWND, ULONG, MPARAM, MPARAM);
  2249.    MRESULT resultbuf;
  2250.    SWP swp;
  2251.  
  2252.    OldFrameProc= (PFNWP) WinQueryWindowPtr(hwnd, 0);
  2253.  
  2254.    if (!OldFrameProc)
  2255.       return WinDefWindowProc(hwnd, msg, mp1, mp2);
  2256.  
  2257.    switch(msg)
  2258.    {
  2259.       /* Fenster bewegen oder Groesse aendern */
  2260.       case WM_QUERYTRACKINFO:
  2261.         /* Default-Werte aus Original-Prozedur holen */
  2262.         resultbuf=OldFrameProc(hwnd, msg, mp1, mp2);
  2263.         WinQueryWindowPos(hwnd, &swp);
  2264.         if (!(swp.fl & SWP_MINIMIZE)) /* nicht bei minimized */
  2265.         {
  2266.            /* Minimale Fenstergroesse einstellen */
  2267.            ((PTRACKINFO)mp2)->ptlMinTrackSize.x=440;
  2268.            ((PTRACKINFO)mp2)->ptlMinTrackSize.y=420;
  2269.         }
  2270.         return resultbuf;
  2271.  
  2272.       case WM_QUERYFRAMECTLCOUNT:
  2273.          usCount=(USHORT)OldFrameProc(hwnd, msg, mp1, mp2);
  2274.          return (MRESULT)(usCount+2);
  2275.  
  2276.       case WM_FORMATFRAME:
  2277.          {
  2278.          PSWP     pSWP = (PSWP) mp1;
  2279.          USHORT   usItemCount;
  2280.          USHORT   usMenuIndex;
  2281.          USHORT   usToolbarIndex;
  2282.          USHORT   usStatusIndex;
  2283.          USHORT   usClientIndex;
  2284.          PRECTL   prectlClient;
  2285.          HWND     hwndToolBar = WinWindowFromID(hwnd, FID_TOOLBAR);
  2286.          HWND     hwndClient = WinWindowFromID(hwnd, FID_CLIENT);
  2287.          HWND     hwndMenu = WinWindowFromID(hwnd, FID_MENU);
  2288.          HWND     hwndStatus = WinWindowFromID(hwnd, FID_STATUSLINE);
  2289.  
  2290.          usItemCount = SHORT1FROMMR(OldFrameProc(hwnd, msg, mp1, mp2));
  2291.  
  2292.          /* ------------- locate SWP for client window  ---------- */
  2293.          for (usClientIndex = 0; usClientIndex < usItemCount; usClientIndex++)
  2294.             if (pSWP[usClientIndex].hwnd == hwndClient)
  2295.                break;
  2296.  
  2297.          for (usMenuIndex = 0; usMenuIndex < usItemCount; usMenuIndex++)
  2298.             if (pSWP[usMenuIndex].hwnd == hwndMenu)
  2299.                break;
  2300.  
  2301.          /* ------ the new SWP starts after standard control SWPs ----- */
  2302.          usToolbarIndex = usItemCount+1 ;
  2303.          usStatusIndex = usItemCount ;
  2304.  
  2305.          /* Statuszeile formatieren */
  2306.          pSWP[usStatusIndex].cx = pSWP[usClientIndex].cx;
  2307.          pSWP[usStatusIndex].x  = pSWP[usClientIndex].x;
  2308.          pSWP[usStatusIndex].cy = 30;
  2309.          pSWP[usStatusIndex].y  = pSWP[usClientIndex].y;
  2310.          pSWP[usStatusIndex].hwndInsertBehind = HWND_TOP;
  2311.          pSWP[usStatusIndex].hwnd = hwndStatus;
  2312.          pSWP[usStatusIndex].fl = pSWP[usMenuIndex].fl;
  2313.  
  2314.          /* --------  adjust Client window size for Statusline ------- */
  2315.          pSWP[usClientIndex].fl |= SWP_SIZE | SWP_MOVE;
  2316.          pSWP[usClientIndex].cy -= pSWP[usStatusIndex].cy ;
  2317.          pSWP[usClientIndex].y  += pSWP[usStatusIndex].cy ;
  2318.  
  2319.          /* Toolbar formatieren */
  2320.          if (WinQueryWindowULong(hwndToolBar, QWL_STYLE) & TBS_VERTICAL)
  2321.          {
  2322.             pSWP[usToolbarIndex].cx = pSWP[usClientIndex].cx;
  2323.             SendMsg(hwndToolBar, WM_ADJUSTWINDOWPOS, &pSWP[usToolbarIndex], NULL);
  2324.             pSWP[usToolbarIndex].cy = pSWP[usClientIndex].cy;
  2325.             pSWP[usToolbarIndex].y = pSWP[usStatusIndex].y + pSWP[usStatusIndex].cy;
  2326.             pSWP[usToolbarIndex].hwndInsertBehind = HWND_TOP;
  2327.             pSWP[usToolbarIndex].hwnd = hwndToolBar;
  2328.             pSWP[usToolbarIndex].fl   = pSWP[usMenuIndex].fl;
  2329.             if (ToolbarOptions.ulToolbarPos == TOOLBARPOS_RIGHT)
  2330.             {
  2331.                pSWP[usToolbarIndex].x  = pSWP[usClientIndex].x +pSWP[usClientIndex].cx -pSWP[usToolbarIndex].cx;
  2332.  
  2333.                /* --------  adjust Client window size for 2nd menu ------- */
  2334.                pSWP[usClientIndex].fl |= SWP_SIZE;
  2335.                pSWP[usClientIndex].cx -= pSWP[usToolbarIndex].cx ;
  2336.             }
  2337.             else
  2338.             {
  2339.                pSWP[usToolbarIndex].x  = pSWP[usClientIndex].x;
  2340.  
  2341.                /* --------  adjust Client window size for 2nd menu ------- */
  2342.                pSWP[usClientIndex].fl |= SWP_SIZE | SWP_MOVE;
  2343.                pSWP[usClientIndex].cx -= pSWP[usToolbarIndex].cx ;
  2344.                pSWP[usClientIndex].x += pSWP[usToolbarIndex].cx ;
  2345.             }
  2346.          }
  2347.          else
  2348.          {
  2349.             pSWP[usToolbarIndex].cx = pSWP[usClientIndex].cx;
  2350.             pSWP[usToolbarIndex].x  = pSWP[usClientIndex].x;
  2351.             SendMsg(hwndToolBar, WM_ADJUSTWINDOWPOS, &pSWP[usToolbarIndex], NULL);
  2352.             pSWP[usToolbarIndex].cx = pSWP[usClientIndex].cx;
  2353.             pSWP[usToolbarIndex].hwndInsertBehind = HWND_TOP;
  2354.             pSWP[usToolbarIndex].hwnd = hwndToolBar;
  2355.             pSWP[usToolbarIndex].fl   = pSWP[usMenuIndex].fl;
  2356.  
  2357.             if (ToolbarOptions.ulToolbarPos == TOOLBARPOS_TOP)
  2358.             {
  2359.                pSWP[usToolbarIndex].y = pSWP[usMenuIndex].y - pSWP[usToolbarIndex].cy;
  2360.  
  2361.                /* --------  adjust Client window size for 2nd menu ------- */
  2362.                pSWP[usClientIndex].fl |= SWP_SIZE;
  2363.                pSWP[usClientIndex].cy -= pSWP[usToolbarIndex].cy ;
  2364.             }
  2365.             else
  2366.             {
  2367.                pSWP[usToolbarIndex].y = pSWP[usStatusIndex].y + pSWP[usStatusIndex].cy;
  2368.  
  2369.                /* --------  adjust Client window size for 2nd menu ------- */
  2370.                pSWP[usClientIndex].fl |= SWP_SIZE | SWP_MOVE;
  2371.                pSWP[usClientIndex].cy -= pSWP[usToolbarIndex].cy ;
  2372.                pSWP[usClientIndex].y += pSWP[usToolbarIndex].cy;
  2373.             }
  2374.          }
  2375.  
  2376.          /* --------  set new client size in rectl param  ---------- */
  2377.          prectlClient = (PRECTL) mp2;
  2378.          if (prectlClient)
  2379.             prectlClient->yTop -=
  2380.                             (prectlClient->yTop - prectlClient->yBottom) -
  2381.                             pSWP[usClientIndex].cy;
  2382.  
  2383.          /* ---  return total count of controls ( +1 for 2nd menu ) --- */
  2384.          return MRFROMSHORT(usItemCount+2);
  2385.          }
  2386.  
  2387.       case WM_CALCFRAMERECT :
  2388.          {
  2389.          PRECTL   prectl;
  2390.          BOOL     fCalcClientRect;
  2391.          SWP      swp;
  2392.  
  2393.          /* ----- first call old proc for defaults  ------- */
  2394.          if (OldFrameProc(hwnd, msg, mp1, mp2))
  2395.          {
  2396.             /* ----- get the passed parameters  -------- */
  2397.             prectl = (PRECTL) mp1;
  2398.             fCalcClientRect = (BOOL) SHORT1FROMMP( mp2 );
  2399.  
  2400.             /* ---- determine height of second menu ---- */
  2401.             swp.cy = 0 ;
  2402.             WinQueryWindowPos(WinWindowFromID(hwnd, FID_TOOLBAR), &swp);
  2403.             if (fCalcClientRect)
  2404.             {
  2405.                /*
  2406.                 *  we are calculating the client rect so we must SUBTRACT
  2407.                 *  the height of the 2nd menu from the default client size
  2408.                 */
  2409.                 prectl->yTop -= swp.cy;
  2410.             }
  2411.             else
  2412.             {
  2413.                /*
  2414.                 *  we are calculating the frame rect so we must ADD
  2415.                 *  the height of the 2nd menu to the default frame size
  2416.                 */
  2417.                 prectl->yTop += swp.cy;
  2418.             }
  2419.          }
  2420.          else
  2421.            return FALSE ;
  2422.          }
  2423.          return (MRESULT) TRUE;
  2424.  
  2425.       default:
  2426.          break;
  2427.    }
  2428.    return OldFrameProc(hwnd, msg, mp1, mp2);
  2429. }
  2430.  
  2431. int CreateStatusLine(HWND hwndFrame)
  2432. {
  2433.    extern WINDOWCOLORS windowcolors;
  2434.    extern WINDOWFONTS windowfonts;
  2435.  
  2436.    HWND hwnd;
  2437.    STLFIELDINFO STLField;
  2438.    PWINDOWDATA pWindowData = (PWINDOWDATA) WinQueryWindowULong(WinWindowFromID(hwndFrame, FID_CLIENT), QWL_USER);
  2439.  
  2440.    hwnd=WinCreateWindow(hwndFrame,
  2441.                         WC_STATUSLINE,
  2442.                         NULL,
  2443.                         WS_VISIBLE | STLS_BORDER,
  2444.                         0,0,
  2445.                         200,30,
  2446.                         hwndFrame,
  2447.                         HWND_TOP,
  2448.                         FID_STATUSLINE,
  2449.                         NULL,
  2450.                         NULL);
  2451.  
  2452.    SetForeground(hwnd, &windowcolors.statusfore);
  2453.    SetBackground(hwnd, &windowcolors.statusback);
  2454.    SetFont(hwnd, windowfonts.statusfont);
  2455.  
  2456.    STLField.ulFlags=STLF_VARIABLE | STLF_3D;
  2457.    STLField.lFieldSize=100;
  2458.    STLField.lColorForeground=windowcolors.statusfore;
  2459.    STLField.pszFontName=NULL;
  2460.    STLField.ulTimeout = MSGTIMEOUT;
  2461.    pWindowData->idMessageField=(ULONG)SendMsg(hwnd, STLM_ADDFIELD, &STLField,
  2462.                                                  MPFROMLONG(STLI_LAST));
  2463.  
  2464.    STLField.ulFlags=STLF_FIXED | STLF_3D | STLF_CENTER | STLF_CHECK;
  2465.    STLField.lFieldSize=30;
  2466.    STLField.lColorForeground=windowcolors.statusfore;
  2467.    STLField.pszFontName=NULL;
  2468.    STLField.ulTimeout = 0;
  2469.    pWindowData->idCheckField=(ULONG)SendMsg(hwnd, STLM_ADDFIELD, &STLField,
  2470.                                                 MPFROMLONG(STLI_LAST));
  2471.  
  2472.    STLField.ulFlags=STLF_FIXED | STLF_3D | STLF_CENTER;
  2473.    STLField.lFieldSize=60;
  2474.    STLField.lColorForeground=windowcolors.statusfore;
  2475.    STLField.pszFontName=NULL;
  2476.    STLField.ulTimeout = 0;
  2477.    pWindowData->idCursorField=(ULONG)SendMsg(hwnd, STLM_ADDFIELD, &STLField,
  2478.                                                 MPFROMLONG(STLI_LAST));
  2479.  
  2480.    STLField.ulFlags=STLF_FIXED | STLF_3D | STLF_CENTER;
  2481.    STLField.lFieldSize=50;
  2482.    STLField.lColorForeground=windowcolors.statusfore;
  2483.    STLField.pszFontName=NULL;
  2484.    STLField.ulTimeout = 0;
  2485.    pWindowData->idKeybField=(ULONG)SendMsg(hwnd, STLM_ADDFIELD, &STLField,
  2486.                                               MPFROMLONG(STLI_LAST));
  2487.  
  2488.    STLField.ulFlags=STLF_FIXED | STLF_3D | STLF_CENTER;
  2489.    STLField.lFieldSize=110;
  2490.    STLField.lColorForeground=windowcolors.statusfore;
  2491.    STLField.pszFontName=NULL;
  2492.    STLField.ulTimeout = 0;
  2493.    pWindowData->idNumberField=(ULONG)SendMsg(hwnd, STLM_ADDFIELD, &STLField,
  2494.                                                  MPFROMLONG(STLI_LAST));
  2495.  
  2496.    STLField.ulFlags=STLF_FIXED | STLF_3D | STLF_CENTER;
  2497.    STLField.lFieldSize=120;
  2498.    STLField.lColorForeground=windowcolors.statusfore;
  2499.    STLField.pszFontName=NULL;
  2500.    STLField.ulTimeout = 0;
  2501.    pWindowData->idAddressField=(ULONG)SendMsg(hwnd, STLM_ADDFIELD, &STLField,
  2502.                                                  MPFROMLONG(STLI_LAST));
  2503.  
  2504.    return 0;
  2505. }
  2506.  
  2507. int CreateToolbar(HWND hwndFrame)
  2508. {
  2509.    TBCTLDATA CtlData;
  2510.    extern TOOLBAROPTIONS ToolbarOptions;
  2511.    extern TOOLBARCONFIG ToolbarConfig;
  2512.    ULONG ulStyle = TBS_BORDER | TBS_SCROLLABLE;
  2513.  
  2514.    if (ToolbarOptions.ulToolbarPos == TOOLBARPOS_LEFT ||
  2515.        ToolbarOptions.ulToolbarPos == TOOLBARPOS_RIGHT)
  2516.       ulStyle |= TBS_VERTICAL;
  2517.  
  2518.  
  2519.    CtlData.cb = sizeof(CtlData);
  2520.    CtlData.lButtonSpacing = 0;
  2521.    CtlData.lExtraSpacing = 5 ;
  2522.    CtlData.lBorderX =  2;
  2523.    CtlData.lBorderY =  2;
  2524.    WinCreateWindow(hwndFrame,
  2525.                    WC_TOOLBAR,
  2526.                    NULL,
  2527.                    ulStyle,
  2528.                    0, 0,
  2529.                    400, 80,
  2530.                    hwndFrame,
  2531.                    HWND_TOP,
  2532.                    FID_TOOLBAR,
  2533.                    &CtlData,
  2534.                    NULL);
  2535.  
  2536.    RefreshToolbar(WinWindowFromID(hwndFrame, FID_TOOLBAR), &ToolbarConfig, ToolbarOptions.bSmallToolbar);
  2537.  
  2538.    return 0;
  2539. }
  2540.  
  2541. int OpenToolbarContext(HWND hwndClient, PWINDOWDATA pWindowData, ULONG ulButtonID)
  2542. {
  2543.    POINTL pointl;
  2544.    extern TOOLBAROPTIONS ToolbarOptions;
  2545.  
  2546.    WinQueryPointerPos(HWND_DESKTOP, &pointl);
  2547.  
  2548.    if (!ulButtonID)
  2549.    {
  2550.       WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_TOP, FALSE);
  2551.       WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_BOTTOM, FALSE);
  2552.       WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_LEFT, FALSE);
  2553.       WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_RIGHT, FALSE);
  2554.  
  2555.       switch(ToolbarOptions.ulToolbarPos)
  2556.       {
  2557.          case TOOLBARPOS_TOP:
  2558.             WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_TOP, TRUE);
  2559.             break;
  2560.  
  2561.          case TOOLBARPOS_BOTTOM:
  2562.             WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_BOTTOM, TRUE);
  2563.             break;
  2564.  
  2565.          case TOOLBARPOS_LEFT:
  2566.             WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_LEFT, TRUE);
  2567.             break;
  2568.  
  2569.          case TOOLBARPOS_RIGHT:
  2570.             WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_RIGHT, TRUE);
  2571.             break;
  2572.  
  2573.          default:
  2574.             break;
  2575.       }
  2576.       if (ToolbarOptions.bSmallToolbar)
  2577.          WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_SMALL, TRUE);
  2578.       else
  2579.          WinCheckMenuItem(pWindowData->hwndToolbarPopup, IDM_TB_SMALL, FALSE);
  2580.  
  2581.       WinPopupMenu(HWND_DESKTOP, hwndClient, pWindowData->hwndToolbarPopup,
  2582.                    pointl.x, pointl.y,
  2583.                    0,
  2584.                    PU_HCONSTRAIN | PU_VCONSTRAIN | PU_KEYBOARD | PU_MOUSEBUTTON1);
  2585.    }
  2586.  
  2587.    return 0;
  2588. }
  2589.  
  2590. int SwitchToolbarPos(HWND hwndClient, ULONG ulCommand)
  2591. {
  2592.    extern TOOLBAROPTIONS ToolbarOptions;
  2593.    extern DIRTYFLAGS dirtyflags;
  2594.    HWND hwndFrame = WinQueryWindow(hwndClient, QW_PARENT);
  2595.    HWND hwndToolbar = WinWindowFromID(hwndFrame, FID_TOOLBAR);
  2596.    ULONG ulStyle = WinQueryWindowULong(hwndToolbar, QWL_STYLE);
  2597.  
  2598.    switch(ulCommand)
  2599.    {
  2600.       case IDM_TB_TOP:
  2601.          ulStyle &= ~TBS_VERTICAL;
  2602.          ToolbarOptions.ulToolbarPos = TOOLBARPOS_TOP;
  2603.          break;
  2604.  
  2605.       case IDM_TB_BOTTOM:
  2606.          ulStyle &= ~TBS_VERTICAL;
  2607.          ToolbarOptions.ulToolbarPos = TOOLBARPOS_BOTTOM;
  2608.          break;
  2609.  
  2610.       case IDM_TB_LEFT:
  2611.          ulStyle |= TBS_VERTICAL;
  2612.          ToolbarOptions.ulToolbarPos = TOOLBARPOS_LEFT;
  2613.          break;
  2614.  
  2615.       case IDM_TB_RIGHT:
  2616.          ulStyle |= TBS_VERTICAL;
  2617.          ToolbarOptions.ulToolbarPos = TOOLBARPOS_RIGHT;
  2618.          break;
  2619.  
  2620.       default:
  2621.          break;
  2622.    }
  2623.    WinSetWindowULong(hwndToolbar, QWL_STYLE, ulStyle);
  2624.    SendMsg(hwndFrame, WM_UPDATEFRAME, NULL, NULL);
  2625.    dirtyflags.toolbardirty = TRUE;
  2626.  
  2627.    return 0;
  2628. }
  2629.  
  2630. int SwitchToolbarSize(HWND hwndClient)
  2631. {
  2632.    extern TOOLBAROPTIONS ToolbarOptions;
  2633.    extern DIRTYFLAGS dirtyflags;
  2634.    HWND hwndFrame = WinQueryWindow(hwndClient, QW_PARENT);
  2635.    HWND hwndToolbar = WinWindowFromID(hwndFrame, FID_TOOLBAR);
  2636.    TOOLBARITEM TBItem;
  2637.    ULONG ulResult;
  2638.  
  2639.    ToolbarOptions.bSmallToolbar = !ToolbarOptions.bSmallToolbar;
  2640.  
  2641.    WinEnableWindowUpdate(hwndToolbar, FALSE);
  2642.    ulResult = (ULONG) SendMsg(hwndToolbar, TBM_QUERYFIRSTITEM, &TBItem, NULL);
  2643.    while (ulResult == TBQUERY_OK)
  2644.    {
  2645.       TBItem.ulBitmapID = QueryBitmap(TBItem.ulCommandID, ToolbarOptions.bSmallToolbar);
  2646.       SendMsg(hwndToolbar, TBM_SETITEMDATA, NULL, &TBItem);
  2647.  
  2648.       ulResult = (ULONG) SendMsg(hwndToolbar, TBM_QUERYNEXTITEM, &TBItem, NULL);
  2649.    }
  2650.    WinEnableWindowUpdate(hwndToolbar, TRUE);
  2651.  
  2652.    SendMsg(hwndFrame, WM_UPDATEFRAME, NULL, NULL);
  2653.    dirtyflags.toolbardirty = TRUE;
  2654.  
  2655.    return 0;
  2656. }
  2657.  
  2658. void SetTranslateMode(BOOL bTranslate)
  2659. {
  2660.    extern HWND client;
  2661.  
  2662.    WinSendDlgItemMsg(client, IDML_MAINEDIT, MLM_SETTRANSLATE,
  2663.                      (MPARAM) bTranslate, NULL);
  2664.    WinSendDlgItemMsg(client, IDE_FROMNAME, MLM_SETTRANSLATE,
  2665.                      (MPARAM) bTranslate, NULL);
  2666.    WinSendDlgItemMsg(client, IDE_TONAME, MLM_SETTRANSLATE,
  2667.                      (MPARAM) bTranslate, NULL);
  2668.    WinSendDlgItemMsg(client, IDE_SUBJTEXT, MLM_SETTRANSLATE,
  2669.                      (MPARAM) bTranslate, NULL);
  2670.    return;
  2671. }
  2672.  
  2673. void BackToWindow(PWINDOWDATA pWindowData)
  2674. {
  2675.    extern HWND hwndAreaDlg, hwndFindResults, hwndThreadList, hwndMsgList;
  2676.  
  2677.    switch(pWindowData->ulSourceWindow)
  2678.    {
  2679.       case SOURCEWIN_AREA:
  2680.          if (hwndAreaDlg)
  2681.             SetFocusControl(hwndAreaDlg, IDD_AREALIST+1);
  2682.          break;
  2683.  
  2684.       case SOURCEWIN_MSGLIST:
  2685.          if (hwndMsgList)
  2686.             SetFocusControl(hwndMsgList, IDD_MSGLIST+1);
  2687.          break;
  2688.  
  2689.       case SOURCEWIN_THREAD:
  2690.          if (hwndThreadList)
  2691.             SetFocusControl(hwndThreadList, IDD_THREADLIST+1);
  2692.          break;
  2693.  
  2694.       case SOURCEWIN_BOOKMARKS:
  2695.          if (hwndFindResults)
  2696.             SetFocusControl(hwndFindResults, IDD_FINDRESULTS+1);
  2697.          break;
  2698.  
  2699.       default:
  2700.          break;
  2701.    }
  2702.  
  2703.    pWindowData->ulSourceWindow = SOURCEWIN_NONE;
  2704.  
  2705.    return;
  2706. }
  2707.  
  2708. int OpenProgressBar(PWINDOWDATA pWindowData, PCHAR pchAreaTag)
  2709. {
  2710.    STLFIELDINFO STLField;
  2711.    extern HWND frame;
  2712.    extern WINDOWCOLORS windowcolors;
  2713.    HWND hwndStatus = WinWindowFromID(frame, FID_STATUSLINE);
  2714.  
  2715.    if (!pWindowData->idProgressField)
  2716.    {
  2717.       STLField.ulFlags=STLF_VARIABLE | STLF_3D | STLF_PROGRESS;
  2718.       STLField.lFieldSize=50;
  2719.       STLField.lColorForeground=windowcolors.statusfore;
  2720.       STLField.pszFontName=NULL;
  2721.       STLField.ulTimeout = 0;
  2722.  
  2723.       SendMsg(hwndStatus, STLM_SETTIMEOUT, MPFROMLONG(pWindowData->idMessageField), MPFROMLONG(0));
  2724.       SendMsg(hwndStatus, STLM_SETFIELDWIDTH, MPFROMLONG(pWindowData->idMessageField), MPFROMLONG(50));
  2725.  
  2726.       pWindowData->idProgressField = (ULONG) SendMsg(hwndStatus, STLM_ADDFIELD,
  2727.                                             &STLField, MPFROMLONG(pWindowData->idMessageField));
  2728.    }
  2729.    SendMsg(hwndStatus, STLM_SETFIELDTEXT, MPFROMLONG(pWindowData->idMessageField), pchAreaTag);
  2730.    SendMsg(hwndStatus, STLM_SETFIELDTEXT, MPFROMLONG(pWindowData->idProgressField), NULL);
  2731.    pWindowData->lLastProgress=0;
  2732.  
  2733.    return 0;
  2734. }
  2735.  
  2736. int CloseProgressBar(PWINDOWDATA pWindowData)
  2737. {
  2738.    extern HWND frame;
  2739.    HWND hwndStatus = WinWindowFromID(frame, FID_STATUSLINE);
  2740.  
  2741.    SendMsg(hwndStatus, STLM_SETFIELDWIDTH, MPFROMLONG(pWindowData->idMessageField), MPFROMLONG(100));
  2742.    SendMsg(hwndStatus, STLM_SETTIMEOUT, MPFROMLONG(pWindowData->idMessageField), MPFROMLONG(MSGTIMEOUT));
  2743.    SendMsg(hwndStatus, STLM_REMOVEFIELD, MPFROMLONG(pWindowData->idProgressField), NULL);
  2744.    pWindowData->idProgressField = 0;
  2745.    pWindowData->lLastProgress=0;
  2746.    SendMsg(hwndStatus, STLM_SETFIELDTEXT, MPFROMLONG(pWindowData->idMessageField), "");
  2747.  
  2748.    return 0;
  2749. }
  2750.  
  2751. int ProgressBarProgress(PWINDOWDATA pWindowData, LONG lPercent)
  2752. {
  2753.    extern HWND frame;
  2754.    HWND hwndStatus = WinWindowFromID(frame, FID_STATUSLINE);
  2755.  
  2756.    if (lPercent/5 != pWindowData->lLastProgress)
  2757.    {
  2758.       pWindowData->lLastProgress = lPercent/5;
  2759.       SendMsg(hwndStatus, STLM_SETFIELDTEXT, MPFROMLONG(pWindowData->idProgressField),
  2760.               MPFROMLONG(lPercent));
  2761.    }
  2762.  
  2763.    return 0;
  2764. }
  2765.  
  2766. static MRESULT SetReadOnly(HWND hwnd, ULONG Control, BOOL bReadOnly)
  2767. {
  2768.    return WinSendDlgItemMsg(hwnd, Control, EM_SETREADONLY, (MPARAM) bReadOnly, NULL);
  2769. }
  2770.  
  2771. /*-------------------------------- Modulende --------------------------------*/
  2772.  
  2773.  
  2774.