home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / spdos2.zip / LIBSRC / PMEDITOR.PAS < prev    next >
Pascal/Delphi Source File  |  1994-06-22  |  60KB  |  1,842 lines

  1. UNIT PMEditor;
  2.  
  3. {************************************************************************
  4. *                                                                       *
  5. *                                                                       *
  6. *          General Unit for Object-PM (C) 1993,94 R. Nürnberger         *
  7. *                                                                       *
  8. *                                                                       *
  9. *************************************************************************}
  10.  
  11. INTERFACE
  12.  
  13. USES PmObject,PmDos,PmDialog;
  14.  
  15. CONST
  16.      MaxEditors=32;          {Maximal editors to process}
  17.      InitialBuf=32768;       {starting buffer size for editing}
  18.      EditorMaxLines:WORD=28; {maximal editor lines for standard text}
  19.  
  20. VAR
  21.    CharWidth:LONGWORD;
  22.    CharHeight:LONGWORD;
  23.    SelectDrawColor,SelectBackColor:LONGINT;
  24.  
  25. TYPE
  26.      PSliderData=^SliderData;
  27.      SliderData=record
  28.                       scrollbottom:LONGWORD; { Scroll lower border  }
  29.                       scrolltop:LONGWORD;    { Scroll upper border  }
  30.                       viewarea:LONGWORD;     { View area of window  }
  31.                       intervall:WORD;        { Intervall of Slider  }
  32.                       acvalue:LONGWORD;      { actual Slider value  }
  33.                 end;
  34.  
  35.      PTextBuf=^TTextBuf;
  36.      TTextBuf=ARRAY[0..6553500] OF BYTE; {that should be enough ...}
  37.  
  38.      PEditor=^TEditor;  {Data structure for each editor}
  39.      TEditor=RECORD
  40.                    TextBuffer:PTextBuf; {Buffer to text}
  41.                    ScreenBuffer:ARRAY[0..60] OF String[126];
  42.                    TextLen:LONGWORD;    {Length of text +InitialBuf}
  43.                    TextLow:LONGWORD;    {Actual low position in text}
  44.                    TextHigh:LONGWORD;   {Actual high position in text}
  45.                    HSlider,VSlider:SliderData;
  46.                    CursorX,CursorY:LONGWORD; {Current cursor position}
  47.                    InsertMode:BOOLEAN;
  48.                    Title:String;
  49.                    Untitled:BOOLEAN;
  50.                    Modified:BOOLEAN;
  51.                    TextLines:LONGWORD;
  52.                    TextViewX,TextViewY:LONGWORD;
  53.                    SelectLineStart,SelectColumnStart:WORD;
  54.                    SelectLineEnd,SelectColumnEnd:WORD;
  55.                    SelectAnchorLine,SelectAnchorColumn:WORD;
  56.                    Win:HWND;  {Frame window handle}
  57.              END;
  58.  
  59.  
  60.  
  61. TYPE TEditorApplication=OBJECT(TMDIApplication)
  62.                    EditorCount:WORD;
  63.                    UntitledCount:BYTE;
  64.                    Editors:ARRAY[0..MaxEditors] OF PEditor;
  65.                    CreateBackups:BOOLEAN;
  66.                    StdExt:String;
  67.                    CONSTRUCTOR Init(AppMainID:LONGWORD);
  68.                    DESTRUCTOR Done;
  69.                    FUNCTION MDIHandleEvent(Win:HWND;Msg:LONGWORD;para1,para2:POINTER;
  70.                                            VAR Handled:BOOLEAN;
  71.                                            Extra:POINTER):LONGWORD:virtual;
  72.                    FUNCTION AppHandleEvent(Win:HWND;Msg:LONGWORD;
  73.                                            para1,para2:POINTER;
  74.                                            VAR Handled:BOOLEAN):
  75.                                            LONGWORD:virtual;
  76.                    PROCEDURE MDIRedraw(Win:HWND;_hps:HPS;Extra:POINTER):virtual;
  77.                    PROCEDURE MDICreateNotify(Win:HWND;Extra:POINTER):virtual;
  78.                    PROCEDURE OpenNewFile;
  79.                    PROCEDURE OpenFile(name:STRING);
  80.                    PROCEDURE SaveFile;
  81.                    PROCEDURE SaveFileAs;
  82.                    PROCEDURE SaveAllFiles;
  83.                    PROCEDURE SaveEditor(e:PEditor);
  84.                    PROCEDURE InitEditor(e:Peditor);
  85.                    PROCEDURE CheckHScrollBar(Win:HWND;para1,para2,Extra:PEditor);
  86.                    PROCEDURE CheckVScrollBar(Win:HWND;para1,para2,Extra:PEditor);
  87.                    PROCEDURE MDIHandleCharEvent(Win:HWND;Extra:POINTER;
  88.                                                ch:Char):virtual;
  89.                    PROCEDURE MDIHandleScanEvent(Win:HWND;Extra:POINTER;
  90.                                                 scan:Word):virtual;
  91.                    PROCEDURE SetCursor(Win:HWND;pp:PEditor);
  92.                    PROCEDURE InvalidateEditorLine(Win:HWND;VAR s:string;
  93.                                                   y:LONGWORD;Extra:PEditor);
  94.                    FUNCTION CheckIfToScrollX(Win:HWND;Extra:PEditor):BOOLEAN;
  95.                    PROCEDURE DestroyEditor(e:PEditor);
  96.                    PROCEDURE InvalidateEditorWindow(Win:HWND;Extra:PEditor);
  97.                    FUNCTION CalcMaxSliderPositions(VAR scrolldata:SliderData)
  98.                                                    :WORD;
  99.                    FUNCTION CalcSliderfromValue(wert:LONGWORD;scrolldata:
  100.                                                 SliderData):WORD;
  101.                    FUNCTION CalcValuefromSlider(wert:WORD;scrolldata:
  102.                                                 SliderData):LONGWORD;
  103.                    FUNCTION GetUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
  104.                    FUNCTION GetLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
  105.                    FUNCTION AppendUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
  106.                    FUNCTION AppendLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
  107.                    PROCEDURE LineDown(Win:HWND;Extra:PEditor);
  108.                    PROCEDURE PageDown(Win:HWND;Extra:PEditor);
  109.                    PROCEDURE LineUp(Win:HWND;Extra:PEditor);
  110.                    PROCEDURE PageUp(Win:HWND;Extra:PEditor);
  111.               END;
  112.  
  113.  
  114. IMPLEMENTATION
  115.  
  116. IMPORTS {Private}
  117.       FUNCTION WinSetWindowText(psztext:PSZ;
  118.                                 _hwnd:HWND):LONGWORD:   PMWIN index 877;
  119.       FUNCTION WinQueryWindow(cmd:LONGWORD;
  120.                                   _hwnd:HWND):LONGWORD:    PMWIN index 834;
  121.       FUNCTION WinWindowFromID(id:LONGWORD;
  122.                                    hwndParent:HWND):HWND:  PMWIN index 899;
  123.       FUNCTION WinSendMsg(MPARAM2,MPARAM1:POINTER;
  124.                               msg:LONGWORD;
  125.                               _hwnd:HWND):POINTER:         PMWIN index 920;
  126.       FUNCTION WinQueryWindowRect(VAR prclDest:RECTL;
  127.                                       _hwnd:HWND ):
  128.                                       LONGWORD:            PMWIN index 840;
  129.       PROCEDURE WinReleasePS(_hps:HPS):                    PMWIN index 848;
  130.       FUNCTION  WinGetPS(Win:HWND):HPS:                    PMWIN index 757;
  131.       PROCEDURE WinShowCursor(Visible:LONGWORD;
  132.                               Win:HWND):                   PMWIN index 880;
  133.       PROCEDURE GpiSetBackMix(Mix:LONGWORD;_hps:HPS):      PMGPI index 505;
  134.       FUNCTION GpiSetColor(lColor:LONGWORD;
  135.                              _hps:HPS):LONGINT:            PMGPI index 517;
  136.       FUNCTION GpiSetBackColor(lColor:LONGINT;
  137.                                _hps:HPS):LONGWORD:       PMGPI index 504;
  138.       FUNCTION GpiCharStringAt(VAR pchString;
  139.                                lCount:LONGWORD;
  140.                                VAR pptlPoint:POINTL;
  141.                                _hps:HPS):LONGWORD:       PMGPI index 359;
  142. END;
  143.  
  144. PROCEDURE TEditorApplication.SaveEditor(e:PEditor);
  145. VAR f:file;
  146.     d:dirstr;
  147.     n:namestr;
  148.     ex:extstr;
  149.     s:String;
  150.     Buf:LONGWORD;
  151.     Len:LONGWORD;
  152.     t:BYTE;
  153.     sp:PString;
  154. BEGIN
  155.      IF e=NIL THEN exit;
  156.      IF e^.Untitled THEN
  157.      BEGIN
  158.           GetDir(0,s);
  159.           IF s[length(s)]='\' THEN dec(s[0]);
  160.           s:=s+'\'+e^.Title;
  161.           e^.Title:=s;
  162.           e^.Untitled:=FALSE;
  163.           sp:=s;
  164.           WinSetWindowText(sp,e^.Win);
  165.      END;
  166.      IF CreateBackups THEN
  167.      BEGIN
  168.           s:=e^.Title;
  169.           assign(f,s);
  170.           fsplit(s,d,n,ex);
  171.           IF d[length(d)]='\' THEN dec(d[0]);
  172.           s:=d+'\'+n+'.BAK';
  173.           Erase(s);  {Delete old .BAK file}
  174.           Rename(f,s);
  175.      END;
  176.      s:=e^.Title;
  177.      Assign(f,s);
  178.      Rewrite(f,1);
  179.      IF ioresult<>0 THEN
  180.      BEGIN
  181.           ErrorBox('Could not create file (Disk full ?)');
  182.           exit;
  183.      END;
  184.      Buf:=LONGWORD(e^.TextBuffer);
  185.      Len:=e^.TextLow-Buf;
  186.      IF Len>0 THEN
  187.      BEGIN
  188.           BlockWrite(f,e^.TextBuffer^[0],Len);
  189.           IF ioresult<>0 THEN
  190.           BEGIN
  191.               ErrorBox('Could not write file (Disk full ?)');
  192.               Close(f);
  193.               exit;
  194.           END;
  195.      END;
  196.  
  197.      FOR t:=0 TO EditorMaxLines DO
  198.      BEGIN
  199.           s:=e^.ScreenBuffer[t];
  200.           while s[length(s)]=#32 do dec(s[0]);
  201.           s:=s+#13+#10;
  202.           BlockWrite(f,s[1],length(s));
  203.           IF ioresult<>0 THEN
  204.           BEGIN
  205.               ErrorBox('Could not write file (Disk full ?)');
  206.               Close(f);
  207.               exit;
  208.           END;
  209.      END;
  210.  
  211.      Len:=Buf+e^.textlen;  {Maximal adress}
  212.      Len:=Len-e^.TextHigh;
  213.      IF Len>0 THEN
  214.      BEGIN
  215.           BlockWrite(f,e^.TextBuffer^[e^.TextHigh-Buf],len);
  216.           IF ioresult<>0 THEN
  217.           BEGIN
  218.              ErrorBox('Could not write file (Disk full ?)');
  219.              Close(f);
  220.              exit;
  221.           END;
  222.      END;
  223.      Close(f);
  224.      IF ioresult<>0 THEN
  225.      BEGIN
  226.           ErrorBox('Could not write file (Disk full ?)');
  227.           exit;
  228.      END;
  229.      e^.Modified:=FALSE;
  230. END;
  231.  
  232. PROCEDURE TEditorApplication.SaveFile;  {Save upper editor file}
  233. VAR e:PEditor;
  234.     s:string;
  235.     sp:PString;
  236.     f:file;
  237. BEGIN
  238.      IF EditorCount=0 THEN exit;
  239.      MDIGetTopWindow(e);
  240.      IF e=NIL THEN exit;
  241.      IF e^.Untitled THEN
  242.      BEGIN
  243.           IF FileSaveDialog(AppWinHandle,s) THEN
  244.           BEGIN
  245.                IF pos('.',s)=0 THEN s:=s+StdExt;
  246.                assign(f,s);
  247.                reset(f,1);
  248.                IF ioresult=0 THEN  {file exists}
  249.                BEGIN
  250.                     Close(f);
  251.                     IF not ConfirmBox('File exists. Overwrite ??') THEN exit;
  252.                END;
  253.                e^.Title:=s;
  254.                e^.Untitled:=FALSE;
  255.                sp:=s;
  256.                WinSetWindowText(sp,e^.Win);
  257.           END
  258.           ELSE exit; {Canceled}
  259.      END;
  260.      SaveEditor(e);
  261. END;
  262.  
  263. PROCEDURE TEditorApplication.SaveFileAs;  {Save upper editor file}
  264. VAR e:PEditor;
  265.     s:string;
  266.     sp:PString;
  267.     f:file;
  268. BEGIN
  269.      IF EditorCount=0 THEN exit;
  270.      MDIGetTopWindow(e);
  271.      IF e=NIL THEN exit;
  272.      IF FileSaveDialog(AppWinHandle,s) THEN
  273.      BEGIN
  274.           IF pos('.',s)=0 THEN s:=s+StdExt;
  275.           assign(f,s);
  276.           reset(f,1);
  277.           IF ioresult=0 THEN  {file exists}
  278.           BEGIN
  279.                Close(f);
  280.                IF not ConfirmBox('File exists. Overwrite ??') THEN exit;
  281.           END;
  282.           e^.Title:=s;
  283.           e^.Untitled:=FALSE;
  284.           sp:=s;
  285.           WinSetWindowText(sp,e^.Win);
  286.      END
  287.      ELSE exit; {Canceled}
  288.      SaveEditor(e);
  289. END;
  290.  
  291. PROCEDURE TEditorApplication.SaveAllFiles;
  292. VAR t:BYTE;
  293. BEGIN
  294.      IF EditorCount=0 THEN exit;
  295.      FOR t:=0 TO EditorCount-1 DO
  296.        IF Editors[t]^.Modified THEN SaveEditor(Editors[t]);
  297. END;
  298.  
  299.  
  300. FUNCTION TEditorApplication.CalcMaxSliderPositions(VAR scrolldata:SliderData):WORD;
  301. VAR as:WORD;
  302. BEGIN
  303.      as:=(scrolldata.scrolltop-scrolldata.scrollbottom)-scrolldata.viewarea;
  304.      inc(as,2);
  305.      scrolldata.intervall:=as;
  306.      CalcMaxSliderPositions:=as;
  307. END;
  308.  
  309. FUNCTION TEditorApplication.CalcSliderfromValue(wert:LONGWORD;scrolldata:SliderData):WORD;
  310. VAR og:LONGWORD;
  311.     rec:RECTL;
  312. BEGIN
  313.      og:=(scrolldata.scrolltop-scrolldata.viewarea)+1;
  314.      IF wert<scrolldata.scrollbottom THEN wert:=scrolldata.scrollbottom;
  315.      IF wert>og THEN wert:=og;
  316.      CalcSliderfromValue:=(wert-scrolldata.scrollbottom)+1;
  317. END;
  318.  
  319. FUNCTION TEditorApplication.CalcValuefromSlider(Wert:WORD;scrolldata:SliderData):
  320.          LONGWORD;
  321. VAR og:WORD;
  322. BEGIN
  323.      og:=(scrolldata.scrolltop-scrolldata.scrollbottom)-scrolldata.viewarea;
  324.      inc(og,2);
  325.      IF Wert<1 THEN Wert:=1;
  326.      IF Wert>og THEN Wert:=og;
  327.      CalcValuefromSlider:=(Wert+scrolldata.scrollbottom)-1;
  328. END;
  329.  
  330.  
  331. FUNCTION TEditorApplication.GetUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
  332. VAR Adresse:LONGWORD;
  333.     Buffer:POINTER;
  334.     Max:LONGWORD;
  335.     result:BOOLEAN;
  336. Label l;
  337. BEGIN
  338.      Adresse:=Extra^.TextHigh;
  339.      Max:=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen;
  340.      IF Adresse>=Max THEN
  341.      BEGIN
  342.           Extra^.TextHigh:=Max;
  343.           s:='';
  344.           result:=FALSE;
  345.           goto l;
  346.      END;
  347.      Buffer:=Extra^.TextBuffer;
  348.      ASM
  349.         MOV CL,0
  350.         MOV EDI,$s
  351.         INC EDI
  352.         MOV ESI,$Adresse
  353.         INC ESI
  354. !rep_lab:
  355.         CMP ESI,$Max
  356.         JAE !crlf
  357.         MOV AL,[ESI+0]
  358.         CMP AL,13
  359.         JE !cr
  360.         CMP AL,10
  361.         JE !crlf
  362.  
  363.         INC CL
  364.         INC ESI
  365.         MOV [EDI+0],AL
  366.         INC EDI
  367.         CMP CL,127
  368.         JAE !crlf
  369.         JMP !rep_lab
  370. !cr:
  371.         INC ESI
  372.         MOV AL,[ESI+0]
  373.         CMP AL,10
  374.         JNE !crlf
  375.         INC ESI
  376. !crlf:
  377.         CLD
  378.         MOV AL,0
  379.         STOSB
  380.         MOV EDI,$s
  381.         MOV [EDI+0],CL   ;Set text len
  382.         DEC ESI
  383.         CMP ESI,$Max
  384.         JBE !ok1
  385.         MOV ESI,$Max
  386. !ok1:
  387.         MOV $Adresse,ESI
  388.      END;
  389.      Extra^.TextHigh:=Adresse;
  390.      result:=TRUE;
  391. l:
  392.      IF length(s)>126 THEN s[0]:=#126;
  393.      ASM
  394.         MOV EDI,$s
  395.         MOV AL,[EDI+0]
  396.         CMP AL,126
  397.         JE !eee
  398.         ;Length to short --> fill up with space
  399.         MOVZX EAX,AL
  400.         MOVB [EDI+0],126
  401.         ADD EDI,EAX
  402.         INC EDI
  403.         MOV ECX,126
  404.         SUB ECX,EAX
  405.         MOV AL,32
  406.         CLD
  407.         REP
  408.         STOSB
  409.         MOV AL,0
  410.         STOSB
  411. !eee:
  412.      END;
  413.      GetUpperLine:=result;
  414. END;
  415.  
  416. FUNCTION TEditorApplication.GetLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
  417. VAR Adresse:LONGWORD;
  418.     Buffer:POINTER;
  419.     Result:BOOLEAN;
  420. Label l;
  421. BEGIN
  422.      Adresse:=Extra^.TextLow;
  423.      Buffer:=Extra^.TextBuffer;
  424.      IF Adresse<=LONGWORD(Buffer) THEN
  425.      BEGIN
  426.           Extra^.TextLow:=LONGWORD(Buffer);
  427.           Result:=FALSE;
  428.           s:='';
  429.           goto l;
  430.      END;
  431.      ASM
  432.          MOV CL,0
  433.          MOV EDI,$s
  434.          INC EDI
  435.          MOV ESI,$Adresse
  436.          SUB ESI,3
  437. !rep_lab1:
  438.          CMP ESI,$Buffer
  439.          JB !cr1
  440.          CMP CL,127
  441.          JAE !cr1
  442.          MOV AL,[ESI+0]
  443.          CMP AL,10
  444.          JE !cr1
  445.          CMP AL,13
  446.          JE !cr1
  447.          DEC ESI
  448.          INC CL
  449.          JMP !rep_lab1
  450. !cr1:
  451.          INC ESI
  452.          MOVZX ECX,CL
  453.          PUSH ECX
  454.          PUSH ESI
  455.          CMP ECX,0
  456.          JE !no_copy
  457.          CLD
  458.          REP
  459.          MOVSB
  460. !no_copy:
  461.          CLD
  462.          MOV AL,0
  463.          STOSB
  464.          POP ESI
  465.          POP ECX
  466.          MOV EDI,$s
  467.          MOV [EDI+0],CL
  468.          CMP ESI,$Buffer
  469.          JAE !ok
  470.          MOV ESI,$Buffer
  471. !ok:
  472.          MOV $Adresse,ESI
  473.      END;
  474.      Extra^.TextLow:=Adresse;
  475.      Result:=TRUE;
  476. l:
  477.      IF length(s)>126 THEN s[0]:=#126;
  478.      ASM
  479.         MOV EDI,$s
  480.         MOV AL,[EDI+0]
  481.         CMP AL,126
  482.         JE !eee1
  483.         ;Length to short --> fill up with space
  484.         MOVZX EAX,AL
  485.         MOVB [EDI+0],126
  486.         ADD EDI,EAX
  487.         INC EDI
  488.         MOV ECX,126
  489.         SUB ECX,EAX
  490.         MOV AL,32
  491.         CLD
  492.         REP
  493.         STOSB
  494.         MOV AL,0
  495.         STOSB
  496. !eee1:
  497.      END;
  498.      GetLowerLine:=Result;
  499. END;
  500.  
  501. FUNCTION TEditorApplication.AppendUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
  502. VAR Adresse:LONGWORD;
  503.     Buffer:POINTER;
  504. BEGIN
  505.      WHILE s[length(s)]=#32 DO dec(s[0]);
  506.      Adresse:=Extra^.TextHigh;
  507.      Buffer:=Extra^.TextBuffer;
  508.      ASM
  509.          MOV EDI,$Adresse
  510.          MOV AL,10
  511.          STD
  512.          STOSB
  513.          MOV AL,13
  514.          STOSB
  515.          MOV ESI,$s
  516.          MOV CL,[ESI+0]
  517.          MOVZX ECX,CL
  518.          ADD ESI,ECX
  519.          CMP ECX,0
  520.          JE !no_copy1
  521.          STD
  522.          REP
  523.          MOVSB
  524. !no_copy1:
  525.          MOV $Adresse,EDI
  526.      END;
  527.      Extra^.TextHigh:=Adresse;
  528.      AppendUpperLine:=TRUE;
  529. END;
  530.  
  531. FUNCTION TEditorApplication.AppendLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
  532. VAR Adresse:LONGWORD;
  533.     Buffer:POINTER;
  534. BEGIN
  535.      WHILE s[length(s)]=#32 DO dec(s[0]);
  536.      Adresse:=Extra^.TextLow;
  537.      Buffer:=Extra^.TextBuffer;
  538.      ASM
  539.         MOV EDI,$Adresse
  540.         MOV ESI,$s
  541.         MOV CL,[ESI+0]
  542.         MOVZX ECX,CL
  543.         INC ESI
  544.         CMP ECX,0
  545.         JE !no_copy2
  546.         CLD
  547.         REP
  548.         MOVSB
  549. !no_copy2:
  550.         MOV AL,13
  551.         STOSB
  552.         MOV AL,10
  553.         STOSB
  554.         MOV $Adresse,EDI
  555.      END;
  556.      Extra^.TextLow:=Adresse;
  557.      AppendLowerLine:=TRUE;
  558. END;
  559.  
  560. CONSTRUCTOR TEditorApplication.Init(AppMainID:LONGWORD);
  561. VAR t:WORD;
  562. BEGIN
  563.      inherited.init(AppMainID);
  564.      SelectBackColor:=15; {CLR_PALEGRAY}
  565.      SelectDrawColor:=1; {CLR_BLUE}
  566.      StdExt:='.TXT';
  567.      EditorCount:=0;
  568.      UntitledCount:=0;
  569.      CharHeight:=16;
  570.      CharWidth:=8;
  571.      CreateBackups:=TRUE;
  572.      FOR t:=0 TO MaxEditors DO Editors[t]:=NIL;
  573. END;
  574.  
  575. DESTRUCTOR TEditorApplication.Done;
  576. BEGIN
  577. END;
  578.  
  579. PROCEDURE TEditorApplication.DestroyEditor(e:PEditor);
  580. VAR t,t1:WORD;
  581. label l;
  582. BEGIN
  583.      freemem(e^.TextBuffer,e^.TextLen);
  584.      FOR t:=0 TO MaxEditors DO IF Editors[t]=e THEN goto l;
  585.      errorbox('Could not free editor data !');
  586.      exit;
  587. l:
  588.      FOR t1:=t TO MaxEditors DO Editors[t1]:=Editors[t1+1];
  589.      dec(EditorCount);
  590.      dispose(e);
  591. END;
  592.  
  593. PROCEDURE TEditorApplication.InitEditor(e:Peditor);
  594. VAR Adresse:LONGWORD;
  595.     Max:LONGWORD;
  596. BEGIN
  597.      Editors[EditorCount]:=e;
  598.      inc(EditorCount);
  599.      e^.CursorX:=1;
  600.      e^.CursorY:=1;
  601.      e^.InsertMode:=FALSE;
  602.      e^.Untitled:=FALSE;
  603.      e^.Modified:=FALSE;
  604.      e^.SelectLineStart:=65535;
  605.      e^.SelectLineEnd:=65535;
  606.      e^.SelectColumnStart:=65535;
  607.      e^.SelectColumnEnd:=65535;
  608.      Adresse:=e^.TextHigh;
  609.      Max:=EditorMaxLines;
  610.      ASM
  611.         MOV ECX,$Max
  612.         MOV EDI,$Adresse
  613.         STD
  614. !cploop:
  615.         MOV AL,10
  616.         STOSB
  617.         MOV AL,13
  618.         STOSB
  619.         LOOP !cploop
  620.         MOV $Adresse,EDI
  621.      END;
  622.      e^.TextHigh:=Adresse;
  623. END;
  624.  
  625. PROCEDURE TEditorApplication.OpenNewFile;
  626. VAR e:PEditor;
  627.     t:WORD;
  628.     s:string;
  629. BEGIN
  630.       IF EditorCount>=MaxEditors THEN
  631.       BEGIN
  632.            ErrorBox('Too much files opened');
  633.            exit;
  634.       END;
  635.       new(e);
  636.       getmem(e^.TextBuffer,InitialBuf); {reserve 32K initially}
  637.       e^.Textlen:=InitialBuf;
  638.       e^.TextLow:=LONGWORD(e^.TextBuffer);
  639.       e^.TextHigh:=e^.TextLow+e^.textLen;  {Clear Editor}
  640.       e^.TextLines:=EditorMaxLines;
  641.       InitEditor(e);
  642.       FOR t:=0 TO EditorMaxLines DO
  643.       BEGIN
  644.            e^.ScreenBuffer[t]:='';
  645.            s:=e^.ScreenBuffer[t];
  646.            ASM
  647.               CLD
  648.               LEA EDI,$s
  649.               MOV AL,126
  650.               STOSB
  651.               MOV ECX,126
  652.               MOV AL,32
  653.               REP
  654.               STOSB
  655.            END;
  656.            e^.ScreenBuffer[t]:=s;
  657.       END;
  658.       s:=Tostr(UntitledCount);
  659.       inc(UntitledCount);
  660.       IF length(s)=1 THEN s:='0'+s;
  661.       e^.Title:='NONAME'+s+StdExt;
  662.       e^.untitled:=TRUE;
  663.       e^.Win:=MDICreateChild(e^.Title,e,FCF_VERTSCROLL or FCF_HORZSCROLL);
  664. END;
  665.  
  666. PROCEDURE TEditorApplication.OpenFile(name:string);
  667. VAR e:PEditor;
  668.     t:WORD;
  669.     f:file;
  670.     size:LONGWORD;
  671.     Adresse:LONGWORD;
  672.     Zeilen:LONGWORD;
  673.     BufAdresse:LONGWORD;
  674.     BufLen:LONGWORD;
  675. BEGIN
  676.       IF EditorCount>=MaxEditors THEN
  677.       BEGIN
  678.            ErrorBox('Too much files opened');
  679.            exit;
  680.       END;
  681.       assign(f,name);
  682.       reset(f,1);
  683.       if ioresult<>0 THEN
  684.       BEGIN
  685.            ErrorBox('Error reading:'+name);
  686.            exit;
  687.       END;
  688.       size:=FileSize(f);
  689.       new(e);
  690.       getmem(e^.TextBuffer,size+InitialBuf); {reserve 32K initially}
  691.       e^.Textlen:=InitialBuf+size;
  692.       e^.TextLow:=LONGWORD(e^.TextBuffer);
  693.       e^.TextHigh:=e^.TextLow+InitialBuf+size;  {Clear Editor}
  694.       e^.TextLines:=EditorMaxLines;
  695.       InitEditor(e);
  696.       dec(e^.TextHigh,size+1);
  697.       Adresse:=e^.TextHigh+1;
  698.       ASM
  699.          LEA EAX,$f
  700.          PUSH EAX
  701.          PUSHL $Adresse
  702.          PUSHL $Size
  703.          CALLN32 System._BlockRead
  704.       END;
  705.       IF ioresult<>0 THEN ErrorBox('Error reading:'+name)
  706.       ELSE IF Size<>BlockReadResult THEN ErrorBox('Error reading:'+name);
  707.       close(f);
  708.       {Count Zeilnums}
  709.       Zeilen:=0;
  710.       BufAdresse:=e^.TextHigh+1;
  711.       BufLen:=e^.TextLow+InitialBuf+size;
  712.       ASM
  713.          MOV ESI,$BufAdresse
  714.          CLD
  715. !cloop:
  716.          CMP ESI,$BufLen
  717.          JAE !zexit
  718.          LODSB
  719.          CMP AL,13
  720.          JE !zfoundcr
  721.          CMP AL,10
  722.          JE !zFound
  723.          JMP !cloop
  724. !zfoundcr:
  725.          LODSB
  726.          CMP AL,10
  727.          JE !zfound
  728.          DEC ESI
  729. !zfound:
  730.          INCD $Zeilen
  731.          JMP !cloop
  732. !zexit:
  733.       END;
  734.       e^.TextLines:=Zeilen;
  735.       FOR t:=0 TO EditorMaxLines DO GetUpperLine(e^.ScreenBuffer[t],e);
  736.       e^.Title:=name;
  737.       MDICreateChild(e^.Title,e,FCF_VERTSCROLL or FCF_HORZSCROLL); {Extra Byte is the editor}
  738. END;
  739.  
  740.  
  741. FUNCTION TEditorApplication.AppHandleEvent(Win:HWND;Msg:LONGWORD;
  742.                                         para1,para2:POINTER;
  743.                                         VAR Handled:BOOLEAN):LONGWORD;
  744. VAR r:LONGWORD;
  745. BEGIN
  746.      r:=Inherited.AppHandleEvent(Win,Msg,para1,para2,Handled);
  747.      AppHandleEvent:=r;
  748. END;
  749.  
  750.  
  751. PROCEDURE TEditorApplication.SetCursor(Win:HWND;pp:PEditor);
  752. VAR cux,cuy:LONGWORD;
  753.     rec:RECTL;
  754.     s,s1:string;
  755.     sp:Pstring;
  756.     ScrollWin,FrameWin:HWND;
  757.     w:WORD;
  758.     p:POINTER;
  759.     ww,ww1:WORD;
  760.     t:LONGWORD;
  761.     na:namestr;
  762.     di:dirstr;
  763.     ex:extstr;
  764. BEGIN
  765.      WinShowCursor(0,Win);
  766.      WinQueryWindowRect(rec,Win);
  767.      cux:=2+(pp^.CursorX-1)*CharWidth;
  768.      cuy:=rec.yTop-(pp^.CursorY)*CharHeight;
  769.      dec(cuy,2);
  770.      ASM
  771.         ;Set window cursor
  772.         PUSHL 0      ;whole window
  773.         PUSHL 8004h  ;CURSOR_SETPOS
  774.         PUSHL 2      ;Cusizey
  775.         PUSHL _CharWidth
  776.         PUSHL $cuy
  777.         PUSHL $cux
  778.         PUSHL $Win
  779.         MOV AL,7
  780.         CALLDLL PMWIN,715  ;WinCreateCursor
  781.         ADD ESP,28
  782.     END;
  783.     WinShowCursor(1,Win);
  784.     s1:=pp^.Title;
  785.     IF length(s1)>60 THEN
  786.     BEGIN
  787.          fsplit(s1,di,na,ex);
  788.          s1:='...\'+na+ex;
  789.     END;
  790.     s:=s1+'   '+tostr(pp^.CursorY+pp^.VSlider.acvalue)+':'+
  791.        tostr(pp^.CursorX+pp^.HSlider.acvalue);
  792.     IF pp^.Modified THEN s:=s+' *';
  793.     sp:=s;
  794.     FrameWin:=WinQueryWindow(QW_PARENT,Win);
  795.     WinSetWindowText(sp,FrameWin);
  796.     ScrollWin:=WinWindowFromID(FID_HORZSCROLL,FrameWin);
  797.  
  798.     w:=CalcSliderfromValue(pp^.HSlider.acvalue,pp^.HSlider);
  799.     p:=PointerFromShort(w);
  800.     WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  801.     ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
  802.     w:=CalcSliderfromValue(pp^.VSlider.acvalue,pp^.VSlider);
  803.     p:=PointerFromShort(w);
  804.     WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  805. END;
  806.  
  807. PROCEDURE TEditorApplication.MDIRedraw(Win:HWND;_hps:HPS;Extra:POINTER);
  808. VAR facename,s:string;
  809.     rec:RECTL;
  810.     pp:PEditor;
  811.     Lines:LONGWORD;
  812.     t:LongWord;
  813.     pt:POINTL;
  814.     ScrollX:LONGWORD;
  815.     SelectLoLine,SelectHiLine:WORD;
  816.     SelectLoColumn,SelectHiColumn:WORD;
  817.     AcLine,AcColumn,help,TextViewX,Mul,Mul1:WORD;
  818. Label l;
  819. BEGIN
  820.     WinShowCursor(0,Win);
  821.     facename:='System VIO';
  822.     CreateLogFont(_hps,facename,CharHeight,CharWidth); {default font}
  823.  
  824.     pp:=Extra;
  825.     GpiSetBackMix(2,_hps); {BM_OverPaint}
  826.     WinQueryWindowRect(rec,Win);
  827.     Lines:=(rec.ytop-rec.ybottom) div CharHeight; {Lines to draw}
  828.     pt.x:=2;
  829.     pt.y:=rec.yTop-CharHeight;
  830.     ScrollX:=pp^.HSlider.acvalue;
  831.  
  832.     SelectLoLine:=pp^.SelectLineStart;
  833.     SelectHiLine:=pp^.SelectLineEnd;
  834.     SelectLoColumn:=pp^.SelectColumnStart;
  835.     SelectHiColumn:=pp^.SelectColumnEnd;
  836.     AcLine:=pp^.VSlider.acvalue;
  837.     AcColumn:=ScrollX+1;
  838.     TextViewX:=pp^.TextViewX+1;
  839.  
  840.     IF SelectLoColumn<65535 THEN
  841.     BEGIN
  842.         IF SelectLoColumn>AcColumn THEN
  843.         BEGIN
  844.              Dec(SelectLoColumn,AcColumn);
  845.              Mul:=CharWidth*SelectLoColumn;
  846.         END
  847.         ELSE SelectLoColumn:=0;
  848.     END
  849.     ELSE SelectLoColumn:=0;
  850.  
  851.     IF SelectHiColumn<65535 THEN
  852.     BEGIN
  853.         IF SelectHiColumn>AcColumn-1 THEN
  854.         BEGIN
  855.              Dec(SelectHiColumn,AcColumn-1);
  856.              Mul1:=CharWidth*SelectHiColumn;
  857.         END
  858.         ELSE SelectHiColumn:=0;
  859.     END
  860.     ELSE SelectHiColumn:=0;
  861.  
  862.     GpiSetColor(TextDrawColor,_hps);
  863.     GpiSetBackColor(TextBackColor,_hps);
  864.     FOR t:=0 TO Lines-1 DO
  865.     BEGIN
  866.         help:=t+AcLine;
  867.         IF ((help>=SelectLoLine)AND(Help<=SelectHiLine)) THEN
  868.         BEGIN
  869.              CASE Help OF
  870.                 SelectLoLine:
  871.                 BEGIN
  872.                      IF SelectLoColumn>0 THEN
  873.                      BEGIN
  874.                           GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
  875.                                           SelectLoColumn,pt,_hps);
  876.                           inc(pt.x,Mul);
  877.                           GpiSetColor(SelectDrawColor,_hps);
  878.                           GpiSetBackColor(SelectBackColor,_hps);
  879.                           IF Help=SelectHiLine THEN
  880.                           BEGIN
  881.                                GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
  882.                                           SelectLoColumn],SelectHiColumn-
  883.                                           SelectLoColumn,pt,_hps);
  884.                                GpiSetColor(TextDrawColor,_hps);
  885.                                GpiSetBackColor(TextBackColor,_hps);
  886.                                inc(pt.x,mul1-mul);
  887.                                GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
  888.                                           SelectLoColumn+
  889.                                           (SelectHiColumn-SelectLoColumn)],
  890.                                           TextViewX-SelectHiColumn,pt,_hps);
  891.                                dec(pt.x,mul1-mul);
  892.                           END
  893.                           ELSE GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
  894.                                           SelectLoColumn],TextViewX-SelectLoColumn,
  895.                                           pt,_hps);
  896.                           dec(pt.x,Mul);
  897.                      END
  898.                      ELSE
  899.                      BEGIN
  900. l:
  901.                           GpiSetColor(SelectDrawColor,_hps);
  902.                           GpiSetBackColor(SelectBackColor,_hps);
  903.                           GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
  904.                                           pp^.TextViewX+1,pt,_hps);
  905.                      END;
  906.                      GpiSetColor(TextDrawColor,_hps);
  907.                      GpiSetBackColor(TextBackColor,_hps);
  908.                 END;
  909.                 SelectHiLine:
  910.                 BEGIN
  911.                      IF SelectHiColumn>0 THEN
  912.                      BEGIN
  913.                           GpiSetColor(SelectDrawColor,_hps);
  914.                           GpiSetBackColor(SelectBackColor,_hps);
  915.                           GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
  916.                                           SelectHiColumn,pt,_hps);
  917.                           inc(pt.x,Mul1);
  918.                           GpiSetColor(TextDrawColor,_hps);
  919.                           GpiSetBackColor(TextBackColor,_hps);
  920.                           GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
  921.                                           SelectHiColumn],TextViewX-SelectHiColumn,
  922.                                           pt,_hps);
  923.                           dec(pt.x,Mul1);
  924.                      END
  925.                      ELSE goto l;
  926.                 END;
  927.                 ELSE
  928.                 BEGIN
  929.                      GpiSetColor(SelectDrawColor,_hps);
  930.                      GpiSetBackColor(SelectBackColor,_hps);
  931.                      GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
  932.                                      pp^.TextViewX+1,pt,_hps);
  933.                      GpiSetColor(TextDrawColor,_hps);
  934.                      GpiSetBackColor(TextBackColor,_hps);
  935.                 END;
  936.              END; {case}
  937.         END
  938.         ELSE GpiCharStringAt(pp^.ScreenBuffer[t][ScrollX+1],pp^.TextViewX+1,pt,_hps);
  939.         dec(pt.y,CharHeight);
  940.     END;
  941.     WinShowCursor(1,Win);
  942.     SetCursor(Win,pp);
  943. END;
  944.  
  945. PROCEDURE TEditorApplication.CheckHScrollBar(Win:HWND;para1,para2,Extra:PEditor);
  946. VAr w:Word;
  947.     p,p1:POINTER;
  948.     l:LONGWORD;
  949.     ScrollWin,FrameWin:HWND;
  950.     SliderID:LONGWORD;
  951.     HSliderX:SliderData;
  952. label lab;
  953. BEGIN
  954.      HSliderX:=Extra^.HSlider;
  955.  
  956.      l:=PointerToLong(para2);
  957.      SliderID:=PointerToLong(para1);
  958.      SliderID:=lo(SliderID);
  959.      w:=hi(l);
  960.      FrameWin:=WinQueryWindow(QW_PARENT,Win);
  961.      ScrollWin:=WinWindowFromID(SliderID,FrameWin);
  962.      CASE w OF
  963.          SB_LINELEFT:
  964.          BEGIN
  965.               IF HSliderX.acvalue-1>HSliderX.scrollbottom THEN dec(HSliderX.acvalue)
  966.               ELSE HSliderX.acvalue:=HSliderX.scrollbottom;
  967.               goto lab;
  968.          END;
  969.          SB_LINERIGHT:
  970.          BEGIN
  971.               IF HSliderX.acvalue+1<HSliderX.scrolltop THEN inc(HSliderX.acvalue);
  972.               {ELSE HSliderX.acvalue:=HSliderX.scrolltop;}
  973.               goto lab;
  974.          END;
  975.          SB_PAGELEFT:
  976.          BEGIN
  977.               IF HSliderX.acvalue-HSliderX.viewarea>HSliderX.scrollbottom THEN
  978.                dec(HSliderX.acvalue,HSliderX.viewarea)
  979.               ELSE HSliderX.acvalue:=HSliderX.scrollbottom;
  980.               goto lab;
  981.          END;
  982.          SB_PAGERIGHT:
  983.          BEGIN
  984.               IF HSliderX.acvalue+HSliderX.viewarea<HSliderX.scrolltop THEN
  985.               inc(HSliderX.acvalue,HSliderX.viewarea)
  986.               ELSE HSliderX.acvalue:=HSliderX.scrolltop;
  987. lab:
  988.               IF HSliderX.acValue+Extra^.CursorX>HSliderX.ScrollTop THEN
  989.               BEGIN
  990.                   Beep(1200,200);
  991.                   HSliderX.acvalue:=HSliderX.ScrollTop-Extra^.CursorX;
  992.               END;
  993.               w:=HSliderX.acvalue; {CalcSliderfromValue(HSliderX.acvalue,HSliderX);}
  994.               p:=PointerFromShort(w);
  995.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  996.          END;
  997.          SB_SLIDERPOSITION:
  998.          BEGIN
  999.               w:=lo(l);
  1000.               HSliderX.acvalue:=CalcValuefromSlider(w,HSliderX);
  1001.               IF HSliderX.acValue+Extra^.CursorX>HSliderX.ScrollTop THEN
  1002.               BEGIN
  1003.                    Beep(1200,200);
  1004.                    HSliderX.acvalue:=HSliderX.ScrollTop-Extra^.CursorX;
  1005.                    w:=CalcSliderfromValue(HSliderX.acvalue,HSliderX);
  1006.                    p:=PointerFromShort(w);
  1007.                    WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  1008.               END;
  1009.          END;
  1010.          ELSE exit;
  1011.      END; {Case}
  1012.      Extra^.HSlider:=HSliderX;
  1013. END;
  1014.  
  1015.  
  1016. FUNCTION TEditorApplication.CheckIfToScrollX(Win:HWND;Extra:PEditor):BOOLEAN;
  1017. VAR ScrollX:LONGWORD;
  1018.     rec:RECTL;
  1019. BEGIN
  1020.      IF Extra^.CursorX>Extra^.TextViewX THEN
  1021.      BEGIN
  1022.           ScrollX:=Extra^.CursorX-Extra^.TextViewX;
  1023.           dec(Extra^.Cursorx,ScrollX);
  1024.           inc(Extra^.HSlider.acvalue,ScrollX);
  1025.           InvalidateEditorWindow(Win,Extra);
  1026.           CheckIfToScrollX:=TRUE;
  1027.      END
  1028.      ELSE CheckIfToScrollX:=FALSE;
  1029. END;
  1030.  
  1031.  
  1032. PROCEDURE TEditorApplication.MDIHandleCharEvent(Win:HWND;Extra:POINTER;ch:CHAR);
  1033. VAR s:string;
  1034.     x,y:LongWord;
  1035.     Extra1:PEditor;
  1036. label L;
  1037. BEGIN
  1038.      Extra1:=Extra;
  1039.      x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  1040.      IF x>=Extra1^.HSlider.ScrollTop THEN
  1041.      BEGIN
  1042. l:
  1043.           beep(1200,200);
  1044.           exit;
  1045.      END;
  1046.      y:=Extra1^.CursorY-1;
  1047.      s:=Extra1^.ScreenBuffer[y];
  1048.      Extra1^.Modified:=TRUE;
  1049.      IF Extra1^.insertmode THEN s[x]:=ch
  1050.      ELSE
  1051.      BEGIN
  1052.           Insert(ch,s,x);
  1053.           IF Length(s)>126 THEN s[0]:=#126;
  1054.      END;
  1055.      inc(Extra1^.CursorX);
  1056.      Extra1^.ScreenBuffer[y]:=s;
  1057.      IF CheckIfToScrollX(Win,Extra1) THEN exit;
  1058.      InvalidateEditorLine(Win,s,y+1,Extra1);
  1059. END;
  1060.  
  1061. PROCEDURE TEditorApplication.PageUp(Win:HWND;Extra:PEditor);
  1062. VAR t,t1:WORD;
  1063.     TextView:WORD;
  1064. BEGIN
  1065.      IF Extra^.TextLow<=LONGWORD(Extra^.TextBuffer) THEN
  1066.      BEGIN
  1067.           Extra^.CursorY:=1;
  1068.           exit;
  1069.      END;
  1070.      IF Extra^.VSlider.acvalue=0 THEN
  1071.      BEGIN
  1072.           Extra^.CursorY:=1;
  1073.           exit;
  1074.      END;
  1075.      TextView:=Extra^.TextViewY-1;
  1076.      IF TextView>Extra^.VSlider.acvalue THEN
  1077.      BEGIN
  1078.           TextView:=Extra^.VSlider.acvalue;
  1079.           Extra^.CursorY:=1;
  1080.      END;
  1081.      FOR t:=EditorMaxLines DOWNTO (EditorMaxLines-TextView)+1 DO
  1082.         AppendUpperLine(Extra^.ScreenBuffer[t],Extra);
  1083.      t1:=EditorMaxLines-TextView;  {Lines to transmit}
  1084.      ASM
  1085.         MOVZXW ECX,$t1
  1086.         INC ECX
  1087.         SHL ECX,5         ;multiply with 128 and divide by 4
  1088.  
  1089.         MOV ESI,$Extra    ;Source buffer
  1090.         MOVZXW EAX,_EditormaxLines
  1091.         MOVZXW EBX,$TextView
  1092.         SUB EAX,EBX
  1093.         INC EAX
  1094.         SHL EAX,7         ;multiply with 128
  1095.         ADD ESI,EAX       ;Source
  1096.  
  1097.         MOV EDI,$Extra    ;Destination
  1098.         MOVZXW EAX,_EditorMaxLines
  1099.         INC EAX
  1100.         SHL EAX,7
  1101.         ADD EDI,EAX       ;Destination
  1102.  
  1103.         STD
  1104.         REP
  1105.         MOVSW             ;MOVSD
  1106.      END;
  1107.      FOR t:=TextView-1 DOWNTO 0 DO GetLowerLine(Extra^.ScreenBuffer[t],Extra);
  1108.      Dec(Extra^.VSlider.acvalue,TextView);
  1109. END;
  1110.  
  1111. PROCEDURE TEditorApplication.LineUp(Win:HWND;Extra:PEditor);
  1112. VAR t:WORD;
  1113. BEGIN
  1114.      IF Extra^.CursorY=1 THEN
  1115.      BEGIN
  1116.           IF Extra^.VSlider.acvalue=0 THEN exit;
  1117.           IF Extra^.TextLow<=LONGWORD(Extra^.TextBuffer) THEN
  1118.           BEGIN
  1119.                Extra^.VSlider.Acvalue:=0;
  1120.                exit;
  1121.           END;
  1122.           dec(Extra^.VSlider.acvalue);
  1123.           AppendUpperLine(Extra^.ScreenBuffer[EditorMaxLines],Extra);
  1124.           ASM
  1125.              MOVZXW ECX,_EditorMaxLines
  1126.              SHL ECX,5         ;multiply with 128 and divide by 4
  1127.  
  1128.              MOV ESI,$Extra    ;Source
  1129.              MOVZXW EAX,_EditorMaxLines
  1130.              INC EAX
  1131.              SHL EAX,7
  1132.              ADD ESI,EAX
  1133.              MOV EDI,ESI       ;Destination
  1134.              SUB ESI,128       ;Source
  1135.  
  1136.              STD
  1137.              REP
  1138.              MOVSW             ;MOVSD
  1139.           END;
  1140.           GetLowerLine(Extra^.ScreenBuffer[0],Extra);
  1141.      END
  1142.      ELSE dec(Extra^.CursorY);
  1143. END;
  1144.  
  1145. PROCEDURE TEditorApplication.LineDown(Win:HWND;Extra:PEditor);
  1146. VAR t:Word;
  1147. label l;
  1148. BEGIN
  1149.      IF Extra^.TextHigh>=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen THEN
  1150.      BEGIN
  1151.           {No more lines in memory}
  1152.           FOR t:=Extra^.CursorY TO EditorMaxLines DO
  1153.             IF length(Extra^.ScreenBuffer[t])<>0 THEN goto l;
  1154.           exit;
  1155.      END;
  1156. l:
  1157.      inc(Extra ^.CursorY);
  1158.      IF Extra^.CursorY>Extra^.TextViewY THEN
  1159.      BEGIN
  1160.           Extra^.CursorY:=Extra^.TextViewY;
  1161.           inc(Extra^.VSlider.acvalue);
  1162.           AppendLowerLine(Extra^.ScreenBuffer[0],Extra);
  1163.           ASM
  1164.              MOVZXW ECX,_EditorMaxLines
  1165.              SHL ECX,5         ;multiply with 128 and divide by 4
  1166.  
  1167.              MOV EDI,$Extra    ;Destination
  1168.              ADD EDI,4
  1169.              MOV ESI,EDI       ;Source
  1170.              ADD ESI,128
  1171.  
  1172.              CLD
  1173.              REP
  1174.              MOVSW             ;MOVSD
  1175.           END;
  1176.           GetUpperLine(Extra^.ScreenBuffer[EditorMaxLines],Extra);
  1177.      END;
  1178. END;
  1179.  
  1180. PROCEDURE TEditorApplication.PageDown(Win:HWND;Extra:PEditor);
  1181. VAR
  1182.     Count:WORD;
  1183.     TextView:WORD;
  1184.     t,t1:WORD;
  1185. BEGIN
  1186.      IF Extra^.TextHigh>=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen THEN exit;
  1187.      TextView:=Extra^.TextViewY-1;
  1188.      FOR t:=0 TO TextView-1 DO AppendLowerLine(Extra^.ScreenBuffer[t],Extra);
  1189.      t1:=(EditorMaxLines-TextView)+1;  {Lines to transmit}
  1190.      ASM
  1191.         MOVZXW ECX,$t1
  1192.         SHL ECX,5         ;multiply with 128 and divide by 4
  1193.         MOV ESI,$Extra    ;Source buffer
  1194.         ADD ESI,4
  1195.         MOVZXW EAX,$TextView
  1196.         SHL EAX,7         ;multiply with 128
  1197.         ADD ESI,EAX       ;onto ScreenBuffer[TextView]
  1198.         MOV EDI,$Extra
  1199.         ADD EDI,4         ;onto ScreenBuffer[0]
  1200.         CLD
  1201.         REP
  1202.         MOVSW             ;MOVSD
  1203.      END;
  1204.      FOR t:=t1 TO EditorMaxLines DO GetUpperLine(Extra^.ScreenBuffer[t],Extra);
  1205.      Inc(Extra^.VSlider.acvalue,TextView);
  1206. END;
  1207.  
  1208. PROCEDURE TEditorApplication.CheckVScrollBar(Win:HWND;para1,para2,Extra:PEditor);
  1209. VAr w:Word;
  1210.     p,p1:POINTER;
  1211.     l,r:LONGWORD;
  1212.     ScrollWin,FrameWin:HWND;
  1213.     SliderID:LONGWORD;
  1214.     t:WORD;
  1215.     t1:LONGWORD;
  1216.     acval:LONGWORD;
  1217.     aclineval:LONGWORD;
  1218.     acpageval:LONGWORD;
  1219. BEGIN
  1220.      l:=PointerToLong(para2);
  1221.      SliderID:=PointerToLong(para1);
  1222.      SliderID:=lo(SliderID);
  1223.      w:=hi(l);
  1224.      FrameWin:=WinQueryWindow(QW_PARENT,Win);
  1225.      ScrollWin:=WinWindowFromID(SliderID,FrameWin);
  1226.      CASE w OF
  1227.          SB_LINEUP:
  1228.          BEGIN
  1229.               Extra^.CursorY:=1;
  1230.               LineUp(Win,Extra);
  1231.               w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
  1232.               p:=PointerFromShort(w);
  1233.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  1234.          END;
  1235.          SB_LINEDOWN:
  1236.          BEGIN
  1237.               Extra^.CursorY:=Extra^.TextViewY;
  1238.               LineDown(Win,Extra);
  1239.               w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
  1240.               p:=PointerFromShort(w);
  1241.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  1242.          END;
  1243.          SB_PAGEUP:
  1244.          BEGIN
  1245.               PageUp(Win,Extra);
  1246.               w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
  1247.               p:=PointerFromShort(w);
  1248.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  1249.          END;
  1250.          SB_PAGEDOWN:
  1251.          BEGIN
  1252.               PageDown(Win,Extra);
  1253.               w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
  1254.               p:=PointerFromShort(w);
  1255.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  1256.          END;
  1257.          SB_SLIDERPOSITION:
  1258.          BEGIN
  1259.               w:=lo(l);
  1260.               acval:=CalcValuefromSlider(w,Extra^.VSlider);
  1261.               IF acval=Extra^.VSlider.acvalue THEN exit;
  1262.               IF acval>Extra^.VSlider.acvalue THEN
  1263.               BEGIN
  1264.                    r:=(acval-Extra^.VSlider.acvalue)+Extra^.TextViewY;
  1265.                    acpageval:=r div Extra^.TextViewY;
  1266.                    aclineval:=r mod Extra^.TextViewY;
  1267.                    FOR t1:=1 TO acpageval DO PageDown(Win,Extra);
  1268.                    FOR t1:=1 TO aclineval DO LineDown(Win,Extra);
  1269.               END
  1270.               ELSE
  1271.               BEGIN
  1272.                    r:=(Extra^.VSlider.acvalue-acval)+Extra^.TextViewY;
  1273.                    acpageval:=r div Extra^.TextViewY;
  1274.                    aclineval:=r mod Extra^.TextViewY;
  1275.                    FOR t1:=1 TO acpageval DO PageUp(Win,Extra);
  1276.                    FOR t1:=1 TO aclineval DO LineUp(Win,Extra);
  1277.               END;
  1278.          END;
  1279.      END; {Case}
  1280. END;
  1281.  
  1282. PROCEDURE TEditorApplication.MDICreateNotify(Win:HWND;Extra:POINTER);
  1283. VAR
  1284.     ww,ww1:Word;
  1285.     p:POINTER;
  1286.     p1:POINTER;
  1287.     FrameWin,ScrollWin:HWND;
  1288.     pp:PEditor;
  1289.     rec:RECTL;
  1290.     Lines:LONGWORD;
  1291. BEGIN
  1292.      inherited.MDICreateNotify(Win,Extra);
  1293.      pp:=Extra;
  1294.  
  1295.      WinQueryWindowrect(rec,Win);
  1296.  
  1297.      {init horizontal ScrollWindow}
  1298.      Lines:=(rec.XRight-rec.XLeft) div CharWidth;
  1299.      pp^.TextViewX:=Lines;
  1300.      FrameWin:=WinQueryWindow(QW_PARENT,Win);
  1301.      ScrollWin:=WinWindowFromID(FID_HORZSCROLL,FrameWin);
  1302.      pp^.HSlider.scrollbottom:=0;
  1303.      pp^.HSlider.scrolltop:=127;
  1304.      pp^.HSlider.viewarea:=Lines;
  1305.      {define Scroll intervall}
  1306.      ww1:=1;
  1307.      ww:=CalcMaxSliderPositions(pp^.HSlider);
  1308.      p:=PointerFrom2Short(ww,ww1);
  1309.      WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
  1310.      pp^.HSlider.acvalue:=pp^.HSlider.scrollbottom;
  1311.      {Set slider size}
  1312.      ww1:=pp^.HSlider.viewarea;
  1313.      ww:=pp^.HSlider.scrolltop-pp^.HSlider.scrollbottom+1;
  1314.      p:=PointerFrom2Short(ww,ww1);
  1315.      WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
  1316.  
  1317.      {init vertical ScrollWindow}
  1318.      ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
  1319.      Lines:=(rec.yTop-rec.yBottom) div CharHeight;
  1320.      pp^.TextViewY:=Lines;
  1321.      pp^.VSlider.scrollbottom:=0;
  1322.      pp^.VSlider.scrolltop:=pp^.TextLines;
  1323.      pp^.VSlider.viewarea:=Lines;
  1324.      {define Scroll intervall}
  1325.      ww1:=1;
  1326.      ww:=CalcMaxSliderPositions(pp^.VSlider);
  1327.      p:=PointerFrom2Short(ww,ww1);
  1328.      WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
  1329.      pp^.VSlider.acvalue:=pp^.VSlider.scrollbottom;
  1330.      {Set slider size}
  1331.      ww1:=pp^.VSlider.viewarea;
  1332.      ww:=pp^.VSlider.scrolltop-pp^.VSlider.scrollbottom+1;
  1333.      p:=PointerFrom2Short(ww,ww1);
  1334.      WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
  1335. END;
  1336.  
  1337. PROCEDURE TEditorApplication.InvalidateEditorLine(Win:HWND;var s:string;
  1338.                                                   y:LONGWORD;Extra:PEditor);
  1339. VAR _hps:LONGWORD;
  1340.     rec:RECTL;
  1341.     pt:POINTL;
  1342.     facename:String;
  1343.     scrollX:LONGWORD;
  1344. BEGIN
  1345.      WinShowCursor(0,Win);
  1346.      _hps:=WinGetPS(Win);
  1347.      WinQueryWindowRect(rec,Win);
  1348.      facename:='System VIO';
  1349.      CreateLogFont(_hps,facename,CharHeight,CharWidth); {default font}
  1350.      pt.x:=2;
  1351.      pt.y:=rec.yTop-y*CharHeight;
  1352.      scrollX:=Extra^.HSlider.acvalue;
  1353.      GpiSetBackMix(2,_hps);  {BM_OverPaint}
  1354.      GpiSetColor(TextDrawColor,_hps);
  1355.      GpiSetBackColor(TextBackColor,_hps);
  1356.      GpiCharStringAt(s[Scrollx+1],Extra^.TextViewX+1,pt,_hps);
  1357.      WinReleasePS(_hps);
  1358.      WinShowCursor(1,Win);
  1359.      SetCursor(Win,Extra);
  1360. END;
  1361.  
  1362. PROCEDURE TEditorApplication.InvalidateEditorWindow(Win:HWND;Extra:PEditor);
  1363. VAR _hps:LONGWORD;
  1364. BEGIN
  1365.      _hps:=WinGetPS(Win);
  1366.      MDIRedraw(Win,_hps,Extra);
  1367.      WinReleasePs(_hps);
  1368. END;
  1369.  
  1370.  
  1371.  
  1372. PROCEDURE TEditorApplication.MDIHandleScanEvent(Win:HWND;Extra:POINTER;scan:Word);
  1373. VAR hsp:LONGWORD;
  1374.     r:LongWord;
  1375.     x,y:LONGWORD;
  1376.     s,s1:string;
  1377.     t,t1:WORD;
  1378.     ScrollWin,FrameWin:HWND;
  1379.     p:POINTER;
  1380.     ww,ww1:WORD;
  1381.     rc:RECTL;
  1382.     Extra1:PEditor;
  1383. BEGIN
  1384.      Extra1:=Extra;
  1385.      CASE Scan OF
  1386.          kbCtrlY:
  1387.          BEGIN
  1388.               Extra1^.Modified:=TRUE;
  1389.               FOR t:=Extra1^.CursorY-1 TO EditorMaxLines-1 DO
  1390.                 Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t+1];
  1391.               IF GetUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1)
  1392.                THEN Dec(Extra1^.TextLines);
  1393.               InvalidateEditorWindow(Win,Extra1);
  1394.          END;
  1395.          kbCDown:
  1396.          BEGIN
  1397.               IF Extra1^.CursorY=Extra1^.TextViewY THEN
  1398.               BEGIN
  1399.                    LineDown(Win,Extra1);
  1400.                    InvalidateEditorWindow(Win,Extra);
  1401.                    exit;
  1402.               END
  1403.               ELSE LineDown(Win,Extra1);
  1404.          END;
  1405.          kbCUp:
  1406.          BEGIN
  1407.               IF Extra1^.CursorY=1 THEN
  1408.               BEGIN
  1409.                    IF Extra1^.VSlider.acvalue=0 THEN exit;
  1410.                    LineUp(Win,Extra1);
  1411.                    InvalidateEditorWindow(Win,Extra1);
  1412.                    exit;
  1413.               END
  1414.               ELSE LineUp(Win,Extra1);
  1415.          END;
  1416.          kbCR:
  1417.          BEGIN
  1418.               IF Extra1^.InsertMode THEN
  1419.               BEGIN
  1420.                    Extra1^.CursorX:=1;
  1421.                    Extra1^.HSlider.acvalue:=0;
  1422.                    IF Extra1^.CursorY=Extra1^.TextViewY THEN
  1423.                    BEGIN
  1424.                         LineDown(Win,Extra1);
  1425.                         InvalidateEditorWindow(Win,Extra);
  1426.                         exit;
  1427.                    END
  1428.                    ELSE LineDown(Win,Extra1);
  1429.               END
  1430.               ELSE
  1431.               BEGIN
  1432.                    Extra1^.Modified:=TRUE;
  1433.                    s:=Extra1^.ScreenBuffer[Extra1^.CursorY-1];
  1434.                    x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  1435.                    s1:=copy(s,1,x-1);
  1436.                    WHILE Length(s1)<126 DO s1:=s1+' ';
  1437.                    Extra1^.ScreenBuffer[Extra1^.CursorY-1]:=s1;
  1438.                    delete(s,1,x-1);
  1439.                    WHILE Length(s)<126 DO s:=s+' ';
  1440.                    inc(Extra1^.CursorY);
  1441.                    Extra1^.CursorX:=1;
  1442.                    Extra1^.HSlider.acvalue:=0;
  1443.                    inc(Extra1^.TextLines);
  1444.  
  1445.                    {init vertical ScrollWindow}
  1446.                    WinQueryWindowrect(rc,Win);
  1447.                    FrameWin:=WinQueryWindow(QW_PARENT,Win);
  1448.                    ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
  1449.                    r:=(rc.yTop-rc.yBottom) div CharHeight;
  1450.                    Extra1^.TextViewY:=r;
  1451.                    Extra1^.VSlider.scrollbottom:=0;
  1452.                    Extra1^.VSlider.scrolltop:=Extra1^.TextLines;
  1453.                    Extra1^.VSlider.viewarea:=r;
  1454.                    {define Scroll intervall}
  1455.                    ww1:=1;
  1456.                    ww:=CalcMaxSliderPositions(Extra1^.VSlider);
  1457.                    p:=PointerFrom2Short(ww,ww1);
  1458.                    WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
  1459.                    {Set slider size}
  1460.                    ww1:=Extra1^.VSlider.viewarea;
  1461.                    ww:=Extra1^.VSlider.scrolltop-Extra1^.VSlider.scrollbottom+1;
  1462.                    p:=PointerFrom2Short(ww,ww1);
  1463.                    WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
  1464.  
  1465.                    AppendUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1);
  1466.                    FOR t:=EditorMaxLines DOWNTO Extra1^.CursorY DO
  1467.                     Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t-1];
  1468.                    Extra1^.ScreenBuffer[Extra1^.CursorY-1]:=s;
  1469.                    Dec(Extra1^.CursorY);
  1470.                    LineDown(Win,Extra1);
  1471.                    InvalidateEditorWindow(Win,Extra);
  1472.               END;
  1473.          END;
  1474.          kbPageDown:
  1475.          BEGIN
  1476.               IF Extra1^.TextHigh>=LONGWORD(Extra1^.TextBuffer)+Extra1^.TextLen THEN exit;
  1477.               PageDown(Win,Extra1);
  1478.               InvalidateEditorWindow(Win,Extra1);
  1479.               exit;
  1480.          END;
  1481.          kbPageUp:
  1482.          BEGIN
  1483.               IF Extra1^.TextLow<=LONGWORD(Extra1^.TextBuffer) THEN exit;
  1484.               PageUp(Win,Extra1);
  1485.               InvalidateEditorWindow(Win,Extra1);
  1486.               exit;
  1487.          END;
  1488.          kbCRight:
  1489.          BEGIN
  1490.               x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  1491.               IF x>=Extra1^.HSlider.ScrollTop THEN exit;
  1492.               inc(Extra1^.CursorX);
  1493.               IF CheckIfToScrollX(Win,Extra1) THEN exit;
  1494.          END;
  1495.          kbCLeft:
  1496.          BEGIN
  1497.               IF Extra1^.CursorX=1 THEN
  1498.               BEGIN
  1499.                    IF Extra1^.HSlider.acvalue=0 THEN exit;
  1500.                    dec(Extra1^.HSlider.acvalue);
  1501.                    InvalidateEditorWindow(Win,Extra1);
  1502.                    exit;
  1503.               END
  1504.               ELSE dec(Extra1^.CursorX);
  1505.          END;
  1506.          kbPos1:
  1507.          BEGIN
  1508.               Extra1^.CursorX:=1;
  1509.               r:=Extra1^.HSlider.acvalue;
  1510.               Extra1^.HSlider.acvalue:=0;
  1511.               if r<>0 THEN
  1512.               BEGIN
  1513.                    InvalidateEditorWindow(Win,Extra1);
  1514.                    exit;
  1515.               END;
  1516.          END;
  1517.          kbEnd:
  1518.          BEGIN
  1519.               x:=Extra1^.CursorY-1;
  1520.               s:=Extra1^.ScreenBuffer[x];
  1521.               while s[length(s)]=#32 do dec(s[0]);
  1522.               Extra1^.CursorX:=length(s)+1;
  1523.               Extra1^.HSlider.acvalue:=0;
  1524.               IF CheckIfToScrollX(Win,Extra1) THEN exit;
  1525.          END;
  1526.          kbDel:
  1527.          BEGIN
  1528.               Extra1^.Modified:=TRUE;
  1529.               y:=Extra1^.CursorY-1;
  1530.               s:=Extra1^.ScreenBuffer[y];
  1531.               x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  1532.               t1:=0;
  1533.               for t:=length(s) downto x do if s[t]<>#32 then t1:=t;
  1534.               if t1<x then
  1535.               begin
  1536.                    while s[length(s)]=#32 do dec(s[0]);
  1537.                    s1:=Extra1^.ScreenBuffer[y+1];
  1538.                    while s1[length(s1)]=#32 do dec(s1[0]);
  1539.                    if length(s)+length(s1)>126 then s1[0]:=chr(126-length(s));
  1540.                    s:=s+s1;
  1541.                    while length(s)<126 do s:=s+' ';
  1542.                    Extra1^.ScreenBuffer[y]:=s;
  1543.                    FOR t:=y+1 TO EditorMaxLines-1 DO
  1544.                      Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t+1];
  1545.                    IF GetUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1)
  1546.                     THEN Dec(Extra1^.TextLines);
  1547.                    InvalidateEditorWindow(Win,Extra1);
  1548.               end
  1549.               else
  1550.               begin
  1551.                    delete(s,x,1);
  1552.                    s:=s+' ';
  1553.                    Extra1^.ScreenBuffer[y]:=s;
  1554.                    InvalidateEditorLine(Win,s,y+1,Extra1);
  1555.               end;
  1556.               exit;
  1557.          END;
  1558.          kbBS:
  1559.          BEGIN
  1560.               Extra1^.Modified:=TRUE;
  1561.               y:=Extra1^.CursorY-1;
  1562.               x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  1563.               s:=Extra1^.ScreenBuffer[y];
  1564.               IF length(s)>=x-1 THEN IF x<>1 THEN delete(s,x-1,1);
  1565.               Extra1^.ScreenBuffer[y]:=s;
  1566.               while s[length(s)]=#32 do dec(s[0]);
  1567.               IF Extra1^.CursorX=1 THEN
  1568.               BEGIN
  1569.                    IF Extra1^.HSlider.acvalue=0 THEN exit;
  1570.                    dec(Extra1^.HSlider.acvalue);
  1571.                    InvalidateEditorWindow(Win,Extra1);
  1572.                    exit;
  1573.               END
  1574.               ELSE
  1575.               BEGIN
  1576.                    dec(Extra1^.CursorX);
  1577.                    InvalidateEditorLine(Win,s,y+1,Extra1);
  1578.                    exit;
  1579.               END;
  1580.          END;
  1581.          kbInsert:
  1582.          BEGIN
  1583.               Extra1^.InsertMode:=not(Extra1^.InsertMode);
  1584.               IF Extra1^.InsertMode THEN r:=CharHeight
  1585.               ELSE r:=2;
  1586.               ASM
  1587.                   ;Destroy the cursor
  1588.                   PUSHL $Win
  1589.                   MOV AL,1
  1590.                   CALLDLL PMWIN,725  ;WinDestroyCursor
  1591.                   ADD ESP,4
  1592.  
  1593.                   ;Create the cursor
  1594.                   PUSHL 0  ;whole window
  1595.                   PUSHL 4  ;CURSOR_SOLID | CURSOR_FLASH
  1596.                   PUSHL $r ;Cursorheigth
  1597.                   PUSHL _CharWidth
  1598.                   PUSHL 40
  1599.                   PUSHL 40
  1600.                   PUSHL $Win
  1601.                   MOV AL,7
  1602.                   CALLDLL PMWIN,715  ;WinCreateCursor
  1603.                   ADD ESP,28
  1604.               END;
  1605.               WinShowCursor(1,Win);
  1606.          END;
  1607.          ELSE exit;
  1608.      END; {CASE}
  1609.      SetCursor(Win,Extra1);
  1610. END;
  1611.  
  1612.  
  1613. FUNCTION TEditorApplication.MDIHandleEvent(Win:HWND;Msg:LONGWORD;para1,
  1614.                       para2:POINTER;VAR Handled:BOOLEAN;
  1615.                       Extra:POINTER):LONGWORD;
  1616. VAR r:LONGWORD;
  1617.     rc:RECTL;
  1618.     H:BOOLEAN;
  1619.     w:WORD;
  1620.     ch:CHAR;
  1621.     b:Byte;
  1622.     pp:PEditor;
  1623.     FrameWin,ScrollWin:HWND;
  1624.     ww,ww1:WORD;
  1625.     p:POINTER;
  1626.     po:points;
  1627.     lx,ly,wx,wy:Integer;
  1628. Label l,ll,ll1;
  1629. BEGIN
  1630.      H:=TRUE;
  1631.      r:=0;
  1632.      CASE MSG OF
  1633.           WM_SIZE:
  1634.           BEGIN
  1635.                pp:=Extra;
  1636.                WinQueryWindowrect(rc,Win);
  1637.  
  1638.                {init horizontal ScrollWindow}
  1639.                r:=(rc.XRight-rc.XLeft) div CharWidth;
  1640.                pp^.TextViewX:=r;
  1641.                FrameWin:=WinQueryWindow(QW_PARENT,Win);
  1642.                ScrollWin:=WinWindowFromID(FID_HORZSCROLL,FrameWin);
  1643.                pp^.HSlider.scrollbottom:=0;
  1644.                pp^.HSlider.scrolltop:=127;
  1645.                pp^.HSlider.viewarea:=r;
  1646.                {define Scroll intervall}
  1647.                ww1:=1;
  1648.                ww:=CalcMaxSliderPositions(pp^.HSlider);
  1649.                p:=PointerFrom2Short(ww,ww1);
  1650.                WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
  1651.                {Set slider size}
  1652.                ww1:=pp^.HSlider.viewarea;
  1653.                ww:=pp^.HSlider.scrolltop-pp^.HSlider.scrollbottom+1;
  1654.                p:=PointerFrom2Short(ww,ww1);
  1655.                WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
  1656.  
  1657.                {init vertical ScrollWindow}
  1658.                ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
  1659.                r:=(rc.yTop-rc.yBottom) div CharHeight;
  1660.                pp^.textViewY:=r;
  1661.                pp^.VSlider.scrollbottom:=0;
  1662.                pp^.VSlider.scrolltop:=pp^.TextLines;
  1663.                pp^.VSlider.viewarea:=r;
  1664.                {define Scroll intervall}
  1665.                ww1:=1;
  1666.                ww:=CalcMaxSliderPositions(pp^.VSlider);
  1667.                p:=PointerFrom2Short(ww,ww1);
  1668.                WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
  1669.                {Set slider size}
  1670.                ww1:=pp^.VSlider.viewarea;
  1671.                ww:=pp^.VSlider.scrolltop-pp^.VSlider.scrollbottom+1;
  1672.                p:=PointerFrom2Short(ww,ww1);
  1673.                WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
  1674.  
  1675.                IF not Handled THEN H:=FALSE;
  1676.           END;
  1677.           WM_DESTROY:
  1678.           BEGIN
  1679.                DestroyEditor(Extra);
  1680.                IF not Handled THEN H:=FALSE;
  1681.           END;
  1682.           WM_HSCROLL:CheckHScrollBar(Win,para1,para2,Extra);
  1683.           WM_VSCROLL:CheckVScrollBar(Win,para1,para2,Extra);
  1684.           WM_SETFOCUS:  {EingabeFocus neu setzen}
  1685.           BEGIN
  1686.                pp:=Extra;
  1687.                IF pp^.InsertMode THEN r:=CharHeight
  1688.                ELSE r:=2;
  1689.                ASM
  1690.                   MOV EAX,$Para2
  1691.                   CMP EAX,0
  1692.                   JE !dc      ;Window is loosing focus
  1693.  
  1694.                   ;Window becomes focus --> Create the cursor
  1695.                   PUSHL 0  ;whole window
  1696.                   PUSHL 4  ;CURSOR_SOLID | CURSOR_FLASH
  1697.                   PUSHL $r ;Cursorheigth
  1698.                   PUSHL _CharWidth
  1699.                   PUSHL 40
  1700.                   PUSHL 40
  1701.                   PUSHL $Win
  1702.                   MOV AL,7
  1703.                   CALLDLL PMWIN,715  ;WinCreateCursor
  1704.                   ADD ESP,28
  1705.                END;
  1706.                WinShowCursor(1,Win);
  1707.                SetCursor(Win,Extra);
  1708.                InvalidateWindow(Win);
  1709.                goto l;
  1710.  
  1711.                ASM
  1712. !dc:
  1713.                   ;Window is loosing focus --> Destroy the cursor
  1714.                   PUSHL $Win
  1715.                   MOV AL,1
  1716.                   CALLDLL PMWIN,725  ;WinDestroyCursor
  1717.                   ADD ESP,4
  1718.                END;
  1719. l:
  1720.           END;
  1721.           WM_BUTTON1Down,WM_BUTTON1Click:
  1722.           BEGIN
  1723.                po:=Points(Para1);
  1724.                lx:=po.x DIV CharWidth;
  1725.                ly:=po.y DIV CharHeight;
  1726.                WinQueryWindowrect(rc,Win);
  1727.                wx:=(rc.xright-rc.xleft) DIV CharWidth;
  1728.                wy:=(rc.ytop-rc.ybottom) DIV CharHeight;
  1729.                inc(lx);
  1730.                if lx>wx then lx:=wx;
  1731.                ly:=wy-ly;
  1732.                if ly<1 then ly:=1;
  1733.                pp:=Extra;
  1734.                pp^.SelectColumnStart:=65535;
  1735.                pp^.SelectLineStart:=65535;
  1736.                pp^.SelectColumnEnd:=65535;
  1737.                pp^.SelectLineEnd:=65535;
  1738.                IF lx=pp^.CursorX THEN IF ly=pp^.Cursory THEN goto ll;
  1739.                pp^.CursorX:=lx;
  1740.                pp^.CursorY:=ly;
  1741.                SetCursor(Win,pp);
  1742.                InvalidateEditorWindow(Win,pp)
  1743. ll:
  1744.                IF not Handled THEN H:=FALSE;
  1745.           END;
  1746.           WM_BUTTON2Click:MessageBox('Right mouse button clicked');
  1747.           WM_MOUSEDRAG1:
  1748.           BEGIN
  1749.                po:=Points(Para1);
  1750.                lx:=po.x DIV CharWidth;
  1751.                ly:=po.y DIV CharHeight;
  1752.                WinQueryWindowrect(rc,Win);
  1753.                wx:=(rc.xright-rc.xleft) DIV CharWidth;
  1754.                wy:=(rc.ytop-rc.ybottom) DIV CharHeight;
  1755.                inc(lx);
  1756.                if lx>wx then lx:=wx;
  1757.                ly:=wy-ly;
  1758.                if ly<1 then ly:=1;
  1759.                pp:=Extra;
  1760.                IF lx=pp^.CursorX THEN IF ly=pp^.Cursory THEN
  1761.                  IF ly<pp^.TextViewY-1 THEN IF ly>1 THEN goto ll1;
  1762.                pp^.CursorX:=lx;
  1763.                pp^.CursorY:=ly;
  1764.                SetCursor(Win,pp);
  1765.  
  1766.                ww:=pp^.HSlider.acvalue+pp^.CursorX-1;
  1767.                ww1:=pp^.vSlider.acvalue+pp^.CursorY-1;
  1768.  
  1769.                IF pp^.SelectLineStart=65535 THEN
  1770.                BEGIN
  1771.                     pp^.SelectLineStart:=ww1;
  1772.                     pp^.SelectAnchorLine:=ww1;
  1773.                END;
  1774.  
  1775.                IF ww1>=pp^.SelectAnchorLine THEN
  1776.                BEGIN
  1777.                     pp^.SelectLineEnd:=ww1;
  1778.                     pp^.SelectLineStart:=pp^.SelectAnchorLine;
  1779.                END;
  1780.                ELSE
  1781.                BEGIN
  1782.                     pp^.SelectLineStart:=ww1;
  1783.                     pp^.SelectLineEnd:=pp^.SelectAnchorLine;
  1784.                END;
  1785.  
  1786.                IF pp^.SelectColumnStart=65535 THEN
  1787.                BEGIN
  1788.                     pp^.SelectColumnStart:=ww;
  1789.                     pp^.SelectAnchorColumn:=ww;
  1790.                END;
  1791.  
  1792.                IF ww1=pp^.SelectLineStart THEN
  1793.                BEGIN
  1794.                     IF ww>=pp^.SelectAnchorColumn THEN
  1795.                     BEGIN
  1796.                         IF ww1=pp^.SelectLineEnd THEN pp^.SelectColumnEnd:=ww;
  1797.                         pp^.SelectColumnStart:=pp^.SelectAnchorColumn;
  1798.                     END;
  1799.                     ELSE
  1800.                     BEGIN
  1801.                         pp^.SelectColumnStart:=ww;
  1802.                         IF ww1=pp^.SelectLineEnd THEN pp^.SelectColumnEnd:=
  1803.                                pp^.SelectAnchorColumn;
  1804.                     END;
  1805.                END;
  1806.  
  1807.                IF ww1=pp^.SelectLineEnd THEN IF ww1<>pp^.SelectLineStart THEN
  1808.                    pp^.SelectColumnEnd:=ww;
  1809.  
  1810.                dec(ww1,pp^.VSlider.AcValue);
  1811.  
  1812.                IF ww1=pp^.TextViewY-1 THEN
  1813.                BEGIN
  1814.                     LineDown(Win,pp);
  1815.                     LastDragPos:=para1;
  1816.                     DragWindow:=Win;
  1817.                     Drag_Mode:=TRUE;
  1818.                END
  1819.                ELSE
  1820.                BEGIN
  1821.                     IF ww1=0 THEN
  1822.                     BEGIN
  1823.                          LineUp(Win,pp);
  1824.                          LastDragPos:=para1;
  1825.                          DragWindow:=Win;
  1826.                          Drag_Mode:=TRUE;
  1827.                     END
  1828.                     ELSE Drag_Mode:=FALSE;
  1829.                END;
  1830.                InvalidateEditorWindow(Win,pp);
  1831. ll1:
  1832.                IF not Handled THEN H:=FALSE;
  1833.           END;
  1834.           ELSE IF not Handled THEN H:=FALSE;
  1835.      END; {Case}
  1836.      Handled:=H;
  1837.      r:=Inherited.MDIHandleEvent(Win,Msg,para1,para2,Handled,Extra);
  1838.      MDIHandleEvent:=r;
  1839. END;
  1840.  
  1841. BEGIN
  1842. END.