home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / exedt040.zip / src / child.c next >
C/C++ Source or Header  |  1999-01-24  |  9KB  |  335 lines

  1.  
  2. #define INCL_PM
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <memory.h>
  6. #include <fcntl.h>
  7. #include <io.h>
  8. #include <os2.h>
  9. #include "exedit.h"
  10.  
  11. void RegisterChild(HAB hab)
  12. {
  13.  WinRegisterClass(hab,WC_CHILD,ChildWindow_Proc,CS_SIZEREDRAW,sizeof(PVOID)*2);
  14. }
  15.  
  16. void UpdateStatusLC(HWND hwndMle,TMle *Mle)
  17. {
  18.  LONG Line,Col,Pos;
  19.  
  20.  Mle->StText[0]=0;
  21.  Pos=LONGFROMMR(WinSendMsg(hwndMle, MLM_QUERYSEL, (MPARAM)MLFQS_CURSORSEL,0L));
  22.  Line=LONGFROMMR(WinSendMsg(hwndMle, MLM_LINEFROMCHAR, (MPARAM)Pos, 0L));
  23.  Col=LONGFROMMR(WinSendMsg(hwndMle, MLM_CHARFROMLINE, (MPARAM)Line, 0L));
  24.  Col=Pos-Col;
  25.  sprintf(Mle->StText," Line: %-5d Col: %-5d",Line,Col);
  26.  WinSendMsg(Mle->hwndStatusbar,SBM_SETPANELTEXT,MPFROM2SHORT(0,0),(MPARAM)Mle->StText);
  27. }
  28.  
  29. MRESULT EXPENTRY NewMLEProc(HWND hwnd,ULONG msg, MPARAM mp1,MPARAM mp2)
  30. {
  31.  TMle *Mle;
  32.  Mle = (TMle*) WinQueryWindowULong( hwnd, QWL_USER );
  33.  
  34.  switch (msg)
  35.  {
  36.  
  37.   case WM_CONTEXTMENU:
  38.   {
  39.    POINTL ptlMouse;
  40.  
  41.    WinQueryPointerPos(HWND_DESKTOP,&ptlMouse);
  42.  
  43.    WinPopupMenu(HWND_DESKTOP,Mle->hwndMenuOwner,Mle->hwndMenu,
  44.                 ptlMouse.x,ptlMouse.y,0,
  45.                 PU_HCONSTRAIN |
  46.                 PU_VCONSTRAIN |
  47.                 PU_MOUSEBUTTON1 |
  48.                 PU_KEYBOARD);
  49.   }
  50.   return 0;
  51.  
  52.   case WM_BUTTON1UP:
  53.    UpdateStatusLC(hwnd,Mle);
  54.   break;
  55.  
  56.   case WM_CHAR:
  57.    if (SHORT1FROMMP(mp1)&KC_KEYUP)
  58.    {
  59.      UpdateStatusLC(hwnd,Mle);
  60.      if (SHORT2FROMMP(mp2)==VK_INSERT)
  61.      {
  62.       if (WinQuerySysValue(HWND_DESKTOP,SV_INSERTMODE))
  63.        WinSendMsg(Mle->hwndStatusbar,SBM_SETPANELTEXT,MPFROM2SHORT(1,0)," Insert");
  64.       else WinSendMsg(Mle->hwndStatusbar,SBM_SETPANELTEXT,MPFROM2SHORT(1,0)," Overwrite");
  65.      }
  66.    }
  67.   break;
  68.  
  69.   case WM_FOCUSCHANGE:
  70.    if (!SHORT1FROMMP(mp2))
  71.    {
  72.     WinSendMsg(Mle->hwndStatusbar,SBM_SETPANELTEXT,MPFROM2SHORT(0,0),"");
  73.     WinSendMsg(Mle->hwndStatusbar,SBM_SETPANELTEXT,MPFROM2SHORT(1,0),"");
  74.    }
  75.    else
  76.    {
  77.     UpdateStatusLC(hwnd,Mle);
  78.     if (WinQuerySysValue(HWND_DESKTOP,SV_INSERTMODE))
  79.      WinSendMsg(Mle->hwndStatusbar,SBM_SETPANELTEXT,MPFROM2SHORT(1,0)," Insert");
  80.     else WinSendMsg(Mle->hwndStatusbar,SBM_SETPANELTEXT,MPFROM2SHORT(1,0)," Overwrite");
  81.    }
  82.   break;
  83.  
  84.   default:
  85.   break;
  86.  }
  87.  return Mle->OldProc(hwnd,msg,mp1,mp2);
  88. }
  89.  
  90.  
  91. MRESULT EXPENTRY ChildWindow_Proc(HWND hwnd,ULONG msg, MPARAM mp1,MPARAM mp2)
  92. {
  93.  TChild *Child;
  94.  Child=WinQueryWindowPtr(hwnd,0);
  95.  
  96.  switch (msg)
  97.  {
  98.   case WM_CREATE:
  99.   {
  100.    HWND hwndMClient=WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT);
  101.  
  102.  
  103.    Child = (TChild*)malloc(sizeof(TChild));
  104.    WinSetWindowPtr(hwnd,0,Child);
  105.    Child->usSzStruct= sizeof(TChild);
  106.  
  107.    //Create and subclass MLE Window
  108.    Child->hwndMLE=WinCreateWindow(hwnd,WC_MLE,NULL,MLS_BORDER|MLS_HSCROLL|MLS_VSCROLL|
  109.                                   WS_VISIBLE,0,0,0,0,hwnd,HWND_TOP,Id_MLEWindow,0,0);
  110.    Child->Main=WinQueryWindowPtr(hwndMClient,0);
  111.    Child->hwndStatusbar= Child->Main->hwndStatusbar;
  112.    Child->Mle=(TMle*)malloc(sizeof(TMle));
  113.    Child->Mle->OldProc = WinSubclassWindow(Child->hwndMLE,NewMLEProc);
  114.    Child->Mle->hwndMenu = Child->Main->hwndMleMenu;
  115.    Child->Mle->hwndMenuOwner = hwndMClient;
  116.    Child->Mle->hwndStatusbar = Child->hwndStatusbar;
  117.    WinSetWindowULong(Child->hwndMLE,QWL_USER,(ULONG)Child->Mle);
  118.    Child->SearchDlg.usSzStruct=sizeof(TSearchDlg);
  119.    Child->SearchDlg.FText[0]=0;
  120.    Child->SearchDlg.Rtext[0]=0;
  121.    Child->SearchDlg.CaseSens=FALSE;
  122.    Child->SearchDlg.Select=FALSE;
  123.    Child->SearchDlg.WholeWord=FALSE;
  124.    Child->SearchDlg.hwnd=hwnd;
  125.   }
  126.   break;
  127.  
  128.   case WM_SIZE:
  129.   {
  130.    SWP swpClient;
  131.    WinQueryWindowPos(hwnd,&swpClient);
  132.    WinSetWindowPos(Child->hwndMLE,HWND_TOP,0,0,swpClient.cx,swpClient.cy,
  133.                     SWP_SIZE | SWP_MOVE);
  134.   }
  135.   break;
  136.  
  137.   case WM_COMMAND:
  138.   {
  139.    switch(SHORT1FROMMP(mp1))
  140.    {
  141.     case M_File_Open:
  142.      FileOpen(Child);
  143.     return 0;
  144.  
  145.     case M_File_Save:
  146.     if (!Child->FileName[0])
  147.      WinSendMsg(hwnd,WM_COMMAND,MPFROM2SHORT(M_File_SaveAs,0),0);
  148.     else FileSave(Child);
  149.     return 0;
  150.  
  151.     case M_File_SaveAs:
  152.     {
  153.      HWND hwndFrame=WinQueryWindow(hwnd, QW_PARENT);
  154.      TMain *Main=Child->Main;
  155.  
  156.      Main->FileDlg.fl     = FDS_SAVEAS_DIALOG|FDS_CENTER;
  157.      WinFileDlg(HWND_DESKTOP, hwnd, &Main->FileDlg);
  158.      if (Main->FileDlg.lReturn == DID_OK)
  159.      {
  160.       strcpy(Child->FileName,Main->FileDlg.szFullFile);
  161.       WinSetWindowText(hwndFrame,Child->FileName);
  162.       FileSave(Child);
  163.      }
  164.     }
  165.     return 0;
  166.  
  167.     case M_Edit_Undo:
  168.      WinSendMsg(Child->hwndMLE,MLM_UNDO,0,0);
  169.     return 0;
  170.  
  171.     case M_Edit_Cut:
  172.      WinSendMsg(Child->hwndMLE,MLM_CUT,0,0);
  173.     return 0;
  174.  
  175.     case M_Edit_Clear:
  176.      WinSendMsg(Child->hwndMLE,MLM_CLEAR,0,0);
  177.     return 0;
  178.  
  179.     case M_Edit_Copy:
  180.      WinSendMsg(Child->hwndMLE,MLM_COPY,0,0);
  181.     return 0;
  182.  
  183.     case M_Edit_Paste:
  184.      WinSendMsg(Child->hwndMLE,MLM_PASTE,0,0);
  185.     return 0;
  186.  
  187.     case M_Edit_LocSet:
  188.     {
  189.      TSettingsNB *SettingsNB;
  190.      SettingsNB = (TSettingsNB*)malloc(sizeof(TSettingsNB));
  191.      memcpy(&SettingsNB->Settings,&Child->Main->DefSettings,sizeof(TSettings));
  192.      if (WinDlgBox(HWND_DESKTOP,hwnd,Dlg_Settings_Proc,NULLHANDLE,Id_Settings,(PVOID)SettingsNB)==TRUE)
  193.       UpdateSettings(hwnd,&SettingsNB->Settings,FALSE);
  194.      DosFreeMem(SettingsNB);
  195.     }
  196.     return 0;
  197.  
  198.     case M_Edit_Search:
  199.      WinSetFocus(HWND_DESKTOP,Child->hwndMLE);
  200.      WinDlgBox(HWND_DESKTOP,hwnd,D_Search_Proc,NULLHANDLE,DLG_SEARCH,&Child->SearchDlg);
  201.     return 0;
  202.  
  203.     case M_File_Print:
  204.     {
  205.      if (WinMessageBox(HWND_DESKTOP,hwnd,"Do you want to print current file?",Child->FileName,
  206.                        0,MB_NOICON|MB_YESNO|MB_QUERY|MB_MOVEABLE)==MBID_YES)
  207.       {
  208.       PVOID  Buffer;
  209.       ULONG  amount, amountexp;
  210.       MPARAM sel=0;
  211.       IPT FirstChar=0,Lenght;
  212.       int HPrint=open("\\DEV\\PRN",O_RDWR | O_BINARY | O_CREAT | O_TRUNC, 0666);
  213.  
  214.       Buffer=(char*)malloc(64000);
  215.       sel=WinSendMsg(Child->hwndMLE,MLM_QUERYSEL,(MPARAM)MLFQS_MINMAXSEL,0);
  216.       WinSendMsg(Child->hwndMLE,MLM_SETIMPORTEXPORT,Buffer,MPFROMLONG(64000));
  217.  
  218.       if(SHORT1FROMMP(sel)!=SHORT2FROMMP(sel))
  219.       {
  220.        FirstChar=SHORT1FROMMP(sel);
  221.        Lenght=SHORT2FROMMP(sel)-FirstChar;
  222.        amountexp=(ULONG)WinSendMsg(Child->hwndMLE, MLM_EXPORT, &FirstChar, &Lenght);
  223.        write(HPrint,Buffer,amountexp);
  224.       }
  225.       else
  226.       do {
  227.           amount = 64000;
  228.           amountexp = (ULONG) WinSendMsg(Child->hwndMLE, MLM_EXPORT, &FirstChar, &amount);
  229.           write(HPrint,Buffer,amountexp);
  230.          }
  231.       while(amountexp != 0);
  232.       close(HPrint);
  233.      }
  234.     }
  235.     return 0;
  236.  
  237.  
  238.  
  239.     default:
  240.     return WinDefWindowProc(hwnd,msg,mp1,mp2);
  241.    }
  242.   }
  243.  
  244.   case SM_FIND:
  245.   {
  246.    PVOID Buffer;
  247.    ULONG  amount, amountexp;
  248.    PCHAR p;
  249.    IPT anchor,search;
  250.    MPARAM sel;
  251.    IPT FirstChar=0,Lenght;
  252.    TSearchDlg* SearchDlg=(TSearchDlg*)mp1;
  253.  
  254.    Buffer=(char*)malloc(64000);
  255.  
  256.    if (!SearchDlg->SEnd)
  257.    {
  258.     sel=WinSendMsg(Child->hwndMLE,MLM_QUERYSEL,(MPARAM)MLFQS_MINMAXSEL,0);
  259.     SearchDlg->SStart=SHORT1FROMMP(sel);
  260.     SearchDlg->SEnd=SHORT2FROMMP(sel);
  261.    }
  262.  
  263.    if (!SearchDlg->End)
  264.    {
  265.     if (!SearchDlg->Select)
  266.     {
  267.      SearchDlg->Start=0;
  268.      SearchDlg->End=(IPT)WinSendMsg(Child->hwndMLE,MLM_QUERYTEXTLENGTH,0,0);
  269.     }
  270.     else
  271.     {
  272.      SearchDlg->Start=SearchDlg->SStart;
  273.      SearchDlg->End=SearchDlg->SEnd;
  274.     }
  275.    }
  276.  
  277.    WinSendMsg(Child->hwndMLE,MLM_SETIMPORTEXPORT,Buffer,MPFROMLONG(64000));
  278.    FirstChar=SearchDlg->Start;
  279.    Lenght=SearchDlg->End-SearchDlg->Start;
  280.  
  281.    do
  282.    {
  283.     amountexp=(ULONG)WinSendMsg(Child->hwndMLE, MLM_EXPORT, &FirstChar, &Lenght);
  284.     p=(PCHAR)Buffer;
  285.     p[amountexp+1]=0;
  286.     if ((search=Search(p,SearchDlg->FText,SearchDlg->CaseSens,SearchDlg->WholeWord))!=-1)
  287.     {
  288.      anchor=SearchDlg->Start+search;
  289.      WinSendMsg(Child->hwndMLE,MLM_SETSEL,(MPARAM)anchor,(MPARAM)(anchor+strlen(SearchDlg->FText)));
  290.      DosFreeMem(Buffer);
  291.      return (MPARAM)(anchor+strlen(SearchDlg->FText));
  292.     }
  293.    }
  294.    while(amountexp!=0);
  295.    DosFreeMem(Buffer);
  296.   }
  297.   return (MPARAM)-1;
  298.  
  299.   case SM_REPLACE:
  300.   {
  301.    TSearchDlg *SearchDlg=(MPARAM)mp1;
  302.    WinSendMsg(Child->hwndMLE,MLM_INSERT,SearchDlg->Rtext,0);
  303.   }
  304.   return 0;
  305.  
  306.   case WM_CLOSEALL:
  307.   case WM_CLOSE:
  308.   {
  309.    HWND hwndFrame=WinQueryWindow(hwnd, QW_PARENT);
  310.    HWND hwndClient=WinQueryWindow(hwndFrame, QW_PARENT);
  311.  
  312.    if (WinSendMsg(Child->hwndMLE,MLM_QUERYCHANGED,0,0))
  313.    if (WinMessageBox(HWND_DESKTOP,hwnd,"Do you want to save changes?",Child->FileName,
  314.                      0,MB_NOICON|MB_YESNO|MB_QUERY|MB_MOVEABLE)==MBID_YES)
  315.    WinSendMsg(hwnd,WM_COMMAND,(MPARAM)M_File_Save,0);
  316.  
  317.    WinDestroyWindow(Child->hwndMLE);
  318.    WinDestroyWindow(hwndFrame);
  319.    DosFreeMem(Child->Mle);
  320.    DosFreeMem(Child);
  321.    if (!ChildCount(hwndClient)) CItemsEnable(hwndClient,FALSE);
  322.    RefreshWinList(hwndClient);
  323.   }
  324.   break;
  325.  
  326.   default:
  327.    if ((ULONG)msg>=0x01b0 && (ULONG)msg<=0x01df)
  328.    WinSendMsg(Child->hwndMLE,msg,mp1,mp2);
  329.   break;
  330.  }
  331.  return WinDefWindowProc(hwnd,msg,mp1,mp2);
  332. }
  333.  
  334.  
  335.