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

  1. /*---------------------------------------------------------------------------+
  2.  | Titel: FINDDLG.C                                                          |
  3.  +-----------------------------------------+---------------------------------+
  4.  | Erstellt von: Michael Hohner            | Am: 04.08.93                    |
  5.  +-----------------------------------------+---------------------------------+
  6.  | System: OS/2 2.x PM                                                       |
  7.  +---------------------------------------------------------------------------+
  8.  | Beschreibung:                                                             |
  9.  |                                                                           |
  10.  |     Find-Dialoge fuer Fleet Street                                        |
  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. #include <os2.h>
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include <ctype.h>
  28.  
  29. #include "main.h"
  30. #include "resids.h"
  31. #include "messages.h"
  32. #include "structs.h"
  33. #include "msgheader.h"
  34. #include "areaman\areaman.h"
  35. #include "dialogids.h"
  36. #include "handlemsg\handlemsg.h"
  37. #include "util\fltutil.h"
  38. #include "finddlg.h"
  39. #include "utility.h"
  40. #include "areadlg.h"
  41. #include "findexec.h"
  42. #include "markmanage.h"
  43. #include "msglist.h"
  44.  
  45. /*--------------------------------- Defines ---------------------------------*/
  46.  
  47. typedef struct {
  48.          HPOINTER icon;
  49.          BOOL AutoScroll;
  50.          char pchTArea[20];
  51.          char pchTNumber[20];
  52.          char pchTFrom[20];
  53.          char pchTSubject[20];
  54.          char pchCnrTitle[100];
  55.          HSWITCH hSwitch;
  56.          POINTL minsize;
  57.          HWND hwndPopup;
  58.          HWND hwndFolderPopup;
  59.          BOOL bKeyboard;
  60.          BOOL bForeground;
  61.          RESULTRECORD *pPopupRecord;
  62.          ULONG ulView;
  63.          ULONG ulDisable;
  64.          BOOL bNoUpdate;
  65.       } RESULTSDATA, *PRESULTSDATA;
  66.  
  67. #ifndef CRA_SOURCE
  68. #define CRA_SOURCE  0x00004000L    /* 2.1-spezifisch !!! */
  69. #endif
  70.  
  71. /*---------------------------- Globale Variablen ----------------------------*/
  72.  
  73. extern HWND client, frame;
  74. extern HWND hwndhelp;
  75. extern HMODULE hmodLang;
  76. extern AREALIST arealiste;
  77. extern WINDOWPOSITIONS windowpositions;
  78.  
  79. extern HWND hwndFindResults;
  80. extern HWND hwndFindDlg;
  81. extern volatile BOOL DoingFind;
  82. extern volatile BOOL StopFind;
  83. extern int tidFind;
  84. extern FINDJOB FindJob;
  85.  
  86. static PFNWP OldContainerProc;
  87.  
  88. /*--------------------------- Funktionsprototypen ---------------------------*/
  89.  
  90. static MRESULT EXPENTRY NewFContainerProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2);
  91. static int GetJobParams(HWND hwndDlg, PFINDJOB pFindJob);
  92. static MRESULT EXPENTRY PersmailProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  93. static void ResizeResults(HWND hwndDlg, PSWP pNewSize);
  94. static void CleanupResults(HWND hwndContainer);
  95. static int BookmarksPopup(HWND hwndDlg, PRESULTSDATA pResultsData, RESULTRECORD *pRecord);
  96. static void SwitchResultsView(HWND hwndDlg, PRESULTSDATA pResultsData, ULONG ulNewView);
  97. static void FillResultsWindow(HWND hwndDlg, PRESULTSDATA pResultsData);
  98. static void SetResultsTitle(HWND hwndDlg, PRESULTSDATA pResultsData, ULONG ulMenuID);
  99. static PWORKDATA CollectBookmarks(HWND hwndDlg, PRESULTSDATA pResultsData, ULONG ulWork,
  100.                                   PCHAR pchDestArea, PCHAR pchDestFile, ULONG ulOptions);
  101. static void UpdateGotoButton(HWND hwndDlg, PRESULTSDATA pResultsData);
  102. static SHORT _System SortResults(PRECORDCORE p1, PRECORDCORE p2, PVOID pStorage);
  103. static void CheckBoxClick1(HWND parent);
  104. static void CheckBoxClick2(HWND parent);
  105. static void BacklogText(PFINDJOB pFindJob);
  106. static void FillDropDown(HWND hwndDropDown, PFINDJOB pFindJob);
  107.  
  108. /*------------------------------ NewContainerProc ---------------------------*/
  109. /* Neue Window-Prozedur f. Container, um OS/2-Bug zu umschiffen              */
  110. /*---------------------------------------------------------------------------*/
  111.  
  112. static MRESULT EXPENTRY NewFContainerProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2)
  113. {
  114.    switch(message)
  115.    {
  116.       case DM_DRAGOVER:
  117.          DrgAccessDraginfo(mp1);
  118.          break;
  119.  
  120.       default:
  121.          break;
  122.    }
  123.    return OldContainerProc(parent, message, mp1, mp2);
  124. }
  125.  
  126.  
  127. /*-------------------------------  FindProc  --------------------------------*/
  128. /* Dialog-Prozedur des Such-Dialogs                                          */
  129. /*---------------------------------------------------------------------------*/
  130.  
  131. MRESULT EXPENTRY FindProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2)
  132. {
  133.    AREALISTPAR AreaListPar;
  134.    extern DIRTYFLAGS dirtyflags;
  135.  
  136.    switch(message)
  137.    {
  138.       case WM_INITDLG:
  139.          /* Initialisieren */
  140.          /* Text */
  141.  
  142.          FillDropDown(WinWindowFromID(parent, IDD_FINDTEXT+2), &FindJob);
  143.  
  144.          WinSetDlgItemText(parent, IDD_FINDTEXT+2, FindJob.pchBackTexts[0]);
  145.          WinSendDlgItemMsg(parent, IDD_FINDTEXT+2, EM_SETSEL,
  146.                            MPFROM2SHORT(0, 200), NULL);
  147.  
  148.          /* Where */
  149.          if (FindJob.ulWhere & FINDWHERE_FROM)
  150.             WinCheckButton(parent, IDD_FINDTEXT+5, TRUE);
  151.          if (FindJob.ulWhere & FINDWHERE_TO)
  152.             WinCheckButton(parent, IDD_FINDTEXT+6, TRUE);
  153.          if (FindJob.ulWhere & FINDWHERE_SUBJ)
  154.             WinCheckButton(parent, IDD_FINDTEXT+7, TRUE);
  155.          if (FindJob.ulWhere & FINDWHERE_TEXT)
  156.             WinCheckButton(parent, IDD_FINDTEXT+8, TRUE);
  157.  
  158.          /* WAreas */
  159.          if (FindJob.ulWAreas & FINDAREAS_NM)
  160.             WinCheckButton(parent, IDD_FINDTEXT+21, TRUE);
  161.          if (FindJob.ulWAreas & FINDAREAS_ECHO)
  162.             WinCheckButton(parent, IDD_FINDTEXT+22, TRUE);
  163.          if (FindJob.ulWAreas & FINDAREAS_LOCAL)
  164.             WinCheckButton(parent, IDD_FINDTEXT+23, TRUE);
  165.          if (FindJob.ulWAreas & FINDAREAS_PRIV)
  166.             WinCheckButton(parent, IDD_FINDTEXT+24, TRUE);
  167.  
  168.          switch(FindJob.ulWAreas & 0xf)
  169.          {
  170.             case FINDAREAS_CURRENT:
  171.                WinCheckButton(parent, IDD_FINDTEXT+18, TRUE);
  172.                break;
  173.  
  174.             case FINDAREAS_ALL:
  175.                WinCheckButton(parent, IDD_FINDTEXT+19, TRUE);
  176.                break;
  177.  
  178.             case FINDAREAS_CUSTOMN:
  179.                WinCheckButton(parent, IDD_FINDTEXT+25, TRUE);
  180.                break;
  181.  
  182.             case FINDAREAS_TYPE:
  183.                WinCheckButton(parent, IDD_FINDTEXT+27, TRUE);
  184.                break;
  185.  
  186.             default:
  187.                WinCheckButton(parent, IDD_FINDTEXT+18, TRUE);
  188.                break;
  189.          }
  190.  
  191.          switch(FindJob.ulHow & FINDHOW_METHOD_MASK)
  192.          {
  193.             case FINDHOW_SENS:
  194.                WinCheckButton(parent, IDD_FINDTEXT+10, TRUE);
  195.                break;
  196.  
  197.             case FINDHOW_CASE:
  198.                WinCheckButton(parent, IDD_FINDTEXT+11, TRUE);
  199.                break;
  200.  
  201.             case FINDHOW_FUZZY:
  202.                WinCheckButton(parent, IDD_FINDTEXT+12, TRUE);
  203.                break;
  204.  
  205.             case FINDHOW_REGEX:
  206.                WinCheckButton(parent, IDD_FINDTEXT+13, TRUE);
  207.                break;
  208.  
  209.             case FINDHOW_PERSMAIL:
  210.                WinCheckButton(parent, IDD_FINDTEXT+14, TRUE);
  211.                break;
  212.  
  213.             case FINDHOW_UNSENT:
  214.                WinCheckButton(parent, IDD_FINDTEXT+20, TRUE);
  215.                break;
  216.  
  217.             default:
  218.                break;
  219.          }
  220.          if (FindJob.ulHow & FINDHOW_UNREADONLY)
  221.             WinCheckButton(parent, IDD_FINDTEXT+29, TRUE);
  222.  
  223.          /* Controls aktivieren oder deaktivieren */
  224.          CheckBoxClick1(parent);
  225.          CheckBoxClick2(parent);
  226.  
  227.          /* Fuzzy-Levels initialisieren */
  228.          WinSendDlgItemMsg(parent, IDD_FINDTEXT+15, SPBM_SETLIMITS,
  229.                            MPFROMLONG(5), MPFROMLONG(1));
  230.          WinSendDlgItemMsg(parent, IDD_FINDTEXT+15, SPBM_SETCURRENTVALUE,
  231.                            MPFROMLONG(FindJob.ulFuzzyLevel), NULL);
  232.  
  233.          WinAssociateHelpInstance(hwndhelp, parent);
  234.          RestoreWinPos(parent, &windowpositions.findpos, FALSE, TRUE);
  235.          break;
  236.  
  237.       case WM_DESTROY:
  238.       case WM_CLOSE:
  239.          QueryWinPos(parent, &(windowpositions.findpos));
  240.          WinAssociateHelpInstance(hwndhelp, frame);
  241.          break;
  242.  
  243.       case WM_COMMAND:
  244.          if (SHORT1FROMMP(mp2)==CMDSRC_PUSHBUTTON)
  245.          {
  246.             switch(SHORT1FROMMP(mp1))
  247.             {
  248.                PFINDJOB pFindJob;
  249.  
  250.                case DID_OK:
  251.                   switch(GetJobParams(parent, &FindJob))
  252.                   {
  253.                      case 0: /* OK */
  254.                         if ((FindJob.ulWAreas & 0x0F) == FINDAREAS_CUSTOMN &&
  255.                             !FindJob.pchAreas)
  256.                         {
  257.                            MessageBox(parent, IDST_MSG_FINDNOAREAS, 0,
  258.                                       IDD_FINDNOAREAS, MB_OK | MB_ERROR);
  259.                            return (MRESULT) FALSE;
  260.                         }
  261.  
  262.                         pFindJob=malloc(sizeof(FINDJOB));
  263.                         memcpy(pFindJob, &FindJob, sizeof(FINDJOB));
  264.                         if (FindJob.pchAreas)
  265.                            pFindJob->pchAreas = strdup(FindJob.pchAreas);
  266.  
  267.                         tidFind=_beginthread(FindThread2, NULL, 0x20000, pFindJob);
  268.                         dirtyflags.finddirty=TRUE;
  269.                         break;
  270.  
  271.                      case 1:
  272.                         MessageBox(parent, IDST_MSG_FINDNOPARTS, 0,
  273.                                    IDD_FINDNOPARTS, MB_OK | MB_ERROR);
  274.                         return (MRESULT) FALSE;
  275.  
  276.                      case 2:
  277.                         MessageBox(parent, IDST_MSG_FINDNOAREAS, 0,
  278.                                    IDD_FINDNOAREAS, MB_OK | MB_ERROR);
  279.                         return (MRESULT) FALSE;
  280.  
  281.                      case 3:
  282.                         MessageBox(parent, IDST_MSG_FINDNOTEXT, 0,
  283.                                    IDD_FINDNOTEXT, MB_OK | MB_ERROR);
  284.                         return (MRESULT) FALSE;
  285.  
  286.                      default:
  287.                         return (MRESULT) FALSE;
  288.                   }
  289.  
  290.                   if (DoingFind)
  291.                   {
  292.                      WinAlarm(HWND_DESKTOP, WA_ERROR);
  293.                      return (MRESULT) FALSE;
  294.                   }
  295.                   break;
  296.  
  297.                case DID_CANCEL:
  298.                   break;
  299.  
  300.                case IDD_FINDTEXT+16: /* Configure */
  301.                   FindJob.PersMailOpt.cb=sizeof(PERSMAILOPT);
  302.                   WinDlgBox(HWND_DESKTOP, parent, PersmailProc, hmodLang,
  303.                             IDD_PERSMAILOPT, &FindJob.PersMailOpt);
  304.                   return (MRESULT) FALSE;
  305.  
  306.                case IDD_FINDTEXT+28: /* Select */
  307.                   AreaListPar.cb=sizeof(AREALISTPAR);
  308.                   AreaListPar.idTitle=0; /* @@ */
  309.                   if (FindJob.pchAreas)
  310.                      AreaListPar.pchString=strdup(FindJob.pchAreas);
  311.                   else
  312.                      AreaListPar.pchString=NULL;
  313.                   AreaListPar.ulIncludeTypes = INCLUDE_ALL;
  314.                   AreaListPar.bExtendedSel = TRUE;
  315.                   AreaListPar.bChange = FALSE;
  316.                   if (WinDlgBox(HWND_DESKTOP, parent, AreaListProc, hmodLang,
  317.                                 IDD_AREALIST, &AreaListPar) == DID_OK && AreaListPar.pchString)
  318.                   {
  319.                      if (FindJob.pchAreas)
  320.                         free(FindJob.pchAreas);
  321.                      FindJob.pchAreas = AreaListPar.pchString;
  322.                      dirtyflags.finddirty=TRUE;
  323.                   }
  324.                   return (MRESULT) FALSE;
  325.  
  326.                default:
  327.                   return (MRESULT) FALSE;
  328.             }
  329.          }
  330.          break;
  331.  
  332.       case WM_CONTROL:
  333.          switch(SHORT1FROMMP(mp1))
  334.          {
  335.             case IDD_FINDTEXT+18:
  336.             case IDD_FINDTEXT+19:
  337.             case IDD_FINDTEXT+25:
  338.             case IDD_FINDTEXT+27:
  339.                CheckBoxClick1(parent);
  340.                break;
  341.  
  342.             case IDD_FINDTEXT+10:
  343.             case IDD_FINDTEXT+14:
  344.             case IDD_FINDTEXT+13:
  345.             case IDD_FINDTEXT+12:
  346.             case IDD_FINDTEXT+11:
  347.             case IDD_FINDTEXT+20:
  348.                CheckBoxClick2(parent);
  349.                break;
  350.  
  351.             default:
  352.                break;
  353.          }
  354.          break;
  355.  
  356.       case WM_CHAR:
  357.          if (!DoingFind)
  358.             WinEnableControl(parent, DID_OK, TRUE);
  359.          else
  360.             WinEnableControl(parent, DID_OK, FALSE);
  361.          break;
  362.  
  363.       default:
  364.          break;
  365.    }
  366.    return WinDefDlgProc(parent,message,mp1,mp2);
  367. }
  368.  
  369. static void CheckBoxClick1(HWND parent)
  370. {
  371.    if (WinQueryButtonCheckstate(parent, IDD_FINDTEXT+27))
  372.    {
  373.       WinEnableControl(parent, IDD_FINDTEXT+21, TRUE);
  374.       WinEnableControl(parent, IDD_FINDTEXT+22, TRUE);
  375.       WinEnableControl(parent, IDD_FINDTEXT+23, TRUE);
  376.       WinEnableControl(parent, IDD_FINDTEXT+24, TRUE);
  377.    }
  378.    else
  379.    {
  380.       WinEnableControl(parent, IDD_FINDTEXT+21, FALSE);
  381.       WinEnableControl(parent, IDD_FINDTEXT+22, FALSE);
  382.       WinEnableControl(parent, IDD_FINDTEXT+23, FALSE);
  383.       WinEnableControl(parent, IDD_FINDTEXT+24, FALSE);
  384.    }
  385.  
  386.    if (WinQueryButtonCheckstate(parent, IDD_FINDTEXT+25))
  387.       WinEnableControl(parent, IDD_FINDTEXT+28, TRUE);
  388.    else
  389.       WinEnableControl(parent, IDD_FINDTEXT+28, FALSE);
  390.  
  391.    if (WinQueryButtonCheckstate(parent, IDD_FINDTEXT+18) ||
  392.        WinQueryButtonCheckstate(parent, IDD_FINDTEXT+25))
  393.       WinEnableControl(parent, IDD_FINDTEXT+26, FALSE);
  394.    else
  395.       WinEnableControl(parent, IDD_FINDTEXT+26, TRUE);
  396.  
  397.    return;
  398. }
  399.  
  400. static void CheckBoxClick2(HWND parent)
  401. {
  402.    if (WinQueryButtonCheckstate(parent, IDD_FINDTEXT+14) ||
  403.        WinQueryButtonCheckstate(parent, IDD_FINDTEXT+20))
  404.    {
  405.       WinEnableControl(parent, IDD_FINDTEXT+2, FALSE);
  406.       WinEnableControl(parent, IDD_FINDTEXT+5, FALSE);
  407.       WinEnableControl(parent, IDD_FINDTEXT+6, FALSE);
  408.       WinEnableControl(parent, IDD_FINDTEXT+7, FALSE);
  409.       WinEnableControl(parent, IDD_FINDTEXT+8, FALSE);
  410.       if (WinQueryButtonCheckstate(parent, IDD_FINDTEXT+14))
  411.          WinEnableControl(parent, IDD_FINDTEXT+16, TRUE);
  412.       else
  413.          WinEnableControl(parent, IDD_FINDTEXT+16, FALSE);
  414.    }
  415.    else
  416.    {
  417.       WinEnableControl(parent, IDD_FINDTEXT+2, TRUE);
  418.       WinEnableControl(parent, IDD_FINDTEXT+5, TRUE);
  419.       WinEnableControl(parent, IDD_FINDTEXT+6, TRUE);
  420.       WinEnableControl(parent, IDD_FINDTEXT+7, TRUE);
  421.       WinEnableControl(parent, IDD_FINDTEXT+8, TRUE);
  422.       WinEnableControl(parent, IDD_FINDTEXT+16, FALSE);
  423.    }
  424.  
  425.    if (WinQueryButtonCheckstate(parent, IDD_FINDTEXT+12))
  426.       WinEnableControl(parent, IDD_FINDTEXT+15, TRUE);
  427.    else
  428.       WinEnableControl(parent, IDD_FINDTEXT+15, FALSE);
  429.  
  430.    return;
  431. }
  432.  
  433. static void FillDropDown(HWND hwndDropDown, PFINDJOB pFindJob)
  434. {
  435.    int i=0;
  436.  
  437.    while (i < NUM_BACKTEXTS && pFindJob->pchBackTexts[i][0])
  438.    {
  439.       WinSendMsg(hwndDropDown, LM_INSERTITEM, MPFROMSHORT(LIT_END),
  440.                  pFindJob->pchBackTexts[i]);
  441.       i++;
  442.    }
  443.  
  444.    return;
  445. }
  446.  
  447. /*---------------------------------------------------------------------------*/
  448. /* Funktionsname: GetJobParams                                               */
  449. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  450. /* Beschreibung: Holt die Suchjob-Parameter aus dem Dialog                   */
  451. /*                                                                           */
  452. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  453. /* Parameter: hwndDlg: Dialog-Window                                         */
  454. /*            pFindJob: Zeiger auf Suchjob-Struktur                          */
  455. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  456. /* Rückgabewerte: 0  OK                                                      */
  457. /*                1  Keine zu durchsuchenden Message-Teile angegeben         */
  458. /*                2  Keine Area-Typen angegeben                              */
  459. /*                3  Kein Suchtext angegeben                                 */
  460. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  461. /* Sonstiges:                                                                */
  462. /*                                                                           */
  463. /*---------------------------------------------------------------------------*/
  464.  
  465. static int GetJobParams(HWND hwndDlg, PFINDJOB pFindJob)
  466. {
  467.    /* What */
  468.    WinQueryDlgItemText(hwndDlg, IDD_FINDTEXT+2, 200, pFindJob->pchWhat);
  469.  
  470.    BacklogText(pFindJob);
  471.  
  472.    /* Where */
  473.    pFindJob->ulWhere=0;
  474.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+5))
  475.       pFindJob->ulWhere |= FINDWHERE_FROM;
  476.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+6))
  477.       pFindJob->ulWhere |= FINDWHERE_TO;
  478.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+7))
  479.       pFindJob->ulWhere |= FINDWHERE_SUBJ;
  480.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+8))
  481.       pFindJob->ulWhere |= FINDWHERE_TEXT;
  482.  
  483.    /* How */
  484.    pFindJob->ulHow = 0;
  485.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+10))
  486.       pFindJob->ulHow = FINDHOW_SENS;
  487.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+11))
  488.       pFindJob->ulHow = FINDHOW_CASE;
  489.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+12))
  490.       pFindJob->ulHow = FINDHOW_FUZZY;
  491.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+13))
  492.       pFindJob->ulHow = FINDHOW_REGEX;
  493.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+14))
  494.       pFindJob->ulHow = FINDHOW_PERSMAIL;
  495.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+20))
  496.       pFindJob->ulHow = FINDHOW_UNSENT;
  497.  
  498.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+29))
  499.       pFindJob->ulHow |= FINDHOW_UNREADONLY;
  500.  
  501.    /* Areas */
  502.    pFindJob->ulWAreas = 0;
  503.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+18))
  504.       pFindJob->ulWAreas = FINDAREAS_CURRENT;
  505.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+19))
  506.       pFindJob->ulWAreas = FINDAREAS_ALL;
  507.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+27))
  508.       pFindJob->ulWAreas = FINDAREAS_TYPE;
  509.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+25))
  510.       pFindJob->ulWAreas = FINDAREAS_CUSTOMN;
  511.  
  512.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+21))
  513.       pFindJob->ulWAreas |= FINDAREAS_NM;
  514.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+22))
  515.       pFindJob->ulWAreas |= FINDAREAS_ECHO;
  516.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+23))
  517.       pFindJob->ulWAreas |= FINDAREAS_LOCAL;
  518.    if (WinQueryButtonCheckstate(hwndDlg, IDD_FINDTEXT+24))
  519.       pFindJob->ulWAreas |= FINDAREAS_PRIV;
  520.  
  521.    /* Fuzzy-Level */
  522.    WinSendDlgItemMsg(hwndDlg, IDD_FINDTEXT+15, SPBM_QUERYVALUE,
  523.                      &pFindJob->ulFuzzyLevel, MPFROM2SHORT(0, SPBQ_ALWAYSUPDATE));
  524.    if (pFindJob->ulFuzzyLevel > 5)
  525.       pFindJob->ulFuzzyLevel = 5;
  526.    if (pFindJob->ulFuzzyLevel < 1)
  527.       pFindJob->ulFuzzyLevel = 1;
  528.  
  529.    /* Pruefungen */
  530.    if ((pFindJob->ulHow & FINDHOW_METHOD_MASK) != FINDHOW_PERSMAIL &&
  531.        (pFindJob->ulHow & FINDHOW_METHOD_MASK) != FINDHOW_UNSENT   &&
  532.        pFindJob->ulWhere == 0)
  533.       return 1;  /* Keine Message-Teile */
  534.  
  535.    if ((pFindJob->ulWAreas & 0x0F) == FINDAREAS_TYPE &&
  536.        (pFindJob->ulWAreas & 0xF0) == 0)
  537.       return 2;  /* Keine Area-Typen */
  538.  
  539.    if ((pFindJob->ulHow & FINDHOW_METHOD_MASK) != FINDHOW_PERSMAIL &&
  540.        (pFindJob->ulHow & FINDHOW_METHOD_MASK) != FINDHOW_UNSENT &&
  541.        pFindJob->pchWhat[0]==0)
  542.       return 3;  /* kein Text */
  543.  
  544.    return 0;
  545. }
  546.  
  547. static void BacklogText(PFINDJOB pFindJob)
  548. {
  549.    int i=0;
  550.  
  551.    if (!pFindJob->pchWhat[0]) /* bei leerem Text nix machen */
  552.       return;
  553.  
  554.    /* Text in gemerkten suchen */
  555.    while (i < NUM_BACKTEXTS && strcmp(pFindJob->pchWhat, pFindJob->pchBackTexts[i]))
  556.       i++;
  557.  
  558.    if (i < NUM_BACKTEXTS)
  559.    {
  560.       /* gefunden */
  561.       if (i > 0)
  562.       {
  563.          /* mit erstem austauschen */
  564.          strcpy(pFindJob->pchBackTexts[i], pFindJob->pchBackTexts[0]);
  565.          strcpy(pFindJob->pchBackTexts[0], pFindJob->pchWhat);
  566.       }
  567.    }
  568.    else
  569.    {
  570.       /* nicht gefunden, vorne einfuegen */
  571.       memmove(pFindJob->pchBackTexts[1], pFindJob->pchBackTexts[0],
  572.               (NUM_BACKTEXTS-1)* sizeof(pFindJob->pchBackTexts[0]));
  573.       strcpy(pFindJob->pchBackTexts[0], pFindJob->pchWhat);
  574.    }
  575.  
  576.    return;
  577. }
  578.  
  579. /*---------------------------------------------------------------------------*/
  580. /* Funktionsname: PersmailProc                                               */
  581. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  582. /* Beschreibung: Window-Prozedur f. Personal-Mail-Scan-Optionen              */
  583. /*                                                                           */
  584. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  585. /* Parameter: Win-Proc                                                       */
  586. /*                                                                           */
  587. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  588. /* Rückgabewerte: MRESULT                                                    */
  589. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  590. /* Sonstiges:                                                                */
  591. /*                                                                           */
  592. /*---------------------------------------------------------------------------*/
  593.  
  594. static MRESULT EXPENTRY PersmailProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  595. {
  596.    extern DIRTYFLAGS dirtyflags;
  597.    PPERSMAILOPT pPersMailOpt = (PPERSMAILOPT) WinQueryWindowULong(hwnd, QWL_USER);
  598.  
  599.    switch(msg)
  600.    {
  601.       case WM_INITDLG:
  602.          pPersMailOpt = (PPERSMAILOPT) mp2;
  603.          WinSetWindowULong(hwnd, QWL_USER, (ULONG) pPersMailOpt);
  604.  
  605.          if (pPersMailOpt->bAllMsgs)
  606.          {
  607.             WinCheckButton(hwnd, IDD_PERSMAILOPT+2, TRUE);
  608.             SetFocusControl(hwnd, IDD_PERSMAILOPT+2);
  609.          }
  610.          else
  611.          {
  612.             WinCheckButton(hwnd, IDD_PERSMAILOPT+1, TRUE);
  613.             SetFocusControl(hwnd, IDD_PERSMAILOPT+1);
  614.          }
  615.  
  616.          if (pPersMailOpt->bAllNames)
  617.             WinCheckButton(hwnd, IDD_PERSMAILOPT+4, TRUE);
  618.          else
  619.             WinCheckButton(hwnd, IDD_PERSMAILOPT+5, TRUE);
  620.  
  621.          /* Fensterposition */
  622.          RestoreWinPos(hwnd, &windowpositions.persmailpos, FALSE, TRUE);
  623.  
  624.          return (MRESULT) TRUE;
  625.  
  626.       case WM_COMMAND:
  627.          if (SHORT1FROMMP(mp1)== DID_OK)
  628.          {
  629.             if (WinQueryButtonCheckstate(hwnd, IDD_PERSMAILOPT+2))
  630.                pPersMailOpt->bAllMsgs = TRUE;
  631.             else
  632.                pPersMailOpt->bAllMsgs = FALSE;
  633.  
  634.             if (WinQueryButtonCheckstate(hwnd, IDD_PERSMAILOPT+4))
  635.                pPersMailOpt->bAllNames = TRUE;
  636.             else
  637.                pPersMailOpt->bAllNames = FALSE;
  638.  
  639.             dirtyflags.finddirty=TRUE;
  640.          }
  641.          break;
  642.  
  643.       case WM_DESTROY:
  644.          /* Fensterposition */
  645.          QueryWinPos(hwnd, &windowpositions.persmailpos);
  646.          break;
  647.  
  648.       default:
  649.          break;
  650.    }
  651.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  652. }
  653.  
  654. /*------------------------------ FindResultsProc  ---------------------------*/
  655. /* Dialog-Prozedur fuer den Find-Ergebnis-Dialog                             */
  656. /*---------------------------------------------------------------------------*/
  657.  
  658. MRESULT EXPENTRY FindResultsProc(HWND parent, ULONG message, MPARAM mp1, MPARAM mp2)
  659. {
  660.    extern WINDOWFONTS windowfonts;
  661.    extern WINDOWCOLORS windowcolors;
  662.    extern RESULTSOPTIONS resultsoptions;
  663.    extern DIRTYFLAGS dirtyflags;
  664.    extern BOOL bSaveResults;
  665.    PFIELDINFO pFieldInfo, pfirstFieldInfo;
  666.    FIELDINFOINSERT fieldInfoInsert;
  667.    CNRINFO cnrinfo;
  668.    RECORDINSERT RecordInsert;
  669.    RESULTRECORD *pResultRecord, *pFirstRecord;
  670.    SWP swp;
  671.    MRESULT resultbuf;
  672.    PFINDRESULTLIST pResultList=NULL;
  673.    PFOUNDMSG pFoundMsg=NULL;
  674.    PRESULTSDATA pResultsData = (PRESULTSDATA) WinQueryWindowULong(parent, QWL_USER);
  675.  
  676.    switch(message)
  677.    {
  678.       case WM_INITDLG:
  679.          pResultsData = calloc(1, sizeof(RESULTSDATA));
  680.          WinSetWindowULong(parent, QWL_USER, (ULONG) pResultsData);
  681.  
  682.          OldContainerProc=WinSubclassWindow(WinWindowFromID(parent, IDD_FINDRESULTS+1),
  683.                                             NewFContainerProc);
  684.  
  685.          /* Eintrag in Fensterliste */
  686.          pResultsData->hSwitch=AddToWindowList(parent);
  687.  
  688.          /* Popup-Menues */
  689.          pResultsData->hwndPopup=WinLoadMenu(WinWindowFromID(parent, IDD_FINDRESULTS+1),
  690.                                               hmodLang, IDM_BM_POPUP);
  691.          pResultsData->hwndFolderPopup=WinLoadMenu(HWND_DESKTOP,
  692.                                                    hmodLang, IDM_BMF_POPUP);
  693.          if (pResultsData->hwndFolderPopup)
  694.             ReplaceSysMenu(parent, pResultsData->hwndFolderPopup, 1);
  695.  
  696.          /* minimale Fensterbreite berechnen (Slider rechts) */
  697.          WinQueryWindowPos(WinWindowFromID(parent, IDD_FINDRESULTS+9), &swp);
  698.          pResultsData->minsize.x=swp.x+swp.cx+10;
  699.          pResultsData->minsize.y=160;
  700.  
  701.          pResultsData->icon=LoadIcon(IDB_FIND);
  702.          SendMsg(parent, WM_SETICON, (MPARAM) pResultsData->icon, (MPARAM) 0);
  703.          WinEnableControl(parent, IDD_FINDRESULTS+2, FALSE);
  704.          SetFont(WinWindowFromID(parent, IDD_FINDRESULTS+1), windowfonts.findresultsfont);
  705.          SetForeground(WinWindowFromID(parent, IDD_FINDRESULTS+1), &windowcolors.resultsfore);
  706.          SetBackground(WinWindowFromID(parent, IDD_FINDRESULTS+1), &windowcolors.resultsback);
  707.  
  708.          pResultsData->AutoScroll=resultsoptions.bScroll;
  709.          WinCheckButton(parent, IDD_FINDRESULTS+5, pResultsData->AutoScroll);
  710.  
  711.          /* Vordergrund */
  712.          if (resultsoptions.keepinfront)
  713.          {
  714.             pResultsData->bForeground=TRUE;
  715.             WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_FGROUND, TRUE);
  716.             WinSetOwner(parent, client);
  717.          }
  718.          else
  719.          {
  720.             pResultsData->bForeground=FALSE;
  721.             WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_FGROUND, FALSE);
  722.             WinSetOwner(parent, HWND_DESKTOP);
  723.          }
  724.  
  725.          if (bSaveResults)
  726.             WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_SAVE, TRUE);
  727.  
  728.          /* Container initialisieren */
  729.          pFieldInfo = WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1,
  730.                            CM_ALLOCDETAILFIELDINFO, MPFROMLONG(4), NULL);
  731.          pfirstFieldInfo = pFieldInfo;
  732.  
  733.          pFieldInfo->cb = sizeof(FIELDINFO);
  734.          pFieldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_RIGHT |
  735.                               CFA_FIREADONLY | CFA_SEPARATOR;
  736.          pFieldInfo->flTitle = CFA_FITITLEREADONLY;
  737.          pFieldInfo->pTitleData = pResultsData->pchTArea;
  738.          LoadString(IDST_FD_AREA, 20, pFieldInfo->pTitleData);
  739.          pFieldInfo->offStruct = FIELDOFFSET(RESULTRECORD, pchAreaTag);
  740.          pFieldInfo = pFieldInfo->pNextFieldInfo;
  741.  
  742.          pFieldInfo->cb = sizeof(FIELDINFO);
  743.          pFieldInfo->flData = CFA_ULONG | CFA_HORZSEPARATOR | CFA_LEFT |
  744.                               CFA_FIREADONLY /*| CFA_SEPARATOR*/;
  745.          pFieldInfo->flTitle = CFA_FITITLEREADONLY;
  746.          pFieldInfo->pTitleData = pResultsData->pchTNumber;
  747.          LoadString(IDST_FD_NUMBER, 20, pFieldInfo->pTitleData);
  748.          pFieldInfo->offStruct = FIELDOFFSET(RESULTRECORD, ulMsgNum);
  749.          pFieldInfo = pFieldInfo->pNextFieldInfo;
  750.  
  751.          pFieldInfo->cb = sizeof(FIELDINFO);
  752.          pFieldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_LEFT |
  753.                               CFA_FIREADONLY | CFA_SEPARATOR;
  754.          pFieldInfo->flTitle = CFA_FITITLEREADONLY;
  755.          pFieldInfo->pTitleData = pResultsData->pchTFrom;
  756.          LoadString(IDST_FD_FROM, 20, pFieldInfo->pTitleData);
  757.          pFieldInfo->offStruct = FIELDOFFSET(RESULTRECORD, pchFrom);
  758.          pFieldInfo = pFieldInfo->pNextFieldInfo;
  759.  
  760.          pFieldInfo->cb = sizeof(FIELDINFO);
  761.          pFieldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_LEFT |
  762.                               CFA_FIREADONLY;
  763.          pFieldInfo->flTitle = CFA_FITITLEREADONLY;
  764.          pFieldInfo->pTitleData = pResultsData->pchTSubject;
  765.          LoadString(IDST_FD_SUBJECT, 20, pFieldInfo->pTitleData);
  766.          pFieldInfo->offStruct = FIELDOFFSET(RESULTRECORD, pchSubj);
  767.  
  768.  
  769.          fieldInfoInsert.cb = (ULONG)(sizeof(FIELDINFOINSERT));
  770.          fieldInfoInsert.pFieldInfoOrder = (PFIELDINFO)CMA_FIRST;
  771.          fieldInfoInsert.cFieldInfoInsert = 4;
  772.          fieldInfoInsert.fInvalidateFieldInfo = TRUE;
  773.  
  774.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_INSERTDETAILFIELDINFO,
  775.                            MPFROMP(pfirstFieldInfo),
  776.                            MPFROMP(&fieldInfoInsert));
  777.  
  778.          cnrinfo.cb=sizeof(CNRINFO);
  779.          cnrinfo.pFieldInfoLast=pfirstFieldInfo->pNextFieldInfo;
  780.          cnrinfo.flWindowAttr=CV_DETAIL | CA_DETAILSVIEWTITLES | CA_CONTAINERTITLE |
  781.                               CA_TITLESEPARATOR;
  782.          cnrinfo.xVertSplitbar=resultsoptions.lSplitBar;
  783.          cnrinfo.pSortRecord=(PVOID)SortResults;
  784.          cnrinfo.pszCnrTitle = pResultsData->pchCnrTitle;
  785.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_SETCNRINFO, &cnrinfo,
  786.                             MPFROMLONG(CMA_FLWINDOWATTR | CMA_PFIELDINFOLAST |
  787.                                        CMA_XVERTSPLITBAR | CMA_PSORTRECORD | CMA_CNRTITLE));
  788.  
  789.          /* View */
  790.          SwitchResultsView(parent, pResultsData, ((PBOOKMARKSOPEN)mp2)->ulView);
  791.          SetInitialAccel(parent);
  792.          RestoreWinPos(parent, &windowpositions.findresultspos, TRUE, TRUE);
  793.          break;
  794.  
  795.       case WM_COMMAND:
  796.          if (SHORT1FROMMP(mp2)==CMDSRC_PUSHBUTTON)
  797.          {
  798.             switch(SHORT1FROMMP(mp1))
  799.             {
  800.                case DID_OK:
  801.                case DID_CANCEL:
  802.                   if (DoingFind)
  803.                   {
  804.                      return (MRESULT) FALSE;
  805.                   }
  806.                   WinPostMsg(client, FM_FINDRESULTSCLOSE, NULL, NULL);
  807.                   break;
  808.  
  809.                /* Clear-Button */
  810.                case IDD_FINDRESULTS+4:
  811.                   pResultsData->bNoUpdate=TRUE;
  812.                   pResultRecord=NULL;
  813.                   while (pResultRecord = WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_QUERYRECORD,
  814.                                                            pResultRecord,
  815.                                                            MPFROM2SHORT(pResultRecord?CMA_NEXT:CMA_FIRST, CMA_ITEMORDER)))
  816.                   {
  817.                      extern MARKERLIST MarkerList;
  818.                      MESSAGEID MessageID;
  819.  
  820.                      UnmarkMessage(&MarkerList, pResultRecord->pchAreaTag, pResultRecord->ulMsgID, pResultsData->ulView);
  821.                      strcpy(MessageID.pchAreaTag, pResultRecord->pchAreaTag);
  822.                      MessageID.ulMsgID = pResultRecord->ulMsgID;
  823.                      if (pResultsData->ulView == MARKFLAG_MANUAL)
  824.                         SendMsg(client, WORKM_MSGUNMARKED, &MessageID, NULL);
  825.                      else
  826.                         SendMsg(parent, WORKM_DELETED, &MessageID, NULL);
  827.                   }
  828.                   CleanupResults(WinWindowFromID(parent, IDD_FINDRESULTS+1));
  829.                   WinEnableControl(parent, IDD_FINDRESULTS+2, FALSE);
  830.                   pResultsData->bNoUpdate=FALSE;
  831.                   return (MRESULT) FALSE;
  832.  
  833.                /* Go to-Button */
  834.                case IDD_FINDRESULTS+2:
  835.                   if (pResultRecord=WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1,
  836.                                CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), MPFROMSHORT(CRA_SELECTED)))
  837.                   {
  838.                      MESSAGEID MessageID;
  839.                      JUMPINFO JumpInfo;
  840.  
  841.                      SetFocusControl(client, IDML_MAINEDIT);
  842.  
  843.                      strcpy(MessageID.pchAreaTag, pResultRecord->pchAreaTag);
  844.                      MessageID.ulMsgID = pResultRecord->ulMsgID;
  845.                      JumpInfo.pchText = pResultRecord->pchText;
  846.                      JumpInfo.ulHow   = pResultRecord->ulHow;
  847.                      JumpInfo.ulWhere = pResultRecord->ulWhere;
  848.                      SendMsg(client, FM_JUMPTOMESSAGE, &MessageID, &JumpInfo);
  849.                   }
  850.                   return (MRESULT) FALSE;
  851.  
  852.                /* Stop-Button */
  853.                case IDD_FINDRESULTS+10:
  854.                   WinEnableControl(parent, IDD_FINDRESULTS+10, FALSE);
  855.                   StopFind=TRUE;
  856.                   return (MRESULT) FALSE;
  857.  
  858.                default:
  859.                   return (MRESULT) FALSE;
  860.             }
  861.          }
  862.          if (SHORT1FROMMP(mp2)==CMDSRC_MENU)
  863.          {
  864.             PWORKDATA pWorkData;
  865.             AREALISTPAR AreaListPar;
  866.             extern int tidWorker;
  867.             extern BOOL bDoingWork;
  868.             extern GENERALOPT generaloptions;
  869.             extern char CurrentArea[LEN_AREATAG+1];
  870.             extern PATHNAMES pathnames;
  871.             extern ULONG ulExportOptions;
  872.  
  873.             switch(SHORT1FROMMP(mp1))
  874.             {
  875.                case IDM_BMFP_FGROUND:
  876.                   if (pResultsData->bForeground)
  877.                   {
  878.                      pResultsData->bForeground=FALSE;
  879.                      WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_FGROUND, FALSE);
  880.                      WinSetOwner(parent, HWND_DESKTOP);
  881.                   }
  882.                   else
  883.                   {
  884.                      pResultsData->bForeground=TRUE;
  885.                      WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_FGROUND, TRUE);
  886.                      WinSetOwner(parent, client);
  887.                   }
  888.                   return (MRESULT) FALSE;
  889.  
  890.                case IDM_BMFP_VIEW_FIND:
  891.                   SwitchResultsView(parent, pResultsData, MARKFLAG_FIND);
  892.                   return (MRESULT) FALSE;
  893.  
  894.                case IDM_BMFP_VIEW_PERS:
  895.                   SwitchResultsView(parent, pResultsData, MARKFLAG_PERSMAIL);
  896.                   return (MRESULT) FALSE;
  897.  
  898.                case IDM_BMFP_VIEW_MARK:
  899.                   SwitchResultsView(parent, pResultsData, MARKFLAG_MANUAL);
  900.                   return (MRESULT) FALSE;
  901.  
  902.                case IDM_BMFP_VIEW_UNSENT:
  903.                   SwitchResultsView(parent, pResultsData, MARKFLAG_UNSENT);
  904.                   return (MRESULT) FALSE;
  905.  
  906.                case IDM_BMFP_SAVE:
  907.                   bSaveResults = !bSaveResults;
  908.                   WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_SAVE, bSaveResults);
  909.                   dirtyflags.finddirty = TRUE;
  910.                   return (MRESULT) FALSE;
  911.  
  912.                case IDM_BMP_DELETE:
  913.                   if (generaloptions.safety & SAFETY_DELMSG)
  914.                   {
  915.                      if (MessageBox(parent, IDST_MSG_DELETE, IDST_TITLE_DELETE,
  916.                                     IDD_DELETE, MB_YESNO | MB_ICONEXCLAMATION)!=MBID_YES)
  917.                      {
  918.                         return (MRESULT) FALSE;
  919.                      }
  920.                   }
  921.                   if (pWorkData = CollectBookmarks(parent, pResultsData, WORK_DELETE, NULL, NULL, 0))
  922.                   {
  923.                      bDoingWork=TRUE;
  924.                      tidWorker = _beginthread(WorkerThread, NULL, 32768, pWorkData);
  925.                   }
  926.                   return (MRESULT) FALSE;
  927.  
  928.                case IDM_BMP_EXPORT:
  929.                   /* Filenamen holen */
  930.                   if (GetExportName(parent, pathnames.lastexport, &ulExportOptions))
  931.                   {
  932.                      if (pWorkData = CollectBookmarks(parent, pResultsData, WORK_EXPORT, NULL, pathnames.lastexport, 0))
  933.                      {
  934.                         pWorkData->ulExportOptions = ulExportOptions;
  935.                         bDoingWork=TRUE;
  936.                         tidWorker = _beginthread(WorkerThread, NULL, 32768, pWorkData);
  937.                      }
  938.                   }
  939.                   return (MRESULT) FALSE;
  940.  
  941.                case IDM_BMP_PRINT:
  942.                   if (pWorkData = CollectBookmarks(parent, pResultsData, WORK_PRINT, NULL, NULL, 0))
  943.                   {
  944.                      bDoingWork=TRUE;
  945.                      tidWorker = _beginthread(WorkerThread, NULL, 32768, pWorkData);
  946.                   }
  947.                   return (MRESULT) FALSE;
  948.  
  949.                case IDM_BMP_COPY:
  950.                   /* ZielArea holen */
  951.                   AreaListPar.cb=sizeof(AREALISTPAR);
  952.                   if (generaloptions.LastCopyArea[0])
  953.                      AreaListPar.pchString=strdup(generaloptions.LastCopyArea);
  954.                   else
  955.                      AreaListPar.pchString=strdup(CurrentArea);
  956.                   AreaListPar.idTitle = IDST_TITLE_AL_COPY;
  957.                   AreaListPar.ulIncludeTypes = INCLUDE_ALL;
  958.                   AreaListPar.bExtendedSel = FALSE;
  959.                   AreaListPar.bChange      = FALSE;
  960.  
  961.                   if (WinDlgBox(HWND_DESKTOP, parent,
  962.                                 AreaListProc, hmodLang,
  963.                                 IDD_AREALIST, &AreaListPar)==DID_OK && AreaListPar.pchString)
  964.                   {
  965.                      ULONG ulOptions=0;
  966.                      AREADEFLIST *pArea;
  967.  
  968.                      pArea = AM_FindArea(&arealiste, AreaListPar.pchString);
  969.                      if (pArea && pArea->areadata.areatype != AREATYPE_LOCAL)
  970.                         switch(MessageBox(parent, IDST_MSG_RESEND, IDST_TITLE_RESEND,
  971.                                           IDD_RESEND, MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2))
  972.                         {
  973.                            case MBID_YES:
  974.                               ulOptions = COPYMOVE_RESEND;
  975.                               break;
  976.  
  977.                            default:
  978.                               break;
  979.                         }
  980.  
  981.                      if (pWorkData = CollectBookmarks(parent, pResultsData, WORK_COPY, AreaListPar.pchString, NULL, ulOptions))
  982.                      {
  983.                         bDoingWork=TRUE;
  984.                         tidWorker = _beginthread(WorkerThread, NULL, 32768, pWorkData);
  985.                      }
  986.                      else
  987.                         free(AreaListPar.pchString);
  988.                   }
  989.                   return (MRESULT) FALSE;
  990.  
  991.                case IDM_BMP_MOVE:
  992.                   /* ZielArea holen */
  993.                   AreaListPar.cb=sizeof(AREALISTPAR);
  994.                   if (generaloptions.LastMoveArea[0])
  995.                      AreaListPar.pchString=strdup(generaloptions.LastMoveArea);
  996.                   else
  997.                      AreaListPar.pchString=strdup(CurrentArea);
  998.                   AreaListPar.idTitle = IDST_TITLE_AL_MOVE;
  999.                   AreaListPar.ulIncludeTypes = INCLUDE_ALL;
  1000.                   AreaListPar.bExtendedSel = FALSE;
  1001.                   AreaListPar.bChange      = FALSE;
  1002.  
  1003.                   if (WinDlgBox(HWND_DESKTOP, parent,
  1004.                                 AreaListProc, hmodLang,
  1005.                                 IDD_AREALIST, &AreaListPar)==DID_OK && AreaListPar.pchString)
  1006.                   {
  1007.                      ULONG ulOptions=0;
  1008.                      AREADEFLIST *pArea;
  1009.  
  1010.                      pArea = AM_FindArea(&arealiste, AreaListPar.pchString);
  1011.                      if (pArea && pArea->areadata.areatype != AREATYPE_LOCAL)
  1012.                         switch(MessageBox(parent, IDST_MSG_RESEND, IDST_TITLE_RESEND,
  1013.                                           IDD_RESEND, MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2))
  1014.                         {
  1015.                            case MBID_YES:
  1016.                               ulOptions = COPYMOVE_RESEND;
  1017.                               break;
  1018.  
  1019.                            default:
  1020.                               break;
  1021.                         }
  1022.  
  1023.                      if (pWorkData = CollectBookmarks(parent, pResultsData, WORK_MOVE, AreaListPar.pchString, NULL, ulOptions))
  1024.                      {
  1025.                         bDoingWork=TRUE;
  1026.                         tidWorker = _beginthread(WorkerThread, NULL, 32768, pWorkData);
  1027.                      }
  1028.                      else
  1029.                         free(AreaListPar.pchString);
  1030.                   }
  1031.                   return (MRESULT) FALSE;
  1032.  
  1033.                case IDM_BMP_REMOVE:
  1034.                   if (pWorkData = CollectBookmarks(parent, pResultsData, 0, NULL, NULL, 0))
  1035.                   {
  1036.                      PWORKDATA pWorkData2;
  1037.                      MESSAGEID MessageID;
  1038.                      extern MARKERLIST MarkerList;
  1039.  
  1040.                      while (pWorkData)
  1041.                      {
  1042.                         int i;
  1043.                         strcpy(MessageID.pchAreaTag, pWorkData->pchSrcArea);
  1044.  
  1045.                         for (i=0; i<pWorkData->ulArraySize; i++)
  1046.                         {
  1047.                            UnmarkMessage(&MarkerList, pWorkData->pchSrcArea,
  1048.                                          pWorkData->MsgIDArray[i], pResultsData->ulView);
  1049.  
  1050.                            strcpy(MessageID.pchAreaTag, pWorkData->pchSrcArea);
  1051.                            MessageID.ulMsgID = pWorkData->MsgIDArray[i];
  1052.                            if (pResultsData->ulView == MARKFLAG_MANUAL)
  1053.                               SendMsg(client, WORKM_MSGUNMARKED, &MessageID, NULL);
  1054.                            else
  1055.                               SendMsg(parent, WORKM_DELETED, &MessageID, NULL);
  1056.                         }
  1057.                         pWorkData2=pWorkData;
  1058.                         pWorkData = pWorkData->next;
  1059.                         free(pWorkData2->MsgIDArray);
  1060.                         free(pWorkData2);
  1061.                      }
  1062.                   }
  1063.                   return (MRESULT) FALSE;
  1064.  
  1065.                case IDM_BMP_SELECTALL:
  1066.                   SelectAllRecords(WinWindowFromID(parent, IDD_FINDRESULTS+1));
  1067.                   return (MRESULT) FALSE;
  1068.  
  1069.                case IDM_BMP_SELECTNONE:
  1070.                   DeselectAllRecords(WinWindowFromID(parent, IDD_FINDRESULTS+1));
  1071.                   return (MRESULT) FALSE;
  1072.  
  1073.                default:
  1074.                   return (MRESULT) FALSE;
  1075.             }
  1076.          }
  1077.          if (SHORT1FROMMP(mp2)==CMDSRC_ACCELERATOR)
  1078.          {
  1079.             PWORKDATA pWorkData;
  1080.             extern int tidWorker;
  1081.             extern BOOL bDoingWork;
  1082.             extern GENERALOPT generaloptions;
  1083.  
  1084.             switch(SHORT1FROMMP(mp1))
  1085.             {
  1086.                case IDA_DELMSG:
  1087.                   /* Cursor-Record feststellen */
  1088.                   pResultRecord = WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1,
  1089.                                                     CM_QUERYRECORDEMPHASIS,
  1090.                                                     MPFROMLONG(CMA_FIRST),
  1091.                                                     MPFROMLONG(CRA_CURSORED));
  1092.  
  1093.                   if (pResultRecord)
  1094.                   {
  1095.                      /* Abfrage */
  1096.                      if (generaloptions.safety & SAFETY_DELMSG)
  1097.                      {
  1098.                         if (MessageBox(parent, IDST_MSG_DELETE, IDST_TITLE_DELETE,
  1099.                                        IDD_DELETE, MB_YESNO | MB_ICONEXCLAMATION)!=MBID_YES)
  1100.                         {
  1101.                            return (MRESULT) FALSE;
  1102.                         }
  1103.                      }
  1104.                      pResultsData->pPopupRecord = pResultRecord;
  1105.                      if (pWorkData = CollectBookmarks(parent, pResultsData, WORK_DELETE, NULL, NULL, 0))
  1106.                      {
  1107.                         bDoingWork=TRUE;
  1108.                         tidWorker = _beginthread(WorkerThread, NULL, 32768, pWorkData);
  1109.                      }
  1110.                   }
  1111.                   return (MRESULT) FALSE;
  1112.  
  1113.                default:
  1114.                   return RedirectCommand(mp1, mp2);
  1115.             }
  1116.          }
  1117.          break;
  1118.  
  1119.       case WM_ACTIVATE:
  1120.          if (mp1)
  1121.             WinAssociateHelpInstance(hwndhelp, parent);
  1122.          else
  1123.             WinAssociateHelpInstance(hwndhelp, NULLHANDLE);
  1124.          break;
  1125.  
  1126.       case WM_CONTROL:
  1127.          if (SHORT1FROMMP(mp1)==IDD_FINDRESULTS+1)
  1128.          {
  1129.             switch (SHORT2FROMMP(mp1))
  1130.             {
  1131.                /* Enter gedrueckt oder Doppelklick */
  1132.                case CN_ENTER:
  1133.                   if (((PNOTIFYRECORDENTER)mp2)->pRecord && !pResultsData->ulDisable)
  1134.                   {
  1135.                      MESSAGEID MessageID;
  1136.                      JUMPINFO JumpInfo;
  1137.  
  1138.                      pResultRecord = (RESULTRECORD*)((PNOTIFYRECORDENTER)mp2)->pRecord;
  1139.                      SetFocusControl(client, IDML_MAINEDIT);
  1140.  
  1141.                      strcpy(MessageID.pchAreaTag, pResultRecord->pchAreaTag);
  1142.                      MessageID.ulMsgID = pResultRecord->ulMsgID;
  1143.                      JumpInfo.pchText = pResultRecord->pchText;
  1144.                      JumpInfo.ulHow   = pResultRecord->ulHow;
  1145.                      JumpInfo.ulWhere = pResultRecord->ulWhere;
  1146.                      SendMsg(client, FM_JUMPTOMESSAGE, &MessageID, &JumpInfo);
  1147.                   }
  1148.                   break;
  1149.  
  1150.                case CN_HELP:
  1151.                   SendMsg(parent, WM_HELP, MPFROMSHORT(IDD_FINDRESULTS+1), NULL);
  1152.                   break;
  1153.  
  1154.                case CN_CONTEXTMENU:
  1155.                   BookmarksPopup(parent, pResultsData, (RESULTRECORD*) mp2);
  1156.                   break;
  1157.  
  1158.                default:
  1159.                   break;
  1160.             }
  1161.          }
  1162.          if (SHORT1FROMMP(mp1)==IDD_FINDRESULTS+5)
  1163.             pResultsData->AutoScroll=WinQueryButtonCheckstate(parent, IDD_FINDRESULTS+5);
  1164.  
  1165.          if (SHORT1FROMMP(mp1)==IDD_FINDRESULTS+6)
  1166.          {
  1167.             if (WinQueryButtonCheckstate(parent, IDD_FINDRESULTS+6))
  1168.                WinSetOwner(parent, client);
  1169.             else
  1170.                WinSetOwner(parent, HWND_DESKTOP);
  1171.          }
  1172.          break;
  1173.  
  1174.       case WM_QUERYTRACKINFO:
  1175.          /* Default-Werte aus Original-Prozedur holen */
  1176.          resultbuf=WinDefDlgProc(parent, message, mp1, mp2);
  1177.  
  1178.          /* Minimale Fenstergroesse einstellen */
  1179.          ((PTRACKINFO)mp2)->ptlMinTrackSize.x=pResultsData->minsize.x;
  1180.          ((PTRACKINFO)mp2)->ptlMinTrackSize.y=pResultsData->minsize.y;
  1181.          return resultbuf;
  1182.  
  1183.       case WM_CLOSE:
  1184.          if (DoingFind)
  1185.          {
  1186.             return 0;
  1187.          }
  1188.          WinPostMsg(client, FM_FINDRESULTSCLOSE, NULL, NULL);
  1189.          break;
  1190.  
  1191.       case WM_DESTROY:
  1192.          RemoveFromWindowList(pResultsData->hSwitch);
  1193.          CleanupResults(WinWindowFromID(parent, IDD_FINDRESULTS+1));
  1194.          WinDestroyPointer(pResultsData->icon);
  1195.          if (pResultsData->hwndPopup)
  1196.             WinDestroyWindow(pResultsData->hwndPopup);
  1197.          if (pResultsData->hwndFolderPopup)
  1198.             WinDestroyWindow(pResultsData->hwndFolderPopup);
  1199.          QueryWinPos(parent, &windowpositions.findresultspos);
  1200.          QueryFont(WinWindowFromID(parent, IDD_FINDRESULTS+1), windowfonts.findresultsfont);
  1201.          QueryForeground(WinWindowFromID(parent, IDD_FINDRESULTS+1), &windowcolors.resultsfore);
  1202.          QueryBackground(WinWindowFromID(parent, IDD_FINDRESULTS+1), &windowcolors.resultsback);
  1203.          if (resultsoptions.bScroll != pResultsData->AutoScroll)
  1204.          {
  1205.             resultsoptions.bScroll = pResultsData->AutoScroll;
  1206.             dirtyflags.resultsdirty=TRUE;
  1207.          }
  1208.          if (resultsoptions.keepinfront != pResultsData->bForeground)
  1209.          {
  1210.             resultsoptions.keepinfront = pResultsData->bForeground;
  1211.             dirtyflags.resultsdirty=TRUE;
  1212.          }
  1213.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_QUERYCNRINFO,
  1214.                            &cnrinfo, MPFROMLONG(sizeof(cnrinfo)));
  1215.          if (resultsoptions.lSplitBar != cnrinfo.xVertSplitbar)
  1216.          {
  1217.             resultsoptions.lSplitBar = cnrinfo.xVertSplitbar;
  1218.             dirtyflags.resultsdirty=TRUE;
  1219.          }
  1220.          free(pResultsData);
  1221.          break;
  1222.  
  1223.       case WM_ADJUSTWINDOWPOS:
  1224.          if (((PSWP)mp1)->fl & SWP_MINIMIZE)
  1225.          {
  1226.             WinShowWindow(WinWindowFromID(parent, IDD_FINDRESULTS+2), FALSE);
  1227.          }
  1228.          if (((PSWP)mp1)->fl & SWP_RESTORE)
  1229.             WinShowWindow(WinWindowFromID(parent, IDD_FINDRESULTS+2), TRUE);
  1230.  
  1231.          if (((PSWP)mp1)->fl & SWP_SIZE)
  1232.             ResizeResults(parent, (PSWP)mp1);
  1233.          break;
  1234.  
  1235.       case WM_MENUEND:
  1236.          if ((HWND) mp2 != pResultsData->hwndPopup &&
  1237.              (HWND) mp2 != pResultsData->hwndFolderPopup)
  1238.             break;
  1239.          pResultsData->bKeyboard=FALSE;
  1240.  
  1241.          if ((HWND) mp2 == pResultsData->hwndFolderPopup)
  1242.             ResetMenuStyle(pResultsData->hwndFolderPopup, parent);
  1243.  
  1244.          /* Source-Emphasis loeschen */
  1245.          pResultRecord=(RESULTRECORD *)WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1,
  1246.                      CM_QUERYRECORDEMPHASIS, (MPARAM) CMA_FIRST,
  1247.                      MPFROMSHORT(CRA_SOURCE));
  1248.          while (pResultRecord)
  1249.          {
  1250.             WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_SETRECORDEMPHASIS,
  1251.                         pResultRecord, MPFROM2SHORT(FALSE, CRA_SOURCE));
  1252.             pResultRecord=(RESULTRECORD *)WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1,
  1253.                         CM_QUERYRECORDEMPHASIS, pResultRecord,
  1254.                         MPFROMSHORT(CRA_SOURCE));
  1255.          }
  1256.          if (pResultsData->pPopupRecord==NULL)
  1257.             WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_SETRECORDEMPHASIS,
  1258.                               NULL, MPFROM2SHORT(FALSE, CRA_SOURCE));
  1259.          break;
  1260.  
  1261.       case WM_CONTEXTMENU:
  1262.          if (WinQueryFocus(HWND_DESKTOP) == WinWindowFromID(parent, IDD_FINDRESULTS+1) &&
  1263.              !SHORT1FROMMP(mp1))
  1264.          {
  1265.             pResultsData->bKeyboard = TRUE;
  1266.             WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, message, mp1, mp2);
  1267.          }
  1268.          break;
  1269.  
  1270.       case WM_INITMENU:
  1271.          if ((HWND) mp2 == pResultsData->hwndFolderPopup)
  1272.             WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_SETRECORDEMPHASIS,
  1273.                               NULL, MPFROM2SHORT(TRUE, CRA_SOURCE));
  1274.          break;
  1275.  
  1276.       case WORKM_STARTFIND:
  1277.          WinEnableControl(parent, IDD_FINDRESULTS+10, TRUE);
  1278.          WinEnableControl(parent, DID_OK, FALSE);
  1279.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+9, SLM_SETSLIDERINFO,
  1280.                            MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_INCREMENTVALUE),
  1281.                            MPFROMLONG(0));
  1282.          WinSetDlgItemText(parent, IDD_FINDRESULTS+8, "");
  1283.          SetFocusControl(parent, IDD_FINDRESULTS+1);
  1284.          SwitchResultsView(parent, pResultsData, (ULONG) mp1);
  1285.          break;
  1286.  
  1287.       case WORKM_STOPFIND:
  1288.          WinEnableControl(parent, IDD_FINDRESULTS+10, FALSE);
  1289.          WinEnableControl(parent, DID_OK, TRUE);
  1290.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+9, SLM_SETSLIDERINFO,
  1291.                            MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_INCREMENTVALUE),
  1292.                            MPFROMLONG(0));
  1293.          WinSetDlgItemText(parent, IDD_FINDRESULTS+8, "");
  1294.          WinSetWindowPos(parent, HWND_TOP,
  1295.                          0, 0,
  1296.                          0, 0,
  1297.                          SWP_ZORDER);
  1298.          break;
  1299.  
  1300.       case WORKM_FINDAREA:
  1301.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+9, SLM_SETSLIDERINFO,
  1302.                            MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_INCREMENTVALUE),
  1303.                            MPFROMLONG(0));
  1304.          WinSetDlgItemText(parent, IDD_FINDRESULTS+8, (PCHAR) mp1);
  1305.          break;
  1306.  
  1307.       case WORKM_FINDPROGRESS:
  1308.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+9, SLM_SETSLIDERINFO,
  1309.                            MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_INCREMENTVALUE),
  1310.                            MPFROMLONG(((SHORT)mp1)/5));
  1311.          break;
  1312.  
  1313.       case WORKM_FINDAREAEND:
  1314.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+9, SLM_SETSLIDERINFO,
  1315.                            MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_INCREMENTVALUE),
  1316.                            MPFROMLONG(19));
  1317.  
  1318.          /* Ergebnisse einfuegen */
  1319.          pResultList= (PFINDRESULTLIST) mp1;
  1320.          pFoundMsg=   (PFOUNDMSG) mp2;
  1321.  
  1322.          if (pResultList->ulFindType & pResultsData->ulView)
  1323.          {
  1324.             pFirstRecord=WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_ALLOCRECORD,
  1325.                                      MPFROMLONG(sizeof(RESULTRECORD)-sizeof(MINIRECORDCORE)),
  1326.                                      MPFROMLONG(pResultList->ulFoundMsgs));
  1327.             pResultRecord = pFirstRecord;
  1328.             while (pFoundMsg)
  1329.             {
  1330.                pResultRecord->pchAreaTag=malloc(LEN_AREATAG+1);
  1331.                strcpy(pResultRecord->pchAreaTag, pResultList->pchAreaTag);
  1332.                pResultRecord->ulMsgNum = pFoundMsg->ulMsgNum;
  1333.                pResultRecord->ulMsgID  = pFoundMsg->ulMsgID;
  1334.                pResultRecord->pchFrom=malloc(LEN_USERNAME+1);
  1335.                strcpy(pResultRecord->pchFrom, pFoundMsg->Header.pchFromName);
  1336.                pResultRecord->pchSubj=malloc(LEN_SUBJECT+1);
  1337.                strcpy(pResultRecord->pchSubj, pFoundMsg->Header.pchSubject);
  1338.                if (pFoundMsg->pchFindText)
  1339.                   pResultRecord->pchText=strdup(pFoundMsg->pchFindText);
  1340.                else
  1341.                   pResultRecord->pchText=NULL;
  1342.                pResultRecord->ulFlags = pResultList->ulFindType;
  1343.                pResultRecord->ulHow   = pFoundMsg->ulHow;
  1344.                pResultRecord->ulWhere = pFoundMsg->ulWhere;
  1345.  
  1346.                pResultRecord = (RESULTRECORD*) pResultRecord->RecordCore.preccNextRecord;
  1347.                pFoundMsg = pFoundMsg->next;
  1348.             }
  1349.  
  1350.             RecordInsert.cb=sizeof(RECORDINSERT);
  1351.             RecordInsert.pRecordOrder=(RECORDCORE *)CMA_END;
  1352.             RecordInsert.pRecordParent=NULL;
  1353.             RecordInsert.zOrder=CMA_TOP;
  1354.             RecordInsert.fInvalidateRecord=FALSE;
  1355.             RecordInsert.cRecordsInsert=pResultList->ulFoundMsgs;
  1356.  
  1357.             WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_INSERTRECORD,
  1358.                               pFirstRecord, &RecordInsert);
  1359.             WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_INVALIDATERECORD,
  1360.                               NULL, NULL);
  1361.  
  1362. #if 0
  1363.             if (pResultsData->AutoScroll)
  1364.             {
  1365.                QUERYRECORDRECT qrecord;
  1366.  
  1367.                /* Auto-Scroll */
  1368.                qrecord.cb=sizeof(QUERYRECORDRECT);
  1369.                qrecord.pRecord=(RECORDCORE *)pResultRecord;
  1370.                qrecord.fRightSplitWindow=FALSE;
  1371.                qrecord.fsExtent=CMA_TEXT;
  1372.                WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_QUERYRECORDRECT,
  1373.                                  &rectl, &qrecord);
  1374.                WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_SCROLLWINDOW,
  1375.                                  MPFROMSHORT(CMA_VERTICAL),
  1376.                                  MPFROMLONG(rectl.yTop-rectl.yBottom));
  1377.             }
  1378. #endif
  1379.             UpdateGotoButton(parent, pResultsData);
  1380.          }
  1381.          break;
  1382.  
  1383.       case WORKM_DELETED:
  1384.       case WORKM_MSGUNMARKED:
  1385.          if (pResultsData->bNoUpdate)
  1386.             break;
  1387.          if (message == WORKM_MSGUNMARKED && pResultsData->ulView != MARKFLAG_MANUAL)
  1388.             break;
  1389.  
  1390.          pResultRecord=NULL;
  1391.          while (pResultRecord=WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_QUERYRECORD,
  1392.                                                 pResultRecord,
  1393.                                                 MPFROM2SHORT(pResultRecord?CMA_NEXT:CMA_FIRST, CMA_ITEMORDER)))
  1394.          {
  1395.             if (pResultRecord->ulMsgID == ((PMESSAGEID)mp1)->ulMsgID &&
  1396.                 !stricmp(pResultRecord->pchAreaTag, ((PMESSAGEID)mp1)->pchAreaTag))
  1397.             {
  1398.                if (pResultRecord->pchFrom)
  1399.                   free(pResultRecord->pchFrom);
  1400.                if (pResultRecord->pchSubj)
  1401.                   free(pResultRecord->pchSubj);
  1402.                if (pResultRecord->pchAreaTag)
  1403.                   free(pResultRecord->pchAreaTag);
  1404.                if (pResultRecord->pchText)
  1405.                   free(pResultRecord->pchText);
  1406.  
  1407.                WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_REMOVERECORD,
  1408.                                  &pResultRecord, MPFROM2SHORT(1, CMA_FREE|CMA_INVALIDATE));
  1409.                UpdateGotoButton(parent, pResultsData);
  1410.                break;
  1411.             }
  1412.          }
  1413.          break;
  1414.  
  1415.       case WORKM_CHANGED:
  1416.          pResultRecord=NULL;
  1417.          while (pResultRecord=WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_QUERYRECORD,
  1418.                                                 pResultRecord,
  1419.                                                 MPFROM2SHORT(pResultRecord?CMA_NEXT:CMA_FIRST, CMA_ITEMORDER)))
  1420.          {
  1421.             if (pResultRecord->ulMsgID == ((PMESSAGEID)mp1)->ulMsgID &&
  1422.                 !stricmp(pResultRecord->pchAreaTag, ((PMESSAGEID)mp1)->pchAreaTag))
  1423.             {
  1424.                strcpy(pResultRecord->pchFrom, ((PMSGHEADER)mp2)->pchFromName);
  1425.                strcpy(pResultRecord->pchSubj, ((PMSGHEADER)mp2)->pchSubject);
  1426.  
  1427.                WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_INVALIDATERECORD,
  1428.                                  &pResultRecord, MPFROM2SHORT(1, CMA_TEXTCHANGED));
  1429.                break;
  1430.             }
  1431.          }
  1432.          break;
  1433.  
  1434.       case WORKM_MSGMARKED:
  1435.          if (pResultsData->ulView != MARKFLAG_MANUAL)
  1436.             break;
  1437.  
  1438.          pResultRecord=NULL;
  1439.          while (pResultRecord=WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_QUERYRECORD,
  1440.                                                 pResultRecord,
  1441.                                                 MPFROM2SHORT(pResultRecord?CMA_NEXT:CMA_FIRST, CMA_ITEMORDER)))
  1442.          {
  1443.             if (pResultRecord->ulMsgID == ((PMESSAGEID)mp1)->ulMsgID &&
  1444.                 !stricmp(pResultRecord->pchAreaTag, ((PMESSAGEID)mp1)->pchAreaTag))
  1445.                /* schon vorhanden */
  1446.                return (MRESULT) FALSE;
  1447.          }
  1448.          /* neuen Record */
  1449.          pResultRecord=WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_ALLOCRECORD,
  1450.                                   MPFROMLONG(sizeof(RESULTRECORD)-sizeof(MINIRECORDCORE)),
  1451.                                   MPFROMLONG(1));
  1452.          pResultRecord->pchAreaTag=malloc(LEN_AREATAG+1);
  1453.          strcpy(pResultRecord->pchAreaTag, ((PMESSAGEID)mp1)->pchAreaTag);
  1454.          pResultRecord->ulMsgNum = 0; /*@@*/
  1455.          pResultRecord->ulMsgID  = ((PMESSAGEID)mp1)->ulMsgID;
  1456.          pResultRecord->pchFrom=malloc(LEN_USERNAME+1);
  1457.          strcpy(pResultRecord->pchFrom, ((PMSGHEADER)mp2)->pchFromName);
  1458.          pResultRecord->pchSubj=malloc(LEN_SUBJECT+1);
  1459.          strcpy(pResultRecord->pchSubj, ((PMSGHEADER)mp2)->pchSubject);
  1460.          pResultRecord->pchText=NULL;
  1461.          pResultRecord->ulFlags = MARKFLAG_MANUAL;
  1462.          pResultRecord->ulHow = 0;
  1463.          pResultRecord->ulWhere = 0;
  1464.  
  1465.          RecordInsert.cb=sizeof(RECORDINSERT);
  1466.          RecordInsert.pRecordOrder=(RECORDCORE *)CMA_END;
  1467.          RecordInsert.pRecordParent=NULL;
  1468.          RecordInsert.zOrder=CMA_TOP;
  1469.          RecordInsert.fInvalidateRecord=FALSE;
  1470.          RecordInsert.cRecordsInsert=1;
  1471.  
  1472.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_INSERTRECORD,
  1473.                            pResultRecord, &RecordInsert);
  1474.          WinSendDlgItemMsg(parent, IDD_FINDRESULTS+1, CM_INVALIDATERECORD,
  1475.                            NULL, NULL);
  1476.          UpdateGotoButton(parent, pResultsData);
  1477.          break;
  1478.  
  1479.       case WORKM_DISABLEVIEWS:
  1480.          pResultsData->ulDisable++;
  1481.          UpdateGotoButton(parent, pResultsData);
  1482.          break;
  1483.  
  1484.       case WORKM_ENABLEVIEWS:
  1485.          if (pResultsData->ulDisable)
  1486.          {
  1487.             pResultsData->ulDisable--;
  1488.             UpdateGotoButton(parent, pResultsData);
  1489.          }
  1490.          break;
  1491.  
  1492.       case WORKM_SWITCHACCELS:
  1493.          SwitchAccels(parent, (ULONG) mp1);
  1494.          break;
  1495.  
  1496.       default:
  1497.          break;
  1498.    }
  1499.    return WinDefDlgProc(parent, message, mp1, mp2);
  1500. }
  1501.  
  1502. static void ResizeResults(HWND hwndDlg, PSWP pNewSize)
  1503. {
  1504.    POINTL size;
  1505.    POINTL pos;
  1506.    SWP swp, swp2;
  1507.    RECTL rectl;
  1508.    extern HAB anchor;
  1509.  
  1510.    rectl.xLeft=0;
  1511.    rectl.xRight=pNewSize->cx;
  1512.    rectl.yBottom=0;
  1513.    rectl.yTop=pNewSize->cy;
  1514.  
  1515.    CalcClientRect(anchor, hwndDlg, &rectl);
  1516.  
  1517.    size.x=rectl.xRight-rectl.xLeft;
  1518.    size.y=rectl.yTop-rectl.yBottom;
  1519.    WinMapDlgPoints(hwndDlg, &size, 1, FALSE);
  1520.  
  1521.    /* Container */
  1522.    pos.x=5;                 /* linke untere Ecke */
  1523.    pos.y=23;
  1524.    size.x=pos.x+size.x-10;  /* rechte obere Ecke */
  1525.    size.y=pos.y+size.y-55;
  1526.    WinMapDlgPoints(hwndDlg, &pos, 1, TRUE);
  1527.    WinMapDlgPoints(hwndDlg, &size, 1, TRUE);
  1528.    WinSetWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+1),
  1529.                    NULLHANDLE,
  1530.                    rectl.xLeft/* /2 */, pos.y,
  1531.                    rectl.xRight-rectl.xLeft, rectl.yTop-pos.y-30,
  1532.                    SWP_MOVE | SWP_SIZE);
  1533.    WinQueryWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+1), &swp);
  1534.    /* "Area" */
  1535.    WinSetWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+7),
  1536.                    NULLHANDLE,
  1537.                    swp.x, swp.y+swp.cy,
  1538.                    0, 0,
  1539.                    SWP_MOVE);
  1540.    WinQueryWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+7), &swp);
  1541.    WinQueryWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+9), &swp2);
  1542.    /* Laufbalken */
  1543.    WinSetWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+9),
  1544.                    NULLHANDLE,
  1545.                    pNewSize->cx - swp2.cx - 10, swp.y,
  1546.                    0, 0,
  1547.                    SWP_MOVE);
  1548.    WinQueryWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+9), &swp2);
  1549.    /* Area-Name */
  1550.    WinSetWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+8),
  1551.                    NULLHANDLE,
  1552.                    swp.x+swp.cx, swp.y,
  1553.                    swp2.x - swp.x - swp.cx, swp.cy,
  1554.                    SWP_MOVE | SWP_SIZE);
  1555.  
  1556.    return;
  1557. }
  1558.  
  1559. /*------------------------------ CleanupResults   ---------------------------*/
  1560. /* Loescht alle Records aus der Ergebnisliste                                */
  1561. /*---------------------------------------------------------------------------*/
  1562.  
  1563. static void CleanupResults(HWND hwndContainer)
  1564. {
  1565.    RESULTRECORD *pRecord=NULL;
  1566.  
  1567.    while(pRecord=(RESULTRECORD *)SendMsg(hwndContainer, CM_QUERYRECORD,
  1568.                                   pRecord, MPFROM2SHORT(pRecord?CMA_NEXT:CMA_FIRST, CMA_ITEMORDER)))
  1569.    {
  1570.       if (pRecord->pchFrom)
  1571.          free(pRecord->pchFrom);
  1572.       if (pRecord->pchSubj)
  1573.          free(pRecord->pchSubj);
  1574.       if (pRecord->pchAreaTag)
  1575.          free(pRecord->pchAreaTag);
  1576.       if (pRecord->pchText)
  1577.          free(pRecord->pchText);
  1578.    }
  1579.    SendMsg(hwndContainer, CM_REMOVERECORD, NULL,
  1580.               MPFROM2SHORT(0, CMA_FREE|CMA_INVALIDATE));
  1581.    return;
  1582. }
  1583.  
  1584. static void UpdateGotoButton(HWND hwndDlg, PRESULTSDATA pResultsData)
  1585. {
  1586.    CNRINFO cnrinfo;
  1587.  
  1588.    WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_QUERYCNRINFO,
  1589.                      &cnrinfo, MPFROMLONG(sizeof(cnrinfo)));
  1590.    if (cnrinfo.cRecords && !pResultsData->ulDisable)
  1591.       WinEnableControl(hwndDlg, IDD_FINDRESULTS+2, TRUE);
  1592.    else
  1593.       WinEnableControl(hwndDlg, IDD_FINDRESULTS+2, FALSE);
  1594.  
  1595.    return;
  1596. }
  1597.  
  1598. static int BookmarksPopup(HWND hwndDlg, PRESULTSDATA pResultsData, RESULTRECORD *pRecord)
  1599. {
  1600.    POINTL ptlPointer;
  1601.    extern BOOL bDoingWork;
  1602.  
  1603.    WinQueryPointerPos(HWND_DESKTOP, &ptlPointer);
  1604.  
  1605.    if (pRecord)
  1606.    {
  1607.       if (pResultsData->ulDisable || bDoingWork)
  1608.          return 1;
  1609.       if (pRecord->RecordCore.flRecordAttr & CRA_SELECTED)
  1610.       {
  1611.          /* Alle selektierten */
  1612.          RESULTRECORD *pRecord2=NULL;
  1613.  
  1614.          while (pRecord2 = WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_QUERYRECORDEMPHASIS,
  1615.                                              MPFROMP(pRecord2?pRecord2:(RESULTRECORD*)CMA_FIRST),
  1616.                                              MPFROMSHORT(CRA_SELECTED)))
  1617.          {
  1618.             WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_SETRECORDEMPHASIS,
  1619.                               pRecord2, MPFROM2SHORT(TRUE, CRA_SOURCE));
  1620.          }
  1621.       }
  1622.       else
  1623.          WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_SETRECORDEMPHASIS,
  1624.                            pRecord, MPFROM2SHORT(TRUE, CRA_SOURCE));
  1625.       if (pResultsData->bKeyboard)
  1626.       {
  1627.          QUERYRECORDRECT qrecord;
  1628.          RECTL rcl;
  1629.          SWP swp;
  1630.  
  1631.          qrecord.cb = sizeof(QUERYRECORDRECT);
  1632.          qrecord.pRecord = (PRECORDCORE) pRecord;
  1633.          qrecord.fRightSplitWindow = TRUE;
  1634.          qrecord.fsExtent = CMA_TEXT;
  1635.          WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_QUERYRECORDRECT,
  1636.                            &rcl, &qrecord);
  1637.          ptlPointer.y = (rcl.yBottom + rcl.yTop)/2;
  1638.          WinQueryWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+1),
  1639.                            &swp);
  1640.          ptlPointer.x = swp.cx/2;
  1641.          WinMapWindowPoints(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+1),
  1642.                             HWND_DESKTOP, &ptlPointer, 1);
  1643.       }
  1644.       WinPopupMenu(HWND_DESKTOP, hwndDlg, pResultsData->hwndPopup,
  1645.                    ptlPointer.x, ptlPointer.y,
  1646.                    0,
  1647.                    PU_HCONSTRAIN | PU_VCONSTRAIN | PU_KEYBOARD | PU_MOUSEBUTTON1);
  1648.    }
  1649.    else
  1650.    {
  1651.       if (pResultsData->bKeyboard)
  1652.       {
  1653.          SWP swp;
  1654.  
  1655.          WinQueryWindowPos(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+1),
  1656.                            &swp);
  1657.          ptlPointer.x = swp.cx/2;
  1658.          ptlPointer.y = swp.cy/2;
  1659.          WinMapWindowPoints(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+1),
  1660.                             HWND_DESKTOP, &ptlPointer, 1);
  1661.       }
  1662.       WinPopupMenu(HWND_DESKTOP, hwndDlg, pResultsData->hwndFolderPopup,
  1663.                    ptlPointer.x, ptlPointer.y,
  1664.                    0,
  1665.                    PU_HCONSTRAIN | PU_VCONSTRAIN | PU_KEYBOARD | PU_MOUSEBUTTON1);
  1666.    }
  1667.  
  1668.    pResultsData->pPopupRecord = pRecord;
  1669.  
  1670.    return 0;
  1671. }
  1672.  
  1673. static void SwitchResultsView(HWND hwndDlg, PRESULTSDATA pResultsData, ULONG ulNewView)
  1674. {
  1675.    ULONG ulMenuID=0;
  1676.  
  1677.    if (pResultsData->ulView == ulNewView)
  1678.       return;
  1679.  
  1680.    pResultsData->ulView = ulNewView;
  1681.  
  1682.    switch(ulNewView)
  1683.    {
  1684.       case MARKFLAG_FIND:
  1685.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_FIND, TRUE);
  1686.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_PERS, FALSE);
  1687.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_MARK, FALSE);
  1688.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_UNSENT, FALSE);
  1689.          ulMenuID = IDM_BMFP_VIEW_FIND;
  1690.          break;
  1691.  
  1692.       case MARKFLAG_PERSMAIL:
  1693.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_FIND, FALSE);
  1694.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_PERS, TRUE);
  1695.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_MARK, FALSE);
  1696.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_UNSENT, FALSE);
  1697.          ulMenuID = IDM_BMFP_VIEW_PERS;
  1698.          break;
  1699.  
  1700.       case MARKFLAG_MANUAL:
  1701.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_FIND, FALSE);
  1702.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_PERS, FALSE);
  1703.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_MARK, TRUE);
  1704.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_UNSENT, FALSE);
  1705.          ulMenuID = IDM_BMFP_VIEW_MARK;
  1706.          break;
  1707.  
  1708.       case MARKFLAG_UNSENT:
  1709.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_FIND, FALSE);
  1710.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_PERS, FALSE);
  1711.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_MARK, FALSE);
  1712.          WinCheckMenuItem(pResultsData->hwndFolderPopup, IDM_BMFP_VIEW_UNSENT, TRUE);
  1713.          ulMenuID = IDM_BMFP_VIEW_UNSENT;
  1714.          break;
  1715.    }
  1716.    SetResultsTitle(hwndDlg, pResultsData, ulMenuID);
  1717.  
  1718.    FillResultsWindow(hwndDlg, pResultsData);
  1719.  
  1720.    return;
  1721. }
  1722.  
  1723. static void SetResultsTitle(HWND hwndDlg, PRESULTSDATA pResultsData, ULONG ulMenuID)
  1724. {
  1725.    char *pchSrc, *pchDest;
  1726.    CNRINFO cnrinfo;
  1727.  
  1728.    WinSendMsg(pResultsData->hwndFolderPopup, MM_QUERYITEMTEXT,
  1729.               MPFROM2SHORT(ulMenuID, sizeof(pResultsData->pchCnrTitle)),
  1730.               pResultsData->pchCnrTitle);
  1731.    /* Prefix loeschen */
  1732.    pchSrc = pchDest = pResultsData->pchCnrTitle;
  1733.    while(*pchSrc)
  1734.       if (*pchSrc != '~')
  1735.          *pchDest++ = *pchSrc++;
  1736.       else
  1737.          pchSrc++;
  1738.    *pchDest = 0;
  1739.  
  1740.    cnrinfo.cb = sizeof(cnrinfo);
  1741.    cnrinfo.pszCnrTitle = pResultsData->pchCnrTitle;
  1742.    WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_SETCNRINFO, &cnrinfo,
  1743.                      MPFROMLONG(CMA_CNRTITLE));
  1744.  
  1745.    return;
  1746. }
  1747.  
  1748. static void FillResultsWindow(HWND hwndDlg, PRESULTSDATA pResultsData)
  1749. {
  1750.    extern MARKERLIST MarkerList;
  1751.    PMARKERBUCKET pBucket=NULL;
  1752.    PMARKERAREA   pArea=NULL;
  1753.    RESULTRECORD *pRecord, *pFirstRecord;
  1754.    RECORDINSERT RecordInsert;
  1755.  
  1756.    CleanupResults(WinWindowFromID(hwndDlg, IDD_FINDRESULTS+1));
  1757.  
  1758.    WinRequestMutexSem(MarkerList.hmtxAccess, SEM_INDEFINITE_WAIT);
  1759.  
  1760.    /* Alle Areas abklappern */
  1761.    pArea = MarkerList.pAreas;
  1762.    while(pArea)
  1763.    {
  1764.       /* Items zaehlen */
  1765.       ULONG ulItemCount=0;
  1766.  
  1767.       pBucket = pArea->pBuckets;
  1768.       while(pBucket)
  1769.       {
  1770.          int i;
  1771.  
  1772.          for (i=0; i<pBucket->ulCountItems; i++)
  1773.             if (pBucket->aItems[i].ulFlags & pResultsData->ulView)
  1774.                ulItemCount++;
  1775.  
  1776.          pBucket = pBucket->next;
  1777.       }
  1778.  
  1779.       if (ulItemCount)
  1780.       {
  1781.          /* Items einfuegen */
  1782.          pFirstRecord=WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_ALLOCRECORD,
  1783.                                   MPFROMLONG(sizeof(RESULTRECORD)-sizeof(MINIRECORDCORE)),
  1784.                                   MPFROMLONG(ulItemCount));
  1785.          pRecord = pFirstRecord;
  1786.  
  1787.          pBucket = pArea->pBuckets;
  1788.          while(pBucket)
  1789.          {
  1790.             int i;
  1791.  
  1792.             for (i=0; i<pBucket->ulCountItems; i++)
  1793.                if (pBucket->aItems[i].ulFlags & pResultsData->ulView)
  1794.                {
  1795.                   pRecord->pchAreaTag=malloc(LEN_AREATAG+1);
  1796.                   strcpy(pRecord->pchAreaTag, pArea->pchAreaTag);
  1797.                   pRecord->ulMsgNum = pBucket->aItems[i].ulMsgNr;
  1798.                   pRecord->ulMsgID  = pBucket->aItems[i].ulMsgID;
  1799.                   pRecord->pchFrom=malloc(LEN_USERNAME+1);
  1800.                   strcpy(pRecord->pchFrom, pBucket->aItems[i].pchFrom);
  1801.                   pRecord->pchSubj=malloc(LEN_SUBJECT+1);
  1802.                   strcpy(pRecord->pchSubj, pBucket->aItems[i].pchSubj);
  1803.                   if (pBucket->aItems[i].pchFindText[0])
  1804.                      pRecord->pchText=strdup(pBucket->aItems[i].pchFindText);
  1805.                   else
  1806.                      pRecord->pchText=NULL;
  1807.                   pRecord->ulFlags = pBucket->aItems[i].ulFlags;
  1808.                   pRecord->ulHow   = pBucket->aItems[i].ulHow;
  1809.                   pRecord->ulWhere = pBucket->aItems[i].ulWhere;
  1810.  
  1811.                   pRecord = (RESULTRECORD*) pRecord->RecordCore.preccNextRecord;
  1812.                }
  1813.             pBucket = pBucket->next;
  1814.          }
  1815.  
  1816.          RecordInsert.cb=sizeof(RECORDINSERT);
  1817.          RecordInsert.pRecordOrder=(RECORDCORE *)CMA_END;
  1818.          RecordInsert.pRecordParent=NULL;
  1819.          RecordInsert.zOrder=CMA_TOP;
  1820.          RecordInsert.fInvalidateRecord=FALSE;
  1821.          RecordInsert.cRecordsInsert=ulItemCount;
  1822.  
  1823.          WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_INSERTRECORD,
  1824.                            pFirstRecord, &RecordInsert);
  1825.       }
  1826.  
  1827.       pArea=pArea->next;
  1828.    }
  1829.    WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_INVALIDATERECORD,
  1830.                      NULL, NULL);
  1831.  
  1832.    DosReleaseMutexSem(MarkerList.hmtxAccess);
  1833.  
  1834.    UpdateGotoButton(hwndDlg, pResultsData);
  1835.  
  1836.    return;
  1837. }
  1838.  
  1839. static PWORKDATA CollectBookmarks(HWND hwndDlg, PRESULTSDATA pResultsData, ULONG ulWork,
  1840.                                   PCHAR pchDestArea, PCHAR pchDestFile, ULONG ulOptions)
  1841. {
  1842.    char pchLastArea[LEN_AREATAG+1]="#";
  1843.    PWORKDATA pWorkData=NULL, pWorkData2=NULL;
  1844.    RESULTRECORD *pRecord=NULL;
  1845.    CNRINFO cnrinfo;
  1846.    ULONG ulIndex=0;
  1847.  
  1848.    if (pResultsData->pPopupRecord->RecordCore.flRecordAttr & CRA_SELECTED)
  1849.    {
  1850.       /* Anzahl der Records abfragen */
  1851.       WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_QUERYCNRINFO,
  1852.                         &cnrinfo, MPFROMLONG(sizeof(cnrinfo)));
  1853.  
  1854.       while (pRecord = WinSendDlgItemMsg(hwndDlg, IDD_FINDRESULTS+1, CM_QUERYRECORDEMPHASIS,
  1855.                                          pRecord?pRecord:(PVOID)CMA_FIRST,
  1856.                                          MPFROMSHORT(CRA_SELECTED)))
  1857.       {
  1858.          if (stricmp(pchLastArea, pRecord->pchAreaTag))
  1859.          {
  1860.             /* Neue Area */
  1861.             strcpy(pchLastArea, pRecord->pchAreaTag);
  1862.  
  1863.             if (pWorkData)
  1864.             {
  1865.                pWorkData->next = calloc(1, sizeof(WORKDATA));
  1866.                pWorkData = pWorkData->next;
  1867.             }
  1868.             else
  1869.             {
  1870.                pWorkData = calloc(1, sizeof(WORKDATA));
  1871.                pWorkData2 = pWorkData;
  1872.             }
  1873.  
  1874.             pWorkData->flWorkToDo = ulWork;
  1875.             pWorkData->ulCopyMove = ulOptions;
  1876.             memcpy(pWorkData->pchSrcArea, pRecord->pchAreaTag, LEN_AREATAG);
  1877.             if (pchDestArea)
  1878.                strcpy(pWorkData->pchDestArea, pchDestArea);
  1879.             else
  1880.                strcpy(pWorkData->pchDestArea, pRecord->pchAreaTag);
  1881.             if (pchDestFile)
  1882.                strcpy(pWorkData->pchDestFile, pchDestFile);
  1883.  
  1884.             pWorkData->MsgIDArray=calloc(cnrinfo.cRecords, sizeof(ULONG));
  1885.             ulIndex=0;
  1886.          }
  1887.  
  1888.          /* ID eintragen */
  1889.          pWorkData->MsgIDArray[ulIndex++]=pRecord->ulMsgID;
  1890.          pWorkData->ulArraySize=ulIndex;
  1891.       }
  1892.    }
  1893.    else
  1894.    {
  1895.       /* nur einen Record */
  1896.       pWorkData2 = calloc(1, sizeof(WORKDATA));
  1897.       pWorkData2->flWorkToDo = ulWork;
  1898.       pWorkData2->ulCopyMove = ulOptions;
  1899.       memcpy(pWorkData2->pchSrcArea, pResultsData->pPopupRecord->pchAreaTag, LEN_AREATAG);
  1900.       if (pchDestArea)
  1901.          strcpy(pWorkData2->pchDestArea, pchDestArea);
  1902.       if (pchDestFile)
  1903.          strcpy(pWorkData2->pchDestFile, pchDestFile);
  1904.  
  1905.       pWorkData2->MsgIDArray=calloc(1, sizeof(ULONG));
  1906.  
  1907.       /* ID eintragen */
  1908.       pWorkData2->MsgIDArray[0]=pResultsData->pPopupRecord->ulMsgID;
  1909.       pWorkData2->ulArraySize=1;
  1910.    }
  1911.  
  1912.    return pWorkData2;
  1913. }
  1914.  
  1915. static SHORT _System SortResults(PRECORDCORE p1, PRECORDCORE p2, PVOID pStorage)
  1916. {
  1917.    int res=0;
  1918.  
  1919.    pStorage=pStorage;
  1920.  
  1921.    res = stricmp(((RESULTRECORD*)p1)->pchAreaTag, ((RESULTRECORD*)p2)->pchAreaTag);
  1922.  
  1923.    if (res)
  1924.       return (SHORT) res;
  1925.    else
  1926.    {
  1927.       if (((RESULTRECORD*)p1)->ulMsgNum < ((RESULTRECORD*)p2)->ulMsgNum)
  1928.          return -1;
  1929.       else
  1930.          return 1;
  1931.    }
  1932. }
  1933.  
  1934. MRESULT EXPENTRY SearchProc(HWND hwnd, ULONG message, MPARAM mp1, MPARAM mp2)
  1935. {
  1936.    PSEARCHPAR pSearchPar = WinQueryWindowPtr(hwnd, QWL_USER);
  1937.    extern HWND hwndhelp;
  1938.  
  1939.    switch(message)
  1940.    {
  1941.       case WM_INITDLG:
  1942.          pSearchPar = (PSEARCHPAR) mp2;
  1943.          WinSetWindowPtr(hwnd, QWL_USER, pSearchPar);
  1944.  
  1945.          /* Text */
  1946.          WinSendDlgItemMsg(hwnd, IDD_SEARCH, EM_SETTEXTLIMIT,
  1947.                            MPFROMSHORT(LEN_SEARCHTEXT), NULL);
  1948.          WinSetDlgItemText(hwnd, IDD_SEARCH+2, pSearchPar->pchSearchText);
  1949.          if (pSearchPar->pchSearchText[0])
  1950.          {
  1951.             WinEnableControl(hwnd, DID_OK, TRUE);
  1952.             WinSendDlgItemMsg(hwnd, IDD_SEARCH+2, EM_SETSEL,
  1953.                               MPFROM2SHORT(0, LEN_SEARCHTEXT), NULL);
  1954.          }
  1955.          /* Flags */
  1956.          if (pSearchPar->ulSearchFlags & SEARCHFLAG_CASESENSITIVE)
  1957.             WinCheckButton(hwnd, IDD_SEARCH+3, TRUE);
  1958.  
  1959.          RestoreWinPos(hwnd, &pSearchPar->DlgPos, FALSE, TRUE);
  1960.          break;
  1961.  
  1962.       case WM_ACTIVATE:
  1963.          if (mp1)
  1964.             WinAssociateHelpInstance(hwndhelp, hwnd);
  1965.          else
  1966.             WinAssociateHelpInstance(hwndhelp, NULLHANDLE);
  1967.          break;
  1968.  
  1969.       case WM_COMMAND:
  1970.          if (SHORT1FROMMP(mp1) == DID_OK)
  1971.          {
  1972.             WinQueryDlgItemText(hwnd, IDD_SEARCH+2, LEN_SEARCHTEXT+1, pSearchPar->pchSearchText);
  1973.             pSearchPar->ulSearchFlags=0;
  1974.             if (WinQueryButtonCheckstate(hwnd, IDD_SEARCH+3))
  1975.                pSearchPar->ulSearchFlags |= SEARCHFLAG_CASESENSITIVE;
  1976.          }
  1977.          break;
  1978.  
  1979.       case WM_CONTROL:
  1980.          if (SHORT1FROMMP(mp1) == IDD_SEARCH+2 &&
  1981.              SHORT2FROMMP(mp1) == EN_CHANGE)
  1982.          {
  1983.             if (WinQueryDlgItemTextLength(hwnd, IDD_SEARCH+2))
  1984.                WinEnableControl(hwnd, DID_OK, TRUE);
  1985.             else
  1986.                WinEnableControl(hwnd, DID_OK, FALSE);
  1987.          }
  1988.          break;
  1989.  
  1990.       case WM_DESTROY:
  1991.          QueryWinPos(hwnd, &pSearchPar->DlgPos);
  1992.          break;
  1993.    }
  1994.    return WinDefDlgProc(hwnd, message, mp1, mp2);
  1995. }
  1996.  
  1997. /*-------------------------------- Modulende --------------------------------*/
  1998.  
  1999.