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

  1. /*---------------------------------------------------------------------------+
  2.  | Titel: NICKNAMES.C                                                        |
  3.  +-----------------------------------------+---------------------------------+
  4.  | Erstellt von: Michael Hohner            | Am: 03.04.1995                  |
  5.  +-----------------------------------------+---------------------------------+
  6.  | System: OS/2 2.x                                                          |
  7.  +---------------------------------------------------------------------------+
  8.  | Beschreibung:                                                             |
  9.  |                                                                           |
  10.  |     Setup der Nicknames                                                   |
  11.  |                                                                           |
  12.  |                                                                           |
  13.  +---------------------------------------------------------------------------+
  14.  | Bemerkungen:                                                              |
  15.  +---------------------------------------------------------------------------*/
  16.  
  17. /*----------------------------- Header-Dateien ------------------------------*/
  18. #pragma strings(readonly)
  19.  
  20. #define INCL_WIN
  21. #include <os2.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <stdio.h>
  25.  
  26. #include "main.h"
  27. #include "resids.h"
  28. #include "messages.h"
  29. #include "structs.h"
  30. #include "msgheader.h"
  31. #include "areaman\areaman.h"
  32. #include "mainwindow.h"
  33. #include "fltv7\fltv7.h"
  34. #include "lookups.h"
  35. #include "dialogids.h"
  36. #include "utility.h"
  37. #include "handlemsg\handlemsg.h"
  38. #include "util\addrcnv.h"
  39. #include "controls\attrselect.h"
  40. #include "nickmanage.h"
  41. #include "nicknames.h"
  42.  
  43. /*--------------------------------- Defines ---------------------------------*/
  44.  
  45. #define UNREG_NICKNAMES  10
  46.  
  47. /*---------------------------------- Typen ----------------------------------*/
  48.  
  49. typedef struct {
  50.           RECORDCORE RecordCore;
  51.           PSZ pszNickName;
  52.           PSZ pszRealName;
  53.           PSZ pszAddress;
  54.         } NICKRECORD, *PNICKRECORD;
  55.  
  56. typedef struct {
  57.            USHORT cb;
  58.            char pchTitle[LEN_FIRSTLINE+1];
  59.            char pchLine[LEN_FIRSTLINE+1];
  60.          } PROMPTPAR;
  61.  
  62. typedef struct
  63. {
  64.    USHORT cb;
  65.    char pchNickSel[LEN_USERNAME+1];
  66. } NICKSELECT, *PNICKSELECT;
  67.  
  68. /*---------------------------- Globale Variablen ----------------------------*/
  69.  
  70. extern HMODULE hmodLang;
  71. extern HAB anchor;
  72.  
  73. PFNWP OldContainerProc;
  74.  
  75. /*--------------------------- Funktionsprototypen ---------------------------*/
  76.  
  77. /*----------------------- interne Funktionsprototypen -----------------------*/
  78.  
  79. static void UpdateNickList(HWND parent);
  80. static SHORT _System SortNicknames(PRECORDCORE p1, PRECORDCORE p2, PVOID pStorage);
  81. static MRESULT EXPENTRY NickEntryProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2);
  82. static MRESULT EXPENTRY NewNContainerProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2);
  83. static MRESULT EXPENTRY PromptProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2);
  84.  
  85. /*---------------------------------------------------------------------------*/
  86. /* Funktionsname:                                                            */
  87. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  88. /* Beschreibung:                                                             */
  89. /*                                                                           */
  90. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  91. /* Parameter:                                                                */
  92. /*                                                                           */
  93. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  94. /* Rückgabewerte:                                                            */
  95. /*                                                                           */
  96. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  97. /* Sonstiges:                                                                */
  98. /*                                                                           */
  99. /*---------------------------------------------------------------------------*/
  100.  
  101. static MRESULT EXPENTRY NewNContainerProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2)
  102. {
  103.    switch(message)
  104.    {
  105.       case DM_DRAGOVER:
  106.          DrgAccessDraginfo(mp1);
  107.          break;
  108.  
  109.       default:
  110.          break;
  111.    }
  112.    return OldContainerProc(parent, message, mp1, mp2);
  113. }
  114.  
  115. /*-----------------------------  AdrBookProc --------------------------------*/
  116. /* Dialog-Prozedur des Adressbuch-Dialogs                                    */
  117. /*---------------------------------------------------------------------------*/
  118.  
  119. MRESULT EXPENTRY AdrBookProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2)
  120. {
  121.    extern NICKNAMELIST NickNameList;
  122.    extern GENERALOPT generaloptions;
  123.    extern WINDOWFONTS windowfonts;
  124.    extern WINDOWCOLORS windowcolors;
  125.    extern HWND hwndhelp;
  126.    static char pchTitleNickname[100];
  127.    static char pchTitleRealname[100];
  128.    static char pchTitleAddress[100];
  129.    static bNotify;
  130.    PFIELDINFO pFieldInfo, pFirstFieldInfo;
  131.    FIELDINFOINSERT FieldInfoInsert;
  132.    CNRINFO cnrinfo;
  133.    PNICKRECORD pRecord;
  134.    extern BOOL isregistered;
  135.    MRESULT resultbuf;
  136.    PNICKNAME zeiger;
  137.    PNICKSELECT pNickSelect = WinQueryWindowPtr(parent, QWL_USER);
  138.  
  139.    switch(message)
  140.    {
  141.       case WM_COMMAND:
  142.          if (SHORT1FROMMP(mp2)==CMDSRC_PUSHBUTTON)
  143.          {
  144.             NICKPAR NickPar;
  145.  
  146.             switch (SHORT1FROMMP(mp1))
  147.             {
  148.                /* Add-Button */
  149.                case IDD_NICKNAMES+10:
  150.                   NickPar.cb=sizeof(NICKPAR);
  151.                   memset(&NickPar.entry, 0, sizeof(NickPar.entry));
  152.                   NickPar.bNewEntry=TRUE;
  153.                   NickPar.bDirectAdd=FALSE;
  154.  
  155.                   if (WinDlgBox(HWND_DESKTOP, parent, NickEntryProc,
  156.                                 hmodLang, IDD_NICKENTRY, &NickPar)!=DID_OK)
  157.                      return (MRESULT) FALSE;
  158.                   AddNickname(&NickNameList, &NickPar.entry, TRUE);
  159.                   if (NickPar.entry.pchComment)
  160.                      free(NickPar.entry.pchComment);
  161.                   UpdateNickList(parent);
  162.                   return (MRESULT) FALSE;
  163.  
  164.                /* Change-Button */
  165.                case IDD_NICKNAMES+13:
  166.                   pRecord=WinSendDlgItemMsg(parent, IDD_NICKNAMES+6, CM_QUERYRECORDEMPHASIS,
  167.                                             (MPARAM) CMA_FIRST,
  168.                                             MPFROMSHORT(CRA_SELECTED));
  169.                   if (pRecord)
  170.                   {
  171.                      /* Eintrag suchen */
  172.                      zeiger=FindNickname(&NickNameList, pRecord->pszNickName, NULL);
  173.                      if (zeiger)
  174.                      {
  175.                         NickPar.cb=sizeof(NICKPAR);
  176.                         memcpy(&NickPar.entry, zeiger, sizeof(NickPar.entry));
  177.                         if (zeiger->pchComment)
  178.                            NickPar.entry.pchComment = strdup(zeiger->pchComment);
  179.                         NickPar.bNewEntry=FALSE;
  180.                         NickPar.pEntry=zeiger;
  181.                         if (WinDlgBox(HWND_DESKTOP, parent, NickEntryProc,
  182.                                       hmodLang, IDD_NICKENTRY, &NickPar)!=DID_OK)
  183.                            return (MRESULT) FALSE;
  184.                         ChangeNickname(&NickNameList, zeiger, &NickPar.entry);
  185.                         if (NickPar.entry.pchComment)
  186.                            free(NickPar.entry.pchComment);
  187.                         UpdateNickList(parent);
  188.                      }
  189.                      else
  190.                         WinAlarm(HWND_DESKTOP, WA_ERROR);
  191.                   }
  192.                   else
  193.                      WinAlarm(HWND_DESKTOP, WA_ERROR);
  194.                   return (MRESULT) FALSE;
  195.  
  196.                /* Delete-Button */
  197.                case IDD_NICKNAMES+11:
  198.                   if (generaloptions.safety & SAFETY_CHANGESETUP)
  199.                   {
  200.                      if (MessageBox(parent, IDST_MSG_DELNICKNAME, IDST_TITLE_DELNICKNAME,
  201.                                     IDD_DELNICKNAME, MB_YESNO | MB_ICONQUESTION)==MBID_NO)
  202.                         return (MRESULT) FALSE;
  203.                   }
  204.                   pRecord=WinSendDlgItemMsg(parent, IDD_NICKNAMES+6, CM_QUERYRECORDEMPHASIS,
  205.                                             (MPARAM) CMA_FIRST,
  206.                                             MPFROMSHORT(CRA_SELECTED));
  207.                   if (pRecord)
  208.                   {
  209.                      /* Eintrag loeschen */
  210.                      DeleteNickname(&NickNameList, pRecord->pszNickName);
  211.                   }
  212.                   else
  213.                      WinAlarm(HWND_DESKTOP, WA_ERROR);
  214.                   UpdateNickList(parent);
  215.                   return (MRESULT) FALSE;
  216.  
  217.                case DID_OK:
  218.                   if (pNickSelect)
  219.                   {
  220.                      /* selektierten Nickname zurückgeben */
  221.                      pRecord=WinSendDlgItemMsg(parent, IDD_NICKNAMES+6, CM_QUERYRECORDEMPHASIS,
  222.                                                (MPARAM) CMA_FIRST,
  223.                                                MPFROMSHORT(CRA_CURSORED));
  224.                      if (pRecord)
  225.                         strcpy(pNickSelect->pchNickSel, pRecord->pszNickName);
  226.                      else
  227.                         pNickSelect->pchNickSel[0]=0;
  228.                   }
  229.                   break;
  230.  
  231.                default:
  232.                   break;
  233.             }
  234.          }
  235.          break;
  236.  
  237.       /* Doppelklick auf Eintrag */
  238.       case WM_CONTROL:
  239.          if (SHORT1FROMMP(mp1)==IDD_NICKNAMES+6)
  240.          {
  241.             if (SHORT2FROMMP(mp1)==CN_ENTER)
  242.             {
  243.                if (pNickSelect)
  244.                   WinPostMsg(parent, WM_COMMAND, MPFROMSHORT(DID_OK),
  245.                              MPFROMSHORT(CMDSRC_PUSHBUTTON));
  246.                else
  247.                   if (((PNOTIFYRECORDENTER)mp2)->pRecord)
  248.                      SendMsg(parent, WM_COMMAND, MPFROMSHORT(IDD_NICKNAMES+13),
  249.                                 MPFROMSHORT(CMDSRC_PUSHBUTTON));
  250.             }
  251.  
  252.             if (SHORT2FROMMP(mp1)==CN_HELP)
  253.                SendMsg(parent, WM_HELP, MPFROMSHORT(IDD_NICKNAMES+6), NULL);
  254.          }
  255.          break;
  256.  
  257.       case WM_ACTIVATE:
  258.          if (mp1)
  259.             WinAssociateHelpInstance(hwndhelp, parent);
  260.          else
  261.             WinAssociateHelpInstance(hwndhelp, NULLHANDLE);
  262.          break;
  263.  
  264.       case WM_QUERYTRACKINFO:
  265.          {
  266.             SWP swp;
  267.  
  268.             /* Default-Werte aus Original-Prozedur holen */
  269.             resultbuf=WinDefDlgProc(parent,message,mp1,mp2);
  270.  
  271.             WinQueryWindowPos(WinWindowFromID(parent, IDD_NICKNAMES+12),
  272.                               &swp);
  273.  
  274.             /* Minimale Fenstergroesse einstellen */
  275.             ((PTRACKINFO)mp2)->ptlMinTrackSize.x=swp.x+swp.cx+5;
  276.             ((PTRACKINFO)mp2)->ptlMinTrackSize.y=200;
  277.          }
  278.          return resultbuf;
  279.  
  280.       case WM_ADJUSTFRAMEPOS:
  281.          if (((PSWP)mp1)->fl & (SWP_SIZE|SWP_MAXIMIZE|SWP_MINIMIZE|SWP_RESTORE))
  282.          {
  283.             SWP swp;
  284.             RECTL rectl;
  285.  
  286.             rectl.xLeft=0;
  287.             rectl.xRight=((PSWP)mp1)->cx;
  288.             rectl.yBottom=0;
  289.             rectl.yTop=((PSWP)mp1)->cy;
  290.  
  291.             CalcClientRect(anchor, parent, &rectl);
  292.             WinQueryWindowPos(WinWindowFromID(parent, DID_OK), &swp);
  293.             rectl.yBottom += swp.y + swp.cy;
  294.             WinSetWindowPos(WinWindowFromID(parent, IDD_NICKNAMES+6),
  295.                             NULLHANDLE,
  296.                             rectl.xLeft, rectl.yBottom,
  297.                             rectl.xRight-rectl.xLeft, rectl.yTop-rectl.yBottom,
  298.                             SWP_MOVE | SWP_SIZE);
  299.          }
  300.          break;
  301.  
  302.       case WM_INITDLG:
  303.          OldContainerProc=WinSubclassWindow(WinWindowFromID(parent, IDD_NICKNAMES+6),
  304.                                             NewNContainerProc);
  305.  
  306.          WinSetWindowPtr(parent, QWL_USER, (PNICKSELECT) mp2);
  307.  
  308.          SetFont(WinWindowFromID(parent, IDD_NICKNAMES+6), windowfonts.nicknamesfont);
  309.          SetForeground(WinWindowFromID(parent, IDD_NICKNAMES+6), &windowcolors.nicknamesfore);
  310.          SetBackground(WinWindowFromID(parent, IDD_NICKNAMES+6), &windowcolors.nicknamesback);
  311.  
  312.          /* Titelstrings laden */
  313.          LoadString(IDST_NICK_NICKNAME, 100, pchTitleNickname);
  314.          LoadString(IDST_NICK_REALNAME, 100, pchTitleRealname);
  315.          LoadString(IDST_NICK_ADDRESS,  100, pchTitleAddress);
  316.  
  317.          /* Container vorbereiten */
  318.          pFirstFieldInfo = WinSendDlgItemMsg(parent, IDD_NICKNAMES+6,
  319.                            CM_ALLOCDETAILFIELDINFO, MPFROMLONG(3), NULL);
  320.          pFieldInfo=pFirstFieldInfo;
  321.  
  322.          pFieldInfo->cb = sizeof(FIELDINFO);
  323.          pFieldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_LEFT | CFA_SEPARATOR;
  324.          pFieldInfo->flTitle = CFA_FITITLEREADONLY;
  325.          pFieldInfo->pTitleData = pchTitleNickname;
  326.          pFieldInfo->offStruct = FIELDOFFSET(NICKRECORD, pszNickName);
  327.          pFieldInfo = pFieldInfo->pNextFieldInfo;
  328.  
  329.          pFieldInfo->cb = sizeof(FIELDINFO);
  330.          pFieldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_LEFT | CFA_SEPARATOR;
  331.          pFieldInfo->flTitle = CFA_FITITLEREADONLY;
  332.          pFieldInfo->pTitleData = pchTitleRealname;
  333.          pFieldInfo->offStruct = FIELDOFFSET(NICKRECORD, pszRealName);
  334.          pFieldInfo = pFieldInfo->pNextFieldInfo;
  335.  
  336.          pFieldInfo->cb = sizeof(FIELDINFO);
  337.          pFieldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_LEFT;
  338.          pFieldInfo->flTitle = CFA_FITITLEREADONLY;
  339.          pFieldInfo->pTitleData = pchTitleAddress;
  340.          pFieldInfo->offStruct = FIELDOFFSET(NICKRECORD, pszAddress);
  341.          pFieldInfo = pFieldInfo->pNextFieldInfo;
  342.  
  343.          FieldInfoInsert.cb = (ULONG)(sizeof(FIELDINFOINSERT));
  344.          FieldInfoInsert.pFieldInfoOrder = (PFIELDINFO)CMA_FIRST;
  345.          FieldInfoInsert.cFieldInfoInsert = 3;
  346.          FieldInfoInsert.fInvalidateFieldInfo = TRUE;
  347.  
  348.          WinSendDlgItemMsg(parent, IDD_NICKNAMES+6, CM_INSERTDETAILFIELDINFO,
  349.                            MPFROMP(pFirstFieldInfo),
  350.                            MPFROMP(&FieldInfoInsert));
  351.  
  352.          cnrinfo.cb=sizeof(CNRINFO);
  353.          cnrinfo.flWindowAttr=CV_DETAIL | CA_DETAILSVIEWTITLES;
  354.          cnrinfo.pSortRecord=(PVOID)SortNicknames;
  355.          WinSendDlgItemMsg(parent,IDD_NICKNAMES+6, CM_SETCNRINFO, &cnrinfo,
  356.                             MPFROMLONG(CMA_FLWINDOWATTR | CMA_PSORTRECORD ));
  357.  
  358.          UpdateNickList(parent);
  359.          RestoreWinPos(parent, &NickNameList.FolderPos, TRUE, TRUE);
  360.          bNotify = TRUE;
  361.          break;
  362.  
  363.       case WM_DESTROY:
  364.          QueryFont(WinWindowFromID(parent, IDD_NICKNAMES+6), windowfonts.nicknamesfont);
  365.          QueryForeground(WinWindowFromID(parent, IDD_NICKNAMES+6), &windowcolors.nicknamesfore);
  366.          QueryBackground(WinWindowFromID(parent, IDD_NICKNAMES+6), &windowcolors.nicknamesback);
  367.          bNotify=FALSE;
  368.          break;
  369.  
  370.       case WM_WINDOWPOSCHANGED:
  371.          if (bNotify)
  372.             SaveWinPos(parent, (PSWP) mp1, &NickNameList.FolderPos, &NickNameList.bDirty);
  373.          break;
  374.  
  375.       default:
  376.          break;
  377.    }
  378.    return WinDefDlgProc(parent,message,mp1,mp2);
  379. }
  380.  
  381. /*-----------------------------  SortNicknames  -----------------------------*/
  382. /* Nicknameliste sortieren                                                   */
  383. /*---------------------------------------------------------------------------*/
  384.  
  385. static SHORT _System SortNicknames(PRECORDCORE p1, PRECORDCORE p2, PVOID pStorage)
  386. {
  387.    pStorage=pStorage;
  388.  
  389.    return stricmp(((NICKRECORD*)p1)->pszNickName, ((NICKRECORD*)p2)->pszNickName);
  390. }
  391.  
  392.  
  393. /*-----------------------------  UpdateNickList -----------------------------*/
  394. /* Nicknameliste neu fuellen                                                 */
  395. /*---------------------------------------------------------------------------*/
  396.  
  397. static void UpdateNickList(HWND parent)
  398. {
  399.    extern NICKNAMELIST NickNameList;
  400.    PNICKNAME zeiger;
  401.    HWND hwndListe=NULLHANDLE;
  402.    RECORDINSERT RecordInsert;
  403.    PNICKRECORD pRecord, pFirstRecord;
  404.  
  405.    hwndListe=WinWindowFromID(parent, IDD_NICKNAMES+6);
  406.  
  407.    WinEnableWindowUpdate(hwndListe, FALSE);
  408.  
  409.    /* Liste loeschen */
  410.    SendMsg(hwndListe, CM_REMOVERECORD, NULL,
  411.               MPFROM2SHORT(0, CMA_FREE | CMA_INVALIDATE));
  412.  
  413.    /* Elemente zaehlen */
  414.    if (NickNameList.ulNumEntries)
  415.    {
  416.       /* Speicher anfordern */
  417.       pFirstRecord=SendMsg(hwndListe, CM_ALLOCRECORD,
  418.                               MPFROMLONG(sizeof(NICKRECORD)-sizeof(RECORDCORE)),
  419.                               MPFROMLONG(NickNameList.ulNumEntries));
  420.       pRecord=pFirstRecord;
  421.  
  422.       /* Records vorbereiten */
  423.       zeiger=NULL;
  424.       while (zeiger = FindNickname(&NickNameList, NULL, zeiger))
  425.       {
  426.          pRecord->RecordCore.flRecordAttr=0;
  427.          pRecord->pszNickName=zeiger->usertag;
  428.          pRecord->pszRealName=zeiger->username;
  429.          pRecord->pszAddress=zeiger->address;
  430.  
  431.          pRecord=(PNICKRECORD)pRecord->RecordCore.preccNextRecord;
  432.       }
  433.       /* Records einfuegen */
  434.  
  435.       RecordInsert.cb=sizeof(RECORDINSERT);
  436.       RecordInsert.pRecordOrder=(PRECORDCORE) CMA_FIRST;
  437.       RecordInsert.pRecordParent=NULL;
  438.       RecordInsert.fInvalidateRecord=TRUE;
  439.       RecordInsert.zOrder=CMA_TOP;
  440.       RecordInsert.cRecordsInsert=NickNameList.ulNumEntries;
  441.  
  442.       SendMsg(hwndListe, CM_INSERTRECORD, pFirstRecord, &RecordInsert);
  443.    }
  444.  
  445.    WinEnableWindowUpdate(hwndListe, TRUE);
  446.  
  447.    /* Leere Liste */
  448.    if (!NickNameList.ulNumEntries)
  449.    {
  450.       WinEnableControl(parent, IDD_NICKNAMES+11, FALSE);
  451.       WinEnableControl(parent, IDD_NICKNAMES+13, FALSE);
  452.    }
  453.    else
  454.    {
  455.       WinEnableControl(parent, IDD_NICKNAMES+11, TRUE);
  456.       WinEnableControl(parent, IDD_NICKNAMES+13, TRUE);
  457.    }
  458.    return;
  459. }
  460.  
  461. /*----------------------------- NickEntryProc -------------------------------*/
  462. /* Dialog-Prozedur des Nickname-Eintrag-Dialogs                              */
  463. /*---------------------------------------------------------------------------*/
  464.  
  465. static MRESULT EXPENTRY NickEntryProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2)
  466. {
  467.    static NICKPAR *NickPar;
  468.    extern HWND hwndhelp;
  469.    extern WINDOWPOSITIONS windowpositions;
  470.    extern HAB anchor;
  471.    extern NICKNAMELIST NickNameList;
  472.    extern USERDATAOPT userdaten;
  473.  
  474.    switch(message)
  475.    {
  476.       case WM_INITDLG:
  477.          NickPar=(NICKPAR*) mp2;
  478.          WinAssociateHelpInstance(hwndhelp, parent);
  479.  
  480.          /* Textlimits */
  481.          WinSendDlgItemMsg(parent,IDD_NICKENTRY+1, EM_SETTEXTLIMIT,
  482.                            MPFROMSHORT(LEN_USERNAME), NULL);
  483.  
  484.          WinSendDlgItemMsg(parent,IDD_NICKENTRY+2, EM_SETTEXTLIMIT,
  485.                            MPFROMSHORT(LEN_USERNAME), NULL);
  486.  
  487.          WinSendDlgItemMsg(parent,IDD_NICKENTRY+3, EM_SETTEXTLIMIT,
  488.                            MPFROMSHORT(LEN_5DADDRESS), NULL);
  489.  
  490.          WinSendDlgItemMsg(parent,IDD_NICKENTRY+4, EM_SETTEXTLIMIT,
  491.                            MPFROMSHORT(LEN_SUBJECT), NULL);
  492.  
  493.          WinSendDlgItemMsg(parent,IDD_NICKENTRY+16, EM_SETTEXTLIMIT,
  494.                            MPFROMSHORT(LEN_FIRSTLINE), NULL);
  495.  
  496.          /* Texte */
  497.          WinSetDlgItemText(parent, IDD_NICKENTRY+1, NickPar->entry.usertag);
  498.          if (NickPar->entry.usertag[0])
  499.             WinEnableControl(parent, DID_OK, TRUE);
  500.          WinSetDlgItemText(parent, IDD_NICKENTRY+2, NickPar->entry.username);
  501.          WinSetDlgItemText(parent, IDD_NICKENTRY+3, NickPar->entry.address);
  502.          WinSetDlgItemText(parent, IDD_NICKENTRY+4, NickPar->entry.subjectline);
  503.          WinSetDlgItemText(parent, IDD_NICKENTRY+16, NickPar->entry.firstline);
  504.  
  505.          /* Default-Flags */
  506.          WinSendDlgItemMsg(parent, IDD_NICKENTRY+11, ATTSM_SETATTRIB,
  507.                            MPFROMLONG(NickPar->entry.ulAttrib),
  508.                            MPFROMLONG(ATTRIB_ALL));
  509.  
  510.          if (NickPar->entry.ulFlags & NICKFLAG_NOTEMPLATE)
  511.             WinCheckButton(parent, IDD_NICKENTRY+18, TRUE);
  512.  
  513.          RestoreWinPos(parent, &windowpositions.nickentrypos, FALSE, TRUE);
  514.          break;
  515.  
  516.       case WM_DESTROY:
  517.       case WM_CLOSE:
  518.          QueryWinPos(parent, &windowpositions.nickentrypos);
  519.          WinAssociateHelpInstance(hwndhelp, WinQueryWindow(parent, QW_OWNER));
  520.          break;
  521.  
  522.       case WM_COMMAND:
  523.          if (SHORT1FROMMP(mp1)==DID_OK)
  524.          {
  525.             WinQueryDlgItemText(parent, IDD_NICKENTRY+1, LEN_USERNAME+1,
  526.                                 NickPar->entry.usertag);
  527.             if (NickPar->bNewEntry)
  528.             {
  529.                if (FindNickname(&NickNameList, NickPar->entry.usertag, NULL))
  530.                {
  531.                   if (!NickPar->bDirectAdd)
  532.                   {
  533.                      /* Nickname schon vorhanden */
  534.                      MessageBox(parent, IDST_MSG_HAVENICKNAME, 0, IDD_HAVENICKNAME,
  535.                                    MB_OK | MB_ERROR);
  536.                      return (MRESULT) FALSE;
  537.                   }
  538.                   else
  539.                   {
  540.                      if (MessageBox(parent, IDST_MSG_REPLACENICK, IDST_TITLE_REPLACENICK,
  541.                                     IDD_REPLACENICK, MB_YESNO | MB_QUERY)!=MBID_YES)
  542.                         return (MRESULT) FALSE;
  543.                   }
  544.                }
  545.             }
  546.             else
  547.             {
  548.                if (FindNickname(&NickNameList, NickPar->entry.usertag, NULL) &&
  549.                    FindNickname(&NickNameList, NickPar->entry.usertag, NULL) != NickPar->pEntry)
  550.                {
  551.                   /* Nickname schon vorhanden */
  552.                   MessageBox(parent, IDST_MSG_HAVENICKNAME, 0, IDD_HAVENICKNAME,
  553.                                 MB_OK | MB_ERROR);
  554.                   return (MRESULT) FALSE;
  555.                }
  556.             }
  557.             WinQueryDlgItemText(parent, IDD_NICKENTRY+2, LEN_USERNAME+1,
  558.                                 NickPar->entry.username);
  559.             WinQueryDlgItemText(parent, IDD_NICKENTRY+3, LEN_5DADDRESS+1,
  560.                                 NickPar->entry.address);
  561.             WinQueryDlgItemText(parent, IDD_NICKENTRY+4, LEN_SUBJECT+1,
  562.                                 NickPar->entry.subjectline);
  563.             WinQueryDlgItemText(parent, IDD_NICKENTRY+16, LEN_FIRSTLINE+1,
  564.                                 NickPar->entry.firstline);
  565.  
  566.             NickPar->entry.ulAttrib= (ULONG) WinSendDlgItemMsg(parent, IDD_NICKENTRY+11,
  567.                                                 ATTSM_QUERYATTRIB, NULL, NULL);
  568.  
  569.             NickPar->entry.ulFlags = 0;
  570.             if (WinQueryButtonCheckstate(parent, IDD_NICKENTRY+18))
  571.                NickPar->entry.ulFlags |= NICKFLAG_NOTEMPLATE;
  572.          }
  573.  
  574.          if (SHORT1FROMMP(mp1)==IDD_NICKENTRY+17)
  575.          {
  576.             char FoundName[LEN_USERNAME+1];
  577.             char FoundAddress[LEN_5DADDRESS+1];
  578.  
  579.             WinQueryDlgItemText(parent, IDD_NICKENTRY+2, sizeof(FoundName), FoundName);
  580.             if (PerformNameLookup(FoundName, parent, LOOKUP_NORMAL, FoundName, FoundAddress))
  581.             {
  582.                WinSetDlgItemText(parent, IDD_NICKENTRY+2, FoundName);
  583.                WinSetDlgItemText(parent, IDD_NICKENTRY+3, FoundAddress);
  584.             }
  585.             return (MRESULT) FALSE;
  586.          }
  587.          break;
  588.  
  589.       case WM_CHAR:
  590.          if (WinQueryDlgItemTextLength(parent, IDD_NICKENTRY+1))
  591.             WinEnableControl(parent, DID_OK, TRUE);
  592.          else
  593.             WinEnableControl(parent, DID_OK, FALSE);
  594.          break;
  595.  
  596.       case WM_CONTROL:
  597.          if (SHORT1FROMMP(mp1)==IDD_NICKENTRY+3)
  598.             if (SHORT2FROMMP(mp1)==EN_KILLFOCUS)
  599.             {
  600.                FTNADDRESS NetAddr;
  601.                char pchTemp[LEN_5DADDRESS+1];
  602.  
  603.                WinQueryDlgItemText(parent, SHORT1FROMMP(mp1),
  604.                                    LEN_5DADDRESS+1, pchTemp);
  605.                StringToNetAddr(pchTemp, &NetAddr, userdaten.address[0]);
  606.                NetAddrToString(pchTemp, &NetAddr);
  607.                WinSetDlgItemText(parent, SHORT1FROMMP(mp1), pchTemp);
  608.             }
  609.          break;
  610.  
  611.       default:
  612.          break;
  613.    }
  614.    return WinDefDlgProc(parent,message,mp1,mp2);
  615. }
  616.  
  617. /*---------------------------------------------------------------------------*/
  618. /* Funktionsname: AddToNick                                                  */
  619. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  620. /* Beschreibung: Fuegt aktuellen Absender zu Nicknames dazu                  */
  621. /*                                                                           */
  622. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  623. /* Parameter: hwndOwner: Owner-Window                                        */
  624. /*            pHeader: zeiger auf aktuellen Header                           */
  625. /*                                                                           */
  626. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  627. /* Rückgabewerte: -                                                          */
  628. /*                                                                           */
  629. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  630. /* Sonstiges:                                                                */
  631. /*                                                                           */
  632. /*---------------------------------------------------------------------------*/
  633.  
  634. void AddToNick(HWND hwndOwner, MSGHEADER *pHeader)
  635. {
  636.    extern NICKNAMELIST NickNameList;
  637.    extern HWND client;
  638.    NICKPAR NickPar;
  639.    PNICKNAME zeiger=NULL;
  640.    extern BOOL isregistered;
  641.  
  642.    NickPar.cb=sizeof(NICKPAR);
  643.    memset(&NickPar.entry, 0, sizeof(NickPar.entry));
  644.    NickPar.bNewEntry=TRUE;
  645.    NickPar.bDirectAdd=TRUE;
  646.  
  647.    /* Name und Adresse fuellen */
  648.    memcpy(NickPar.entry.username, pHeader->pchFromName, LEN_USERNAME);
  649.    NetAddrToString(NickPar.entry.address, &pHeader->FromAddress);
  650.  
  651.    SendMsg(client, WORKM_DISABLEVIEWS, NULL, NULL);
  652.  
  653.    if (WinDlgBox(HWND_DESKTOP, hwndOwner, NickEntryProc,
  654.                  hmodLang, IDD_NICKENTRY, &NickPar)!=DID_OK)
  655.    {
  656.       SendMsg(client, WORKM_ENABLEVIEWS, NULL, NULL);
  657.       return;
  658.    }
  659.  
  660.    zeiger= FindNickname(&NickNameList, NickPar.entry.usertag, NULL);
  661.    if (!zeiger)
  662.    {
  663.       /* noch nicht vorhanden */
  664.       AddNickname(&NickNameList, &NickPar.entry, TRUE);
  665.    }
  666.    else
  667.       /* schon vorhanden, aendern */
  668.       ChangeNickname(&NickNameList, zeiger, &NickPar.entry);
  669.  
  670.    SendMsg(client, WORKM_ENABLEVIEWS, NULL, NULL);
  671.  
  672.    return;
  673. }
  674.  
  675. /*----------------------------- LookupNickname  -----------------------------*/
  676. /* sucht den Nickname in der Nicknameliste, ersetzt ggf. Name, Adresse,      */
  677. /* und Subject, setzt Focus weiter.                                          */
  678. /* Rueckgabewerte: TRUE Nickname gefunden                                    */
  679. /*                 FALSE Nickname nicht gefunden                             */
  680. /*---------------------------------------------------------------------------*/
  681.  
  682. BOOL LookupNickname(HWND hwndClient, char *pchNick, PNICKNAMELIST Liste)
  683. {
  684.    PNICKNAME zeiger=NULL;
  685.    extern MSGHEADER CurrentHeader;
  686.    extern LONG iptInitialPos2;
  687.    extern BOOL bTemplateProcessed;
  688.    extern USERDATAOPT userdaten;
  689.    int iMatch;
  690.    FTNADDRESS tempAddr, tempAddr2;
  691.    char pchTemp[LEN_5DADDRESS+1];
  692.    NICKSELECT NickSelect;
  693.  
  694.    if (!*pchNick)
  695.    {
  696.       memset(&NickSelect, 0, sizeof(NickSelect));
  697.       NickSelect.cb = sizeof(NickSelect);
  698.  
  699.       if (WinDlgBox(HWND_DESKTOP, hwndClient, AdrBookProc, hmodLang,
  700.                     IDD_NICKNAMES, &NickSelect) == DID_OK)
  701.          pchNick = NickSelect.pchNickSel;
  702.       else
  703.          return TRUE;
  704.    }
  705.  
  706.    zeiger=FindNickname(Liste, pchNick, NULL);
  707.  
  708.    /* nicht gefunden oder Liste leer */
  709.    if (!zeiger)
  710.       return FALSE;
  711.  
  712.    WinSetDlgItemText(hwndClient, IDE_TONAME, zeiger->username);
  713.    WinSetDlgItemText(hwndClient, IDE_TOADDRESS, zeiger->address);
  714.    StringToNetAddr(zeiger->address, &tempAddr, NULL);
  715.    WinQueryWindowText(WinWindowFromID(hwndClient, IDE_FROMADDRESS), LEN_5DADDRESS+1, pchTemp);
  716.    StringToNetAddr(pchTemp, &tempAddr2, NULL);
  717.    iMatch = MSG_MatchAddress(&tempAddr, &userdaten, &tempAddr2);
  718.    if (iMatch>=0)
  719.       WinSetDlgItemText(hwndClient, IDE_FROMADDRESS, userdaten.address[iMatch]);
  720.  
  721.    if (zeiger->ulFlags & NICKFLAG_NOTEMPLATE)
  722.       bTemplateProcessed=TRUE;
  723.    if (zeiger->subjectline[0])
  724.    {
  725.       WinSetDlgItemText(hwndClient, IDE_SUBJTEXT, zeiger->subjectline);
  726.       SetFocusControl(hwndClient, IDML_MAINEDIT);
  727.    }
  728.    else
  729.       SetFocusControl(hwndClient, IDE_SUBJTEXT);
  730.  
  731.    /* Attribute */
  732.    CurrentHeader.ulAttrib |= zeiger->ulAttrib;
  733.    DisplayAttrib(CurrentHeader.ulAttrib);
  734.  
  735.    /* erste Zeile vorbereiten */
  736.  
  737.    if (zeiger->firstline[0])
  738.    {
  739.       char pchBuffer[1000];
  740.       char *pchSrc, *pchDest;
  741.       long ipt=0;
  742.  
  743.       pchDest=pchBuffer;
  744.       pchSrc=zeiger->firstline;
  745.  
  746.       while(*pchSrc)
  747.       {
  748.          switch(*pchSrc)
  749.          {
  750.             case '%':
  751.                pchSrc++;
  752.                if (*pchSrc == '?')
  753.                {
  754.                   PROMPTPAR PromptPar;
  755.                   char *pchDest2;
  756.  
  757.                   PromptPar.cb=sizeof(PROMPTPAR);
  758.                   pchSrc++;
  759.  
  760.                   if (*pchSrc=='"')
  761.                   {
  762.                      pchSrc++;
  763.                      pchDest2=PromptPar.pchTitle;
  764.  
  765.                      while(*pchSrc && *pchSrc!='"')
  766.                         *pchDest2++ = *pchSrc++;
  767.                      *pchDest2='\0';
  768.                      if (*pchSrc)
  769.                         pchSrc++;
  770.                   }
  771.                   else
  772.                      PromptPar.pchTitle[0]='\0';
  773.  
  774.                   PromptPar.pchLine[0]='\0';
  775.                   if (WinDlgBox(HWND_DESKTOP, hwndClient, PromptProc, hmodLang,
  776.                                 IDD_NICKPROMPT, &PromptPar)==DID_OK)
  777.                   {
  778.                      char *pchTemp=PromptPar.pchLine;
  779.  
  780.                      while (*pchTemp)
  781.                         *pchDest++=*pchTemp++;
  782.                   }
  783.                }
  784.                else
  785.                {
  786.                   *pchDest++='%';
  787.                   *pchDest++ = *pchSrc++;
  788.                }
  789.                break;
  790.  
  791.             default:
  792.                *pchDest++ = *pchSrc++;
  793.                break;
  794.          }
  795.       }
  796.       *pchDest++='\n';
  797.       *pchDest++=' ';
  798.       *pchDest++='\n';
  799.       *pchDest='\0';
  800.  
  801.       /* Einfuegen */
  802.       WinSendDlgItemMsg(hwndClient, IDML_MAINEDIT, MLM_FORMAT,
  803.                         MPFROMSHORT(MLFIE_NOTRANS), NULL);
  804.       WinSendDlgItemMsg(hwndClient, IDML_MAINEDIT, MLM_SETIMPORTEXPORT,
  805.                         pchBuffer, MPFROMLONG(strlen(pchBuffer)));
  806.       WinSendDlgItemMsg(hwndClient, IDML_MAINEDIT, MLM_IMPORT,
  807.                         &ipt, MPFROMLONG(strlen(pchBuffer)));
  808.       iptInitialPos2+=strlen(pchBuffer);
  809.    }
  810.  
  811.    return TRUE;
  812. }
  813.  
  814. /*------------------------------ PromptProc     -----------------------------*/
  815. /* Fensterprozedur f. Nickname-Prompt                                        */
  816. /*---------------------------------------------------------------------------*/
  817.  
  818. static MRESULT EXPENTRY PromptProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2)
  819. {
  820.    extern WINDOWPOSITIONS windowpositions;
  821.    extern HWND frame, hwndhelp;
  822.    static PROMPTPAR *PromptPar;
  823.  
  824.    switch(message)
  825.    {
  826.       case WM_INITDLG:
  827.          PromptPar=(PROMPTPAR*) mp2;
  828.          WinAssociateHelpInstance(hwndhelp, parent);
  829.          WinSetDlgItemText(parent, IDD_NICKPROMPT+2, PromptPar->pchTitle);
  830.          WinSendDlgItemMsg(parent, IDD_NICKPROMPT+3, EM_SETTEXTLIMIT,
  831.                            MPFROMLONG(LEN_FIRSTLINE), NULL);
  832.          RestoreWinPos(parent, &windowpositions.promptpos, FALSE, TRUE);
  833.          break;
  834.  
  835.       case WM_COMMAND:
  836.          if (SHORT1FROMMP(mp1)==DID_OK)
  837.             WinQueryDlgItemText(parent, IDD_NICKPROMPT+3,
  838.                                 LEN_FIRSTLINE+1, PromptPar->pchLine);
  839.          break;
  840.  
  841.       case WM_CLOSE:
  842.       case WM_DESTROY:
  843.          WinAssociateHelpInstance(hwndhelp, frame);
  844.          QueryWinPos(parent, &windowpositions.promptpos);
  845.          break;
  846.  
  847.       default:
  848.          break;
  849.    }
  850.    return WinDefDlgProc(parent, message, mp1, mp2);
  851. }
  852.  
  853. /*-------------------------------- Modulende --------------------------------*/
  854.  
  855.